aboutsummaryrefslogtreecommitdiff
path: root/devel/electron4
diff options
context:
space:
mode:
Diffstat (limited to 'devel/electron4')
-rw-r--r--devel/electron4/Makefile269
-rw-r--r--devel/electron4/Makefile.tests79
-rw-r--r--devel/electron4/distinfo13
-rw-r--r--devel/electron4/files/apply-electron-patches.sh20
-rw-r--r--devel/electron4/files/package-lock.json12232
-rw-r--r--devel/electron4/files/package.json76
-rw-r--r--devel/electron4/files/patch-BUILD.gn87
-rw-r--r--devel/electron4/files/patch-apps_ui_views_app__window__frame__view.cc11
-rw-r--r--devel/electron4/files/patch-ash_display_mirror__window__controller.cc14
-rw-r--r--devel/electron4/files/patch-base_BUILD.gn67
-rw-r--r--devel/electron4/files/patch-base_allocator_allocator__shim.cc11
-rw-r--r--devel/electron4/files/patch-base_allocator_allocator__shim__default__dispatch__to__glibc.cc77
-rw-r--r--devel/electron4/files/patch-base_allocator_allocator__shim__override__libc__symbols.h11
-rw-r--r--devel/electron4/files/patch-base_allocator_allocator__shim__unittest.cc36
-rw-r--r--devel/electron4/files/patch-base_allocator_partition__allocator_partition__alloc__unittest.cc11
-rw-r--r--devel/electron4/files/patch-base_debug_debugger__posix.cc57
-rw-r--r--devel/electron4/files/patch-base_debug_elf__reader__linux.cc13
-rw-r--r--devel/electron4/files/patch-base_debug_proc__maps__linux.cc11
-rw-r--r--devel/electron4/files/patch-base_debug_stack__trace.h10
-rw-r--r--devel/electron4/files/patch-base_debug_stack__trace__posix.cc40
-rw-r--r--devel/electron4/files/patch-base_debug_thread__heap__usage__tracker.cc15
-rw-r--r--devel/electron4/files/patch-base_files_file__path__unittest.cc11
-rw-r--r--devel/electron4/files/patch-base_files_file__path__watcher__kqueue.h13
-rw-r--r--devel/electron4/files/patch-base_files_file__path__watcher__stub.cc51
-rw-r--r--devel/electron4/files/patch-base_files_file__path__watcher__unittest.cc11
-rw-r--r--devel/electron4/files/patch-base_files_file__util.h11
-rw-r--r--devel/electron4/files/patch-base_files_memory__mapped__file__posix.cc11
-rw-r--r--devel/electron4/files/patch-base_i18n_icu__util.cc20
-rw-r--r--devel/electron4/files/patch-base_linux__util.cc18
-rw-r--r--devel/electron4/files/patch-base_logging__unittest.cc11
-rw-r--r--devel/electron4/files/patch-base_native__library__posix.cc11
-rw-r--r--devel/electron4/files/patch-base_native__library__unittest.cc11
-rw-r--r--devel/electron4/files/patch-base_posix_unix__domain__socket.cc49
-rw-r--r--devel/electron4/files/patch-base_posix_unix__domain__socket__unittest.cc12
-rw-r--r--devel/electron4/files/patch-base_process_internal__linux.cc16
-rw-r--r--devel/electron4/files/patch-base_process_internal__linux.h11
-rw-r--r--devel/electron4/files/patch-base_process_kill.h11
-rw-r--r--devel/electron4/files/patch-base_process_kill__posix.cc11
-rw-r--r--devel/electron4/files/patch-base_process_launch.cc11
-rw-r--r--devel/electron4/files/patch-base_process_launch.h20
-rw-r--r--devel/electron4/files/patch-base_process_launch__posix.cc10
-rw-r--r--devel/electron4/files/patch-base_process_memory.cc20
-rw-r--r--devel/electron4/files/patch-base_process_memory.h11
-rw-r--r--devel/electron4/files/patch-base_process_memory__unittest.cc18
-rw-r--r--devel/electron4/files/patch-base_process_process__handle.cc11
-rw-r--r--devel/electron4/files/patch-base_process_process__handle.h11
-rw-r--r--devel/electron4/files/patch-base_process_process__handle__freebsd.cc17
-rw-r--r--devel/electron4/files/patch-base_process_process__info__linux.cc39
-rw-r--r--devel/electron4/files/patch-base_process_process__iterator__freebsd.cc45
-rw-r--r--devel/electron4/files/patch-base_process_process__metrics.h112
-rw-r--r--devel/electron4/files/patch-base_process_process__metrics__freebsd.cc85
-rw-r--r--devel/electron4/files/patch-base_process_process__metrics__posix.cc20
-rw-r--r--devel/electron4/files/patch-base_profiler_stack__sampling__profiler__unittest.cc11
-rw-r--r--devel/electron4/files/patch-base_security__unittest.cc11
-rw-r--r--devel/electron4/files/patch-base_strings_safe__sprintf__unittest.cc18
-rw-r--r--devel/electron4/files/patch-base_sys__info__freebsd.cc71
-rw-r--r--devel/electron4/files/patch-base_sys__info__posix.cc38
-rw-r--r--devel/electron4/files/patch-base_test_launcher_test__launcher.cc10
-rw-r--r--devel/electron4/files/patch-base_test_test__file__util__linux.cc13
-rw-r--r--devel/electron4/files/patch-base_test_test__file__util__posix.cc11
-rw-r--r--devel/electron4/files/patch-base_third__party_libevent_BUILD.gn24
-rw-r--r--devel/electron4/files/patch-base_threading_platform__thread.h11
-rw-r--r--devel/electron4/files/patch-base_threading_platform__thread__linux.cc21
-rw-r--r--devel/electron4/files/patch-base_threading_platform__thread__posix.cc11
-rw-r--r--devel/electron4/files/patch-base_threading_thread__local__storage__unittest.cc11
-rw-r--r--devel/electron4/files/patch-base_threading_thread__task__runner__handle.cc26
-rw-r--r--devel/electron4/files/patch-base_trace__event_malloc__dump__provider.cc21
-rw-r--r--devel/electron4/files/patch-base_trace__event_process__memory__dump.cc11
-rw-r--r--devel/electron4/files/patch-base_trace__event_process__memory__dump.h11
-rw-r--r--devel/electron4/files/patch-build_config_BUILD.gn30
-rw-r--r--devel/electron4/files/patch-build_config_BUILDCONFIG.gn119
-rw-r--r--devel/electron4/files/patch-build_config_allocator.gni20
-rw-r--r--devel/electron4/files/patch-build_config_compiler_BUILD.gn89
-rw-r--r--devel/electron4/files/patch-build_config_compiler_compiler.gni11
-rw-r--r--devel/electron4/files/patch-build_config_features.gni11
-rw-r--r--devel/electron4/files/patch-build_config_linux_BUILD.gn11
-rw-r--r--devel/electron4/files/patch-build_config_linux_pkg-config.py26
-rw-r--r--devel/electron4/files/patch-build_config_sysroot.gni15
-rw-r--r--devel/electron4/files/patch-build_gn__run__binary.py11
-rw-r--r--devel/electron4/files/patch-build_linux_chrome.map29
-rw-r--r--devel/electron4/files/patch-build_linux_libpci_BUILD.gn53
-rw-r--r--devel/electron4/files/patch-build_linux_unbundle_libusb.gn27
-rw-r--r--devel/electron4/files/patch-build_linux_unbundle_replace__gn__files.py10
-rw-r--r--devel/electron4/files/patch-build_toolchain_gcc__toolchain.gni45
-rw-r--r--devel/electron4/files/patch-build_toolchain_get__concurrent__links.py17
-rw-r--r--devel/electron4/files/patch-build_toolchain_linux_BUILD.gn10
-rw-r--r--devel/electron4/files/patch-cc_BUILD.gn11
-rw-r--r--devel/electron4/files/patch-cc_layers_scrollbar__layer__impl__base.cc13
-rw-r--r--devel/electron4/files/patch-cc_trees_property__tree.cc20
-rw-r--r--devel/electron4/files/patch-chrome_app_chrome__command__ids.h11
-rw-r--r--devel/electron4/files/patch-chrome_app_chrome__main.cc19
-rw-r--r--devel/electron4/files/patch-chrome_app_chrome__main__delegate.cc74
-rw-r--r--devel/electron4/files/patch-chrome_app_chromium__strings.grd11
-rw-r--r--devel/electron4/files/patch-chrome_app_generated__resources.grd20
-rw-r--r--devel/electron4/files/patch-chrome_app_google__chrome__strings.grd11
-rw-r--r--devel/electron4/files/patch-chrome_app_settings__strings.grdp20
-rw-r--r--devel/electron4/files/patch-chrome_app_shutdown__signal__handlers__posix.cc15
-rw-r--r--devel/electron4/files/patch-chrome_app_theme_chrome__unscaled__resources.grd11
-rw-r--r--devel/electron4/files/patch-chrome_browser_about__flags.cc72
-rw-r--r--devel/electron4/files/patch-chrome_browser_after__startup__task__utils.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_autocomplete_chrome__autocomplete__scheme__classifier.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_background_background__mode__optimizer.cc15
-rw-r--r--devel/electron4/files/patch-chrome_browser_browser__resources.grd11
-rw-r--r--devel/electron4/files/patch-chrome_browser_chrome__browser__main.cc42
-rw-r--r--devel/electron4/files/patch-chrome_browser_chrome__browser__main__linux.cc27
-rw-r--r--devel/electron4/files/patch-chrome_browser_chrome__browser__main__posix.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_chrome__content__browser__client.cc83
-rw-r--r--devel/electron4/files/patch-chrome_browser_chrome__content__browser__client.h17
-rw-r--r--devel/electron4/files/patch-chrome_browser_defaults.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_devtools_devtools__eye__dropper.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_diagnostics_diagnostics__writer.h11
-rw-r--r--devel/electron4/files/patch-chrome_browser_download_chrome__download__manager__delegate.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_download_download__commands.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_download_download__commands.h11
-rw-r--r--devel/electron4/files/patch-chrome_browser_download_download__prefs.cc65
-rw-r--r--devel/electron4/files/patch-chrome_browser_download_download__prefs.h20
-rw-r--r--devel/electron4/files/patch-chrome_browser_download_download__query.cc14
-rw-r--r--devel/electron4/files/patch-chrome_browser_download_download__shelf__context__menu.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_download_download__status__updater.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_extensions_BUILD.gn15
-rw-r--r--devel/electron4/files/patch-chrome_browser_extensions_activity__log_activity__log.cc14
-rw-r--r--devel/electron4/files/patch-chrome_browser_extensions_api_image__writer__private_removable__storage__provider.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_extensions_api_input__ime_input__ime__api.h11
-rw-r--r--devel/electron4/files/patch-chrome_browser_extensions_api_runtime_chrome__runtime__api__delegate.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_extensions_api_settings__private_prefs__util.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_extensions_bookmark__app__helper.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_extensions_browser__context__keyed__service__factories.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_extensions_external__provider__impl.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_first__run_first__run__internal__posix.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_flag__descriptions.cc36
-rw-r--r--devel/electron4/files/patch-chrome_browser_flag__descriptions.h35
-rw-r--r--devel/electron4/files/patch-chrome_browser_media__galleries_fileapi_mtp__device__map__service.cc15
-rw-r--r--devel/electron4/files/patch-chrome_browser_media__galleries_media__file__system__registry.cc14
-rw-r--r--devel/electron4/files/patch-chrome_browser_media_router_discovery_discovery__network__list__posix.cc28
-rw-r--r--devel/electron4/files/patch-chrome_browser_media_router_discovery_discovery__network__list__wifi__linux.cc27
-rw-r--r--devel/electron4/files/patch-chrome_browser_media_router_providers_wired__display_wired__display__media__route__provider.cc23
-rw-r--r--devel/electron4/files/patch-chrome_browser_media_webrtc_webrtc__event__log__uploader.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_media_webrtc_webrtc__log__uploader.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_memory__details.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_memory__details__linux.cc13
-rw-r--r--devel/electron4/files/patch-chrome_browser_metrics_chrome__browser__main__extra__parts__metrics.cc21
-rw-r--r--devel/electron4/files/patch-chrome_browser_net_system__network__context__manager.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_password__manager_chrome__password__manager__client.cc14
-rw-r--r--devel/electron4/files/patch-chrome_browser_password__manager_password__store__factory.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_platform__util.h11
-rw-r--r--devel/electron4/files/patch-chrome_browser_plugins_plugins__resource__service.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_policy_policy__prefs__browsertest.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_process__singleton__posix.cc34
-rw-r--r--devel/electron4/files/patch-chrome_browser_profiles_chrome__browser__main__extra__parts__profiles.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_renderer__context__menu_render__view__context__menu.cc29
-rw-r--r--devel/electron4/files/patch-chrome_browser_renderer__preferences__util.cc38
-rw-r--r--devel/electron4/files/patch-chrome_browser_resources_safe__browsing_gen__file__type__proto.py19
-rw-r--r--devel/electron4/files/patch-chrome_browser_resources_settings_appearance__page_appearance__browser__proxy.js20
-rw-r--r--devel/electron4/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.html29
-rw-r--r--devel/electron4/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.js33
-rw-r--r--devel/electron4/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__handler__util.cc15
-rw-r--r--devel/electron4/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__reporting__service.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_search_local__files__ntp__source.cc16
-rw-r--r--devel/electron4/files/patch-chrome_browser_speech_tts__controller__impl.cc16
-rw-r--r--devel/electron4/files/patch-chrome_browser_ssl_ssl__error__controller__client.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_sync_chrome__sync__client.cc19
-rw-r--r--devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__group.cc56
-rw-r--r--devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__group.h39
-rw-r--r--devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.cc44
-rw-r--r--devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.h50
-rw-r--r--devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__manager__impl.cc16
-rw-r--r--devel/electron4/files/patch-chrome_browser_task__manager_task__manager__observer.h16
-rw-r--r--devel/electron4/files/patch-chrome_browser_tracing_crash__service__uploader.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_browser__command__controller.cc38
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_exclusive__access_exclusive__access__bubble.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_input__method_input__method__engine.h11
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_input__method_input__method__engine__base.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_libgtkui_print__dialog__gtk.cc10
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_sad__tab.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_startup_bad__flags__prompt.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_startup_startup__browser__creator.cc22
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_tab__helpers.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_task__manager_task__manager__columns.cc15
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_task__manager_task__manager__table__model.cc50
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_toolbar_app__menu__model.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_views_accelerator__table.cc29
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_views_chrome__browser__main__extra__parts__views.cc38
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_views_chrome__views__delegate.h11
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_views_first__run__dialog.cc24
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_views_frame_browser__frame.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_views_frame_browser__non__client__frame__view__factory__views.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view__layout.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view__platform__specific.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_views_frame_system__menu__model__builder.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_views_frame_system__menu__model__delegate.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_views_tabs_new__tab__button.cc11
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_views_tabs_tab__drag__controller.cc29
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_webui_about__ui.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_webui_chrome__web__ui__controller__factory.cc49
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_webui_settings_appearance__handler.cc20
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_webui_settings_appearance__handler.h11
-rw-r--r--devel/electron4/files/patch-chrome_browser_ui_webui_settings_md__settings__localized__strings__provider.cc20
-rw-r--r--devel/electron4/files/patch-chrome_common_BUILD.gn13
-rw-r--r--devel/electron4/files/patch-chrome_common_chrome__features.cc45
-rw-r--r--devel/electron4/files/patch-chrome_common_chrome__features.h20
-rw-r--r--devel/electron4/files/patch-chrome_common_chrome__paths.cc97
-rw-r--r--devel/electron4/files/patch-chrome_common_chrome__paths.h29
-rw-r--r--devel/electron4/files/patch-chrome_common_chrome__paths__internal.h11
-rw-r--r--devel/electron4/files/patch-chrome_common_chrome__switches.cc17
-rw-r--r--devel/electron4/files/patch-chrome_common_chrome__switches.h17
-rw-r--r--devel/electron4/files/patch-chrome_common_extensions_api_api__sources.gni11
-rw-r--r--devel/electron4/files/patch-chrome_common_extensions_command.cc11
-rw-r--r--devel/electron4/files/patch-chrome_common_features.gni14
-rw-r--r--devel/electron4/files/patch-chrome_common_pref__names.cc29
-rw-r--r--devel/electron4/files/patch-chrome_common_pref__names.h38
-rw-r--r--devel/electron4/files/patch-chrome_common_webui__url__constants.cc41
-rw-r--r--devel/electron4/files/patch-chrome_common_webui__url__constants.h25
-rw-r--r--devel/electron4/files/patch-chrome_renderer_pepper_pepper__flash__font__file__host.cc29
-rw-r--r--devel/electron4/files/patch-chrome_renderer_pepper_pepper__flash__font__file__host.h20
-rw-r--r--devel/electron4/files/patch-chrome_service_cloud__print_print__system.cc11
-rw-r--r--devel/electron4/files/patch-chrome_test_base_in__process__browser__test.cc22
-rw-r--r--devel/electron4/files/patch-chrome_test_base_testing__browser__process.h13
-rw-r--r--devel/electron4/files/patch-chrome_test_chromedriver_chrome_chrome__finder.cc20
-rw-r--r--devel/electron4/files/patch-chromecast_browser_cast__browser__main__parts.cc29
-rw-r--r--devel/electron4/files/patch-chromecast_browser_cast__content__browser__client.cc11
-rw-r--r--devel/electron4/files/patch-components_autofill__strings.grdp11
-rw-r--r--devel/electron4/files/patch-components_autofill_content_renderer_password__form__conversion__utils.cc14
-rw-r--r--devel/electron4/files/patch-components_autofill_core_browser_autofill__experiments.cc20
-rw-r--r--devel/electron4/files/patch-components_autofill_core_common_autofill__util.cc11
-rw-r--r--devel/electron4/files/patch-components_content__settings_core_browser_website__settings__registry.cc11
-rw-r--r--devel/electron4/files/patch-components_cookie__config_cookie__store__util.cc24
-rw-r--r--devel/electron4/files/patch-components_crash_content_app_BUILD.gn20
-rw-r--r--devel/electron4/files/patch-components_crash_content_app_crashpad.cc43
-rw-r--r--devel/electron4/files/patch-components_crash_content_browser_BUILD.gn23
-rw-r--r--devel/electron4/files/patch-components_crash_core_common_BUILD.gn28
-rw-r--r--devel/electron4/files/patch-components_download_internal_common_base__file.cc11
-rw-r--r--devel/electron4/files/patch-components_download_quarantine_quarantine__linux.cc49
-rw-r--r--devel/electron4/files/patch-components_feature__engagement_public_event__constants.cc14
-rw-r--r--devel/electron4/files/patch-components_feature__engagement_public_event__constants.h20
-rw-r--r--devel/electron4/files/patch-components_feedback_anonymizer__tool.cc14
-rw-r--r--devel/electron4/files/patch-components_flags__ui_flags__state.cc11
-rw-r--r--devel/electron4/files/patch-components_gcm__driver_gcm__client.h10
-rw-r--r--devel/electron4/files/patch-components_gcm__driver_gcm__client__impl.cc12
-rw-r--r--devel/electron4/files/patch-components_keyed__service_core_dependency__graph__unittest.cc14
-rw-r--r--devel/electron4/files/patch-components_metrics_BUILD.gn14
-rw-r--r--devel/electron4/files/patch-components_metrics_drive__metrics__provider__linux.cc16
-rw-r--r--devel/electron4/files/patch-components_metrics_system__memory__stats__recorder__linux.cc18
-rw-r--r--devel/electron4/files/patch-components_neterror_resources_neterror.js11
-rw-r--r--devel/electron4/files/patch-components_network__session__configurator_browser_network__session__configurator.cc11
-rw-r--r--devel/electron4/files/patch-components_new__or__sad__tab__strings.grdp38
-rw-r--r--devel/electron4/files/patch-components_os__crypt_os__crypt.h29
-rw-r--r--devel/electron4/files/patch-components_os__crypt_os__crypt__unittest.cc11
-rw-r--r--devel/electron4/files/patch-components_password__manager_core_browser_import_csv__reader.cc14
-rw-r--r--devel/electron4/files/patch-components_plugins_renderer_plugin__placeholder.cc14
-rw-r--r--devel/electron4/files/patch-components_policy_core_common_schema.cc14
-rw-r--r--devel/electron4/files/patch-components_policy_resources_policy__templates.json83
-rw-r--r--devel/electron4/files/patch-components_policy_tools_generate__policy__source.py20
-rw-r--r--devel/electron4/files/patch-components_previews_core_previews__features.cc11
-rw-r--r--devel/electron4/files/patch-components_services_filesystem_file__system__app.cc20
-rw-r--r--devel/electron4/files/patch-components_services_font_font__service__app.cc11
-rw-r--r--devel/electron4/files/patch-components_storage__monitor_BUILD.gn20
-rw-r--r--devel/electron4/files/patch-components_storage__monitor_removable__device__constants.cc11
-rw-r--r--devel/electron4/files/patch-components_storage__monitor_removable__device__constants.h11
-rw-r--r--devel/electron4/files/patch-components_storage__monitor_storage__monitor__freebsd.cc57
-rw-r--r--devel/electron4/files/patch-components_storage__monitor_storage__monitor__freebsd.h48
-rw-r--r--devel/electron4/files/patch-components_sync_base_get__session__name.cc20
-rw-r--r--devel/electron4/files/patch-components_sync_base_get__session__name__linux.cc14
-rw-r--r--devel/electron4/files/patch-components_update__client_update__query__params.cc11
-rw-r--r--devel/electron4/files/patch-components_url__matcher_regex__set__matcher.cc16
-rw-r--r--devel/electron4/files/patch-components_url__matcher_url__matcher__factory.cc14
-rw-r--r--devel/electron4/files/patch-components_webcrypto_algorithms_test__helpers.cc14
-rw-r--r--devel/electron4/files/patch-content_app_content__main__runner__impl.cc29
-rw-r--r--devel/electron4/files/patch-content_browser_BUILD.gn14
-rw-r--r--devel/electron4/files/patch-content_browser_browser__main__loop.cc28
-rw-r--r--devel/electron4/files/patch-content_browser_child__process__launcher__helper__linux.cc76
-rw-r--r--devel/electron4/files/patch-content_browser_media_media__internals.cc11
-rw-r--r--devel/electron4/files/patch-content_browser_memory_memory__monitor.cc11
-rw-r--r--devel/electron4/files/patch-content_browser_memory_swap__metrics__driver__impl__linux.cc16
-rw-r--r--devel/electron4/files/patch-content_browser_renderer__host_input_input__device__change__observer.cc29
-rw-r--r--devel/electron4/files/patch-content_browser_renderer__host_render__message__filter.cc29
-rw-r--r--devel/electron4/files/patch-content_browser_renderer__host_render__message__filter.h19
-rw-r--r--devel/electron4/files/patch-content_browser_renderer__host_render__process__host__impl.h15
-rw-r--r--devel/electron4/files/patch-content_browser_renderer__host_render__view__host__impl.cc11
-rw-r--r--devel/electron4/files/patch-content_browser_renderer__host_render__widget__host__view__aura.cc29
-rw-r--r--devel/electron4/files/patch-content_browser_renderer__host_render__widget__host__view__event__handler.cc11
-rw-r--r--devel/electron4/files/patch-content_browser_service__worker_service__worker__fetch__dispatcher.cc11
-rw-r--r--devel/electron4/files/patch-content_browser_webui_web__ui__data__source__impl.cc69
-rw-r--r--devel/electron4/files/patch-content_browser_webui_web__ui__data__source__impl.h25
-rw-r--r--devel/electron4/files/patch-content_common_BUILD.gn15
-rw-r--r--devel/electron4/files/patch-content_common_common__sandbox__support__linux.cc10
-rw-r--r--devel/electron4/files/patch-content_common_user__agent.cc17
-rw-r--r--devel/electron4/files/patch-content_gpu_BUILD.gn11
-rw-r--r--devel/electron4/files/patch-content_gpu_gpu__main.cc47
-rw-r--r--devel/electron4/files/patch-content_gpu_gpu__sandbox__hook__linux.cc11
-rw-r--r--devel/electron4/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.cc29
-rw-r--r--devel/electron4/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.h20
-rw-r--r--devel/electron4/files/patch-content_ppapi__plugin_ppapi__plugin__main.cc11
-rw-r--r--devel/electron4/files/patch-content_public_browser_web__ui__data__source.h51
-rw-r--r--devel/electron4/files/patch-content_public_common_child__process__host.h20
-rw-r--r--devel/electron4/files/patch-content_public_common_content__switches.cc11
-rw-r--r--devel/electron4/files/patch-content_public_common_content__switches.h11
-rw-r--r--devel/electron4/files/patch-content_public_common_renderer__preferences.h11
-rw-r--r--devel/electron4/files/patch-content_public_common_use__zoom__for__dsf__policy.cc11
-rw-r--r--devel/electron4/files/patch-content_public_test_browser__test__base.cc13
-rw-r--r--devel/electron4/files/patch-content_renderer_media_stream_processed__local__audio__source.cc11
-rw-r--r--devel/electron4/files/patch-content_renderer_render__thread__impl.cc56
-rw-r--r--devel/electron4/files/patch-content_renderer_renderer__blink__platform__impl.cc56
-rw-r--r--devel/electron4/files/patch-content_renderer_renderer__blink__platform__impl.h11
-rw-r--r--devel/electron4/files/patch-content_renderer_renderer__main__platform__delegate__linux.cc19
-rw-r--r--devel/electron4/files/patch-content_shell_browser_shell__browser__context.cc20
-rw-r--r--devel/electron4/files/patch-content_shell_browser_shell__browser__main__parts.cc20
-rw-r--r--devel/electron4/files/patch-content_test_content__test__suite.cc18
-rw-r--r--devel/electron4/files/patch-content_utility_utility__main.cc11
-rw-r--r--devel/electron4/files/patch-device_bluetooth_BUILD.gn11
-rw-r--r--devel/electron4/files/patch-device_gamepad_gamepad__provider.cc11
-rw-r--r--devel/electron4/files/patch-device_serial_BUILD.gn25
-rw-r--r--devel/electron4/files/patch-device_serial_serial__io__handler__posix.cc11
-rw-r--r--devel/electron4/files/patch-device_usb_BUILD.gn21
-rw-r--r--devel/electron4/files/patch-device_usb_usb__context.cc12
-rw-r--r--devel/electron4/files/patch-device_usb_usb__error.cc11
-rw-r--r--devel/electron4/files/patch-device_usb_usb__service__impl.cc45
-rw-r--r--devel/electron4/files/patch-device_usb_usb__service__impl.h26
-rw-r--r--devel/electron4/files/patch-electron_BUILD.gn27
-rw-r--r--devel/electron4/files/patch-electron_atom_app_atom__main.cc35
-rw-r--r--devel/electron4/files/patch-electron_atom_app_atom__main__delegate.cc11
-rw-r--r--devel/electron4/files/patch-electron_atom_browser_api_atom__api__app.cc29
-rw-r--r--devel/electron4/files/patch-electron_atom_browser_api_atom__api__web__contents.cc20
-rw-r--r--devel/electron4/files/patch-electron_atom_browser_atom__browser__main__parts__posix.cc20
-rw-r--r--devel/electron4/files/patch-electron_atom_browser_browser.h15
-rw-r--r--devel/electron4/files/patch-electron_atom_browser_io__thread.cc29
-rw-r--r--devel/electron4/files/patch-electron_atom_browser_relauncher__linux.cc32
-rw-r--r--devel/electron4/files/patch-electron_atom_browser_ui_views_submenu__button.cc11
-rw-r--r--devel/electron4/files/patch-electron_atom_common_api_atom__api__crash__reporter.cc42
-rw-r--r--devel/electron4/files/patch-electron_atom_common_atom__command__line.cc11
-rw-r--r--devel/electron4/files/patch-electron_atom_common_atom__command__line.h11
-rw-r--r--devel/electron4/files/patch-electron_atom_common_crash__reporter_crash__reporter.cc14
-rw-r--r--devel/electron4/files/patch-electron_atom_common_node__bindings.cc11
-rw-r--r--devel/electron4/files/patch-electron_atom_common_node__bindings__linux.cc69
-rw-r--r--devel/electron4/files/patch-electron_brightray_browser_brightray__paths.h11
-rw-r--r--devel/electron4/files/patch-electron_brightray_browser_browser__main__parts.cc29
-rw-r--r--devel/electron4/files/patch-electron_brightray_browser_views_views__delegate.cc38
-rw-r--r--devel/electron4/files/patch-electron_brightray_browser_views_views__delegate.h11
-rw-r--r--devel/electron4/files/patch-electron_brightray_common_platform__util.h11
-rw-r--r--devel/electron4/files/patch-electron_chromium__src_chrome_browser_process__singleton__posix.cc20
-rw-r--r--devel/electron4/files/patch-electron_chromium__src_chrome_renderer_spellchecker_spellcheck__worditerator.cc17
-rw-r--r--devel/electron4/files/patch-electron_chromium__src_chrome_renderer_spellchecker_spellcheck__worditerator.h11
-rw-r--r--devel/electron4/files/patch-electron_lib_browser_api_app.js11
-rw-r--r--devel/electron4/files/patch-electron_lib_browser_api_dialog.js11
-rw-r--r--devel/electron4/files/patch-electron_lib_browser_api_menu-item-roles.js11
-rw-r--r--devel/electron4/files/patch-electron_lib_browser_api_power-monitor.js11
-rw-r--r--devel/electron4/files/patch-electron_lib_browser_init.js11
-rw-r--r--devel/electron4/files/patch-electron_lib_common_api_clipboard.js10
-rw-r--r--devel/electron4/files/patch-electron_script_lib_utils.js10
-rw-r--r--devel/electron4/files/patch-electron_spec_api-app-spec.js75
-rw-r--r--devel/electron4/files/patch-electron_spec_api-auto-updater-spec.js11
-rw-r--r--devel/electron4/files/patch-electron_spec_api-browser-window-spec.js38
-rw-r--r--devel/electron4/files/patch-electron_spec_api-clipboard-spec.js38
-rw-r--r--devel/electron4/files/patch-electron_spec_api-crash-reporter-spec.js11
-rw-r--r--devel/electron4/files/patch-electron_spec_api-net-log-spec.js29
-rw-r--r--devel/electron4/files/patch-electron_spec_api-notification-dbus-spec.js11
-rw-r--r--devel/electron4/files/patch-electron_spec_api-power-monitor-spec.js11
-rw-r--r--devel/electron4/files/patch-electron_spec_chromium-spec.js11
-rw-r--r--devel/electron4/files/patch-extensions_browser_api_declarative__webrequest_webrequest__action.cc14
-rw-r--r--devel/electron4/files/patch-extensions_browser_api_messaging_message__service.cc20
-rw-r--r--devel/electron4/files/patch-extensions_browser_api_networking__private_networking__private__delegate__factory.cc20
-rw-r--r--devel/electron4/files/patch-extensions_browser_api_web__request_form__data__parser.cc14
-rw-r--r--devel/electron4/files/patch-extensions_browser_browser__context__keyed__service__factories.cc11
-rw-r--r--devel/electron4/files/patch-extensions_common_api___permission__features.json29
-rw-r--r--devel/electron4/files/patch-extensions_common_api_runtime.json11
-rw-r--r--devel/electron4/files/patch-extensions_common_feature__switch.cc14
-rw-r--r--devel/electron4/files/patch-extensions_common_features_feature.cc11
-rw-r--r--devel/electron4/files/patch-extensions_common_image__util.cc14
-rw-r--r--devel/electron4/files/patch-extensions_common_stack__frame.cc14
-rw-r--r--devel/electron4/files/patch-extensions_renderer_bindings_api__binding__util.cc11
-rw-r--r--devel/electron4/files/patch-extensions_shell_app_shell__main__delegate.cc29
-rw-r--r--devel/electron4/files/patch-gpu_command__buffer_service_program__manager.cc14
-rw-r--r--devel/electron4/files/patch-gpu_config_gpu__control__list.cc32
-rw-r--r--devel/electron4/files/patch-gpu_config_gpu__test__config.cc11
-rw-r--r--devel/electron4/files/patch-gpu_ipc_common_gpu__memory__buffer__support.cc54
-rw-r--r--devel/electron4/files/patch-gpu_ipc_common_gpu__memory__buffer__support.h38
-rw-r--r--devel/electron4/files/patch-gpu_ipc_service_gpu__init.cc29
-rw-r--r--devel/electron4/files/patch-gpu_ipc_service_gpu__memory__buffer__factory.cc20
-rw-r--r--devel/electron4/files/patch-headless_lib_browser_headless__content__browser__client.cc20
-rw-r--r--devel/electron4/files/patch-headless_lib_browser_headless__content__browser__client.h11
-rw-r--r--devel/electron4/files/patch-headless_lib_headless__macros.h13
-rw-r--r--devel/electron4/files/patch-ipc_ipc__channel.h11
-rw-r--r--devel/electron4/files/patch-ipc_ipc__channel__common.cc11
-rw-r--r--devel/electron4/files/patch-ipc_ipc__channel__mojo.cc11
-rw-r--r--devel/electron4/files/patch-ipc_ipc__message__utils.cc11
-rw-r--r--devel/electron4/files/patch-ipc_ipc__message__utils.h11
-rw-r--r--devel/electron4/files/patch-media_BUILD.gn12
-rw-r--r--devel/electron4/files/patch-media_audio_BUILD.gn31
-rw-r--r--devel/electron4/files/patch-media_audio_alsa_audio__manager__alsa.cc54
-rw-r--r--devel/electron4/files/patch-media_audio_audio__manager.cc29
-rw-r--r--devel/electron4/files/patch-media_audio_audio__manager.h11
-rw-r--r--devel/electron4/files/patch-media_audio_audio__output__proxy__unittest.cc11
-rw-r--r--devel/electron4/files/patch-media_base_audio__latency.cc11
-rw-r--r--devel/electron4/files/patch-media_base_scopedfd__helper.h19
-rw-r--r--devel/electron4/files/patch-media_base_video__frame.cc47
-rw-r--r--devel/electron4/files/patch-media_base_video__frame.h38
-rw-r--r--devel/electron4/files/patch-media_capture_video_create__video__capture__device__factory.cc20
-rw-r--r--devel/electron4/files/patch-media_capture_video_fake__video__capture__device__factory.cc11
-rw-r--r--devel/electron4/files/patch-media_capture_video_file__video__capture__device__factory.cc11
-rw-r--r--devel/electron4/files/patch-media_capture_video_linux_v4l2__capture__delegate.cc26
-rw-r--r--devel/electron4/files/patch-media_capture_video_linux_video__capture__device__factory__linux.cc32
-rw-r--r--devel/electron4/files/patch-media_capture_video_linux_video__capture__device__linux.cc60
-rw-r--r--devel/electron4/files/patch-media_capture_video_video__capture__device__client.cc11
-rw-r--r--devel/electron4/files/patch-media_filters_vp9__parser.h10
-rw-r--r--devel/electron4/files/patch-media_formats_common_offset__byte__queue.cc20
-rw-r--r--devel/electron4/files/patch-media_formats_common_offset__byte__queue.h22
-rw-r--r--devel/electron4/files/patch-media_formats_mp2t_es__parser__adts.cc26
-rw-r--r--devel/electron4/files/patch-media_formats_mp2t_es__parser__mpeg1audio.cc26
-rw-r--r--devel/electron4/files/patch-media_media__options.gni12
-rw-r--r--devel/electron4/files/patch-mojo_public_c_system_thunks.cc47
-rw-r--r--devel/electron4/files/patch-net_BUILD.gn29
-rw-r--r--devel/electron4/files/patch-net_base_address__tracker__linux.cc259
-rw-r--r--devel/electron4/files/patch-net_base_address__tracker__linux.h12
-rw-r--r--devel/electron4/files/patch-net_base_address__tracker__linux__unittest.cc14
-rw-r--r--devel/electron4/files/patch-net_base_network__change__notifier.cc10
-rw-r--r--devel/electron4/files/patch-net_base_network__interfaces__freebsd.cc243
-rw-r--r--devel/electron4/files/patch-net_base_network__interfaces__freebsd.h47
-rw-r--r--devel/electron4/files/patch-net_base_network__interfaces__posix.h11
-rw-r--r--devel/electron4/files/patch-net_disk__cache_blockfile_disk__format.h12
-rw-r--r--devel/electron4/files/patch-net_dns_address__sorter__posix.cc12
-rw-r--r--devel/electron4/files/patch-net_dns_dns__config__service__posix__unittest.cc11
-rw-r--r--devel/electron4/files/patch-net_dns_dns__reloader.cc13
-rw-r--r--devel/electron4/files/patch-net_dns_dns__util.cc11
-rw-r--r--devel/electron4/files/patch-net_dns_host__resolver__proc.cc11
-rw-r--r--devel/electron4/files/patch-net_features.gni11
-rw-r--r--devel/electron4/files/patch-net_http_http__auth__gssapi__posix.cc14
-rw-r--r--devel/electron4/files/patch-net_http_http__network__session.cc12
-rw-r--r--devel/electron4/files/patch-net_proxy__resolution_proxy__config__service__linux.cc39
-rw-r--r--devel/electron4/files/patch-net_proxy__resolution_proxy__resolution__service.cc29
-rw-r--r--devel/electron4/files/patch-net_socket_socks5__client__socket.cc13
-rw-r--r--devel/electron4/files/patch-net_socket_udp__socket__posix.cc96
-rw-r--r--devel/electron4/files/patch-net_third__party_quic_platform_impl_quic__ip__address__impl.cc10
-rw-r--r--devel/electron4/files/patch-net_tools_cert__verify__tool_cert__verify__tool.cc20
-rw-r--r--devel/electron4/files/patch-net_url__request_url__request__context__builder.cc11
-rw-r--r--devel/electron4/files/patch-pdf_pdfium_pdfium__engine.cc65
-rw-r--r--devel/electron4/files/patch-ppapi_proxy_file__io__resource.cc48
-rw-r--r--devel/electron4/files/patch-printing_backend_print__backend__cups.h11
-rw-r--r--devel/electron4/files/patch-printing_cups__config__helper.py11
-rw-r--r--devel/electron4/files/patch-remoting_base_chromoting__event.cc11
-rw-r--r--devel/electron4/files/patch-remoting_client_display_sys__opengl.h11
-rw-r--r--devel/electron4/files/patch-remoting_host_evaluate__capability.cc11
-rw-r--r--devel/electron4/files/patch-remoting_host_host__attributes.cc11
-rw-r--r--devel/electron4/files/patch-remoting_host_host__details.cc11
-rw-r--r--devel/electron4/files/patch-remoting_host_it2me_it2me__native__messaging__host__main.cc20
-rw-r--r--devel/electron4/files/patch-remoting_host_me2me__desktop__environment.cc11
-rw-r--r--devel/electron4/files/patch-remoting_host_remoting__me2me__host.cc108
-rw-r--r--devel/electron4/files/patch-remoting_webapp_base_js_platform.js17
-rw-r--r--devel/electron4/files/patch-sandbox_features.gni10
-rw-r--r--devel/electron4/files/patch-sandbox_linux_BUILD.gn47
-rw-r--r--devel/electron4/files/patch-sandbox_linux_services_init__process__reaper.cc15
-rw-r--r--devel/electron4/files/patch-sandbox_linux_services_libc__interceptor.cc21
-rw-r--r--devel/electron4/files/patch-services_catalog_public_cpp_manifest__parsing__util.cc21
-rw-r--r--devel/electron4/files/patch-services_catalog_store.cc10
-rw-r--r--devel/electron4/files/patch-services_catalog_store.h10
-rw-r--r--devel/electron4/files/patch-services_content_simple__browser_simple__browser__service.h20
-rw-r--r--devel/electron4/files/patch-services_device_geolocation_location__arbitrator.cc11
-rw-r--r--devel/electron4/files/patch-services_device_hid_BUILD.gn22
-rw-r--r--devel/electron4/files/patch-services_device_hid_hid__connection__freebsd.cc194
-rw-r--r--devel/electron4/files/patch-services_device_hid_hid__connection__freebsd.h73
-rw-r--r--devel/electron4/files/patch-services_device_hid_hid__service.cc20
-rw-r--r--devel/electron4/files/patch-services_device_hid_hid__service__freebsd.cc374
-rw-r--r--devel/electron4/files/patch-services_device_hid_hid__service__freebsd.h51
-rw-r--r--devel/electron4/files/patch-services_device_time__zone__monitor_time__zone__monitor.cc11
-rw-r--r--devel/electron4/files/patch-services_device_time__zone__monitor_time__zone__monitor__linux.cc14
-rw-r--r--devel/electron4/files/patch-services_network_BUILD.gn10
-rw-r--r--devel/electron4/files/patch-services_network_network__context.cc38
-rw-r--r--devel/electron4/files/patch-services_network_network__sandbox__hook__linux.cc18
-rw-r--r--devel/electron4/files/patch-services_network_network__service.cc20
-rw-r--r--devel/electron4/files/patch-services_network_network__service.h11
-rw-r--r--devel/electron4/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics.h11
-rw-r--r--devel/electron4/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__linux.cc40
-rw-r--r--devel/electron4/files/patch-services_service__manager_embedder_main.cc11
-rw-r--r--devel/electron4/files/patch-services_service__manager_embedder_set__process__title__linux.cc19
-rw-r--r--devel/electron4/files/patch-services_service__manager_embedder_set__process__title__linux.h20
-rw-r--r--devel/electron4/files/patch-services_service__manager_public_cpp_standalone__service_BUILD.gn11
-rw-r--r--devel/electron4/files/patch-services_service__manager_public_cpp_standalone__service_standalone__service.cc11
-rw-r--r--devel/electron4/files/patch-services_service__manager_runner_host_BUILD.gn11
-rw-r--r--devel/electron4/files/patch-services_service__manager_sandbox_BUILD.gn11
-rw-r--r--devel/electron4/files/patch-services_service__manager_zygote_common_zygote__features.gni8
-rw-r--r--devel/electron4/files/patch-services_service__manager_zygote_host_zygote__host__impl__linux.cc40
-rw-r--r--devel/electron4/files/patch-services_service__manager_zygote_host_zygote__host__impl__linux.h13
-rw-r--r--devel/electron4/files/patch-services_service__manager_zygote_zygote__host__linux.h16
-rw-r--r--devel/electron4/files/patch-services_service__manager_zygote_zygote__linux.cc15
-rw-r--r--devel/electron4/files/patch-services_service__manager_zygote_zygote__main__linux.cc48
-rw-r--r--devel/electron4/files/patch-services_tracing_public_cpp_trace__event__agent.cc11
-rw-r--r--devel/electron4/files/patch-services_tracing_tracing__service.h11
-rw-r--r--devel/electron4/files/patch-skia_ext_SkMemory__new__handler.cpp20
-rw-r--r--devel/electron4/files/patch-third__party_angle_BUILD.gn21
-rw-r--r--devel/electron4/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__internal.h16
-rw-r--r--devel/electron4/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__libpci.cpp90
-rw-r--r--devel/electron4/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__linux.cpp21
-rw-r--r--devel/electron4/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__x11.cpp55
-rw-r--r--devel/electron4/files/patch-third__party_angle_src_libANGLE_Display.cpp20
-rw-r--r--devel/electron4/files/patch-third__party_angle_src_libANGLE_renderer_gl_renderergl__utils.cpp11
-rw-r--r--devel/electron4/files/patch-third__party_angle_third__party_vulkan-loader_src_loader_loader.c11
-rw-r--r--devel/electron4/files/patch-third__party_angle_third__party_vulkan-loader_src_loader_vk__loader__platform.h11
-rw-r--r--devel/electron4/files/patch-third__party_angle_third__party_vulkan-validation-layers_src_layers_vk__loader__platform.h11
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_core_editing_editing__behavior.cc11
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_core_html_canvas_canvas__async__blob__creator.cc11
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_core_html_forms_internal__popup__menu.cc11
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_core_inspector_inspector__memory__agent.cc11
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_platform_BUILD.gn10
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_font__cache.cc20
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_font__cache.h38
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_font__description.cc20
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_font__metrics.cc29
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_skia_font__cache__skia.cc20
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_platform_heap_stack__frame__depth.cc14
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_BUILD.gn16
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_assertions.cc11
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_atomics.h11
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_container__annotations.h11
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_stack__util.cc14
-rw-r--r--devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_threading__pthreads.cc22
-rw-r--r--devel/electron4/files/patch-third__party_boringssl_BUILD.gn36
-rw-r--r--devel/electron4/files/patch-third__party_boringssl_src_crypto_cpu-aarch64-linux.c54
-rw-r--r--devel/electron4/files/patch-third__party_boringssl_src_crypto_ex__data.c13
-rw-r--r--devel/electron4/files/patch-third__party_breakpad_breakpad_src_common_simple__string__dictionary.h11
-rw-r--r--devel/electron4/files/patch-third__party_cacheinvalidation_src_google_cacheinvalidation_include_types.h11
-rw-r--r--devel/electron4/files/patch-third__party_crashpad_crashpad_build_crashpad__buildconfig.gni11
-rw-r--r--devel/electron4/files/patch-third__party_crashpad_crashpad_util_misc_address__types.h20
-rw-r--r--devel/electron4/files/patch-third__party_crashpad_crashpad_util_misc_capture__context.h20
-rw-r--r--devel/electron4/files/patch-third__party_crashpad_crashpad_util_misc_metrics.cc11
-rw-r--r--devel/electron4/files/patch-third__party_crashpad_crashpad_util_misc_uuid.cc11
-rw-r--r--devel/electron4/files/patch-third__party_crashpad_crashpad_util_posix_close__multiple.cc11
-rw-r--r--devel/electron4/files/patch-third__party_crashpad_crashpad_util_posix_drop__privileges.cc11
-rw-r--r--devel/electron4/files/patch-third__party_crashpad_crashpad_util_posix_signals.cc33
-rw-r--r--devel/electron4/files/patch-third__party_crashpad_crashpad_util_posix_symbolic__constants__posix.cc20
-rw-r--r--devel/electron4/files/patch-third__party_crc32c_src_src_crc32c__arm64__linux__check.h19
-rw-r--r--devel/electron4/files/patch-third__party_electron__node_deps_uv_BUILD.gn44
-rw-r--r--devel/electron4/files/patch-third__party_ffmpeg_libavutil_mem.c12
-rw-r--r--devel/electron4/files/patch-third__party_googletest_src_googletest_include_gtest_internal_gtest-port.h11
-rw-r--r--devel/electron4/files/patch-third__party_googletest_src_googletest_src_gtest-port.cc43
-rw-r--r--devel/electron4/files/patch-third__party_googletest_src_googletest_src_gtest.cc10
-rw-r--r--devel/electron4/files/patch-third__party_leveldatabase_env__chromium.cc14
-rw-r--r--devel/electron4/files/patch-third__party_libXNVCtrl_NVCtrl.c25
-rw-r--r--devel/electron4/files/patch-third__party_libjingle__xmpp_task__runner_taskrunner.cc11
-rw-r--r--devel/electron4/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_memory_singleton.h11
-rw-r--r--devel/electron4/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_synchronization_lock.h11
-rw-r--r--devel/electron4/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_thread__checker.h19
-rw-r--r--devel/electron4/files/patch-third__party_libyuv_include_libyuv_row.h37
-rw-r--r--devel/electron4/files/patch-third__party_node_node.py10
-rw-r--r--devel/electron4/files/patch-third__party_pdfium_core_fxcrt_fx__system.h11
-rw-r--r--devel/electron4/files/patch-third__party_pdfium_core_fxge_fx__ge__linux.cpp14
-rw-r--r--devel/electron4/files/patch-third__party_pdfium_fxjs_cjs__publicmethods.cpp106
-rw-r--r--devel/electron4/files/patch-third__party_pdfium_fxjs_js__define.cpp22
-rw-r--r--devel/electron4/files/patch-third__party_pdfium_third__party_base_logging.h11
-rw-r--r--devel/electron4/files/patch-third__party_perfetto_include_perfetto_base_build__config.h37
-rw-r--r--devel/electron4/files/patch-third__party_perfetto_include_perfetto_base_watchdog__posix.h11
-rw-r--r--devel/electron4/files/patch-third__party_perfetto_src_base_unix__task__runner.cc11
-rw-r--r--devel/electron4/files/patch-third__party_perfetto_src_tracing_core_tracing__service__impl.cc12
-rw-r--r--devel/electron4/files/patch-third__party_protobuf_src_google_protobuf_stubs_platform__macros.h11
-rw-r--r--devel/electron4/files/patch-third__party_sfntly_src_cpp_src_sfntly_table_core_cmap__table.cc47
-rw-r--r--devel/electron4/files/patch-third__party_skia_src_core_SkCpu.cpp19
-rw-r--r--devel/electron4/files/patch-third__party_skia_src_gpu_GrAutoLocaleSetter.h11
-rw-r--r--devel/electron4/files/patch-third__party_skia_src_images_SkJpegEncoder.cpp41
-rw-r--r--devel/electron4/files/patch-third__party_skia_src_opts_SkRasterPipeline__opts.h20
-rw-r--r--devel/electron4/files/patch-third__party_skia_src_ports_SkFontHost__FreeType.cpp77
-rw-r--r--devel/electron4/files/patch-third__party_skia_src_ports_SkOSFile__stdio.cpp11
-rw-r--r--devel/electron4/files/patch-third__party_skia_src_sksl_SkSLString.h11
-rw-r--r--devel/electron4/files/patch-third__party_skia_third__party_vulkanmemoryallocator_include_vk__mem__alloc.h11
-rw-r--r--devel/electron4/files/patch-third__party_sqlite_BUILD.gn11
-rw-r--r--devel/electron4/files/patch-third__party_swiftshader_BUILD.gn10
-rw-r--r--devel/electron4/files/patch-third__party_swiftshader_src_Common_Configurator.cpp12
-rw-r--r--devel/electron4/files/patch-third__party_swiftshader_src_Common_MutexLock.hpp11
-rw-r--r--devel/electron4/files/patch-third__party_swiftshader_src_Common_SharedLibrary.hpp11
-rw-r--r--devel/electron4/files/patch-third__party_swiftshader_src_Main_SwiftConfig.cpp14
-rw-r--r--devel/electron4/files/patch-third__party_swiftshader_src_OpenGL_libEGL_libEGL.cpp29
-rw-r--r--devel/electron4/files/patch-third__party_swiftshader_src_OpenGL_libEGL_libEGL.hpp11
-rw-r--r--devel/electron4/files/patch-third__party_swiftshader_src_OpenGL_libGLES__CM_libGLES__CM.hpp11
-rw-r--r--devel/electron4/files/patch-third__party_swiftshader_src_OpenGL_libGLESv2_libGLESv2.hpp11
-rw-r--r--devel/electron4/files/patch-third__party_swiftshader_third__party_llvm-subzero_build_Linux_include_llvm_Config_config.h29
-rw-r--r--devel/electron4/files/patch-third__party_swiftshader_third__party_llvm-subzero_lib_Support_Unix_Process.inc11
-rw-r--r--devel/electron4/files/patch-third__party_usrsctp_BUILD.gn20
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_BUILD.gn12
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_modules_audio__device_BUILD.gn11
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_modules_rtp__rtcp_source_forward__error__correction.cc10
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_rtc__base_BUILD.gn20
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_rtc__base_byteorder.h11
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_rtc__base_httpcommon.cc11
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_rtc__base_ifaddrs__converter.h11
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_rtc__base_ipaddress.h13
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_rtc__base_network.cc29
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_rtc__base_network.h13
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_rtc__base_physicalsocketserver.cc56
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_rtc__base_physicalsocketserver.h11
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_rtc__base_platform__thread.cc12
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_rtc__base_platform__thread__types.cc40
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_rtc__base_stringutils.h17
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_system__wrappers_BUILD.gn11
-rw-r--r--devel/electron4/files/patch-third__party_webrtc_webrtc.gni11
-rw-r--r--devel/electron4/files/patch-third__party_yasm_BUILD.gn16
-rw-r--r--devel/electron4/files/patch-third__party_zlib_BUILD.gn20
-rw-r--r--devel/electron4/files/patch-third__party_zlib_arm__features.c29
-rw-r--r--devel/electron4/files/patch-tools_gn_bootstrap_bootstrap.py20
-rw-r--r--devel/electron4/files/patch-tools_json__schema__compiler_feature__compiler.py10
-rw-r--r--devel/electron4/files/patch-tools_json__schema__compiler_model.py11
-rw-r--r--devel/electron4/files/patch-tools_perf_chrome__telemetry__build_BUILD.gn11
-rw-r--r--devel/electron4/files/patch-tools_variations_fieldtrial__to__struct.py10
-rw-r--r--devel/electron4/files/patch-ui_base_dragdrop_os__exchange__data__provider__factory.cc20
-rw-r--r--devel/electron4/files/patch-ui_base_ime_ime__engine__handler__interface.h11
-rw-r--r--devel/electron4/files/patch-ui_base_ime_input__method__initializer.cc38
-rw-r--r--devel/electron4/files/patch-ui_base_resource_resource__bundle.cc20
-rw-r--r--devel/electron4/files/patch-ui_base_resource_resource__bundle__freebsd.cc24
-rw-r--r--devel/electron4/files/patch-ui_base_ui__base__features.cc20
-rw-r--r--devel/electron4/files/patch-ui_base_ui__base__features.h14
-rw-r--r--devel/electron4/files/patch-ui_base_webui_web__ui__util.cc11
-rw-r--r--devel/electron4/files/patch-ui_events_devices_x11_device__data__manager__x11.cc19
-rw-r--r--devel/electron4/files/patch-ui_events_event__switches.cc11
-rw-r--r--devel/electron4/files/patch-ui_events_event__switches.h11
-rw-r--r--devel/electron4/files/patch-ui_events_keycodes_dom_keycode__converter.cc11
-rw-r--r--devel/electron4/files/patch-ui_gfx_BUILD.gn11
-rw-r--r--devel/electron4/files/patch-ui_gfx_canvas__skia.cc11
-rw-r--r--devel/electron4/files/patch-ui_gfx_codec_jpeg__codec.cc20
-rw-r--r--devel/electron4/files/patch-ui_gfx_font__fallback__linux.cc13
-rw-r--r--devel/electron4/files/patch-ui_gfx_font__list.cc11
-rw-r--r--devel/electron4/files/patch-ui_gfx_font__render__params.h18
-rw-r--r--devel/electron4/files/patch-ui_gfx_gpu__memory__buffer.h20
-rw-r--r--devel/electron4/files/patch-ui_gfx_ipc_gfx__param__traits__macros.h29
-rw-r--r--devel/electron4/files/patch-ui_gfx_linux_client__native__pixmap__dmabuf.cc25
-rw-r--r--devel/electron4/files/patch-ui_gfx_mojo_buffer__types__struct__traits.cc42
-rw-r--r--devel/electron4/files/patch-ui_gfx_mojo_buffer__types__struct__traits.h11
-rw-r--r--devel/electron4/files/patch-ui_gfx_native__pixmap__handle.cc28
-rw-r--r--devel/electron4/files/patch-ui_gfx_native__pixmap__handle.h28
-rw-r--r--devel/electron4/files/patch-ui_gfx_render__text.cc46
-rw-r--r--devel/electron4/files/patch-ui_gl_BUILD.gn11
-rw-r--r--devel/electron4/files/patch-ui_gl_generate__bindings.py12
-rw-r--r--devel/electron4/files/patch-ui_gl_gl__bindings__api__autogen__glx.h10
-rw-r--r--devel/electron4/files/patch-ui_gl_gl__bindings__autogen__glx.cc61
-rw-r--r--devel/electron4/files/patch-ui_gl_gl__bindings__autogen__glx.h43
-rw-r--r--devel/electron4/files/patch-ui_gl_gl__fence.cc11
-rw-r--r--devel/electron4/files/patch-ui_gl_sync__control__vsync__provider.cc43
-rw-r--r--devel/electron4/files/patch-ui_gl_sync__control__vsync__provider.h34
-rw-r--r--devel/electron4/files/patch-ui_message__center_public_cpp_message__center__constants.h11
-rw-r--r--devel/electron4/files/patch-ui_native__theme_native__theme.h11
-rw-r--r--devel/electron4/files/patch-ui_native__theme_native__theme__base.cc11
-rw-r--r--devel/electron4/files/patch-ui_strings_app__locale__settings.grd11
-rw-r--r--devel/electron4/files/patch-ui_views_controls_label.cc20
-rw-r--r--devel/electron4/files/patch-ui_views_controls_textfield_textfield.cc73
-rw-r--r--devel/electron4/files/patch-ui_views_corewm_tooltip__aura.cc11
-rw-r--r--devel/electron4/files/patch-ui_views_examples_widget__example.cc11
-rw-r--r--devel/electron4/files/patch-ui_views_selection__controller.cc11
-rw-r--r--devel/electron4/files/patch-ui_views_style_platform__style.cc11
-rw-r--r--devel/electron4/files/patch-ui_views_views__delegate.cc11
-rw-r--r--devel/electron4/files/patch-ui_views_views__delegate.h11
-rw-r--r--devel/electron4/files/patch-ui_views_window_custom__frame__view.cc11
-rw-r--r--devel/electron4/files/patch-ui_views_window_dialog__delegate.cc11
-rw-r--r--devel/electron4/files/patch-ui_views_window_frame__background.cc11
-rw-r--r--devel/electron4/files/patch-ui_webui_resources_js_cr.js14
-rw-r--r--devel/electron4/files/patch-ui_webui_resources_js_icon.js11
-rw-r--r--devel/electron4/files/patch-v8_BUILD.gn41
-rw-r--r--devel/electron4/files/patch-v8_src_base_cpu.cc18
-rw-r--r--devel/electron4/files/patch-v8_src_base_platform_platform-posix.cc15
-rw-r--r--devel/electron4/files/patch-v8_src_log-utils.h11
-rw-r--r--devel/electron4/pkg-descr10
-rw-r--r--devel/electron4/pkg-plist75
656 files changed, 27729 insertions, 0 deletions
diff --git a/devel/electron4/Makefile b/devel/electron4/Makefile
new file mode 100644
index 000000000000..ac11b8a00614
--- /dev/null
+++ b/devel/electron4/Makefile
@@ -0,0 +1,269 @@
+# $FreeBSD$
+
+PORTNAME= electron
+DISTVERSIONPREFIX= v
+DISTVERSION= ${ELECTRON_VER:S/-beta./.b/}
+CATEGORIES= devel
+MASTER_SITES= https://github.com/tagattie/FreeBSD-Electron/releases/download/v4.1.0/:chromium \
+ https://commondatastorage.googleapis.com/chromium-nodejs/:chromium_node \
+ https://commondatastorage.googleapis.com/chromium-fonts/:chromium_testfonts
+PKGNAMESUFFIX= 4
+DISTFILES= chromium-${CHROMIUM_VER}${EXTRACT_SUFX}:chromium \
+ ${CHROMIUM_NODE_MODULES_HASH}:chromium_node \
+ electron-npm-modules-${ELECTRON_VER}${EXTRACT_SUFX}:prefetch
+DIST_SUBDIR= ${PORTNAME}
+
+MAINTAINER= tagattie@yandex.com
+COMMENT= Build cross-platform desktop apps with JavaScript, HTML, and CSS
+
+LICENSE= MIT
+LICENSE_FILE= ${WRKSRC}/electron/LICENSE
+
+FETCH_DEPENDS= npm:www/npm-node10
+PATCH_DEPENDS= git:devel/git
+BUILD_DEPENDS= ${LOCALBASE}/bin/ar:devel/binutils \
+ gn:devel/chromium-gn \
+ gperf:devel/gperf \
+ yasm:devel/yasm \
+ ${LOCALBASE}/include/linux/videodev2.h:multimedia/v4l_compat \
+ node:www/node10 \
+ npm:www/npm-node10
+LIB_DEPENDS= libatk-bridge-2.0.so:accessibility/at-spi2-atk \
+ libsnappy.so:archivers/snappy \
+ libFLAC.so:audio/flac \
+ libopus.so:audio/opus \
+ libdbus-1.so:devel/dbus \
+ libnotify.so:devel/libnotify \
+ libpci.so:devel/libpci \
+ libnspr4.so:devel/nspr \
+ libdrm.so:graphics/libdrm \
+ libwebp.so:graphics/webp \
+ libavcodec.so:multimedia/ffmpeg \
+ libopenh264.so:multimedia/openh264 \
+ libfreetype.so:print/freetype2 \
+ libharfbuzz.so:print/harfbuzz \
+ libsecret-1.so:security/libsecret \
+ libnss3.so:security/nss \
+ libexpat.so:textproc/expat2 \
+ libfontconfig.so:x11-fonts/fontconfig
+RUN_DEPENDS= xdg-open:devel/xdg-utils
+TEST_DEPENDS= npm:www/npm-node10
+
+USES= bison dos2unix gettext-tools gl gnome jpeg localbase:ldflags \
+ ninja pkgconfig python:2.7,build tar:xz
+
+CONFLICTS_INSTALL= electron5
+
+USE_GITHUB= yes
+GH_TAGNAME= ${DISTVERSIONPREFIX}${ELECTRON_VER}
+# See ${WRKSRC}/electron/DEPS for GH_TAGNAME_node
+GH_TUPLE= electron:node:8bc5d171a0873c0ba49f9433798bc8b67399788c:node
+ # boto:boto:f7574aa6cc2c819430c1f05e9a1a1a666ef8169b:boto \
+ # yaml:pyyaml:3.12:pyyaml \
+ # kennethreitz:requests:e4d59bedfd3c7f4f254f4f5d036587bcd8152458:requests
+
+ELECTRON_VER= 4.2.2
+# See ${WRKSRC}/electron/DEPS for CHROMIUM_VER
+CHROMIUM_VER= 69.0.3497.128
+# See ${WRKSRC}/third_party/node/node_modules.tar.gz.sha1 for CHROMIUM_NODE_MODULES_HASH
+CHROMIUM_NODE_MODULES_HASH= 050c85d20f7cedd7f5c39533c1ba89dcdfa56a08
+# See ${WRKSRC}/third_party/test_fonts/test_fonts.tar.gz.sha1 for CHROMIUM_TEST_FONTS_HASH
+CHROMIUM_TEST_FONTS_HASH= a22de844e32a3f720d219e3911c3da3478039f89
+
+NO_WRKSUBDIR= yes
+WRKSRC_SUBDIR= src
+
+DOS2UNIX_FILES= third_party/skia/third_party/vulkanmemoryallocator/include/vk_mem_alloc.h
+BINARY_ALIAS= python=${PYTHON_CMD}
+
+USE_XORG= x11 xcb xcomposite xcursor xdamage xext xfixes xi xrandr \
+ xrender xscrnsaver xtst
+USE_GL= gl glesv2
+USE_GNOME= atk cairo pango gdkpixbuf2 gtk30 libxml2 libxslt
+USE_LDCONFIG= ${DATADIR}
+
+GN_ARGS+= clang_use_chrome_plugins=false \
+ enable_hangout_services_extension=true \
+ enable_nacl=false \
+ enable_remoting=false \
+ fieldtrial_testing_like_official_build=true \
+ is_clang=true \
+ jumbo_file_merge_limit=8 \
+ toolkit_views=true \
+ treat_warnings_as_errors=false \
+ use_allocator="none" \
+ use_allocator_shim=false \
+ use_aura=true \
+ use_bundled_fontconfig=false \
+ use_custom_libcxx=false \
+ use_gnome_keyring=false \
+ use_jumbo_build=true \
+ use_lld=true \
+ use_sysroot=false \
+ use_system_freetype=true \
+ use_system_harfbuzz=true \
+ use_system_libjpeg=true \
+ extra_cxxflags="${CXXFLAGS}" \
+ extra_ldflags="${LDFLAGS}"
+
+ALL_TARGET= electron licenses version
+MAKE_ARGS= -C out/${BUILDTYPE}
+MAKE_ENV+= C_INCLUDE_PATH=${LOCALBASE}/include \
+ CPLUS_INCLUDE_PATH=${LOCALBASE}/include
+
+OPTIONS_DEFINE= CUPS DEBUG DIST DRIVER KERBEROS TEST
+DIST_DESC= Build distribution zip files
+DRIVER_DESC= Install chromedriver
+OPTIONS_GROUP= AUDIO
+OPTIONS_GROUP_AUDIO= ALSA PULSEAUDIO
+OPTIONS_DEFAULT= CUPS DRIVER KERBEROS ALSA
+OPTIONS_SUB= yes
+
+.if make(makesum)
+.MAKEFLAGS: WITH="${OPTIONS_DEFINE}"
+.endif
+
+ALSA_LIB_DEPENDS= libasound.so:audio/alsa-lib
+ALSA_RUN_DEPENDS= ${LOCALBASE}/lib/alsa-lib/libasound_module_pcm_oss.so:audio/alsa-plugins
+ALSA_VARS= GN_ARGS+=use_alsa=true
+ALSA_VARS_OFF= GN_ARGS+=use_alsa=false
+
+CUPS_LIB_DEPENDS= libcups.so:print/cups
+CUPS_VARS= GN_ARGS+=use_cups=true
+CUPS_VARS_OFF= GN_ARGS+=use_cups=false
+
+DEBUG_VARS= BUILDTYPE=Debug \
+ GN_ARGS+=is_component_build=false
+DEBUG_VARS_OFF= BUILDTYPE=Release
+
+DIST_ALL_TARGET= dist.zip chromedriver.zip mksnapshot.zip
+DIST_IMPLIES= DRIVER
+
+DRIVER_ALL_TARGET= chromedriver
+
+KERBEROS_VARS= GN_ARGS+=use_kerberos=true
+KERBEROS_VARS_OFF= GN_ARGS+=use_kerberos=false
+
+PULSEAUDIO_LIB_DEPENDS= libpulse.so:audio/pulseaudio
+PULSEAUDIO_VARS= GN_ARGS+=use_pulseaudio=true
+PULSEAUDIO_VARS_OFF= GN_ARGS+=use_pulseaudio=false
+
+.include "Makefile.tests"
+TEST_DISTFILES= ${CHROMIUM_TEST_FONTS_HASH}:chromium_testfonts
+TEST_ALL_TARGET= ${TEST_TARGETS}
+TEST_ALL_TARGET+= third_party/electron_node:headers
+
+NPM_TIMESTAMP= 1558165815
+
+pre-fetch:
+ @${MKDIR} ${DISTDIR}/${DIST_SUBDIR}
+ if [ ! -f ${DISTDIR}/${DIST_SUBDIR}/electron-npm-modules-${ELECTRON_VER}${EXTRACT_SUFX} ]; \
+ then ${MKDIR} ${WRKDIR}/npm-cache; \
+ ${CP} ${FILESDIR}/package.json \
+ ${FILESDIR}/package-lock.json ${WRKDIR}/npm-cache; \
+ cd ${WRKDIR}/npm-cache && \
+ ${SETENV} HOME=${WRKDIR} npm ci --verbose --no-progress && \
+ ${MV} node_modules npm_modules; \
+ ${MTREE_CMD} -cbnSp npm_modules | ${MTREE_CMD} -C | ${SED} \
+ -e 's:time=[0-9.]*:time=${NPM_TIMESTAMP}.000000000:' \
+ -e 's:\([gu]id\)=[0-9]*:\1=0:g' \
+ -e 's:flags=.*:flags=none:' \
+ -e 's:^\.:./npm_modules:' > npm_modules.mtree; \
+ ${TAR} cJf ${DISTDIR}/${DIST_SUBDIR}/electron-npm-modules-${ELECTRON_VER}${EXTRACT_SUFX} \
+ @npm_modules.mtree; \
+ ${RM} -r ${WRKDIR}/npm-cache; \
+ fi
+
+post-extract:
+ ${MV} ${WRKDIR}/${PORTNAME}-${ELECTRON_VER}/chromium-${CHROMIUM_VER} ${WRKSRC}
+ ${MV} ${WRKDIR}/${PORTNAME}-${ELECTRON_VER}/${PORTNAME}-${ELECTRON_VER} ${WRKSRC}/electron
+ ${MV} ${WRKDIR}/${PORTNAME}-${ELECTRON_VER}/${GH_PROJECT_node}-${GH_TAGNAME_node} \
+ ${WRKSRC}/third_party/${GH_ACCOUNT_node}_${GH_PROJECT_node}
+ # ${RMDIR} ${WRKSRC}/electron/vendor/${GH_PROJECT_boto}
+ # ${MV} ${WRKDIR}/${PORTNAME}-${ELECTRON_VER}/${GH_PROJECT_boto}-${GH_TAGNAME_boto} \
+ # ${WRKSRC}/electron/vendor/${GH_PROJECT_boto}
+ # ${MV} ${WRKDIR}/${PORTNAME}-${ELECTRON_VER}/${GH_PROJECT_pyyaml}-${GH_TAGNAME_pyyaml} \
+ # ${WRKSRC}/electron/vendor/${GH_PROJECT_pyyaml}
+ # ${RMDIR} ${WRKSRC}/electron/vendor/${GH_PROJECT_requests}
+ # ${MV} ${WRKDIR}/${PORTNAME}-${ELECTRON_VER}/${GH_PROJECT_requests}-${GH_TAGNAME_requests} \
+ # ${WRKSRC}/electron/vendor/${GH_PROJECT_requests}
+ ${MV} ${WRKDIR}/${PORTNAME}-${ELECTRON_VER}/node_modules ${WRKSRC}/third_party/node
+ ${MV} ${WRKDIR}/${PORTNAME}-${ELECTRON_VER}/npm_modules ${WRKSRC}/electron/node_modules
+
+post-extract-TEST-on:
+ ${MV} ${WRKDIR}/${PORTNAME}-${ELECTRON_VER}/test_fonts ${WRKSRC}/third_party/test_fonts
+
+pre-patch:
+ ${SH} ${FILESDIR}/apply-electron-patches.sh ${WRKSRC}
+ # ${FIND} ${WRKSRC} -type f -name '*.orig' -print -delete
+ # ${FIND} ${WRKSRC} -type f -name '*~' -print -delete
+
+pre-configure:
+ # cd ${WRKSRC}/electron/vendor/${GH_PROJECT_boto} && \
+ # ${PYTHON_CMD} setup.py build
+ # cd ${WRKSRC}/electron/vendor/${GH_PROJECT_requests} && \
+ # ${PYTHON_CMD} setup.py build
+ # We used to remove bundled libraries to be sure that chromium uses
+ # system libraries and not shipped ones.
+ # cd ${WRKSRC} && ${PYTHON_CMD} \
+ #./build/linux/unbundle/remove_bundled_libraries.py [list of preserved]
+ cd ${WRKSRC} && ${SETENV} ${CONFIGURE_ENV} ${PYTHON_CMD} \
+ ./build/linux/unbundle/replace_gn_files.py --system-libraries \
+ ffmpeg flac freetype harfbuzz-ng libdrm libusb libwebp libxml \
+ libxslt openh264 opus snappy yasm || ${FALSE}
+
+do-configure:
+ cd ${WRKSRC} && ${SETENV} ${CONFIGURE_ENV} gn gen out/${BUILDTYPE} \
+ --args='import("//electron/build/args/${BUILDTYPE:tl}.gn") ${GN_ARGS}'
+ # Setup nodejs dependency
+ ${MKDIR} ${WRKSRC}/third_party/node/freebsd/node-freebsd-x64/bin
+ ${LN} -sf ${LOCALBASE}/bin/node ${WRKSRC}/third_party/node/freebsd/node-freebsd-x64/bin/node
+
+# do-build:
+# cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} ninja -C out/${BUILDTYPE} ${ALL_TARGET}
+
+do-install:
+ ${MKDIR} ${STAGEDIR}${DATADIR}
+.for f in electron mksnapshot v8_context_snapshot_generator
+ ${INSTALL_PROGRAM} ${WRKSRC}/out/${BUILDTYPE}/${f} ${STAGEDIR}${DATADIR}
+.endfor
+.for f in libEGL.so libGLESv2.so libVkICD_mock_icd.so
+ ${INSTALL_LIB} ${WRKSRC}/out/${BUILDTYPE}/${f} ${STAGEDIR}${DATADIR}
+.endfor
+ ${MKDIR} ${STAGEDIR}${DATADIR}/swiftshader
+.for f in libEGL.so libGLESv2.so
+ ${INSTALL_LIB} ${WRKSRC}/out/${BUILDTYPE}/swiftshader/${f} ${STAGEDIR}${DATADIR}/swiftshader
+.endfor
+.for f in LICENSE LICENSES.chromium.html icudtl.dat natives_blob.bin snapshot_blob.bin v8_context_snapshot.bin version
+ ${INSTALL_DATA} ${WRKSRC}/out/${BUILDTYPE}/${f} ${STAGEDIR}${DATADIR}
+.endfor
+.for f in chrome_100_percent.pak chrome_200_percent.pak resources.pak
+ ${INSTALL_DATA} ${WRKSRC}/out/${BUILDTYPE}/${f} ${STAGEDIR}${DATADIR}
+.endfor
+ ${MKDIR} ${STAGEDIR}${DATADIR}/locales
+ ${INSTALL_DATA} ${WRKSRC}/out/${BUILDTYPE}/locales/*.pak ${STAGEDIR}${DATADIR}/locales
+ ${MKDIR} ${STAGEDIR}${DATADIR}/resources
+.for f in default_app.asar electron.asar
+ ${INSTALL_DATA} ${WRKSRC}/out/${BUILDTYPE}/resources/${f} ${STAGEDIR}${DATADIR}/resources
+.endfor
+ ${RLN} ${STAGEDIR}${DATADIR}/electron ${STAGEDIR}${PREFIX}/bin
+
+post-install-DRIVER-on:
+ ${INSTALL_PROGRAM} ${WRKSRC}/out/${BUILDTYPE}/chromedriver ${STAGEDIR}${DATADIR}
+
+do-test-TEST-on:
+ # chromium unit tests
+# .for t in ${TEST_ALL_TARGET}
+# cd ${WRKSRC}/out/${BUILDTYPE} && ${SETENV} LC_ALL=en_US.UTF-8 \
+# ./${t} --gtest_filter=-${EXCLUDE_${t}:ts:} || ${TRUE}
+# .endfor
+ # electron unit tests
+ # Note 1: "npm install" will run before actual tests are executed
+ # Note 2: Xvfb or something similar is necessary for headless testing
+.for t in ${TEST_MODULES}
+ cd ${WRKSRC}/electron && \
+ ${SETENV} ${TEST_ENV} ELECTRON_OUT_DIR=${BUILDTYPE} \
+ npm run test -- --ci -g '${t}' || ${TRUE}
+.endfor
+
+.include <bsd.port.mk>
diff --git a/devel/electron4/Makefile.tests b/devel/electron4/Makefile.tests
new file mode 100644
index 000000000000..a077896a6202
--- /dev/null
+++ b/devel/electron4/Makefile.tests
@@ -0,0 +1,79 @@
+# $FreeBSD$
+
+TEST_TARGETS= base_unittests \
+ chromedriver_unittests \
+ crypto_unittests \
+ printing_unittests \
+ url_unittests
+
+# capture_unittests \
+# cc_unittests \
+# compositor_unittests \
+# content_unittests \
+# dbus_unittests \
+# display_unittests \
+# events_unittests \
+# gin_unittests \
+# gl_unittests \
+# gpu_unittests \
+# headless_unittests \
+# media_unittests \
+# media_mojo_unittests \
+# midi_unittests \
+# mojo_unittests \
+# net_unittests \
+# ppapi_unittests \
+# skia_unittests \
+# sql_unittests \
+# storage_unittests \
+# ui_base_unittests \
+# url_ipc_unittests \
+# unittests \
+
+TEST_MODULES= electron\ module \
+ app\ module \
+ autoUpdater\ module \
+ BrowserView\ module \
+ BrowserWindow\ with\ affinity\ module \
+ BrowserWindow\ module \
+ CallbacksRegistry\ module \
+ clipboard\ module \
+ contentTracing \
+ debugger\ module \
+ deprecations \
+ desktopCapturer \
+ dialog\ module \
+ globalShortcut\ module \
+ ipc\ main\ module \
+ ipc\ renderer\ module \
+ MenuItems \
+ Menu\ module \
+ nativeImage\ module \
+ netLog\ module \
+ net\ module \
+ Notification\ module \
+ powerMonitor \
+ powerSaveBlocker\ module \
+ process\ module \
+ protocol\ module \
+ remote\ module \
+ screen\ module \
+ session\ module \
+ shell\ module \
+ systemPreferences\ module \
+ TouchBar\ module \
+ tray\ module \
+ View \
+ webContents\ module \
+ WebContentsView \
+ webFrame\ module \
+ webRequest\ module \
+ asar\ package \
+ chromium\ feature \
+ modules\ support \
+ node\ feature \
+ security\ warnings \
+ <webview>\ tag
+
+# crashReporter\ module \
+# inAppPurchase\ module \
diff --git a/devel/electron4/distinfo b/devel/electron4/distinfo
new file mode 100644
index 000000000000..1f4de067c0ad
--- /dev/null
+++ b/devel/electron4/distinfo
@@ -0,0 +1,13 @@
+TIMESTAMP = 1558659133
+SHA256 (electron/chromium-69.0.3497.128.tar.xz) = af2b0ee2d16255fd28c3ef23a1481eebe58d6604f238b154594072e17ac643ed
+SIZE (electron/chromium-69.0.3497.128.tar.xz) = 1363607512
+SHA256 (electron/050c85d20f7cedd7f5c39533c1ba89dcdfa56a08) = d2e12fe5e144628f70536d1fea30fa817b7639f067e69f6a9e926f7311c9ec00
+SIZE (electron/050c85d20f7cedd7f5c39533c1ba89dcdfa56a08) = 4535767
+SHA256 (electron/electron-npm-modules-4.2.2.tar.xz) = eddd4bfc2ff327022472fbea884867501bd92d239008beb626bf45525cd6d767
+SIZE (electron/electron-npm-modules-4.2.2.tar.xz) = 15029072
+SHA256 (electron/a22de844e32a3f720d219e3911c3da3478039f89) = 6e331676d098a57c53c1250821dc47ed84c47f823901bf30c4704df90d8a34be
+SIZE (electron/a22de844e32a3f720d219e3911c3da3478039f89) = 17469927
+SHA256 (electron/electron-electron-v4.2.2_GH0.tar.gz) = 4df4e851d5f6fb2a38460618e2bdcc00542debaadca6b38da40f334de6aff616
+SIZE (electron/electron-electron-v4.2.2_GH0.tar.gz) = 6494168
+SHA256 (electron/electron-node-8bc5d171a0873c0ba49f9433798bc8b67399788c_GH0.tar.gz) = bc94083d3904643f17181c83db83a1c7d6557044e957185d0d73d88e82472b90
+SIZE (electron/electron-node-8bc5d171a0873c0ba49f9433798bc8b67399788c_GH0.tar.gz) = 56885474
diff --git a/devel/electron4/files/apply-electron-patches.sh b/devel/electron4/files/apply-electron-patches.sh
new file mode 100644
index 000000000000..300c8166f223
--- /dev/null
+++ b/devel/electron4/files/apply-electron-patches.sh
@@ -0,0 +1,20 @@
+#! /bin/sh
+
+PATH=/bin:/usr/bin:/usr/local/bin
+
+PATCH_CMD="git apply"
+#PATCH_FLAGS="--numstat --check" # for debugging
+PATCH_FLAGS="--verbose --reject"
+
+WRKSRC=$1
+PATCH_CONF=${WRKSRC}/electron/patches/common/config.json
+
+PATCHD_REPOD_PAIRS=$(sed -e '1d; $d; /^$/d; s/[",]//g; s/: */:/' "${PATCH_CONF}")
+for prp in ${PATCHD_REPOD_PAIRS}; do
+ pd=$(echo "${prp}" | awk -F: '{print $1}' | sed -e 's/src/./')
+ rd=$(echo "${prp}" | awk -F: '{print $2}' | sed -e 's/src/./')
+ (cd "${WRKSRC}/${rd}" && \
+ while read -r p; do
+ ${PATCH_CMD} ${PATCH_FLAGS} "${WRKSRC}/${pd}/${p}"
+ done < "${WRKSRC}/${pd}/.patches")
+done
diff --git a/devel/electron4/files/package-lock.json b/devel/electron4/files/package-lock.json
new file mode 100644
index 000000000000..7a58f8f95ea9
--- /dev/null
+++ b/devel/electron4/files/package-lock.json
@@ -0,0 +1,12232 @@
+{
+ "name": "electron",
+ "version": "4.2.2",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "^1.0.1",
+ "glob-to-regexp": "^0.3.0"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.2.tgz",
+ "integrity": "sha512-yprFYuno9FtNsSHVlSWd+nRlmGoAbqbeCwOryP6sC/zoCjhpArcRMYp19EvpSUSizJAlsXEwJv+wcWS9XaXdMw==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "7.0.70",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.70.tgz",
+ "integrity": "sha512-bAcW/1aM8/s5iFKhRpu/YJiQf/b1ZwnMRqqsWRCmAqEDQF2zY8Ez3Iu9AcZKFKc3vCJc8KJVpJ6Pn54sJ1BvXQ==",
+ "dev": true
+ },
+ "JSONStream": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz",
+ "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=",
+ "dev": true,
+ "requires": {
+ "jsonparse": "^1.2.0",
+ "through": ">=2.2.7 <3"
+ }
+ },
+ "abab": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
+ "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=",
+ "dev": true,
+ "optional": true
+ },
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=",
+ "dev": true
+ },
+ "accepts": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
+ "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+ "dev": true,
+ "requires": {
+ "mime-types": "~2.1.18",
+ "negotiator": "0.6.1"
+ }
+ },
+ "acorn": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+ "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
+ "dev": true
+ },
+ "acorn-globals": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz",
+ "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "acorn": "^2.1.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz",
+ "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "acorn-jsx": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz",
+ "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^5.0.3"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
+ "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
+ "dev": true
+ }
+ }
+ },
+ "acorn-node": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.3.0.tgz",
+ "integrity": "sha512-efP54n3d1aLfjL2UMdaXa6DsswwzJeI5rqhbFvXMrKiJ6eJFpf+7R0zN7t8IC+XKn2YOAFAv6xbBNgHUkoHWLw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^5.4.1",
+ "xtend": "^4.0.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
+ "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==",
+ "dev": true
+ }
+ }
+ },
+ "add-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz",
+ "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=",
+ "dev": true
+ },
+ "address": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz",
+ "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==",
+ "dev": true
+ },
+ "agent-base": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz",
+ "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=",
+ "dev": true,
+ "requires": {
+ "extend": "~3.0.0",
+ "semver": "~5.0.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
+ "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=",
+ "dev": true
+ }
+ }
+ },
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "requires": {
+ "co": "^4.6.0",
+ "fast-deep-equal": "^1.0.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.3.0"
+ }
+ },
+ "ajv-keywords": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
+ "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
+ "dev": true
+ },
+ "aliasify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/aliasify/-/aliasify-2.1.0.tgz",
+ "integrity": "sha1-fDCCW5RQueYYW6J1M+r24gZ9S0I=",
+ "dev": true,
+ "requires": {
+ "browserify-transform-tools": "~1.7.0"
+ }
+ },
+ "align-text": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2",
+ "longest": "^1.0.1",
+ "repeat-string": "^1.5.2"
+ }
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+ "dev": true
+ },
+ "ansi-align": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+ "dev": true,
+ "requires": {
+ "string-width": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ }
+ }
+ },
+ "ansi-escapes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
+ "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "anymatch": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+ "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=",
+ "dev": true,
+ "requires": {
+ "micromatch": "^2.1.5",
+ "normalize-path": "^2.0.0"
+ }
+ },
+ "arch": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz",
+ "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==",
+ "dev": true
+ },
+ "arg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-2.0.0.tgz",
+ "integrity": "sha512-XxNTUzKnz1ctK3ZIcI2XUPlD96wbHP2nGqkPKpvk/HNRlPveYrXIVSTk9m3LcqOgDPg3B1nMvdV/K8wZd7PG4w==",
+ "dev": true
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "args": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/args/-/args-4.0.0.tgz",
+ "integrity": "sha512-4b7lVF58nlo7sNtq8s2OueroOY/UHn0Nt/NVjsx9zn28u6yDVb9bQ/uy/5jKtHCbUDil4MlMyDLF5+OHEgnTug==",
+ "dev": true,
+ "requires": {
+ "camelcase": "5.0.0",
+ "chalk": "2.3.2",
+ "leven": "2.1.0",
+ "mri": "1.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "camelcase": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
+ "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.0.1"
+ }
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-filter": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
+ "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
+ "dev": true
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
+ },
+ "array-ify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
+ "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=",
+ "dev": true
+ },
+ "array-includes": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz",
+ "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "es-abstract": "^1.7.0"
+ }
+ },
+ "array-iterate": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.2.tgz",
+ "integrity": "sha512-1hWSHTIlG/8wtYD+PPX5AOBtKWngpDFjrsrHgZpe+JdgNGz0udYu6ZIkAa/xuenIUEqFv7DvE2Yr60jxweJSrQ==",
+ "dev": true
+ },
+ "array-map": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
+ "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
+ "dev": true
+ },
+ "array-reduce": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
+ "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
+ "dev": true
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "dev": true,
+ "requires": {
+ "array-uniq": "^1.0.1"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true
+ },
+ "asar": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/asar/-/asar-0.11.0.tgz",
+ "integrity": "sha1-uSbnksMV+MBIxDNx4yWwnJenZGQ=",
+ "dev": true,
+ "requires": {
+ "chromium-pickle-js": "^0.1.0",
+ "commander": "^2.9.0",
+ "cuint": "^0.2.1",
+ "glob": "^6.0.4",
+ "minimatch": "^3.0.0",
+ "mkdirp": "^0.5.0",
+ "mksnapshot": "^0.3.0"
+ }
+ },
+ "asn1": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "asn1.js": {
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
+ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "assert": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
+ "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+ "dev": true,
+ "requires": {
+ "util": "0.10.3"
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "astw": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz",
+ "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=",
+ "dev": true,
+ "requires": {
+ "acorn": "^4.0.3"
+ }
+ },
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ },
+ "async-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "^1.1.3",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.2"
+ }
+ },
+ "bail": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz",
+ "integrity": "sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
+ "base64-js": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
+ "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
+ "dev": true
+ },
+ "basic-auth": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz",
+ "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+ "dev": true
+ }
+ }
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "binary": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
+ "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=",
+ "dev": true,
+ "requires": {
+ "buffers": "~0.1.1",
+ "chainsaw": "~0.1.0"
+ }
+ },
+ "binary-extensions": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
+ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
+ "dev": true
+ },
+ "bl": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
+ "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.3.5",
+ "safe-buffer": "^5.1.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "bluebird": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
+ "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
+ "dev": true
+ },
+ "bn.js": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+ "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=",
+ "dev": true
+ },
+ "boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+ "dev": true
+ },
+ "boxen": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
+ "dev": true,
+ "requires": {
+ "ansi-align": "^2.0.0",
+ "camelcase": "^4.0.0",
+ "chalk": "^2.0.1",
+ "cli-boxes": "^1.0.0",
+ "string-width": "^2.0.0",
+ "term-size": "^1.2.0",
+ "widest-line": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "^1.8.1",
+ "preserve": "^0.2.0",
+ "repeat-element": "^1.1.2"
+ }
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+ "dev": true
+ },
+ "browser-pack": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
+ "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^1.0.3",
+ "combine-source-map": "~0.8.0",
+ "defined": "^1.0.0",
+ "safe-buffer": "^5.1.1",
+ "through2": "^2.0.0",
+ "umd": "^3.0.0"
+ }
+ },
+ "browser-resolve": {
+ "version": "1.11.2",
+ "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz",
+ "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=",
+ "dev": true,
+ "requires": {
+ "resolve": "1.1.7"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
+ "dev": true
+ }
+ }
+ },
+ "browserify": {
+ "version": "13.3.0",
+ "resolved": "https://registry.npmjs.org/browserify/-/browserify-13.3.0.tgz",
+ "integrity": "sha1-tanJAgJD8McORnW+yCI7xifkFc4=",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^1.0.3",
+ "assert": "^1.4.0",
+ "browser-pack": "^6.0.1",
+ "browser-resolve": "^1.11.0",
+ "browserify-zlib": "~0.1.2",
+ "buffer": "^4.1.0",
+ "cached-path-relative": "^1.0.0",
+ "concat-stream": "~1.5.1",
+ "console-browserify": "^1.1.0",
+ "constants-browserify": "~1.0.0",
+ "crypto-browserify": "^3.0.0",
+ "defined": "^1.0.0",
+ "deps-sort": "^2.0.0",
+ "domain-browser": "~1.1.0",
+ "duplexer2": "~0.1.2",
+ "events": "~1.1.0",
+ "glob": "^7.1.0",
+ "has": "^1.0.0",
+ "htmlescape": "^1.1.0",
+ "https-browserify": "~0.0.0",
+ "inherits": "~2.0.1",
+ "insert-module-globals": "^7.0.0",
+ "labeled-stream-splicer": "^2.0.0",
+ "module-deps": "^4.0.8",
+ "os-browserify": "~0.1.1",
+ "parents": "^1.0.1",
+ "path-browserify": "~0.0.0",
+ "process": "~0.11.0",
+ "punycode": "^1.3.2",
+ "querystring-es3": "~0.2.0",
+ "read-only-stream": "^2.0.0",
+ "readable-stream": "^2.0.2",
+ "resolve": "^1.1.4",
+ "shasum": "^1.0.0",
+ "shell-quote": "^1.6.1",
+ "stream-browserify": "^2.0.0",
+ "stream-http": "^2.0.0",
+ "string_decoder": "~0.10.0",
+ "subarg": "^1.0.0",
+ "syntax-error": "^1.1.1",
+ "through2": "^2.0.0",
+ "timers-browserify": "^1.0.1",
+ "tty-browserify": "~0.0.0",
+ "url": "~0.11.0",
+ "util": "~0.10.1",
+ "vm-browserify": "~0.0.1",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ },
+ "dependencies": {
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ }
+ }
+ },
+ "browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "dev": true,
+ "requires": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "browserify-cipher": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "dev": true,
+ "requires": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "browserify-des": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz",
+ "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "browserify-rsa": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "browserify-sign": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
+ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.1",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.2",
+ "elliptic": "^6.0.0",
+ "inherits": "^2.0.1",
+ "parse-asn1": "^5.0.0"
+ }
+ },
+ "browserify-transform-tools": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/browserify-transform-tools/-/browserify-transform-tools-1.7.0.tgz",
+ "integrity": "sha1-g+J3Ih9jJZvtLn6yooOpcKUB9MQ=",
+ "dev": true,
+ "requires": {
+ "falafel": "^2.0.0",
+ "through": "^2.3.7"
+ }
+ },
+ "browserify-zlib": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
+ "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
+ "dev": true,
+ "requires": {
+ "pako": "~0.2.0"
+ }
+ },
+ "buffer": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4",
+ "isarray": "^1.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ }
+ }
+ },
+ "buffer-alloc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+ "dev": true,
+ "requires": {
+ "buffer-alloc-unsafe": "^1.1.0",
+ "buffer-fill": "^1.0.0"
+ }
+ },
+ "buffer-alloc-unsafe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
+ "dev": true
+ },
+ "buffer-fill": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
+ "dev": true
+ },
+ "buffer-from": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz",
+ "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==",
+ "dev": true
+ },
+ "buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+ "dev": true
+ },
+ "buffers": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz",
+ "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=",
+ "dev": true
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "builtin-status-codes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+ "dev": true
+ },
+ "bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+ "dev": true
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "cached-path-relative": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz",
+ "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=",
+ "dev": true
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "dev": true,
+ "requires": {
+ "callsites": "^0.2.0"
+ }
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+ "dev": true,
+ "optional": true
+ },
+ "camelcase-keys": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
+ "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^4.1.0",
+ "map-obj": "^2.0.0",
+ "quick-lru": "^1.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ }
+ }
+ },
+ "capture-stack-trace": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
+ "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "ccount": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz",
+ "integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==",
+ "dev": true
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "align-text": "^0.1.3",
+ "lazy-cache": "^1.0.3"
+ }
+ },
+ "chainsaw": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
+ "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=",
+ "dev": true,
+ "requires": {
+ "traverse": ">=0.3.0 <0.4"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "character-entities": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.2.tgz",
+ "integrity": "sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==",
+ "dev": true
+ },
+ "character-entities-html4": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.2.tgz",
+ "integrity": "sha512-sIrXwyna2+5b0eB9W149izTPJk/KkJTg6mEzDGibwBUkyH1SbDa+nf515Ppdi3MaH35lW0JFJDWeq9Luzes1Iw==",
+ "dev": true
+ },
+ "character-entities-legacy": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz",
+ "integrity": "sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==",
+ "dev": true
+ },
+ "character-reference-invalid": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz",
+ "integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==",
+ "dev": true
+ },
+ "chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+ "dev": true
+ },
+ "check-for-leaks": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/check-for-leaks/-/check-for-leaks-1.2.0.tgz",
+ "integrity": "sha1-6jtQFk6XV3kzLGKBMZX/jGr4Jsw=",
+ "dev": true,
+ "requires": {
+ "anymatch": "^1.3.0",
+ "minimist": "^1.2.0",
+ "parse-gitignore": "^0.4.0",
+ "walk-sync": "^0.3.2"
+ }
+ },
+ "checksum": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/checksum/-/checksum-0.1.1.tgz",
+ "integrity": "sha1-3GUn1MkL6FYNvR7Uzs8yl9Uo6ek=",
+ "dev": true,
+ "requires": {
+ "optimist": "~0.3.5"
+ }
+ },
+ "cheerio": {
+ "version": "0.22.0",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz",
+ "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=",
+ "dev": true,
+ "requires": {
+ "css-select": "~1.2.0",
+ "dom-serializer": "~0.1.0",
+ "entities": "~1.1.1",
+ "htmlparser2": "^3.9.1",
+ "lodash.assignin": "^4.0.9",
+ "lodash.bind": "^4.1.4",
+ "lodash.defaults": "^4.0.1",
+ "lodash.filter": "^4.4.0",
+ "lodash.flatten": "^4.2.0",
+ "lodash.foreach": "^4.3.0",
+ "lodash.map": "^4.4.0",
+ "lodash.merge": "^4.4.0",
+ "lodash.pick": "^4.2.1",
+ "lodash.reduce": "^4.4.0",
+ "lodash.reject": "^4.4.0",
+ "lodash.some": "^4.4.0"
+ }
+ },
+ "chokidar": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
+ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+ "dev": true,
+ "requires": {
+ "anymatch": "^1.3.0",
+ "async-each": "^1.0.0",
+ "fsevents": "^1.0.0",
+ "glob-parent": "^2.0.0",
+ "inherits": "^2.0.1",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^2.0.0",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.0.0"
+ }
+ },
+ "chownr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz",
+ "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=",
+ "dev": true
+ },
+ "chromium-pickle-js": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.1.0.tgz",
+ "integrity": "sha1-HUixB9ghJqLz4hHC6iX4A7pVGyE=",
+ "dev": true
+ },
+ "ci-info": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz",
+ "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==",
+ "dev": true
+ },
+ "cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "circular-json": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+ "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=",
+ "dev": true
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "^1.5.2",
+ "glob": "^7.0.0",
+ "resolve": "^1.1.6"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "clean-deep": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/clean-deep/-/clean-deep-2.0.2.tgz",
+ "integrity": "sha1-d83ZTmsmZkTw95Cy9XbL7wOOJ8E=",
+ "dev": true,
+ "requires": {
+ "lodash.isempty": "^4.4.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.transform": "^4.6.0"
+ }
+ },
+ "cli-boxes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
+ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^1.0.1"
+ }
+ },
+ "cli-spinners": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz",
+ "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=",
+ "dev": true
+ },
+ "cli-width": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+ "dev": true
+ },
+ "clipboardy": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz",
+ "integrity": "sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA==",
+ "dev": true,
+ "requires": {
+ "arch": "^2.1.0",
+ "execa": "^0.8.0"
+ },
+ "dependencies": {
+ "execa": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz",
+ "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^5.0.1",
+ "get-stream": "^3.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ }
+ }
+ }
+ },
+ "cliui": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "center-align": "^0.1.1",
+ "right-align": "^0.1.1",
+ "wordwrap": "0.0.2"
+ },
+ "dependencies": {
+ "wordwrap": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "dev": true
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true
+ },
+ "collapse-white-space": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz",
+ "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "^1.1.1"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz",
+ "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==",
+ "dev": true
+ },
+ "combine-source-map": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
+ "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=",
+ "dev": true,
+ "requires": {
+ "convert-source-map": "~1.1.0",
+ "inline-source-map": "~0.6.0",
+ "lodash.memoize": "~3.0.3",
+ "source-map": "~0.5.3"
+ }
+ },
+ "combined-stream": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+ "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
+ "dev": true
+ },
+ "compare-func": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz",
+ "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=",
+ "dev": true,
+ "requires": {
+ "array-ify": "^1.0.0",
+ "dot-prop": "^3.0.0"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "compressible": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz",
+ "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=",
+ "dev": true,
+ "requires": {
+ "mime-db": ">= 1.34.0 < 2"
+ },
+ "dependencies": {
+ "mime-db": {
+ "version": "1.35.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz",
+ "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==",
+ "dev": true
+ }
+ }
+ },
+ "compression": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz",
+ "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==",
+ "dev": true,
+ "requires": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.14",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.1",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz",
+ "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=",
+ "dev": true,
+ "requires": {
+ "inherits": "~2.0.1",
+ "readable-stream": "~2.0.0",
+ "typedarray": "~0.0.5"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+ "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~1.0.6",
+ "string_decoder": "~0.10.x",
+ "util-deprecate": "~1.0.1"
+ }
+ }
+ }
+ },
+ "configstore": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
+ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
+ "dev": true,
+ "requires": {
+ "dot-prop": "^4.1.0",
+ "graceful-fs": "^4.1.2",
+ "make-dir": "^1.0.0",
+ "unique-string": "^1.0.0",
+ "write-file-atomic": "^2.0.0",
+ "xdg-basedir": "^3.0.0"
+ },
+ "dependencies": {
+ "dot-prop": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+ "dev": true,
+ "requires": {
+ "is-obj": "^1.0.0"
+ }
+ }
+ }
+ },
+ "console-browserify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+ "dev": true,
+ "requires": {
+ "date-now": "^0.1.4"
+ }
+ },
+ "constants-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+ "dev": true
+ },
+ "contains-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+ "dev": true
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "dev": true
+ },
+ "conventional-changelog": {
+ "version": "1.1.24",
+ "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.24.tgz",
+ "integrity": "sha512-2WcSUst4Y3Z4hHvoMTWXMJr/DmgVdLiMOVY1Kak2LfFz+GIz2KDp5naqbFesYbfXPmaZ5p491dO0FWZIJoJw1Q==",
+ "dev": true,
+ "requires": {
+ "conventional-changelog-angular": "^1.6.6",
+ "conventional-changelog-atom": "^0.2.8",
+ "conventional-changelog-codemirror": "^0.3.8",
+ "conventional-changelog-core": "^2.0.11",
+ "conventional-changelog-ember": "^0.3.12",
+ "conventional-changelog-eslint": "^1.0.9",
+ "conventional-changelog-express": "^0.3.6",
+ "conventional-changelog-jquery": "^0.1.0",
+ "conventional-changelog-jscs": "^0.1.0",
+ "conventional-changelog-jshint": "^0.3.8",
+ "conventional-changelog-preset-loader": "^1.1.8"
+ }
+ },
+ "conventional-changelog-angular": {
+ "version": "1.6.6",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz",
+ "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==",
+ "dev": true,
+ "requires": {
+ "compare-func": "^1.3.1",
+ "q": "^1.5.1"
+ }
+ },
+ "conventional-changelog-atom": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.8.tgz",
+ "integrity": "sha512-8pPZqhMbrnltNBizjoDCb/Sz85KyUXNDQxuAEYAU5V/eHn0okMBVjqc8aHWYpHrytyZWvMGbayOlDv7i8kEf6g==",
+ "dev": true,
+ "requires": {
+ "q": "^1.5.1"
+ }
+ },
+ "conventional-changelog-cli": {
+ "version": "1.3.22",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-1.3.22.tgz",
+ "integrity": "sha512-pnjdIJbxjkZ5VdAX/H1wndr1G10CY8MuZgnXuJhIHglOXfIrXygb7KZC836GW9uo1u8PjEIvIw/bKX0lOmOzZg==",
+ "dev": true,
+ "requires": {
+ "add-stream": "^1.0.0",
+ "conventional-changelog": "^1.1.24",
+ "lodash": "^4.2.1",
+ "meow": "^4.0.0",
+ "tempfile": "^1.1.1"
+ }
+ },
+ "conventional-changelog-codemirror": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.8.tgz",
+ "integrity": "sha512-3HFZKtBXTaUCHvz7ai6nk2+psRIkldDoNzCsom0egDtVmPsvvHZkzjynhdQyULfacRSsBTaiQ0ol6nBOL4dDiQ==",
+ "dev": true,
+ "requires": {
+ "q": "^1.5.1"
+ }
+ },
+ "conventional-changelog-core": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.11.tgz",
+ "integrity": "sha512-HvTE6RlqeEZ/NFPtQeFLsIDOLrGP3bXYr7lFLMhCVsbduF1MXIe8OODkwMFyo1i9ku9NWBwVnVn0jDmIFXjDRg==",
+ "dev": true,
+ "requires": {
+ "conventional-changelog-writer": "^3.0.9",
+ "conventional-commits-parser": "^2.1.7",
+ "dateformat": "^3.0.0",
+ "get-pkg-repo": "^1.0.0",
+ "git-raw-commits": "^1.3.6",
+ "git-remote-origin-url": "^2.0.0",
+ "git-semver-tags": "^1.3.6",
+ "lodash": "^4.2.1",
+ "normalize-package-data": "^2.3.5",
+ "q": "^1.5.1",
+ "read-pkg": "^1.1.0",
+ "read-pkg-up": "^1.0.1",
+ "through2": "^2.0.0"
+ }
+ },
+ "conventional-changelog-ember": {
+ "version": "0.3.12",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.12.tgz",
+ "integrity": "sha512-mmJzA7uzbrOqeF89dMMi6z17O07ORTXlTMArnLG9ZTX4oLaKNolUlxFUFlFm9JUoVWajVpaHQWjxH1EOQ+ARoQ==",
+ "dev": true,
+ "requires": {
+ "q": "^1.5.1"
+ }
+ },
+ "conventional-changelog-eslint": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.9.tgz",
+ "integrity": "sha512-h87nfVh2fdk9fJIvz26wCBsbDC/KxqCc5wSlNMZbXcARtbgNbNDIF7Y7ctokFdnxkzVdaHsbINkh548T9eBA7Q==",
+ "dev": true,
+ "requires": {
+ "q": "^1.5.1"
+ }
+ },
+ "conventional-changelog-express": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.6.tgz",
+ "integrity": "sha512-3iWVtBJZ9RnRnZveNDzOD8QRn6g6vUif0qVTWWyi5nUIAbuN1FfPVyKdAlJJfp5Im+dE8Kiy/d2SpaX/0X678Q==",
+ "dev": true,
+ "requires": {
+ "q": "^1.5.1"
+ }
+ },
+ "conventional-changelog-jquery": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz",
+ "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=",
+ "dev": true,
+ "requires": {
+ "q": "^1.4.1"
+ }
+ },
+ "conventional-changelog-jscs": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz",
+ "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=",
+ "dev": true,
+ "requires": {
+ "q": "^1.4.1"
+ }
+ },
+ "conventional-changelog-jshint": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.8.tgz",
+ "integrity": "sha512-hn9QU4ZI/5V50wKPJNPGT4gEWgiBFpV6adieILW4MaUFynuDYOvQ71EMSj3EznJyKi/KzuXpc9dGmX8njZMjig==",
+ "dev": true,
+ "requires": {
+ "compare-func": "^1.3.1",
+ "q": "^1.5.1"
+ }
+ },
+ "conventional-changelog-preset-loader": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz",
+ "integrity": "sha512-MkksM4G4YdrMlT2MbTsV2F6LXu/hZR0Tc/yenRrDIKRwBl/SP7ER4ZDlglqJsCzLJi4UonBc52Bkm5hzrOVCcw==",
+ "dev": true
+ },
+ "conventional-changelog-writer": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz",
+ "integrity": "sha512-n9KbsxlJxRQsUnK6wIBRnARacvNnN4C/nxnxCkH+B/R1JS2Fa+DiP1dU4I59mEDEjgnFaN2+9wr1P1s7GYB5/Q==",
+ "dev": true,
+ "requires": {
+ "compare-func": "^1.3.1",
+ "conventional-commits-filter": "^1.1.6",
+ "dateformat": "^3.0.0",
+ "handlebars": "^4.0.2",
+ "json-stringify-safe": "^5.0.1",
+ "lodash": "^4.2.1",
+ "meow": "^4.0.0",
+ "semver": "^5.5.0",
+ "split": "^1.0.0",
+ "through2": "^2.0.0"
+ }
+ },
+ "conventional-commits-filter": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz",
+ "integrity": "sha512-KcDgtCRKJCQhyk6VLT7zR+ZOyCnerfemE/CsR3iQpzRRFbLEs0Y6rwk3mpDvtOh04X223z+1xyJ582Stfct/0Q==",
+ "dev": true,
+ "requires": {
+ "is-subset": "^0.1.1",
+ "modify-values": "^1.0.0"
+ }
+ },
+ "conventional-commits-parser": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz",
+ "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^1.0.4",
+ "is-text-path": "^1.0.0",
+ "lodash": "^4.2.1",
+ "meow": "^4.0.0",
+ "split2": "^2.0.0",
+ "through2": "^2.0.0",
+ "trim-off-newlines": "^1.0.0"
+ }
+ },
+ "convert-source-map": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
+ "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "create-ecdh": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
+ "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.0.0"
+ }
+ },
+ "create-error-class": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+ "dev": true,
+ "requires": {
+ "capture-stack-trace": "^1.0.0"
+ }
+ },
+ "create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "crypto-browserify": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+ "dev": true,
+ "requires": {
+ "browserify-cipher": "^1.0.0",
+ "browserify-sign": "^4.0.0",
+ "create-ecdh": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.0",
+ "diffie-hellman": "^5.0.0",
+ "inherits": "^2.0.1",
+ "pbkdf2": "^3.0.3",
+ "public-encrypt": "^4.0.0",
+ "randombytes": "^2.0.0",
+ "randomfill": "^1.0.3"
+ }
+ },
+ "crypto-random-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
+ "dev": true
+ },
+ "css-select": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
+ "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+ "dev": true,
+ "requires": {
+ "boolbase": "~1.0.0",
+ "css-what": "2.1",
+ "domutils": "1.5.1",
+ "nth-check": "~1.0.1"
+ }
+ },
+ "css-what": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
+ "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
+ "dev": true
+ },
+ "cssom": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz",
+ "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==",
+ "dev": true
+ },
+ "cssstyle": {
+ "version": "0.2.37",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
+ "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "cssom": "0.3.x"
+ }
+ },
+ "cuint": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz",
+ "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=",
+ "dev": true
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "^1.0.1"
+ }
+ },
+ "dargs": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz",
+ "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "date-now": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
+ "dev": true
+ },
+ "dateformat": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
+ "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "debug-log": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz",
+ "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=",
+ "dev": true
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "decamelize-keys": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
+ "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
+ "dev": true,
+ "requires": {
+ "decamelize": "^1.1.0",
+ "map-obj": "^1.0.0"
+ },
+ "dependencies": {
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ }
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "decompress-zip": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.0.tgz",
+ "integrity": "sha1-rjvLfjTGWHmt/nfhnDD4ZgK0vbA=",
+ "dev": true,
+ "requires": {
+ "binary": "^0.3.0",
+ "graceful-fs": "^4.1.3",
+ "mkpath": "^0.1.0",
+ "nopt": "^3.0.1",
+ "q": "^1.1.2",
+ "readable-stream": "^1.1.8",
+ "touch": "0.0.3"
+ }
+ },
+ "dedent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.6.0.tgz",
+ "integrity": "sha1-Dm2o8M5Sg471zsXI+TlrDBtko8s=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+ "dev": true,
+ "requires": {
+ "clone": "^1.0.2"
+ }
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ },
+ "dependencies": {
+ "object-keys": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
+ "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
+ "dev": true
+ }
+ }
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
+ "defined": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
+ "dev": true
+ },
+ "deglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz",
+ "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==",
+ "dev": true,
+ "requires": {
+ "find-root": "^1.0.0",
+ "glob": "^7.0.5",
+ "ignore": "^3.0.9",
+ "pkg-config": "^1.1.0",
+ "run-parallel": "^1.1.2",
+ "uniq": "^1.0.1"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
+ }
+ },
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "dev": true,
+ "requires": {
+ "globby": "^5.0.0",
+ "is-path-cwd": "^1.0.0",
+ "is-path-in-cwd": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "rimraf": "^2.2.8"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
+ "depd": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
+ "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
+ "dev": true
+ },
+ "deps-sort": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz",
+ "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^1.0.3",
+ "shasum": "^1.0.0",
+ "subarg": "^1.0.0",
+ "through2": "^2.0.0"
+ }
+ },
+ "des.js": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
+ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+ "dev": true
+ },
+ "detect-port": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.2.3.tgz",
+ "integrity": "sha512-IDbrX6PxqnYy8jV4wSHBaJlErYKTJvW8OQb9F7xivl1iQLqiUYHGa+nZ61Do6+N5uuOn/pReXKNqI9rUn04vug==",
+ "dev": true,
+ "requires": {
+ "address": "^1.0.1",
+ "debug": "^2.6.0"
+ }
+ },
+ "detective": {
+ "version": "4.7.1",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz",
+ "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==",
+ "dev": true,
+ "requires": {
+ "acorn": "^5.2.1",
+ "defined": "^1.0.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
+ "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==",
+ "dev": true
+ }
+ }
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ }
+ },
+ "dir-glob": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
+ "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
+ "dev": true,
+ "requires": {
+ "arrify": "^1.0.1",
+ "path-type": "^3.0.0"
+ },
+ "dependencies": {
+ "path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "requires": {
+ "pify": "^3.0.0"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "dom-serializer": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
+ "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "~1.1.1",
+ "entities": "~1.1.1"
+ },
+ "dependencies": {
+ "domelementtype": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
+ "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
+ "dev": true
+ }
+ }
+ },
+ "domain-browser": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz",
+ "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=",
+ "dev": true
+ },
+ "domelementtype": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
+ "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
+ "dev": true
+ },
+ "domhandler": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1"
+ }
+ },
+ "domutils": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
+ "dot-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz",
+ "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
+ "dev": true,
+ "requires": {
+ "is-obj": "^1.0.0"
+ }
+ },
+ "dotenv": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz",
+ "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=",
+ "dev": true
+ },
+ "dotenv-safe": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/dotenv-safe/-/dotenv-safe-4.0.4.tgz",
+ "integrity": "sha1-iw587Y5wsdPF2HTvlCDkBvOUJbM=",
+ "dev": true,
+ "requires": {
+ "dotenv": "^4.0.0"
+ }
+ },
+ "dugite": {
+ "version": "1.63.0",
+ "resolved": "https://registry.npmjs.org/dugite/-/dugite-1.63.0.tgz",
+ "integrity": "sha512-CFd0sWTB2oouat0kJA4/rEQAeh6ZUvCDL9uFOaSBhLX+2CM/YL+ebKJXd8dYVIe8iVXmK5R9P31NVbRw4Ccoxw==",
+ "dev": true,
+ "requires": {
+ "checksum": "^0.1.1",
+ "mkdirp": "^0.5.1",
+ "progress": "^2.0.0",
+ "request": "^2.85.0",
+ "rimraf": "^2.5.4",
+ "tar": "^4.0.2"
+ }
+ },
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.0.2"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+ "dev": true
+ },
+ "duplexify": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz",
+ "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0",
+ "stream-shift": "^1.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true
+ },
+ "electabul": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/electabul/-/electabul-0.0.4.tgz",
+ "integrity": "sha1-aBO+LTdwciKVrFXxM0/mu5iymsI=",
+ "dev": true,
+ "requires": {
+ "asar": "^0.12.1",
+ "glob": "^7.0.5",
+ "istanbul": "^0.4.4",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.4",
+ "temp": "^0.8.3",
+ "yargs": "^4.8.1"
+ },
+ "dependencies": {
+ "asar": {
+ "version": "0.12.4",
+ "resolved": "https://registry.npmjs.org/asar/-/asar-0.12.4.tgz",
+ "integrity": "sha1-LdPxFoguq4wPI7dUeSqCp9n84XE=",
+ "dev": true,
+ "requires": {
+ "chromium-pickle-js": "^0.2.0",
+ "commander": "^2.9.0",
+ "cuint": "^0.2.1",
+ "glob": "^6.0.4",
+ "minimatch": "^3.0.3",
+ "mkdirp": "^0.5.0",
+ "mksnapshot": "^0.3.0",
+ "tmp": "0.0.28"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
+ "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
+ "dev": true,
+ "requires": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
+ }
+ },
+ "chromium-pickle-js": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
+ "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
+ }
+ },
+ "electron-docs": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/electron-docs/-/electron-docs-2.0.1.tgz",
+ "integrity": "sha1-ARI6T8y2vieswSgAJ7/LJAxUsdI=",
+ "dev": true,
+ "requires": {
+ "got": "^6.3.0",
+ "gunzip-maybe": "^1.3.1",
+ "node-dir": "^0.1.12",
+ "ora": "^0.2.3",
+ "path-exists": "^3.0.0",
+ "pify": "^2.3.0",
+ "semver": "^5.1.0",
+ "tar-fs": "^1.13.0"
+ },
+ "dependencies": {
+ "ora": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz",
+ "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=",
+ "dev": true,
+ "requires": {
+ "chalk": "^1.1.1",
+ "cli-cursor": "^1.0.2",
+ "cli-spinners": "^0.1.2",
+ "object-assign": "^4.0.1"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ }
+ }
+ },
+ "electron-docs-linter": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/electron-docs-linter/-/electron-docs-linter-2.4.0.tgz",
+ "integrity": "sha512-WvxXsk6kl4x0nrQOqMYAXsMMbSouSwa8VeNd+Bps9HM7QXuNNNVPFB1UEdykq06HWS60lUt4VUiAjQjAJJpcSg==",
+ "dev": true,
+ "requires": {
+ "cheerio": "^0.22.0",
+ "clean-deep": "^2.0.1",
+ "decamelize": "^1.2.0",
+ "dedent": "^0.6.0",
+ "electron-docs": "^2.0.1",
+ "entities": "^1.1.1",
+ "keyed-array": "^2.1.2",
+ "lodash.merge": "^4.6.0",
+ "lodash.pick": "^4.2.1",
+ "marky-markdown-lite": "^1.2.0",
+ "minimist": "^1.2.0",
+ "ora": "^0.3.0",
+ "path-exists": "^3.0.0",
+ "pify": "^2.3.0",
+ "revalidator": "^0.3.1",
+ "semver": "^5.3.0"
+ },
+ "dependencies": {
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ }
+ }
+ },
+ "electron-typescript-definitions": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/electron-typescript-definitions/-/electron-typescript-definitions-2.1.1.tgz",
+ "integrity": "sha512-vrEhi3hhPzUEDLwPGOqScYBLefNKH5r9odp3dy/lqE0nhAmUHBkrwnU5jVga3A2pJW22wzCCB1kwkEoPV7Rq4w==",
+ "dev": true,
+ "requires": {
+ "@types/node": "^7.0.18",
+ "colors": "^1.1.2",
+ "debug": "^2.6.3",
+ "electron-docs": "^2.0.0",
+ "electron-docs-linter": "^2.4.0",
+ "lodash": "^4.17.11",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.4",
+ "tslint": "^4.5.1",
+ "typescript": "^2.2.1"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.11",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+ "dev": true
+ }
+ }
+ },
+ "elliptic": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
+ "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.4.0",
+ "brorand": "^1.0.1",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.0"
+ }
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "dev": true
+ },
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "dev": true,
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "ensure-posix-path": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz",
+ "integrity": "sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI=",
+ "dev": true
+ },
+ "entities": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
+ "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
+ "dev": true
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "es-abstract": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
+ "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.1.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.1",
+ "is-callable": "^1.1.3",
+ "is-regex": "^1.0.4"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
+ "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.1",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.1"
+ }
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
+ "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
+ "dev": true,
+ "requires": {
+ "esprima": "^2.7.1",
+ "estraverse": "^1.9.1",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1",
+ "source-map": "~0.2.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
+ "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "amdefine": ">=0.0.4"
+ }
+ }
+ }
+ },
+ "eslint": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.6.0.tgz",
+ "integrity": "sha512-/eVYs9VVVboX286mBK7bbKnO1yamUy2UCRjiY6MryhQL2PaaXCExsCQ2aO83OeYRhU2eCU/FMFP+tVMoOrzNrA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "ajv": "^6.5.3",
+ "chalk": "^2.1.0",
+ "cross-spawn": "^6.0.5",
+ "debug": "^3.1.0",
+ "doctrine": "^2.1.0",
+ "eslint-scope": "^4.0.0",
+ "eslint-utils": "^1.3.1",
+ "eslint-visitor-keys": "^1.0.0",
+ "espree": "^4.0.0",
+ "esquery": "^1.0.1",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^2.0.0",
+ "functional-red-black-tree": "^1.0.1",
+ "glob": "^7.1.2",
+ "globals": "^11.7.0",
+ "ignore": "^4.0.6",
+ "imurmurhash": "^0.1.4",
+ "inquirer": "^6.1.0",
+ "is-resolvable": "^1.1.0",
+ "js-yaml": "^3.12.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.3.0",
+ "lodash": "^4.17.5",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.8.2",
+ "path-is-inside": "^1.0.2",
+ "pluralize": "^7.0.0",
+ "progress": "^2.0.0",
+ "regexpp": "^2.0.0",
+ "require-uncached": "^1.0.3",
+ "semver": "^5.5.1",
+ "strip-ansi": "^4.0.0",
+ "strip-json-comments": "^2.0.1",
+ "table": "^4.0.3",
+ "text-table": "^0.2.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz",
+ "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "requires": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "debug": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz",
+ "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
+ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.5.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
+ "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "eslint-config-standard": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz",
+ "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==",
+ "dev": true
+ },
+ "eslint-config-standard-jsx": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz",
+ "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==",
+ "dev": true
+ },
+ "eslint-import-resolver-node": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
+ "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==",
+ "dev": true,
+ "requires": {
+ "debug": "^2.6.9",
+ "resolve": "^1.5.0"
+ }
+ },
+ "eslint-module-utils": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz",
+ "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.6.8",
+ "pkg-dir": "^1.0.0"
+ }
+ },
+ "eslint-plugin-es": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.3.1.tgz",
+ "integrity": "sha512-9XcVyZiQRVeFjqHw8qHNDAZcQLqaHlOGGpeYqzYh8S4JYCWTCO3yzyen8yVmA5PratfzTRWDwCOFphtDEG+w/w==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^1.3.0",
+ "regexpp": "^2.0.0"
+ }
+ },
+ "eslint-plugin-import": {
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz",
+ "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==",
+ "dev": true,
+ "requires": {
+ "contains-path": "^0.1.0",
+ "debug": "^2.6.8",
+ "doctrine": "1.5.0",
+ "eslint-import-resolver-node": "^0.3.1",
+ "eslint-module-utils": "^2.2.0",
+ "has": "^1.0.1",
+ "lodash": "^4.17.4",
+ "minimatch": "^3.0.3",
+ "read-pkg-up": "^2.0.0",
+ "resolve": "^1.6.0"
+ },
+ "dependencies": {
+ "doctrine": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2",
+ "isarray": "^1.0.0"
+ }
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "dev": true,
+ "requires": {
+ "pify": "^2.0.0"
+ }
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^2.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.0.0",
+ "read-pkg": "^2.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-mocha": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-5.2.0.tgz",
+ "integrity": "sha512-4VTX/qIoxUFRnXLNm6bEhEJyfGnGagmQzV4TWXKzkZgIYyP2FSubEdCjEFTyS/dGwSVRWCWGX7jO7BK8R0kppg==",
+ "dev": true,
+ "requires": {
+ "ramda": "^0.25.0"
+ }
+ },
+ "eslint-plugin-node": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz",
+ "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==",
+ "dev": true,
+ "requires": {
+ "eslint-plugin-es": "^1.3.1",
+ "eslint-utils": "^1.3.1",
+ "ignore": "^4.0.2",
+ "minimatch": "^3.0.4",
+ "resolve": "^1.8.1",
+ "semver": "^5.5.0"
+ },
+ "dependencies": {
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
+ "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.5"
+ }
+ }
+ }
+ },
+ "eslint-plugin-promise": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz",
+ "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==",
+ "dev": true
+ },
+ "eslint-plugin-react": {
+ "version": "7.11.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz",
+ "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.0.3",
+ "doctrine": "^2.1.0",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^2.0.1",
+ "prop-types": "^15.6.2"
+ },
+ "dependencies": {
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ }
+ }
+ },
+ "eslint-plugin-standard": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz",
+ "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==",
+ "dev": true
+ },
+ "eslint-scope": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
+ "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ }
+ }
+ },
+ "eslint-utils": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz",
+ "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==",
+ "dev": true
+ },
+ "eslint-visitor-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+ "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz",
+ "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==",
+ "dev": true,
+ "requires": {
+ "acorn": "^5.6.0",
+ "acorn-jsx": "^4.1.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
+ "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
+ "dev": true
+ }
+ }
+ },
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
+ "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^4.0.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^4.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
+ "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "dev": true
+ },
+ "events": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
+ "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
+ "dev": true
+ },
+ "evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=",
+ "dev": true,
+ "requires": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^5.0.1",
+ "get-stream": "^3.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ }
+ },
+ "exit-hook": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
+ "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "^0.1.0"
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "dev": true,
+ "requires": {
+ "fill-range": "^2.1.0"
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "external-editor": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
+ "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
+ "dev": true,
+ "requires": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ },
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "~1.0.2"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^1.0.0"
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "falafel": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz",
+ "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=",
+ "dev": true,
+ "requires": {
+ "acorn": "^5.0.0",
+ "foreach": "^2.0.5",
+ "isarray": "0.0.1",
+ "object-keys": "^1.0.6"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
+ "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
+ "dev": true
+ },
+ "object-keys": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
+ "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
+ "dev": true
+ }
+ }
+ },
+ "fast-deep-equal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz",
+ "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "^2.2.1",
+ "@nodelib/fs.stat": "^1.0.1",
+ "glob-parent": "^3.1.0",
+ "is-glob": "^4.0.0",
+ "merge2": "^1.2.1",
+ "micromatch": "^3.1.10"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ }
+ }
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fault": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.2.tgz",
+ "integrity": "sha512-o2eo/X2syzzERAtN5LcGbiVQ0WwZSlN3qLtadwAz3X8Bu+XWD16dja/KMsjZLiQr+BLGPDnHGkc4yUJf1Xpkpw==",
+ "dev": true,
+ "requires": {
+ "format": "^0.2.2"
+ }
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "^1.0.5"
+ }
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^1.2.1",
+ "object-assign": "^4.0.1"
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+ "dev": true
+ },
+ "filesize": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz",
+ "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+ "dev": true,
+ "requires": {
+ "is-number": "^2.1.0",
+ "isobject": "^2.0.0",
+ "randomatic": "^3.0.0",
+ "repeat-element": "^1.1.2",
+ "repeat-string": "^1.5.2"
+ }
+ },
+ "find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha1-q8/Iunb3CMQql7PWhbfpRQv7nOQ=",
+ "dev": true
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "findup-sync": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
+ "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
+ "dev": true,
+ "requires": {
+ "glob": "~5.0.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
+ }
+ },
+ "flat-cache": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
+ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+ "dev": true,
+ "requires": {
+ "circular-json": "^0.3.1",
+ "del": "^2.0.2",
+ "graceful-fs": "^4.1.2",
+ "write": "^0.2.1"
+ }
+ },
+ "fn-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz",
+ "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=",
+ "dev": true
+ },
+ "folder-hash": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/folder-hash/-/folder-hash-2.1.1.tgz",
+ "integrity": "sha512-owr5AVhj+nxnzsyDLOiwSUC6S3mqcxJSfZneFgOYoaScMBwPGt3cz0XiBPRrCIUk2Hs1ucQXFGwfB40JxBqb4w==",
+ "dev": true,
+ "requires": {
+ "debug": "^3.1.0",
+ "graceful-fs": "~4.1.11",
+ "minimatch": "~3.0.4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz",
+ "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ }
+ }
+ },
+ "follow-redirects": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-0.0.7.tgz",
+ "integrity": "sha1-NLkLqyqRGqNHVx2pDyK9NuzYqRk=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.2.0",
+ "stream-consume": "^0.1.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "for-own": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+ "dev": true,
+ "requires": {
+ "for-in": "^1.0.1"
+ }
+ },
+ "foreach": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
+ "dev": true
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
+ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
+ "dev": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "format": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
+ "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "^0.2.2"
+ }
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "dev": true
+ },
+ "fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+ "dev": true
+ },
+ "fs-extra": {
+ "version": "0.26.7",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz",
+ "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^2.1.0",
+ "klaw": "^1.0.0",
+ "path-is-absolute": "^1.0.0",
+ "rimraf": "^2.2.8"
+ }
+ },
+ "fs-minipass": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
+ "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
+ "dev": true,
+ "requires": {
+ "minipass": "^2.2.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
+ "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nan": "^2.9.2",
+ "node-pre-gyp": "^0.10.0"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^2.0.6"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chownr": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "detect-libc": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "fs-minipass": {
+ "version": "1.2.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "^2.2.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aproba": "^1.0.3",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.0",
+ "object-assign": "^4.1.0",
+ "signal-exit": "^3.0.0",
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wide-align": "^1.1.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "iconv-lite": {
+ "version": "0.4.21",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "ignore-walk": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minimatch": "^3.0.4"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "minipass": {
+ "version": "2.2.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "^5.1.1",
+ "yallist": "^3.0.0"
+ }
+ },
+ "minizlib": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "^2.2.1"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "needle": {
+ "version": "2.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "^2.1.2",
+ "iconv-lite": "^0.4.4",
+ "sax": "^1.2.4"
+ }
+ },
+ "node-pre-gyp": {
+ "version": "0.10.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "detect-libc": "^1.0.2",
+ "mkdirp": "^0.5.1",
+ "needle": "^2.2.0",
+ "nopt": "^4.0.1",
+ "npm-packlist": "^1.1.6",
+ "npmlog": "^4.0.2",
+ "rc": "^1.1.7",
+ "rimraf": "^2.6.1",
+ "semver": "^5.3.0",
+ "tar": "^4"
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1",
+ "osenv": "^0.1.4"
+ }
+ },
+ "npm-bundled": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "npm-packlist": {
+ "version": "1.1.10",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ignore-walk": "^3.0.1",
+ "npm-bundled": "^1.0.1"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "are-we-there-yet": "~1.1.2",
+ "console-control-strings": "~1.1.0",
+ "gauge": "~2.7.3",
+ "set-blocking": "~2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.0"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "rc": {
+ "version": "1.2.7",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "deep-extend": "^0.5.1",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "glob": "^7.0.5"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "semver": {
+ "version": "5.5.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "tar": {
+ "version": "4.4.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chownr": "^1.0.1",
+ "fs-minipass": "^1.2.5",
+ "minipass": "^2.2.4",
+ "minizlib": "^1.1.0",
+ "mkdirp": "^0.5.0",
+ "safe-buffer": "^5.1.1",
+ "yallist": "^3.0.2"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "wide-align": {
+ "version": "1.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "^1.0.2"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "yallist": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
+ "dev": true
+ },
+ "get-pkg-repo": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz",
+ "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "meow": "^3.3.0",
+ "normalize-package-data": "^2.3.0",
+ "parse-github-repo-url": "^1.3.0",
+ "through2": "^2.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^2.0.0",
+ "map-obj": "^1.0.0"
+ }
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "^2.0.0"
+ }
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "^2.0.0",
+ "decamelize": "^1.1.2",
+ "loud-rejection": "^1.0.0",
+ "map-obj": "^1.0.1",
+ "minimist": "^1.1.3",
+ "normalize-package-data": "^2.3.4",
+ "object-assign": "^4.0.1",
+ "read-pkg-up": "^1.0.1",
+ "redent": "^1.0.0",
+ "trim-newlines": "^1.0.0"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "^2.1.0",
+ "strip-indent": "^1.0.1"
+ }
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^4.0.1"
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ }
+ }
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "git-raw-commits": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz",
+ "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==",
+ "dev": true,
+ "requires": {
+ "dargs": "^4.0.1",
+ "lodash.template": "^4.0.2",
+ "meow": "^4.0.0",
+ "split2": "^2.0.0",
+ "through2": "^2.0.0"
+ }
+ },
+ "git-remote-origin-url": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz",
+ "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=",
+ "dev": true,
+ "requires": {
+ "gitconfiglocal": "^1.0.0",
+ "pify": "^2.3.0"
+ }
+ },
+ "git-semver-tags": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.6.tgz",
+ "integrity": "sha512-2jHlJnln4D/ECk9FxGEBh3k44wgYdWjWDtMmJPaecjoRmxKo3Y1Lh8GMYuOPu04CHw86NTAODchYjC5pnpMQig==",
+ "dev": true,
+ "requires": {
+ "meow": "^4.0.0",
+ "semver": "^5.5.0"
+ }
+ },
+ "gitconfiglocal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz",
+ "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=",
+ "dev": true,
+ "requires": {
+ "ini": "^1.3.2"
+ }
+ },
+ "github": {
+ "version": "9.3.1",
+ "resolved": "https://registry.npmjs.org/github/-/github-9.3.1.tgz",
+ "integrity": "sha1-ajxanMKhzQtdCXpHuu+50Ryu+J4=",
+ "dev": true,
+ "requires": {
+ "follow-redirects": "0.0.7",
+ "https-proxy-agent": "^1.0.0",
+ "mime": "^1.2.11",
+ "netrc": "^0.1.4"
+ }
+ },
+ "glob": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
+ "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
+ "dev": true,
+ "requires": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "dev": true,
+ "requires": {
+ "glob-parent": "^2.0.0",
+ "is-glob": "^2.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "dev": true,
+ "requires": {
+ "is-glob": "^2.0.0"
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "global-dirs": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+ "dev": true,
+ "requires": {
+ "ini": "^1.3.4"
+ }
+ },
+ "globals": {
+ "version": "11.7.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz",
+ "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==",
+ "dev": true
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "dev": true,
+ "requires": {
+ "array-union": "^1.0.1",
+ "arrify": "^1.0.0",
+ "glob": "^7.0.3",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
+ }
+ },
+ "got": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "dev": true,
+ "requires": {
+ "create-error-class": "^3.0.0",
+ "duplexer3": "^0.1.4",
+ "get-stream": "^3.0.0",
+ "is-redirect": "^1.0.0",
+ "is-retry-allowed": "^1.0.0",
+ "is-stream": "^1.0.0",
+ "lowercase-keys": "^1.0.0",
+ "safe-buffer": "^5.0.1",
+ "timed-out": "^4.0.0",
+ "unzip-response": "^2.0.1",
+ "url-parse-lax": "^1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "gunzip-maybe": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.1.tgz",
+ "integrity": "sha512-qtutIKMthNJJgeHQS7kZ9FqDq59/Wn0G2HYCRNjpup7yKfVI6/eqwpmroyZGFoCYaG+sW6psNVb4zoLADHpp2g==",
+ "dev": true,
+ "requires": {
+ "browserify-zlib": "^0.1.4",
+ "is-deflate": "^1.0.0",
+ "is-gzip": "^1.0.0",
+ "peek-stream": "^1.1.0",
+ "pumpify": "^1.3.3",
+ "through2": "^2.0.3"
+ }
+ },
+ "handlebars": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
+ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
+ "dev": true,
+ "requires": {
+ "async": "^1.4.0",
+ "optimist": "^0.6.1",
+ "source-map": "^0.4.4",
+ "uglify-js": "^2.6"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+ "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
+ "dev": true
+ },
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "dev": true,
+ "requires": {
+ "minimist": "~0.0.1",
+ "wordwrap": "~0.0.2"
+ }
+ },
+ "source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "dev": true,
+ "requires": {
+ "amdefine": ">=0.0.4"
+ }
+ }
+ }
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
+ "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
+ "dev": true,
+ "requires": {
+ "ajv": "^5.3.0",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "has": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
+ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.0.2"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "hash-base": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
+ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "hash.js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
+ "integrity": "sha1-NA3tvmKQGHFRweodd3o0SJNd+EY=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+ "dev": true,
+ "requires": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "hosted-git-info": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz",
+ "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==",
+ "dev": true
+ },
+ "html-entities": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
+ "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
+ "dev": true
+ },
+ "htmlescape": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
+ "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=",
+ "dev": true
+ },
+ "htmlparser2": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
+ "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^1.3.0",
+ "domhandler": "^2.3.0",
+ "domutils": "^1.5.1",
+ "entities": "^1.1.1",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.2"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "http-errors": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
+ "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
+ "dev": true,
+ "requires": {
+ "depd": "1.1.1",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.0.3",
+ "statuses": ">= 1.3.1 < 2"
+ }
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "https-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz",
+ "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=",
+ "dev": true
+ },
+ "https-proxy-agent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
+ "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=",
+ "dev": true,
+ "requires": {
+ "agent-base": "2",
+ "debug": "2",
+ "extend": "3"
+ }
+ },
+ "husky": {
+ "version": "0.14.3",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz",
+ "integrity": "sha1-xp7XTi0neXaaF7qDmbVM4LY8EsM=",
+ "dev": true,
+ "requires": {
+ "is-ci": "^1.0.10",
+ "normalize-path": "^1.0.0",
+ "strip-indent": "^2.0.0"
+ },
+ "dependencies": {
+ "normalize-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz",
+ "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=",
+ "dev": true
+ }
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+ "dev": true
+ },
+ "ieee754": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz",
+ "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==",
+ "dev": true
+ },
+ "ignore": {
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz",
+ "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==",
+ "dev": true
+ },
+ "import-lazy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+ "dev": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
+ "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
+ "dev": true
+ },
+ "indexof": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "dev": true
+ },
+ "inline-source-map": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
+ "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=",
+ "dev": true,
+ "requires": {
+ "source-map": "~0.5.3"
+ }
+ },
+ "inquirer": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz",
+ "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "^3.0.0",
+ "chalk": "^2.0.0",
+ "cli-cursor": "^2.1.0",
+ "cli-width": "^2.0.0",
+ "external-editor": "^3.0.0",
+ "figures": "^2.0.0",
+ "lodash": "^4.17.10",
+ "mute-stream": "0.0.7",
+ "run-async": "^2.2.0",
+ "rxjs": "^6.1.0",
+ "string-width": "^2.1.0",
+ "strip-ansi": "^4.0.0",
+ "through": "^2.3.6"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^2.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^1.0.0"
+ }
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "dev": true,
+ "requires": {
+ "onetime": "^2.0.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "insert-module-globals": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.6.tgz",
+ "integrity": "sha512-R3sidKJr3SsggqQQ5cEwQb3pWG8RNx0UnpyeiOSR6jorRIeAOzH2gkTWnNdMnyRiVbjrG047K7UCtlMkQ1Mo9w==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^1.0.3",
+ "combine-source-map": "^0.8.0",
+ "concat-stream": "^1.6.1",
+ "is-buffer": "^1.1.0",
+ "lexical-scope": "^1.2.0",
+ "path-is-absolute": "^1.0.1",
+ "process": "~0.11.0",
+ "through2": "^2.0.0",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+ "dev": true
+ },
+ "ip": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+ "dev": true
+ },
+ "irregular-plurals": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz",
+ "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=",
+ "dev": true
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "is-alphabetical": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.2.tgz",
+ "integrity": "sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg==",
+ "dev": true
+ },
+ "is-alphanumeric": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz",
+ "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=",
+ "dev": true
+ },
+ "is-alphanumerical": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz",
+ "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==",
+ "dev": true,
+ "requires": {
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^1.0.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "dev": true,
+ "requires": {
+ "builtin-modules": "^1.0.0"
+ }
+ },
+ "is-callable": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
+ "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
+ "dev": true
+ },
+ "is-ci": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz",
+ "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==",
+ "dev": true,
+ "requires": {
+ "ci-info": "^1.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "is-date-object": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
+ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
+ "dev": true
+ },
+ "is-decimal": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.2.tgz",
+ "integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==",
+ "dev": true
+ },
+ "is-deflate": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz",
+ "integrity": "sha1-yGKQHDwWH7CdrHzcfnhPgOmPLxQ=",
+ "dev": true
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-dotfile": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+ "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+ "dev": true
+ },
+ "is-empty": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-empty/-/is-empty-1.2.0.tgz",
+ "integrity": "sha1-3pu1snhzigWgsJpX4ftNSjQan2s=",
+ "dev": true
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "dev": true,
+ "requires": {
+ "is-primitive": "^2.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-file/-/is-file-1.0.0.tgz",
+ "integrity": "sha1-KKRM+9nT2xkwRfIrZfzo7fliBZY=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^1.0.0"
+ }
+ },
+ "is-gzip": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz",
+ "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=",
+ "dev": true
+ },
+ "is-hexadecimal": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz",
+ "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==",
+ "dev": true
+ },
+ "is-hidden": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-hidden/-/is-hidden-1.1.1.tgz",
+ "integrity": "sha512-175UKecS8+U4hh2PSY0j4xnm2GKYzvSKnbh+naC93JjuBA7LgIo6YxlbcsSo6seFBdQO3RuIcH980yvqqD/2cA==",
+ "dev": true
+ },
+ "is-installed-globally": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+ "dev": true,
+ "requires": {
+ "global-dirs": "^0.1.0",
+ "is-path-inside": "^1.0.0"
+ }
+ },
+ "is-npm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+ "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
+ "dev": true
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+ "dev": true
+ },
+ "is-object": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz",
+ "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=",
+ "dev": true
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+ "dev": true
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
+ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
+ "dev": true,
+ "requires": {
+ "is-path-inside": "^1.0.0"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "dev": true,
+ "requires": {
+ "path-is-inside": "^1.0.1"
+ }
+ },
+ "is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+ "dev": true
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+ "dev": true
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+ "dev": true
+ },
+ "is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
+ "dev": true
+ },
+ "is-redirect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
+ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.1"
+ }
+ },
+ "is-resolvable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+ "dev": true
+ },
+ "is-retry-allowed": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+ "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "dev": true
+ },
+ "is-subset": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz",
+ "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=",
+ "dev": true
+ },
+ "is-symbol": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
+ "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=",
+ "dev": true
+ },
+ "is-text-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
+ "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=",
+ "dev": true,
+ "requires": {
+ "text-extensions": "^1.0.0"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true
+ },
+ "is-whitespace-character": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz",
+ "integrity": "sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "is-word-character": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.2.tgz",
+ "integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==",
+ "dev": true
+ },
+ "is-wsl": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ }
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "istanbul": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
+ "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1.0.x",
+ "async": "1.x",
+ "escodegen": "1.8.x",
+ "esprima": "2.7.x",
+ "glob": "^5.0.15",
+ "handlebars": "^4.0.1",
+ "js-yaml": "3.x",
+ "mkdirp": "0.5.x",
+ "nopt": "3.x",
+ "once": "1.x",
+ "resolve": "1.1.x",
+ "supports-color": "^3.1.0",
+ "which": "^1.1.1",
+ "wordwrap": "^1.0.0"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
+ "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
+ "dev": true
+ },
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
+ "dev": true
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ }
+ }
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
+ "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+ "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=",
+ "dev": true
+ }
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true,
+ "optional": true
+ },
+ "jsdom": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz",
+ "integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "abab": "^1.0.0",
+ "acorn": "^2.4.0",
+ "acorn-globals": "^1.0.4",
+ "cssom": ">= 0.3.0 < 0.4.0",
+ "cssstyle": ">= 0.2.29 < 0.3.0",
+ "escodegen": "^1.6.1",
+ "nwmatcher": ">= 1.3.7 < 2.0.0",
+ "parse5": "^1.5.1",
+ "request": "^2.55.0",
+ "sax": "^1.1.4",
+ "symbol-tree": ">= 3.1.0 < 4.0.0",
+ "tough-cookie": "^2.2.0",
+ "webidl-conversions": "^2.0.0",
+ "whatwg-url-compat": "~0.6.5",
+ "xml-name-validator": ">= 2.0.1 < 3.0.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz",
+ "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+ "dev": true
+ },
+ "json-stable-stringify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
+ "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=",
+ "dev": true,
+ "requires": {
+ "jsonify": "~0.0.0"
+ }
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
+ "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "dev": true
+ },
+ "jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
+ "dev": true
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
+ "jsx-ast-utils": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz",
+ "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.0.3"
+ }
+ },
+ "keyed-array": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/keyed-array/-/keyed-array-2.1.2.tgz",
+ "integrity": "sha1-isE3thMi7V7Rx7Qbn5zQZmMcrOA=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ },
+ "klaw": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
+ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.9"
+ }
+ },
+ "labeled-stream-splicer": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz",
+ "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "isarray": "^2.0.4",
+ "stream-splicer": "^2.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz",
+ "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==",
+ "dev": true
+ }
+ }
+ },
+ "latest-version": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+ "dev": true,
+ "requires": {
+ "package-json": "^4.0.0"
+ }
+ },
+ "lazy-cache": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+ "dev": true,
+ "optional": true
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "dev": true,
+ "requires": {
+ "invert-kv": "^1.0.0"
+ }
+ },
+ "leven": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
+ "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ }
+ },
+ "lexical-scope": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz",
+ "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=",
+ "dev": true,
+ "requires": {
+ "astw": "^2.0.0"
+ }
+ },
+ "linkify-it": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-1.2.4.tgz",
+ "integrity": "sha1-B3NSbDF8j9E71TTuHRgP+Iq/iBo=",
+ "dev": true,
+ "requires": {
+ "uc.micro": "^1.0.1"
+ }
+ },
+ "lint": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/lint/-/lint-1.1.2.tgz",
+ "integrity": "sha1-Ne0GTzIlR8MxNY2JmGhmSWi6Nx8=",
+ "dev": true
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "strip-bom": "^2.0.0"
+ }
+ },
+ "load-plugin": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/load-plugin/-/load-plugin-2.2.2.tgz",
+ "integrity": "sha512-FYzamtURIJefQykZGtiClYuZkJBUKzmx8Tc74y8JGAulDzbzVm/C+w/MbAljHRr+REL0cRzy3WgnHE+T8gce5g==",
+ "dev": true,
+ "requires": {
+ "npm-prefix": "^1.2.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dev": true,
+ "requires": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "dependencies": {
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ }
+ }
+ },
+ "lodash": {
+ "version": "4.17.10",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
+ "dev": true
+ },
+ "lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+ "dev": true
+ },
+ "lodash.assign": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
+ "dev": true
+ },
+ "lodash.assignin": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz",
+ "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=",
+ "dev": true
+ },
+ "lodash.bind": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz",
+ "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=",
+ "dev": true
+ },
+ "lodash.defaults": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+ "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
+ "dev": true
+ },
+ "lodash.filter": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz",
+ "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=",
+ "dev": true
+ },
+ "lodash.flatten": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+ "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
+ "dev": true
+ },
+ "lodash.foreach": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
+ "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=",
+ "dev": true
+ },
+ "lodash.isempty": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz",
+ "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=",
+ "dev": true
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
+ "dev": true
+ },
+ "lodash.map": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz",
+ "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=",
+ "dev": true
+ },
+ "lodash.memoize": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
+ "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=",
+ "dev": true
+ },
+ "lodash.merge": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz",
+ "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==",
+ "dev": true
+ },
+ "lodash.pick": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
+ "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=",
+ "dev": true
+ },
+ "lodash.range": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.range/-/lodash.range-3.2.0.tgz",
+ "integrity": "sha1-9GHliPZmg/fq3q3lE+OKaaVloV0=",
+ "dev": true
+ },
+ "lodash.reduce": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz",
+ "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=",
+ "dev": true
+ },
+ "lodash.reject": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz",
+ "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=",
+ "dev": true
+ },
+ "lodash.some": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
+ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
+ "dev": true
+ },
+ "lodash.template": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
+ "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "~3.0.0",
+ "lodash.templatesettings": "^4.0.0"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
+ "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "~3.0.0"
+ }
+ },
+ "lodash.transform": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz",
+ "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
+ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
+ "dev": true,
+ "requires": {
+ "chalk": "^1.0.0"
+ }
+ },
+ "longest": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+ "dev": true
+ },
+ "longest-streak": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz",
+ "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "requires": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "^0.4.1",
+ "signal-exit": "^3.0.0"
+ }
+ },
+ "lowercase-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
+ "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ },
+ "dependencies": {
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ }
+ }
+ },
+ "make-dir": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+ "dev": true,
+ "requires": {
+ "pify": "^3.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
+ "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "^1.0.0"
+ }
+ },
+ "markdown-escapes": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.2.tgz",
+ "integrity": "sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==",
+ "dev": true
+ },
+ "markdown-extensions": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-1.1.1.tgz",
+ "integrity": "sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==",
+ "dev": true
+ },
+ "markdown-it": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-6.1.1.tgz",
+ "integrity": "sha1-ztA39Ec+6fUVOsQU933IPJG6knw=",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "entities": "~1.1.1",
+ "linkify-it": "~1.2.2",
+ "mdurl": "~1.0.1",
+ "uc.micro": "^1.0.1"
+ }
+ },
+ "markdown-it-named-headers": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-it-named-headers/-/markdown-it-named-headers-0.0.4.tgz",
+ "integrity": "sha1-gu/CgyQkCmsed7mq5QF3HV81HB8=",
+ "dev": true,
+ "requires": {
+ "string": "^3.0.1"
+ }
+ },
+ "markdown-table": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.2.tgz",
+ "integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==",
+ "dev": true
+ },
+ "marky-markdown-lite": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/marky-markdown-lite/-/marky-markdown-lite-1.2.0.tgz",
+ "integrity": "sha1-dO2phLgTZVfe4QZO/RXkBhdAaZc=",
+ "dev": true,
+ "requires": {
+ "cheerio": "^0.20.0",
+ "conventional-changelog-cli": "^1.2.0",
+ "is-file": "^1.0.0",
+ "markdown-it": "^6.0.1",
+ "markdown-it-named-headers": "0.0.4"
+ },
+ "dependencies": {
+ "cheerio": {
+ "version": "0.20.0",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.20.0.tgz",
+ "integrity": "sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU=",
+ "dev": true,
+ "requires": {
+ "css-select": "~1.2.0",
+ "dom-serializer": "~0.1.0",
+ "entities": "~1.1.1",
+ "htmlparser2": "~3.8.1",
+ "jsdom": "^7.0.2",
+ "lodash": "^4.1.0"
+ }
+ },
+ "domhandler": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
+ "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1"
+ }
+ },
+ "htmlparser2": {
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
+ "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1",
+ "domhandler": "2.3",
+ "domutils": "1.5",
+ "entities": "1.0",
+ "readable-stream": "1.1"
+ },
+ "dependencies": {
+ "entities": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
+ "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "matcher-collection": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-1.0.5.tgz",
+ "integrity": "sha1-LuCVQ4Nyy4iE8FgjQTjAXGROwzk=",
+ "dev": true,
+ "requires": {
+ "minimatch": "^3.0.2"
+ }
+ },
+ "math-random": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
+ "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=",
+ "dev": true
+ },
+ "md5.js": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz",
+ "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=",
+ "dev": true,
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "mdast-comment-marker": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-comment-marker/-/mdast-comment-marker-1.0.2.tgz",
+ "integrity": "sha1-Hd8O+BH7UkOQF8jSwLkiA18rp0o=",
+ "dev": true
+ },
+ "mdast-util-compact": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.1.tgz",
+ "integrity": "sha1-zbX4TitqLTEU3zO9BdnLMuPECDo=",
+ "dev": true,
+ "requires": {
+ "unist-util-modify-children": "^1.0.0",
+ "unist-util-visit": "^1.1.0"
+ }
+ },
+ "mdast-util-heading-style": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-heading-style/-/mdast-util-heading-style-1.0.3.tgz",
+ "integrity": "sha1-77OQ28iqAWw89XegNJANsn7nJHw=",
+ "dev": true
+ },
+ "mdast-util-to-string": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.0.4.tgz",
+ "integrity": "sha1-XEVch4yTVfDB5/PotxnPWDaRrPs=",
+ "dev": true
+ },
+ "mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=",
+ "dev": true
+ },
+ "meow": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz",
+ "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "^4.0.0",
+ "decamelize-keys": "^1.0.0",
+ "loud-rejection": "^1.0.0",
+ "minimist": "^1.1.3",
+ "minimist-options": "^3.0.1",
+ "normalize-package-data": "^2.3.4",
+ "read-pkg-up": "^3.0.0",
+ "redent": "^2.0.0",
+ "trim-newlines": "^2.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "load-json-file": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^4.0.0",
+ "pify": "^3.0.0",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ }
+ },
+ "path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "requires": {
+ "pify": "^3.0.0"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "read-pkg": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^4.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^3.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
+ "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.0.0",
+ "read-pkg": "^3.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ }
+ }
+ },
+ "merge2": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz",
+ "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==",
+ "dev": true
+ },
+ "micro": {
+ "version": "9.3.1",
+ "resolved": "https://registry.npmjs.org/micro/-/micro-9.3.1.tgz",
+ "integrity": "sha512-83uimpPJqfwkfKvJl2WWontBlV3hmzrIgyJ+L2uhDXKNk7Ll+/ezK3zBz7TljubpKPqjM0JdT2Ker4MTPmhjgA==",
+ "dev": true,
+ "requires": {
+ "arg": "2.0.0",
+ "chalk": "2.4.0",
+ "content-type": "1.0.4",
+ "is-stream": "1.1.0",
+ "raw-body": "2.3.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz",
+ "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "micro-compress": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/micro-compress/-/micro-compress-1.0.0.tgz",
+ "integrity": "sha1-U/WoC0rQMgyhZaVZtuPfFF1PcE8=",
+ "dev": true,
+ "requires": {
+ "compression": "^1.6.2"
+ }
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^2.0.0",
+ "array-unique": "^0.2.1",
+ "braces": "^1.8.2",
+ "expand-brackets": "^0.1.4",
+ "extglob": "^0.3.1",
+ "filename-regex": "^2.0.0",
+ "is-extglob": "^1.0.0",
+ "is-glob": "^2.0.1",
+ "kind-of": "^3.0.2",
+ "normalize-path": "^2.0.1",
+ "object.omit": "^2.0.0",
+ "parse-glob": "^3.0.4",
+ "regex-cache": "^0.4.2"
+ }
+ },
+ "miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ }
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
+ "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.18",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
+ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+ "dev": true,
+ "requires": {
+ "mime-db": "~1.33.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true
+ },
+ "minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true
+ },
+ "minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "minimist-options": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz",
+ "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==",
+ "dev": true,
+ "requires": {
+ "arrify": "^1.0.1",
+ "is-plain-obj": "^1.1.0"
+ }
+ },
+ "minipass": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.0.tgz",
+ "integrity": "sha512-jWC2Eg+Np4bxah7llu1IrUNSJQxtLz/J+pOjTM0nFpJXGAaV18XBWhUn031Q1tAA/TJtA1jgwnOe9S2PQa4Lbg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.1",
+ "yallist": "^3.0.0"
+ }
+ },
+ "minizlib": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz",
+ "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==",
+ "dev": true,
+ "requires": {
+ "minipass": "^2.2.1"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ }
+ }
+ },
+ "mkpath": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz",
+ "integrity": "sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE=",
+ "dev": true
+ },
+ "mksnapshot": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/mksnapshot/-/mksnapshot-0.3.1.tgz",
+ "integrity": "sha1-JQHAVldDbXQs6Vik/5LHfkDdN+Y=",
+ "dev": true,
+ "requires": {
+ "decompress-zip": "0.3.0",
+ "fs-extra": "0.26.7",
+ "request": "^2.79.0"
+ }
+ },
+ "modify-values": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",
+ "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==",
+ "dev": true
+ },
+ "module-deps": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz",
+ "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^1.0.3",
+ "browser-resolve": "^1.7.0",
+ "cached-path-relative": "^1.0.0",
+ "concat-stream": "~1.5.0",
+ "defined": "^1.0.0",
+ "detective": "^4.0.0",
+ "duplexer2": "^0.1.2",
+ "inherits": "^2.0.1",
+ "parents": "^1.0.0",
+ "readable-stream": "^2.0.2",
+ "resolve": "^1.1.3",
+ "stream-combiner2": "^1.1.1",
+ "subarg": "^1.0.0",
+ "through2": "^2.0.0",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "mri": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.0.tgz",
+ "integrity": "sha1-XAo/KcjM/7ux7JQdzsCdcfoy82o=",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+ "dev": true
+ },
+ "nan": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
+ "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
+ "dev": true,
+ "optional": true
+ },
+ "nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "negotiator": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+ "dev": true
+ },
+ "netrc": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/netrc/-/netrc-0.1.4.tgz",
+ "integrity": "sha1-a+lPysqNd63gqWcNxGCRTJRHJEQ=",
+ "dev": true
+ },
+ "nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+ "dev": true
+ },
+ "node-dir": {
+ "version": "0.1.17",
+ "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz",
+ "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=",
+ "dev": true,
+ "requires": {
+ "minimatch": "^3.0.2"
+ }
+ },
+ "node-fetch": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz",
+ "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=",
+ "dev": true
+ },
+ "node-version": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.1.3.tgz",
+ "integrity": "sha512-rEwE51JWn0yN3Wl5BXeGn5d52OGbSXzWiiXRjAQeuyvcGKyvuSILW2rb3G7Xh+nexzLwhTpek6Ehxd6IjvHePg==",
+ "dev": true
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "is-builtin-module": "^1.0.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "^1.0.1"
+ }
+ },
+ "npm-prefix": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/npm-prefix/-/npm-prefix-1.2.0.tgz",
+ "integrity": "sha1-5hlFX3B0ulTMZtbQ033Z8b5ry8A=",
+ "dev": true,
+ "requires": {
+ "rc": "^1.1.0",
+ "shellsubstitute": "^1.1.0",
+ "untildify": "^2.1.0"
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "dev": true,
+ "requires": {
+ "path-key": "^2.0.0"
+ }
+ },
+ "nth-check": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
+ "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
+ "dev": true,
+ "requires": {
+ "boolbase": "~1.0.0"
+ }
+ },
+ "nugget": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz",
+ "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.1.3",
+ "minimist": "^1.1.0",
+ "pretty-bytes": "^1.0.2",
+ "progress-stream": "^1.1.0",
+ "request": "^2.45.0",
+ "single-line-log": "^1.1.2",
+ "throttleit": "0.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "nwmatcher": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz",
+ "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==",
+ "dev": true,
+ "optional": true
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "object-keys": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
+ "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=",
+ "dev": true
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "dev": true,
+ "requires": {
+ "for-own": "^0.1.4",
+ "is-extendable": "^0.1.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "octicons": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/octicons/-/octicons-7.3.0.tgz",
+ "integrity": "sha512-UVjlkmUL15Ef/7Rd72Io634Bdl61QgSMasAZpvXPoR2XNFj1RelAyhl4QJuR1hBGlPWFDR7KFj2jEzsFax2IUg==",
+ "dev": true,
+ "requires": {
+ "object-assign": "^4.1.1"
+ }
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "on-headers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+ "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "1.1.0",
+ "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
+ "dev": true
+ },
+ "openssl-self-signed-certificate": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/openssl-self-signed-certificate/-/openssl-self-signed-certificate-1.1.6.tgz",
+ "integrity": "sha1-nTpHdrGlfphHNQOSEUrS+RWoPdQ=",
+ "dev": true
+ },
+ "opn": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
+ "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==",
+ "dev": true,
+ "requires": {
+ "is-wsl": "^1.1.0"
+ }
+ },
+ "optimist": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz",
+ "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=",
+ "dev": true,
+ "requires": {
+ "wordwrap": "~0.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.4",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "wordwrap": "~1.0.0"
+ },
+ "dependencies": {
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ }
+ }
+ },
+ "ora": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-0.3.0.tgz",
+ "integrity": "sha1-NnoHitJc+wltpQERXrW0AeB9dJU=",
+ "dev": true,
+ "requires": {
+ "chalk": "^1.1.1",
+ "cli-cursor": "^1.0.2",
+ "cli-spinners": "^0.2.0",
+ "log-symbols": "^1.0.2"
+ },
+ "dependencies": {
+ "cli-spinners": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.2.0.tgz",
+ "integrity": "sha1-hQeHN5E7iA9uyf/ntl6D7Hd2KE8=",
+ "dev": true
+ }
+ }
+ },
+ "os-browserify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz",
+ "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=",
+ "dev": true
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true
+ },
+ "os-locale": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+ "dev": true,
+ "requires": {
+ "lcid": "^1.0.0"
+ }
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
+ "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
+ "dev": true,
+ "requires": {
+ "p-try": "^1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "requires": {
+ "p-limit": "^1.1.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "dev": true
+ },
+ "package-json": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+ "dev": true,
+ "requires": {
+ "got": "^6.7.1",
+ "registry-auth-token": "^3.0.1",
+ "registry-url": "^3.0.3",
+ "semver": "^5.1.0"
+ }
+ },
+ "pako": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+ "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
+ "dev": true
+ },
+ "parents": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
+ "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
+ "dev": true,
+ "requires": {
+ "path-platform": "~0.11.15"
+ }
+ },
+ "parse-asn1": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
+ "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
+ "dev": true,
+ "requires": {
+ "asn1.js": "^4.0.0",
+ "browserify-aes": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3"
+ }
+ },
+ "parse-entities": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.2.tgz",
+ "integrity": "sha512-5N9lmQ7tmxfXf+hO3X6KRG6w7uYO/HL9fHalSySTdyn63C3WNvTM/1R8tn1u1larNcEbo3Slcy2bsVDQqvEpUg==",
+ "dev": true,
+ "requires": {
+ "character-entities": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "character-reference-invalid": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-hexadecimal": "^1.0.0"
+ }
+ },
+ "parse-github-repo-url": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz",
+ "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=",
+ "dev": true
+ },
+ "parse-gitignore": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/parse-gitignore/-/parse-gitignore-0.4.0.tgz",
+ "integrity": "sha1-q/cC5LkAUk//eQK2g4YoV7Y/k/4=",
+ "dev": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "is-glob": "^3.1.0"
+ },
+ "dependencies": {
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "dev": true,
+ "requires": {
+ "glob-base": "^0.3.0",
+ "is-dotfile": "^1.0.0",
+ "is-extglob": "^1.0.0",
+ "is-glob": "^2.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.2.0"
+ }
+ },
+ "parse5": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
+ "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=",
+ "dev": true,
+ "optional": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-browserify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
+ "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "path-platform": {
+ "version": "0.11.15",
+ "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
+ "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=",
+ "dev": true
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "pbkdf2": {
+ "version": "3.0.16",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz",
+ "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==",
+ "dev": true,
+ "requires": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "peek-stream": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz",
+ "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "duplexify": "^3.5.0",
+ "through2": "^2.0.3"
+ }
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "^2.0.0"
+ }
+ },
+ "pkg-conf": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz",
+ "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.0.0",
+ "load-json-file": "^4.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "load-json-file": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^4.0.0",
+ "pify": "^3.0.0",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ }
+ }
+ },
+ "pkg-config": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz",
+ "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=",
+ "dev": true,
+ "requires": {
+ "debug-log": "^1.0.0",
+ "find-root": "^1.0.0",
+ "xtend": "^4.0.1"
+ }
+ },
+ "pkg-dir": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
+ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
+ "dev": true,
+ "requires": {
+ "find-up": "^1.0.0"
+ }
+ },
+ "plur": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz",
+ "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=",
+ "dev": true,
+ "requires": {
+ "irregular-plurals": "^1.0.0"
+ }
+ },
+ "pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
+ "dev": true
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+ "dev": true
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+ "dev": true
+ },
+ "pretty-bytes": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz",
+ "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^4.0.1",
+ "meow": "^3.1.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^2.0.0",
+ "map-obj": "^1.0.0"
+ }
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "^2.0.0"
+ }
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "^2.0.0",
+ "decamelize": "^1.1.2",
+ "loud-rejection": "^1.0.0",
+ "map-obj": "^1.0.1",
+ "minimist": "^1.1.3",
+ "normalize-package-data": "^2.3.4",
+ "object-assign": "^4.0.1",
+ "read-pkg-up": "^1.0.1",
+ "redent": "^1.0.0",
+ "trim-newlines": "^1.0.0"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "^2.1.0",
+ "strip-indent": "^1.0.1"
+ }
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^4.0.1"
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ }
+ }
+ },
+ "process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+ "dev": true
+ },
+ "progress": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
+ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
+ "dev": true
+ },
+ "progress-stream": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz",
+ "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=",
+ "dev": true,
+ "requires": {
+ "speedometer": "~0.1.2",
+ "through2": "~0.2.3"
+ },
+ "dependencies": {
+ "through2": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz",
+ "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "~1.1.9",
+ "xtend": "~2.1.1"
+ }
+ },
+ "xtend": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
+ "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
+ "dev": true,
+ "requires": {
+ "object-keys": "~0.4.0"
+ }
+ }
+ }
+ },
+ "prop-types": {
+ "version": "15.6.2",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz",
+ "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "^1.3.1",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "psl": {
+ "version": "1.1.29",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
+ "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==",
+ "dev": true
+ },
+ "public-encrypt": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz",
+ "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "pump": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "pumpify": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+ "dev": true,
+ "requires": {
+ "duplexify": "^3.6.0",
+ "inherits": "^2.0.3",
+ "pump": "^2.0.0"
+ }
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ },
+ "querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+ "dev": true
+ },
+ "querystring-es3": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+ "dev": true
+ },
+ "quick-lru": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz",
+ "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=",
+ "dev": true
+ },
+ "ramda": {
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz",
+ "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==",
+ "dev": true
+ },
+ "randomatic": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz",
+ "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==",
+ "dev": true,
+ "requires": {
+ "is-number": "^4.0.0",
+ "kind-of": "^6.0.0",
+ "math-random": "^1.0.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
+ "randombytes": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
+ "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "randomfill": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.0.5",
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
+ "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "http-errors": "1.6.2",
+ "iconv-lite": "0.4.19",
+ "unpipe": "1.0.0"
+ }
+ },
+ "rc": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz",
+ "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==",
+ "dev": true,
+ "requires": {
+ "deep-extend": "^0.5.1",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ }
+ },
+ "read-only-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
+ "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.0.2"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^1.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^1.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "^1.0.0",
+ "read-pkg": "^1.0.0"
+ }
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "readdirp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
+ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "minimatch": "^3.0.2",
+ "readable-stream": "^2.0.2",
+ "set-immediate-shim": "^1.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "recursive-readdir": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
+ "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "redent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
+ "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=",
+ "dev": true,
+ "requires": {
+ "indent-string": "^3.0.0",
+ "strip-indent": "^2.0.0"
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=",
+ "dev": true,
+ "requires": {
+ "is-equal-shallow": "^0.1.3"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "regexpp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.0.tgz",
+ "integrity": "sha512-g2FAVtR8Uh8GO1Nv5wpxW7VFVwHcCEr4wyA8/MHiRkO8uHoR5ntAA8Uq3P1vvMTX/BeQiRVSpDGLd+Wn5HNOTA==",
+ "dev": true
+ },
+ "registry-auth-token": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
+ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
+ "dev": true,
+ "requires": {
+ "rc": "^1.1.6",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+ "dev": true,
+ "requires": {
+ "rc": "^1.0.1"
+ }
+ },
+ "remark": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/remark/-/remark-8.0.0.tgz",
+ "integrity": "sha512-K0PTsaZvJlXTl9DN6qYlvjTkqSZBFELhROZMrblm2rB+085flN84nz4g/BscKRMqDvhzlK1oQ/xnWQumdeNZYw==",
+ "dev": true,
+ "requires": {
+ "remark-parse": "^4.0.0",
+ "remark-stringify": "^4.0.0",
+ "unified": "^6.0.0"
+ }
+ },
+ "remark-cli": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/remark-cli/-/remark-cli-4.0.0.tgz",
+ "integrity": "sha512-q5GMjGypUS4rTZb3WfMQcGpClSC38A9Ogg1h/HB2GLsqypDetmAfy0X+tuJ6JeyCPVOXXCDgsDCQq4QPqKmxBA==",
+ "dev": true,
+ "requires": {
+ "markdown-extensions": "^1.1.0",
+ "remark": "^8.0.0",
+ "unified-args": "^4.0.0"
+ }
+ },
+ "remark-lint": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint/-/remark-lint-6.0.1.tgz",
+ "integrity": "sha512-wvTTuB5O5pF8SxqahQjjrU3dtuhygYjaGcOZTw+4ACgSE4RBINDlNqN46HjcV3X0ib5GmObJUt5a2mmhtmuTqw==",
+ "dev": true,
+ "requires": {
+ "remark-message-control": "^4.0.0"
+ }
+ },
+ "remark-lint-blockquote-indentation": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-blockquote-indentation/-/remark-lint-blockquote-indentation-1.0.1.tgz",
+ "integrity": "sha512-YrP99MJ3+dQ5JXzq39fUOcYzwcumva/xEM1eFtD2TrQcSdlMLoqYa7gj+aEEhZCjlA5BssTiVoWWW0RjyPPGZw==",
+ "dev": true,
+ "requires": {
+ "mdast-util-to-string": "^1.0.2",
+ "plur": "^2.1.2",
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-code-block-style": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-code-block-style/-/remark-lint-code-block-style-1.0.1.tgz",
+ "integrity": "sha512-FRUMhhKwCruH4vkatdMhVO4WlYpysV1NmMILVoK/k+/7uFLSfgvlqo66nzhpMdWL8TQHqdo0LhiXuetGC2WjsQ==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-definition-case": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-definition-case/-/remark-lint-definition-case-1.0.1.tgz",
+ "integrity": "sha512-TxLye5KF4o/rKVTvmPRX5jS9itamFS02yy1IG8bIYcIAJvWsW3GlJaXq4ohK3hKwSQOhtCherEfD6XF9BHLNYQ==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-definition-spacing": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-definition-spacing/-/remark-lint-definition-spacing-1.0.1.tgz",
+ "integrity": "sha512-ewzdlFfpTSP11ZuiOln0yfz6Y03aWtgJmLVQNfF1spaT1gURaShjs8Hiilbo719bz96DgvXSZLP6UnkSiZL1vg==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-emphasis-marker": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-emphasis-marker/-/remark-lint-emphasis-marker-1.0.1.tgz",
+ "integrity": "sha512-QyNsD6y8EZQqhechw0XFGybYMlxn6PFLSlFUO50KSQlJEOgkImN2yJfrNrET2GY4t/fc/uYmeI/q7auUIkLX2w==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-fenced-code-flag": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-fenced-code-flag/-/remark-lint-fenced-code-flag-1.0.1.tgz",
+ "integrity": "sha512-P24T9DRe/nnywPFRpE1UAXAVzN1CX6HmINr15UHbQZo1Cy8KYt7uV9YOR0/XzphtnO/AFenAqZyf7tchW5AUNQ==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-fenced-code-marker": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-fenced-code-marker/-/remark-lint-fenced-code-marker-1.0.1.tgz",
+ "integrity": "sha512-mX7xAMl5m7xGX+YtOtyXIyv+egD4IQAm6DPGdfunI734QwODwcoBydtpTD56jrY+48nVcQ/anFYT1Blg3Xk3sQ==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-file-extension": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-file-extension/-/remark-lint-file-extension-1.0.1.tgz",
+ "integrity": "sha512-K1Pf5oviaFyCs0FhZqaNZ2odgd5KoV6AlA4nNAMxyylB0Y6t0mYpzECoLSS5Bgxf6f8Op9YbuM2cbjBAsv0dIA==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0"
+ }
+ },
+ "remark-lint-final-definition": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-final-definition/-/remark-lint-final-definition-1.0.1.tgz",
+ "integrity": "sha512-DK6bphJdQ0xSOQAn+8wOyLIVc3SZW2+ZzCMCLkQnVtHiQ9GHMzFiCkeE3Cq+OClsMI5Yn8wFTHZHPUn58VhNEQ==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-hard-break-spaces": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/remark-lint-hard-break-spaces/-/remark-lint-hard-break-spaces-1.0.2.tgz",
+ "integrity": "sha512-uh7LqHgRPCphiCvRzBVA4D0Ml2IqPaw89lWJdQ6HvYiV8ChB/OFLBapHi6OKW7NVVVPPJsElPMB/UPUsKFaPTg==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-heading-increment": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-heading-increment/-/remark-lint-heading-increment-1.0.1.tgz",
+ "integrity": "sha512-jBAJacXAU5drUpvmymOoFmrdCCNDiz8bzGgJIMjpT0Vyjd0+qdXu2iyFMl/4RkkUli25rpUDXkTHTcxmNbh7Zw==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-heading-style": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-heading-style/-/remark-lint-heading-style-1.0.1.tgz",
+ "integrity": "sha512-m9Gqr091YdxUtG69xdXYH8fSd3+nsrsMamB/qSWpVSZuWQKZ1mRotr1LO9NphJh6vhw8IfBtG07wgEDn6b40sQ==",
+ "dev": true,
+ "requires": {
+ "mdast-util-heading-style": "^1.0.2",
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-link-title-style": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-link-title-style/-/remark-lint-link-title-style-1.0.1.tgz",
+ "integrity": "sha512-91MyqmZjokSzRbgvlKq5sLCJEFkM/MNKT1PDaWa3+GDLBGu7D4eMQGd2x49xX8IdJDEoWy5D8W+2Gb8XKWMUyw==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1",
+ "vfile-location": "^2.0.1"
+ }
+ },
+ "remark-lint-list-item-content-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-list-item-content-indent/-/remark-lint-list-item-content-indent-1.0.1.tgz",
+ "integrity": "sha512-R5cdXFFywoBcg+2UUcF9OJ/vt9oqJv+KmTKIQV9CFHWeAfMFiZbxazsSPNaCcO1fW9622hxPCawN/AofDTbP7Q==",
+ "dev": true,
+ "requires": {
+ "plur": "^2.1.2",
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-list-item-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-list-item-indent/-/remark-lint-list-item-indent-1.0.1.tgz",
+ "integrity": "sha512-dSUFGQYtduuaos+5oXH89RTk0rGUe6DFf04q+rxQ7Z3YRbuXhAU2nYeY0/HENYiWJU1xFLteZkDvKMj0NfS3DQ==",
+ "dev": true,
+ "requires": {
+ "plur": "^2.1.2",
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-list-item-spacing": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-list-item-spacing/-/remark-lint-list-item-spacing-1.1.1.tgz",
+ "integrity": "sha512-HlPEzRq4LJB6tQ72zgIZ42mOaOSX92O268BLolys/H1x6N29/JNMLfurWqLsrxZrxxHH3H7EUP4dNM2P1kDGBw==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-maximum-heading-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-maximum-heading-length/-/remark-lint-maximum-heading-length-1.0.1.tgz",
+ "integrity": "sha512-f8ChV9U238gncyvTqmzJ+UpCMj+hFyluWBjVYr2K8CNh+MdSivIxS4zw4170sBRoqNuS3gBxRHG9f4rmdqotJA==",
+ "dev": true,
+ "requires": {
+ "mdast-util-to-string": "^1.0.2",
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-maximum-line-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/remark-lint-maximum-line-length/-/remark-lint-maximum-line-length-1.0.2.tgz",
+ "integrity": "sha512-M4UIXAAbtLgoQbTDVwdKOEFbTKtJSZ+pCW7ZqMFs+cbIN0Svm32LM9+xpVfVU0hLYt3Ypl++EAPfguBNe1PZEw==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-no-auto-link-without-protocol": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-auto-link-without-protocol/-/remark-lint-no-auto-link-without-protocol-1.0.1.tgz",
+ "integrity": "sha512-MHl0hNtF8Rc0lg6iuVP7/0rnp4uZadm3S07/1TiFeqzU22KFxxzcC8980Q4+I8oPZE0d1x80h9DmkNAVFwhDjQ==",
+ "dev": true,
+ "requires": {
+ "mdast-util-to-string": "^1.0.2",
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-no-blockquote-without-marker": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-blockquote-without-marker/-/remark-lint-no-blockquote-without-marker-2.0.1.tgz",
+ "integrity": "sha512-8VTQ/MP3flvG4U0tFSD+DMVT7F/4u9SnQLb/jjeRC3DzgbsIagIUqpWYAKkc+yBz9S/lgftA92lLP5PrlOa5DA==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1",
+ "vfile-location": "^2.0.1"
+ }
+ },
+ "remark-lint-no-consecutive-blank-lines": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-consecutive-blank-lines/-/remark-lint-no-consecutive-blank-lines-1.0.1.tgz",
+ "integrity": "sha512-IhyUiGTpb/hjtusIVg10q963KeL5CyNfbWOfDZ1KtY2tvdoSPRGrrCuTKo6OG8r1qavM6bU0mtRuIBqNh4lIzA==",
+ "dev": true,
+ "requires": {
+ "plur": "^2.1.2",
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-no-duplicate-headings": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-duplicate-headings/-/remark-lint-no-duplicate-headings-1.0.1.tgz",
+ "integrity": "sha512-iZZxyZgwnjvDkydKZzqHBueJvIpGbxnITmgd8xN8TOLZoAg9/KGTQRAkotL1HXNRdkzwggfgB9ONxv/rWtYBmg==",
+ "dev": true,
+ "requires": {
+ "mdast-util-to-string": "^1.0.2",
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-no-emphasis-as-heading": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-emphasis-as-heading/-/remark-lint-no-emphasis-as-heading-1.0.1.tgz",
+ "integrity": "sha512-+x17Hrjwne4Mhk2x/Zolnuv/sOclF1oYMDBSEYhBUpn/UAwxhXEXYKkeo0KkWA7Q3+UCLELJvzsk4cGNP6Sgow==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-no-file-name-articles": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-file-name-articles/-/remark-lint-no-file-name-articles-1.0.1.tgz",
+ "integrity": "sha512-SzebnFnilrsINA6QZP1YqPa3SrfSotrLkRWl5FUCoVshBvEFNKJFWXj6Xyt4NjWQ5tJWFtOMysAuHdGT+Odhjg==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0"
+ }
+ },
+ "remark-lint-no-file-name-consecutive-dashes": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-file-name-consecutive-dashes/-/remark-lint-no-file-name-consecutive-dashes-1.0.1.tgz",
+ "integrity": "sha512-YP2HBwA00yeD7phvxp4ftiqbfBPfYHPgPfcEcb8oNa1WlUh/58cs9DbSHWKsZG+XLkvEaheC6qUQG02jEKZHPA==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0"
+ }
+ },
+ "remark-lint-no-file-name-irregular-characters": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-file-name-irregular-characters/-/remark-lint-no-file-name-irregular-characters-1.0.1.tgz",
+ "integrity": "sha512-+ks/V6OVMGOPZKw+fe2E4DPvLoslGxvdgtqXq2Nyz0cEdYX8RP45kI79V4w95H7UCJAeOFM9mZzVLvmCY1sEbg==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0"
+ }
+ },
+ "remark-lint-no-file-name-mixed-case": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-file-name-mixed-case/-/remark-lint-no-file-name-mixed-case-1.0.1.tgz",
+ "integrity": "sha512-bcqPsow1C0LrsKII1YehUO7VPOER7nze6FzsZZ8/NP+d200OL7Y7VMCqN1kscAvG+PTJgjznyXuLEpy7KQnVFg==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0"
+ }
+ },
+ "remark-lint-no-file-name-outer-dashes": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-file-name-outer-dashes/-/remark-lint-no-file-name-outer-dashes-1.0.2.tgz",
+ "integrity": "sha512-BVEwLrA4kipalgKrxhncpgtmh6eUmHBH1ggC+X3csYR4X5vXv4vHQqpov4I1vMyWxMLMBnq7lTL3Iqp0CS4vwg==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0"
+ }
+ },
+ "remark-lint-no-heading-punctuation": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-heading-punctuation/-/remark-lint-no-heading-punctuation-1.0.1.tgz",
+ "integrity": "sha512-/7kGRmPT+JLxEME1Z/rQn99mP8yr4qXFwcniKYsefR1jl8pCZciwCIp2Tq92Nn+FPELVrpk9sloRBb2JP3UB0A==",
+ "dev": true,
+ "requires": {
+ "mdast-util-to-string": "^1.0.2",
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-no-inline-padding": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-inline-padding/-/remark-lint-no-inline-padding-1.0.1.tgz",
+ "integrity": "sha512-nRl6vA45ZPdMz3/rVMZw7WRRqLFuMrzhdkrbrGLjwBovdIeD/IGCEbDA5NR60g2xT9V5dAmKogvHEH1bIr8SdQ==",
+ "dev": true,
+ "requires": {
+ "mdast-util-to-string": "^1.0.2",
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-no-literal-urls": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-literal-urls/-/remark-lint-no-literal-urls-1.0.1.tgz",
+ "integrity": "sha512-YMsZFVYQDt9gvpc6THL76GzyhCR+cK79vjyEOEmX+O3tOjxQstbi0oW6Lngbl1WbpkCW5TWEzSKOorQowYI2wg==",
+ "dev": true,
+ "requires": {
+ "mdast-util-to-string": "^1.0.2",
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-no-multiple-toplevel-headings": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-multiple-toplevel-headings/-/remark-lint-no-multiple-toplevel-headings-1.0.1.tgz",
+ "integrity": "sha512-LFfgjF3NKFkt0tGNnJ8Exf8+DrVcMRwek5qu5mvh2KrZnmSpm5flYWzUy2UnnIyicDL3CZYC/r3Fjz6CeBYgZA==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-no-shell-dollars": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-shell-dollars/-/remark-lint-no-shell-dollars-1.0.1.tgz",
+ "integrity": "sha512-YryHem73PTxjCkuC4HONJWHsmrLyXmF7r+cCH36Ys3vuWsfAbwkbOwpyuPB4KXn+6fHaTUfz/B5BPp3iwzJwyA==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-no-shortcut-reference-image": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-shortcut-reference-image/-/remark-lint-no-shortcut-reference-image-1.0.1.tgz",
+ "integrity": "sha512-nUQ+4xB5hKZTCl9gvg7c+W1T3ddsnjgu4zwRza2Bn+21cKmUzx+z9dvlZ4aVuNGmxuWHbKI8/ZkKuB8Eu27vJw==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-no-shortcut-reference-link": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-shortcut-reference-link/-/remark-lint-no-shortcut-reference-link-1.0.2.tgz",
+ "integrity": "sha512-A6ZexZ6XyQ7fXebrj5WgW5FkSJ81GobjWyMFVmBxgxPd9GH2BkRsZ10aFSkQQvfKSrqbnOL2vrigGMgbiERRxA==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-no-table-indentation": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-no-table-indentation/-/remark-lint-no-table-indentation-1.0.1.tgz",
+ "integrity": "sha512-QrtT1GvJmAoNsWh+gmHFajFlM+ubm9rd3Cbz2OYPix8ZM6g907aIfG2NusJFXL9D8/CExQWYhlBvelFBbHgqbQ==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-ordered-list-marker-style": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-style/-/remark-lint-ordered-list-marker-style-1.0.1.tgz",
+ "integrity": "sha512-LJICUZIxqHHi360EP90zbDP+2QQIVVgPGlz0AatuR9ifd7xqAzraQKxsQajAZpuOepZgjBMTOz9L9W0Znx7ujA==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-ordered-list-marker-value": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-value/-/remark-lint-ordered-list-marker-value-1.0.1.tgz",
+ "integrity": "sha512-P6fYui3MvuB21+6AYH8Lbe7SVZ2VQL+FVJUuDCBhe01bgx6SajGmQ/f4Iqt0gCHEAaKw7e2B7tdwd36ifbs1EA==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-rule-style": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-rule-style/-/remark-lint-rule-style-1.0.1.tgz",
+ "integrity": "sha512-dzH+K6DcPIIMBq6LUQgE4dR9TiQGZrQOoULD7m0Y0lIb2EoR2FK5Zd4TgZg/LnvTs6fid37t0xFoaY4/lXV/5Q==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-strong-marker": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-strong-marker/-/remark-lint-strong-marker-1.0.1.tgz",
+ "integrity": "sha512-+bwWKWAqDwqd21Vw+ndqVFh5V27Dp4MKhk9AUlKmcvgJYHuvQ8UfWQdpZcP218ps/4EbwTfyi33TaPyXqOTlXA==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-table-cell-padding": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-table-cell-padding/-/remark-lint-table-cell-padding-1.0.1.tgz",
+ "integrity": "sha512-o3WwC9YysXbQKf0D5nvhhJPcLagqedLwGdifukdgyaKvuIQVbtWbNv1/UOdB3LL+D+2fUrwrCmnQ8J3E1r0lBw==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-table-pipe-alignment": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-table-pipe-alignment/-/remark-lint-table-pipe-alignment-1.0.1.tgz",
+ "integrity": "sha512-lYfK2gWGN45hYfAOZw5gscQ4uDaO9bJLp+H64jvrTQzBV+OCvB9kRQwI0oIrJAa4XMmipAZR+2XhjNSCfQ0fRA==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-table-pipes": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-table-pipes/-/remark-lint-table-pipes-1.0.1.tgz",
+ "integrity": "sha512-VHfDRvcovLBl/cvSjwDoA0xRizdZU33A6F2qFD9A5hu1sDWgGxMLg5m2MOvFlRkUVxSwUv47cuD0/yxB4THYXQ==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-lint-unordered-list-marker-style": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/remark-lint-unordered-list-marker-style/-/remark-lint-unordered-list-marker-style-1.0.1.tgz",
+ "integrity": "sha512-dHYD9cHM9ZJ7BKUZ1nEPGfLAHgUmYxccXtms1GSEM/uyUtR2SU/ao1RwZZ+LvacZFCNZ1yG2yKCJhGI/5U/GrA==",
+ "dev": true,
+ "requires": {
+ "unified-lint-rule": "^1.0.0",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.1"
+ }
+ },
+ "remark-message-control": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/remark-message-control/-/remark-message-control-4.1.0.tgz",
+ "integrity": "sha512-e1dszks4YKY7hLAkhS2367jBjBpAfvi+kVgSN/tOFrdp3qxITjiNR5fOFnyYF8vvorkQ9uxlKJoZUOW8T7rKDg==",
+ "dev": true,
+ "requires": {
+ "mdast-comment-marker": "^1.0.0",
+ "unified-message-control": "^1.0.0",
+ "xtend": "^4.0.1"
+ }
+ },
+ "remark-parse": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-4.0.0.tgz",
+ "integrity": "sha512-XZgICP2gJ1MHU7+vQaRM+VA9HEL3X253uwUM/BGgx3iv6TH2B3bF3B8q00DKcyP9YrJV+/7WOWEWBFF/u8cIsw==",
+ "dev": true,
+ "requires": {
+ "collapse-white-space": "^1.0.2",
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-whitespace-character": "^1.0.0",
+ "is-word-character": "^1.0.0",
+ "markdown-escapes": "^1.0.0",
+ "parse-entities": "^1.0.2",
+ "repeat-string": "^1.5.4",
+ "state-toggle": "^1.0.0",
+ "trim": "0.0.1",
+ "trim-trailing-lines": "^1.0.0",
+ "unherit": "^1.0.4",
+ "unist-util-remove-position": "^1.0.0",
+ "vfile-location": "^2.0.0",
+ "xtend": "^4.0.1"
+ }
+ },
+ "remark-preset-lint-markdown-style-guide": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/remark-preset-lint-markdown-style-guide/-/remark-preset-lint-markdown-style-guide-2.1.1.tgz",
+ "integrity": "sha512-Ao6fB63WuGtz1fa4rjoI+u1EOu21rWVGPmJlUKZlCICPPB6I815nJ52V0sLYjaw2cs+ZiXsXhdVinN7UpVgXcQ==",
+ "dev": true,
+ "requires": {
+ "remark-lint": "^6.0.0",
+ "remark-lint-blockquote-indentation": "^1.0.0",
+ "remark-lint-code-block-style": "^1.0.0",
+ "remark-lint-definition-case": "^1.0.0",
+ "remark-lint-definition-spacing": "^1.0.0",
+ "remark-lint-emphasis-marker": "^1.0.0",
+ "remark-lint-fenced-code-flag": "^1.0.0",
+ "remark-lint-fenced-code-marker": "^1.0.0",
+ "remark-lint-file-extension": "^1.0.0",
+ "remark-lint-final-definition": "^1.0.0",
+ "remark-lint-hard-break-spaces": "^1.0.0",
+ "remark-lint-heading-increment": "^1.0.0",
+ "remark-lint-heading-style": "^1.0.0",
+ "remark-lint-link-title-style": "^1.0.0",
+ "remark-lint-list-item-content-indent": "^1.0.0",
+ "remark-lint-list-item-indent": "^1.0.0",
+ "remark-lint-list-item-spacing": "^1.0.0",
+ "remark-lint-maximum-heading-length": "^1.0.0",
+ "remark-lint-maximum-line-length": "^1.0.0",
+ "remark-lint-no-auto-link-without-protocol": "^1.0.0",
+ "remark-lint-no-blockquote-without-marker": "^2.0.0",
+ "remark-lint-no-consecutive-blank-lines": "^1.0.0",
+ "remark-lint-no-duplicate-headings": "^1.0.0",
+ "remark-lint-no-emphasis-as-heading": "^1.0.0",
+ "remark-lint-no-file-name-articles": "^1.0.0",
+ "remark-lint-no-file-name-consecutive-dashes": "^1.0.0",
+ "remark-lint-no-file-name-irregular-characters": "^1.0.0",
+ "remark-lint-no-file-name-mixed-case": "^1.0.0",
+ "remark-lint-no-file-name-outer-dashes": "^1.0.0",
+ "remark-lint-no-heading-punctuation": "^1.0.0",
+ "remark-lint-no-inline-padding": "^1.0.0",
+ "remark-lint-no-literal-urls": "^1.0.0",
+ "remark-lint-no-multiple-toplevel-headings": "^1.0.0",
+ "remark-lint-no-shell-dollars": "^1.0.0",
+ "remark-lint-no-shortcut-reference-image": "^1.0.0",
+ "remark-lint-no-shortcut-reference-link": "^1.0.0",
+ "remark-lint-no-table-indentation": "^1.0.0",
+ "remark-lint-ordered-list-marker-style": "^1.0.0",
+ "remark-lint-ordered-list-marker-value": "^1.0.0",
+ "remark-lint-rule-style": "^1.0.0",
+ "remark-lint-strong-marker": "^1.0.0",
+ "remark-lint-table-cell-padding": "^1.0.0",
+ "remark-lint-table-pipe-alignment": "^1.0.0",
+ "remark-lint-table-pipes": "^1.0.0",
+ "remark-lint-unordered-list-marker-style": "^1.0.0"
+ }
+ },
+ "remark-stringify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-4.0.0.tgz",
+ "integrity": "sha512-xLuyKTnuQer3ke9hkU38SUYLiTmS078QOnoFavztmbt/pAJtNSkNtFgR0U//uCcmG0qnyxao+PDuatQav46F1w==",
+ "dev": true,
+ "requires": {
+ "ccount": "^1.0.0",
+ "is-alphanumeric": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-whitespace-character": "^1.0.0",
+ "longest-streak": "^2.0.1",
+ "markdown-escapes": "^1.0.0",
+ "markdown-table": "^1.1.0",
+ "mdast-util-compact": "^1.0.0",
+ "parse-entities": "^1.0.2",
+ "repeat-string": "^1.5.4",
+ "state-toggle": "^1.0.0",
+ "stringify-entities": "^1.0.1",
+ "unherit": "^1.0.4",
+ "xtend": "^4.0.1"
+ }
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "dev": true
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "^1.0.0"
+ }
+ },
+ "replace-ext": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+ "dev": true
+ },
+ "request": {
+ "version": "2.88.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+ "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.0",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.4.3",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "dependencies": {
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.36.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
+ "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.20",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
+ "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
+ "dev": true,
+ "requires": {
+ "mime-db": "~1.36.0"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.24",
+ "punycode": "^1.4.1"
+ }
+ }
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+ "dev": true,
+ "requires": {
+ "caller-path": "^0.1.0",
+ "resolve-from": "^1.0.0"
+ },
+ "dependencies": {
+ "resolve-from": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+ "dev": true
+ }
+ }
+ },
+ "resolve": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
+ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.5"
+ }
+ },
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
+ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
+ "dev": true,
+ "requires": {
+ "exit-hook": "^1.0.0",
+ "onetime": "^1.0.0"
+ }
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "revalidator": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.3.1.tgz",
+ "integrity": "sha1-/yzEz3zHxjhaxxAXgnbm280Ddi8=",
+ "dev": true
+ },
+ "right-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "align-text": "^0.1.1"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=",
+ "dev": true,
+ "requires": {
+ "glob": "^7.0.5"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
+ }
+ },
+ "ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "dev": true,
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "run-async": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+ "dev": true,
+ "requires": {
+ "is-promise": "^2.1.0"
+ }
+ },
+ "run-parallel": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
+ "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
+ "dev": true
+ },
+ "rxjs": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.2.tgz",
+ "integrity": "sha512-hV7criqbR0pe7EeL3O66UYVg92IR0XsA97+9y+BWTePK9SKmEI5Qd3Zj6uPnGkNzXsBywBQWTvujPl+1Kn9Zjw==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.9.0"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "~0.1.10"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "dev": true,
+ "optional": true
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ },
+ "semver-diff": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+ "dev": true,
+ "requires": {
+ "semver": "^5.0.3"
+ }
+ },
+ "send": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.6.2",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.0",
+ "statuses": "~1.4.0"
+ },
+ "dependencies": {
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "dev": true
+ },
+ "mime": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+ "dev": true
+ }
+ }
+ },
+ "serve": {
+ "version": "6.5.8",
+ "resolved": "https://registry.npmjs.org/serve/-/serve-6.5.8.tgz",
+ "integrity": "sha512-GZYlJz7f6E7Xq6xbg1rTSvQQV9x4v/yYB/sum6egzSBLa/mdk1PViDSX2JvL0Me83sxu3JpEpQELfakDKbGcrw==",
+ "dev": true,
+ "requires": {
+ "args": "4.0.0",
+ "basic-auth": "2.0.0",
+ "bluebird": "3.5.1",
+ "boxen": "1.3.0",
+ "chalk": "2.4.1",
+ "clipboardy": "1.2.3",
+ "dargs": "5.1.0",
+ "detect-port": "1.2.3",
+ "filesize": "3.6.1",
+ "fs-extra": "6.0.1",
+ "handlebars": "4.0.11",
+ "ip": "1.1.5",
+ "micro": "9.3.1",
+ "micro-compress": "1.0.0",
+ "mime-types": "2.1.18",
+ "node-version": "1.1.3",
+ "openssl-self-signed-certificate": "1.1.6",
+ "opn": "5.3.0",
+ "path-is-inside": "1.0.2",
+ "path-type": "3.0.0",
+ "send": "0.16.2",
+ "update-check": "1.5.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "dargs": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz",
+ "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=",
+ "dev": true
+ },
+ "fs-extra": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
+ "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "requires": {
+ "pify": "^3.0.0"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "set-immediate-shim": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
+ "dev": true
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "setprototypeof": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
+ "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
+ "dev": true
+ },
+ "sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "shasum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
+ "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=",
+ "dev": true,
+ "requires": {
+ "json-stable-stringify": "~0.0.0",
+ "sha.js": "~2.4.4"
+ }
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "shell-quote": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
+ "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
+ "dev": true,
+ "requires": {
+ "array-filter": "~0.0.0",
+ "array-map": "~0.0.0",
+ "array-reduce": "~0.0.0",
+ "jsonify": "~0.0.0"
+ }
+ },
+ "shellsubstitute": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shellsubstitute/-/shellsubstitute-1.2.0.tgz",
+ "integrity": "sha1-5PcCpQxRiw9v6YRRiQ1wWvKba3A=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
+ },
+ "single-line-log": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz",
+ "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1"
+ }
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ }
+ }
+ },
+ "sliced": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
+ "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.2.0"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
+ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
+ "dev": true,
+ "requires": {
+ "atob": "^2.1.1",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "spdx-correct": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
+ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
+ "dev": true,
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
+ "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
+ "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==",
+ "dev": true
+ },
+ "speedometer": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz",
+ "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=",
+ "dev": true
+ },
+ "split": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
+ "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
+ "dev": true,
+ "requires": {
+ "through": "2"
+ }
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.0"
+ }
+ },
+ "split2": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz",
+ "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==",
+ "dev": true,
+ "requires": {
+ "through2": "^2.0.2"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.14.2",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
+ "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
+ "dev": true,
+ "requires": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ }
+ },
+ "standard": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/standard/-/standard-12.0.1.tgz",
+ "integrity": "sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg==",
+ "dev": true,
+ "requires": {
+ "eslint": "~5.4.0",
+ "eslint-config-standard": "12.0.0",
+ "eslint-config-standard-jsx": "6.0.2",
+ "eslint-plugin-import": "~2.14.0",
+ "eslint-plugin-node": "~7.0.1",
+ "eslint-plugin-promise": "~4.0.0",
+ "eslint-plugin-react": "~7.11.1",
+ "eslint-plugin-standard": "~4.0.0",
+ "standard-engine": "~9.0.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz",
+ "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^2.0.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "requires": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "debug": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz",
+ "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "eslint": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz",
+ "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.5.0",
+ "babel-code-frame": "^6.26.0",
+ "chalk": "^2.1.0",
+ "cross-spawn": "^6.0.5",
+ "debug": "^3.1.0",
+ "doctrine": "^2.1.0",
+ "eslint-scope": "^4.0.0",
+ "eslint-utils": "^1.3.1",
+ "eslint-visitor-keys": "^1.0.0",
+ "espree": "^4.0.0",
+ "esquery": "^1.0.1",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^2.0.0",
+ "functional-red-black-tree": "^1.0.1",
+ "glob": "^7.1.2",
+ "globals": "^11.7.0",
+ "ignore": "^4.0.2",
+ "imurmurhash": "^0.1.4",
+ "inquirer": "^5.2.0",
+ "is-resolvable": "^1.1.0",
+ "js-yaml": "^3.11.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.3.0",
+ "lodash": "^4.17.5",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.8.2",
+ "path-is-inside": "^1.0.2",
+ "pluralize": "^7.0.0",
+ "progress": "^2.0.0",
+ "regexpp": "^2.0.0",
+ "require-uncached": "^1.0.3",
+ "semver": "^5.5.0",
+ "strip-ansi": "^4.0.0",
+ "strip-json-comments": "^2.0.1",
+ "table": "^4.0.3",
+ "text-table": "^0.2.0"
+ }
+ },
+ "external-editor": {
+ "version": "2.2.0",
+ "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+ "dev": true,
+ "requires": {
+ "chardet": "^0.4.0",
+ "iconv-lite": "^0.4.17",
+ "tmp": "^0.0.33"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ },
+ "inquirer": {
+ "version": "5.2.0",
+ "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz",
+ "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "^3.0.0",
+ "chalk": "^2.0.0",
+ "cli-cursor": "^2.1.0",
+ "cli-width": "^2.0.0",
+ "external-editor": "^2.1.0",
+ "figures": "^2.0.0",
+ "lodash": "^4.3.0",
+ "mute-stream": "0.0.7",
+ "run-async": "^2.2.0",
+ "rxjs": "^5.5.2",
+ "string-width": "^2.1.0",
+ "strip-ansi": "^4.0.0",
+ "through": "^2.3.6"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^1.0.0"
+ }
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "dev": true,
+ "requires": {
+ "onetime": "^2.0.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "rxjs": {
+ "version": "5.5.12",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz",
+ "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==",
+ "dev": true,
+ "requires": {
+ "symbol-observable": "1.0.1"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "~1.0.2"
+ }
+ }
+ }
+ },
+ "standard-engine": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-9.0.0.tgz",
+ "integrity": "sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w==",
+ "dev": true,
+ "requires": {
+ "deglob": "^2.1.0",
+ "get-stdin": "^6.0.0",
+ "minimist": "^1.1.0",
+ "pkg-conf": "^2.0.0"
+ },
+ "dependencies": {
+ "get-stdin": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
+ "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
+ "dev": true
+ }
+ }
+ },
+ "standard-markdown": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/standard-markdown/-/standard-markdown-5.0.0.tgz",
+ "integrity": "sha512-jgGyyMmZqOIYYAHs/ksEkGUa+bngJce2P4FygFIrb1WMkKmQL/RPgsI2njl02r6kiDzHPProOG9y4ABe20joCA==",
+ "dev": true,
+ "requires": {
+ "async": "^2.6.1",
+ "commander": "^2.18.0",
+ "globby": "^8.0.1",
+ "lodash.flatten": "^4.4.0",
+ "lodash.range": "^3.2.0",
+ "ora": "^3.0.0",
+ "standard": "^12.0.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "async": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
+ "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.10"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^2.0.0"
+ }
+ },
+ "cli-spinners": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz",
+ "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.18.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz",
+ "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "globby": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz",
+ "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==",
+ "dev": true,
+ "requires": {
+ "array-union": "^1.0.1",
+ "dir-glob": "^2.0.0",
+ "fast-glob": "^2.0.2",
+ "glob": "^7.1.2",
+ "ignore": "^3.3.5",
+ "pify": "^3.0.0",
+ "slash": "^1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.1"
+ }
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^1.0.0"
+ }
+ },
+ "ora": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-3.0.0.tgz",
+ "integrity": "sha512-LBS97LFe2RV6GJmXBi6OKcETKyklHNMV0xw7BtsVn2MlsgsydyZetSCbCANr+PFLmDyv4KV88nn0eCKza665Mg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.3.1",
+ "cli-cursor": "^2.1.0",
+ "cli-spinners": "^1.1.0",
+ "log-symbols": "^2.2.0",
+ "strip-ansi": "^4.0.0",
+ "wcwidth": "^1.0.1"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "dev": true,
+ "requires": {
+ "onetime": "^2.0.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "state-toggle": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz",
+ "integrity": "sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+ "dev": true
+ },
+ "stream-browserify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
+ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
+ "dev": true,
+ "requires": {
+ "inherits": "~2.0.1",
+ "readable-stream": "^2.0.2"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "stream-combiner2": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
+ "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "~0.1.0",
+ "readable-stream": "^2.0.2"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "stream-consume": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz",
+ "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==",
+ "dev": true
+ },
+ "stream-http": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz",
+ "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==",
+ "dev": true,
+ "requires": {
+ "builtin-status-codes": "^3.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.3.6",
+ "to-arraybuffer": "^1.0.0",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "stream-shift": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+ "dev": true
+ },
+ "stream-splicer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz",
+ "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.2"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "string": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/string/-/string-3.3.3.tgz",
+ "integrity": "sha1-XqIRzZLSKOGEKUmQpsyXs2anfLA=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "stringify-entities": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz",
+ "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==",
+ "dev": true,
+ "requires": {
+ "character-entities-html4": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-hexadecimal": "^1.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "^0.2.0"
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true
+ },
+ "subarg": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
+ "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.1.0"
+ }
+ },
+ "sumchecker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz",
+ "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.2.0"
+ }
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "^1.0.0"
+ }
+ },
+ "symbol-observable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz",
+ "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=",
+ "dev": true
+ },
+ "symbol-tree": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
+ "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=",
+ "dev": true,
+ "optional": true
+ },
+ "syntax-error": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
+ "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
+ "dev": true,
+ "requires": {
+ "acorn-node": "^1.2.0"
+ }
+ },
+ "table": {
+ "version": "4.0.3",
+ "resolved": "http://registry.npmjs.org/table/-/table-4.0.3.tgz",
+ "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.0.1",
+ "ajv-keywords": "^3.0.0",
+ "chalk": "^2.1.0",
+ "lodash": "^4.17.4",
+ "slice-ansi": "1.0.0",
+ "string-width": "^2.1.1"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz",
+ "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "tar": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.2.tgz",
+ "integrity": "sha512-BfkE9CciGGgDsATqkikUHrQrraBCO+ke/1f6SFAEMnxyyfN9lxC+nW1NFWMpqH865DhHIy9vQi682gk1X7friw==",
+ "dev": true,
+ "requires": {
+ "chownr": "^1.0.1",
+ "fs-minipass": "^1.2.5",
+ "minipass": "^2.2.4",
+ "minizlib": "^1.1.0",
+ "mkdirp": "^0.5.0",
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.2"
+ }
+ },
+ "tar-fs": {
+ "version": "1.16.3",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz",
+ "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==",
+ "dev": true,
+ "requires": {
+ "chownr": "^1.0.1",
+ "mkdirp": "^0.5.1",
+ "pump": "^1.0.0",
+ "tar-stream": "^1.1.2"
+ },
+ "dependencies": {
+ "pump": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz",
+ "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ }
+ }
+ },
+ "tar-stream": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz",
+ "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==",
+ "dev": true,
+ "requires": {
+ "bl": "^1.0.0",
+ "buffer-alloc": "^1.1.0",
+ "end-of-stream": "^1.0.0",
+ "fs-constants": "^1.0.0",
+ "readable-stream": "^2.3.0",
+ "to-buffer": "^1.1.0",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "temp": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz",
+ "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "^1.0.0",
+ "rimraf": "~2.2.6"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.2.8",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
+ "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
+ "dev": true
+ }
+ }
+ },
+ "tempfile": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz",
+ "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "^1.0.0",
+ "uuid": "^2.0.1"
+ },
+ "dependencies": {
+ "uuid": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
+ "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
+ "dev": true
+ }
+ }
+ },
+ "term-size": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
+ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
+ "dev": true,
+ "requires": {
+ "execa": "^0.7.0"
+ }
+ },
+ "text-extensions": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.8.0.tgz",
+ "integrity": "sha512-mVzjRxuWnDKs/qH1rbOJEVHLlSX9kty9lpi7lMvLgU9S74mQ8/Ozg9UPcKxShh0qG2NZ+NyPOPpcZU4C1Eld9A==",
+ "dev": true
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "throttleit": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz",
+ "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=",
+ "dev": true
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.1.5",
+ "xtend": "~4.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+ "dev": true
+ },
+ "timers-browserify": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
+ "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=",
+ "dev": true,
+ "requires": {
+ "process": "~0.11.0"
+ }
+ },
+ "tmp": {
+ "version": "0.0.28",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz",
+ "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "~1.0.1"
+ }
+ },
+ "to-arraybuffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+ "dev": true
+ },
+ "to-buffer": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
+ "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ }
+ }
+ },
+ "to-vfile": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-2.2.0.tgz",
+ "integrity": "sha512-saGC8/lWdGrEoBMLUtgzhRHWAkQMP8gdldA3MOAUhBwTGEb1RSMVcflHGSx4ZJsdEZ9o1qDBCPp47LCPrbZWow==",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.4",
+ "vfile": "^2.0.0",
+ "x-is-function": "^1.0.4"
+ }
+ },
+ "touch": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.3.tgz",
+ "integrity": "sha1-Ua7z1ElXHU8oel2Hyci0kYGg2x0=",
+ "dev": true,
+ "requires": {
+ "nopt": "~1.0.10"
+ },
+ "dependencies": {
+ "nopt": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
+ "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1"
+ }
+ }
+ }
+ },
+ "tough-cookie": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "psl": "^1.1.24",
+ "punycode": "^1.4.1"
+ }
+ },
+ "tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
+ "dev": true,
+ "optional": true
+ },
+ "traverse": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
+ "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=",
+ "dev": true
+ },
+ "trim": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
+ "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
+ "dev": true
+ },
+ "trim-newlines": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
+ "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=",
+ "dev": true
+ },
+ "trim-off-newlines": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz",
+ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=",
+ "dev": true
+ },
+ "trim-trailing-lines": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz",
+ "integrity": "sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg==",
+ "dev": true
+ },
+ "trough": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.2.tgz",
+ "integrity": "sha512-FHkoUZvG6Egrv9XZAyYGKEyb1JMsFphgPjoczkZC2y6W93U1jswcVURB8MUvtsahEPEVACyxD47JAL63vF4JsQ==",
+ "dev": true
+ },
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
+ },
+ "tslint": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-4.5.1.tgz",
+ "integrity": "sha1-BTVocb7yOkNJBnNABvwYgza6gks=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "^6.20.0",
+ "colors": "^1.1.2",
+ "diff": "^3.0.1",
+ "findup-sync": "~0.3.0",
+ "glob": "^7.1.1",
+ "optimist": "~0.6.0",
+ "resolve": "^1.1.7",
+ "tsutils": "^1.1.0",
+ "update-notifier": "^2.0.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "minimist": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+ "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
+ "dev": true
+ },
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "dev": true,
+ "requires": {
+ "minimist": "~0.0.1",
+ "wordwrap": "~0.0.2"
+ }
+ }
+ }
+ },
+ "tsutils": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-1.9.1.tgz",
+ "integrity": "sha1-ufmrROVa+WgYMdXyjQrur1x1DLA=",
+ "dev": true
+ },
+ "tty-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
+ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
+ "dev": true
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true,
+ "optional": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "~1.1.2"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "typescript": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
+ "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==",
+ "dev": true
+ },
+ "uc.micro": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz",
+ "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "2.8.29",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "source-map": "~0.5.1",
+ "uglify-to-browserify": "~1.0.0",
+ "yargs": "~3.10.0"
+ },
+ "dependencies": {
+ "yargs": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "camelcase": "^1.0.2",
+ "cliui": "^2.1.0",
+ "decamelize": "^1.0.0",
+ "window-size": "0.1.0"
+ }
+ }
+ }
+ },
+ "uglify-to-browserify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+ "dev": true,
+ "optional": true
+ },
+ "umd": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
+ "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==",
+ "dev": true
+ },
+ "unherit": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.1.tgz",
+ "integrity": "sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "xtend": "^4.0.1"
+ }
+ },
+ "unified": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz",
+ "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==",
+ "dev": true,
+ "requires": {
+ "bail": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-plain-obj": "^1.1.0",
+ "trough": "^1.0.0",
+ "vfile": "^2.0.0",
+ "x-is-string": "^0.1.0"
+ }
+ },
+ "unified-args": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unified-args/-/unified-args-4.0.0.tgz",
+ "integrity": "sha1-jZubitNHvrN/QwVipixNNhtCIg8=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^4.0.0",
+ "chalk": "^2.0.0",
+ "chokidar": "^1.5.1",
+ "minimist": "^1.2.0",
+ "text-table": "^0.2.0",
+ "unified-engine": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "unified-engine": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/unified-engine/-/unified-engine-4.0.1.tgz",
+ "integrity": "sha1-lpKql/1cTsNoiXeeElFL746GP8M=",
+ "dev": true,
+ "requires": {
+ "concat-stream": "^1.5.1",
+ "debug": "^2.2.0",
+ "fault": "^1.0.0",
+ "fn-name": "^2.0.1",
+ "glob": "^7.0.3",
+ "ignore": "^3.2.0",
+ "is-empty": "^1.0.0",
+ "is-hidden": "^1.0.1",
+ "is-object": "^1.0.1",
+ "js-yaml": "^3.6.1",
+ "load-plugin": "^2.0.0",
+ "parse-json": "^2.2.0",
+ "to-vfile": "^2.0.0",
+ "trough": "^1.0.0",
+ "vfile-reporter": "^4.0.0",
+ "vfile-statistics": "^1.1.0",
+ "x-is-function": "^1.0.4",
+ "x-is-string": "^0.1.0",
+ "xtend": "^4.0.1"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
+ }
+ },
+ "unified-lint-rule": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-1.0.2.tgz",
+ "integrity": "sha512-WkqwMC1aijHE17W3Z1co7aTI+Dzo1jHdwhI66fTClU1yOTbzAsTqlOD6eeR/MI9235Y3nu2jMDcm8GCeq4gaLg==",
+ "dev": true,
+ "requires": {
+ "wrapped": "^1.0.1"
+ }
+ },
+ "unified-message-control": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unified-message-control/-/unified-message-control-1.0.4.tgz",
+ "integrity": "sha512-e1dEtN4Z/TvLn/qHm+xeZpzqhJTtfZusFErk336kkZVpqrJYiV9ptxq+SbRPFMlN0OkjDYHmVJ929KYjsMTo3g==",
+ "dev": true,
+ "requires": {
+ "trim": "0.0.1",
+ "unist-util-visit": "^1.0.0",
+ "vfile-location": "^2.0.0"
+ }
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.1",
+ "to-object-path": "^0.3.0"
+ }
+ }
+ }
+ },
+ "uniq": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+ "dev": true
+ },
+ "unique-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
+ "dev": true,
+ "requires": {
+ "crypto-random-string": "^1.0.0"
+ }
+ },
+ "unist-util-generated": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.2.tgz",
+ "integrity": "sha512-1HcwiEO62dr0XWGT+abVK4f0aAm8Ik8N08c5nAYVmuSxfvpA9rCcNyX/le8xXj1pJK5nBrGlZefeWB6bN8Pstw==",
+ "dev": true
+ },
+ "unist-util-is": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.2.tgz",
+ "integrity": "sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw==",
+ "dev": true
+ },
+ "unist-util-modify-children": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.2.tgz",
+ "integrity": "sha512-GRi04yhng1WqBf5RBzPkOtWAadcZS2gvuOgNn/cyJBYNxtTuyYqTKN0eg4rC1YJwGnzrqfRB3dSKm8cNCjNirg==",
+ "dev": true,
+ "requires": {
+ "array-iterate": "^1.0.0"
+ }
+ },
+ "unist-util-position": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.0.1.tgz",
+ "integrity": "sha512-05QfJDPI7PE1BIUtAxeSV+cDx21xP7+tUZgSval5CA7tr0pHBwybF7OnEa1dOFqg6BfYH/qiMUnWwWj+Frhlww==",
+ "dev": true
+ },
+ "unist-util-remove-position": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz",
+ "integrity": "sha512-XxoNOBvq1WXRKXxgnSYbtCF76TJrRoe5++pD4cCBsssSiWSnPEktyFrFLE8LTk3JW5mt9hB0Sk5zn4x/JeWY7Q==",
+ "dev": true,
+ "requires": {
+ "unist-util-visit": "^1.1.0"
+ }
+ },
+ "unist-util-stringify-position": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
+ "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
+ "dev": true
+ },
+ "unist-util-visit": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.3.1.tgz",
+ "integrity": "sha512-0fdB9EQJU0tho5tK0VzOJzAQpPv2LyLZ030b10GxuzAWEfvd54mpY7BMjQ1L69k2YNvL+SvxRzH0yUIehOO8aA==",
+ "dev": true,
+ "requires": {
+ "unist-util-is": "^2.1.1"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "untildify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz",
+ "integrity": "sha1-F+soB5h/dpUunASF/DEdBqgmouA=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "^1.0.0"
+ }
+ },
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+ "dev": true
+ },
+ "update-check": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.1.tgz",
+ "integrity": "sha512-M3rjq5KwSrWZrm2GVPIQIF+NXpIn5I9mIV67gGoydptQvzRjLp9ZbM6ctFJeNuaWSm5+mNP7aInELjSiLcIw6A==",
+ "dev": true,
+ "requires": {
+ "registry-auth-token": "3.3.2",
+ "registry-url": "3.1.0"
+ }
+ },
+ "update-notifier": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
+ "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
+ "dev": true,
+ "requires": {
+ "boxen": "^1.2.1",
+ "chalk": "^2.0.1",
+ "configstore": "^3.0.0",
+ "import-lazy": "^2.1.0",
+ "is-ci": "^1.0.10",
+ "is-installed-globally": "^0.1.0",
+ "is-npm": "^1.0.0",
+ "latest-version": "^3.0.0",
+ "semver-diff": "^2.0.0",
+ "xdg-basedir": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "uri-js": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "url": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+ "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+ "dev": true,
+ "requires": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+ "dev": true
+ }
+ }
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "dev": true,
+ "requires": {
+ "prepend-http": "^1.0.1"
+ }
+ },
+ "use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+ "dev": true
+ },
+ "util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.1"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+ "dev": true
+ }
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "uuid": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+ "dev": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
+ "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "dev": true
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "vfile": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz",
+ "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.4",
+ "replace-ext": "1.0.0",
+ "unist-util-stringify-position": "^1.0.0",
+ "vfile-message": "^1.0.0"
+ }
+ },
+ "vfile-location": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.3.tgz",
+ "integrity": "sha512-zM5/l4lfw1CBoPx3Jimxoc5RNDAHHpk6AM6LM0pTIkm5SUSsx8ZekZ0PVdf0WEZ7kjlhSt7ZlqbRL6Cd6dBs6A==",
+ "dev": true
+ },
+ "vfile-message": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.0.1.tgz",
+ "integrity": "sha512-vSGCkhNvJzO6VcWC6AlJW4NtYOVtS+RgCaqFIYUjoGIlHnFL+i0LbtYvonDWOMcB97uTPT4PRsyYY7REWC9vug==",
+ "dev": true,
+ "requires": {
+ "unist-util-stringify-position": "^1.1.1"
+ }
+ },
+ "vfile-reporter": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-4.0.0.tgz",
+ "integrity": "sha1-6m8K4TQvSEFXOYXgX5QXNvJ96do=",
+ "dev": true,
+ "requires": {
+ "repeat-string": "^1.5.0",
+ "string-width": "^1.0.0",
+ "supports-color": "^4.1.0",
+ "unist-util-stringify-position": "^1.0.0",
+ "vfile-statistics": "^1.1.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "^2.0.0"
+ }
+ }
+ }
+ },
+ "vfile-statistics": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-1.1.1.tgz",
+ "integrity": "sha512-dxUM6IYvGChHuwMT3dseyU5BHprNRXzAV0OHx1A769lVGsTiT50kU7BbpRFV+IE6oWmU+PwHdsTKfXhnDIRIgQ==",
+ "dev": true
+ },
+ "vm-browserify": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
+ "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
+ "dev": true,
+ "requires": {
+ "indexof": "0.0.1"
+ }
+ },
+ "walk-sync": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-0.3.2.tgz",
+ "integrity": "sha1-SCcoCvxC0OA1NnxKTjHurA0Tb3U=",
+ "dev": true,
+ "requires": {
+ "ensure-posix-path": "^1.0.0",
+ "matcher-collection": "^1.0.0"
+ }
+ },
+ "wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+ "dev": true,
+ "requires": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "webidl-conversions": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-2.0.1.tgz",
+ "integrity": "sha1-O/glj30xjHRDw28uFpQCoaZwNQY=",
+ "dev": true,
+ "optional": true
+ },
+ "whatwg-url-compat": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz",
+ "integrity": "sha1-AImBEa9om7CXVBzVpFymyHmERb8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "tr46": "~0.0.1"
+ }
+ },
+ "which": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+ "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+ "dev": true
+ },
+ "widest-line": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz",
+ "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=",
+ "dev": true,
+ "requires": {
+ "string-width": "^2.1.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ }
+ }
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+ "dev": true,
+ "optional": true
+ },
+ "wordwrap": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1"
+ }
+ },
+ "wrapped": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wrapped/-/wrapped-1.0.1.tgz",
+ "integrity": "sha1-x4PZ2Aeyc+mwHoUWgKk4yHyQckI=",
+ "dev": true,
+ "requires": {
+ "co": "3.1.0",
+ "sliced": "^1.0.1"
+ },
+ "dependencies": {
+ "co": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz",
+ "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=",
+ "dev": true
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "write": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "dev": true,
+ "requires": {
+ "mkdirp": "^0.5.1"
+ }
+ },
+ "write-file-atomic": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
+ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "x-is-function": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/x-is-function/-/x-is-function-1.0.4.tgz",
+ "integrity": "sha1-XSlNw9Joy90GJYDgxd93o5HR+h4=",
+ "dev": true
+ },
+ "x-is-string": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
+ "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
+ "dev": true
+ },
+ "xdg-basedir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
+ "dev": true
+ },
+ "xml-name-validator": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
+ "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=",
+ "dev": true,
+ "optional": true
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+ "dev": true
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz",
+ "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz",
+ "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=",
+ "dev": true,
+ "requires": {
+ "cliui": "^3.2.0",
+ "decamelize": "^1.1.1",
+ "get-caller-file": "^1.0.1",
+ "lodash.assign": "^4.0.3",
+ "os-locale": "^1.4.0",
+ "read-pkg-up": "^1.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^1.0.1",
+ "which-module": "^1.0.0",
+ "window-size": "^0.2.0",
+ "y18n": "^3.2.1",
+ "yargs-parser": "^2.4.1"
+ },
+ "dependencies": {
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wrap-ansi": "^2.0.0"
+ }
+ },
+ "window-size": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz",
+ "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=",
+ "dev": true
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz",
+ "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^3.0.0",
+ "lodash.assign": "^4.0.6"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+ "dev": true
+ }
+ }
+ }
+ }
+}
diff --git a/devel/electron4/files/package.json b/devel/electron4/files/package.json
new file mode 100644
index 000000000000..999a8f322d5d
--- /dev/null
+++ b/devel/electron4/files/package.json
@@ -0,0 +1,76 @@
+{
+ "name": "electron",
+ "version": "4.2.2",
+ "repository": "https://github.com/electron/electron",
+ "description": "Build cross platform desktop apps with JavaScript, HTML, and CSS",
+ "devDependencies": {
+ "aliasify": "^2.1.0",
+ "asar": "^0.11.0",
+ "browserify": "^13.1.0",
+ "check-for-leaks": "^1.0.2",
+ "clang-format": "^1.2.3",
+ "colors": "^1.1.2",
+ "dotenv-safe": "^4.0.4",
+ "dugite": "^1.45.0",
+ "electabul": "~0.0.4",
+ "electron-docs-linter": "^2.4.0",
+ "electron-typescript-definitions": "^2.1.1",
+ "eslint": "^5.6.0",
+ "eslint-config-standard": "^12.0.0",
+ "eslint-plugin-mocha": "^5.2.0",
+ "folder-hash": "^2.1.1",
+ "github": "^9.2.0",
+ "html-entities": "^1.2.1",
+ "husky": "^0.14.3",
+ "lint": "^1.1.2",
+ "minimist": "^1.2.0",
+ "node-fetch": "^2.1.2",
+ "nugget": "^2.0.1",
+ "octicons": "^7.3.0",
+ "recursive-readdir": "^2.2.2",
+ "remark-cli": "^4.0.0",
+ "remark-preset-lint-markdown-style-guide": "^2.1.1",
+ "request": "^2.88.0",
+ "semver": "^5.5.0",
+ "serve": "^6.5.8",
+ "standard-markdown": "^5.0.0",
+ "sumchecker": "^2.0.2",
+ "temp": "^0.8.3"
+ },
+ "private": true,
+ "scripts": {
+ "asar": "asar",
+ "browserify": "browserify",
+ "bump-version": "./script/bump-version.py",
+ "check-tls": "python ./script/tls.py",
+ "clang-format": "find atom/ brightray/ chromium_src/ -iname *.h -o -iname *.cc -o -iname *.mm | xargs clang-format -i",
+ "lint": "node ./script/lint.js && npm run lint:clang-format && npm run lint:docs",
+ "lint:js": "node ./script/lint.js --js",
+ "lint:clang-format": "python script/run-clang-format.py -r -c atom/ chromium_src/ brightray/ || (echo \"\\nCode not formatted correctly.\" && exit 1)",
+ "lint:cpp": "node ./script/lint.js --cc",
+ "lint:py": "node ./script/lint.js --py",
+ "lint:gn": "node ./script/lint.js --gn",
+ "lint:docs": "remark docs -qf && npm run lint:js-in-markdown && npm run create-typescript-definitions && npm run lint:docs-relative-links",
+ "lint:docs-relative-links": "python ./script/check-relative-doc-links.py",
+ "lint:js-in-markdown": "standard-markdown docs",
+ "create-api-json": "electron-docs-linter docs --outfile=electron-api.json",
+ "create-typescript-definitions": "npm run create-api-json && electron-typescript-definitions --in=electron-api.json --out=electron.d.ts",
+ "preinstall": "node -e 'process.exit(0)'",
+ "precommit": "python script/run-clang-format.py -r -c atom/ chromium_src/ brightray/ && node ./script/lint.js -c && remark docs -qf || (echo \"Code not formatted correctly.\" && exit 1)",
+ "prepack": "check-for-leaks",
+ "prepush": "check-for-leaks",
+ "repl": "node ./script/start.js --interactive",
+ "start": "node ./script/start.js",
+ "test": "node ./script/spec-runner.js electron/spec"
+ },
+ "license": "MIT",
+ "author": "Electron Community",
+ "keywords": [
+ "electron"
+ ],
+ "aliasify": {
+ "replacements": {
+ "@electron/internal/(.+)": "./lib/$1"
+ }
+ }
+}
diff --git a/devel/electron4/files/patch-BUILD.gn b/devel/electron4/files/patch-BUILD.gn
new file mode 100644
index 000000000000..4d7aaf7a0f36
--- /dev/null
+++ b/devel/electron4/files/patch-BUILD.gn
@@ -0,0 +1,87 @@
+--- BUILD.gn.orig 2019-03-15 06:36:52 UTC
++++ BUILD.gn
+@@ -354,7 +354,7 @@ group("gn_all") {
+ [ "//third_party/android_crazy_linker:android_crazy_linker_zip_fuzzer" ]
+ }
+
+- if (is_linux || is_android) {
++ if ((is_linux && !is_bsd) || is_android) {
+ deps += [
+ "//third_party/breakpad:breakpad_unittests",
+ "//third_party/breakpad:core-2-minidump",
+@@ -396,8 +396,6 @@ group("gn_all") {
+ "//net:disk_cache_memory_test",
+ "//net:quic_client",
+ "//net:quic_server",
+- "//sandbox/linux:chrome_sandbox",
+- "//sandbox/linux:sandbox_linux_unittests",
+ "//testing:empty_main",
+ ]
+
+@@ -454,10 +452,6 @@ group("gn_all") {
+ "//chrome/test/chromedriver:chromedriver",
+ "//chrome/test/chromedriver:chromedriver_tests",
+ "//components/sync:run_sync_testserver",
+- "//courgette:courgette",
+- "//courgette:courgette_fuzz",
+- "//courgette:courgette_minimal_tool",
+- "//courgette:courgette_unittests",
+ "//media/cast:generate_barcode_video",
+ "//media/cast:generate_timecode_audio",
+ "//net:crash_cache",
+@@ -513,10 +507,6 @@ group("gn_all") {
+ "//mojo:mojo_perftests",
+ "//services/service_manager/public/cpp",
+ "//testing/gmock:gmock_main",
+- "//third_party/breakpad:dump_syms($host_toolchain)",
+- "//third_party/breakpad:microdump_stackwalk($host_toolchain)",
+- "//third_party/breakpad:minidump_dump($host_toolchain)",
+- "//third_party/breakpad:minidump_stackwalk($host_toolchain)",
+ ]
+
+ if (!is_android) {
+@@ -593,7 +583,7 @@ group("gn_all") {
+ host_os == "win") {
+ deps += [ "//chrome/test/mini_installer:mini_installer_tests" ]
+ }
+- } else if (!is_android && !is_ios && !is_fuchsia) {
++ } else if (!is_android && !is_ios && !is_fuchsia && !is_bsd) {
+ deps += [ "//third_party/breakpad:symupload($host_toolchain)" ]
+ }
+
+@@ -819,7 +809,6 @@ if (is_chromeos) {
+ "//ppapi/examples/video_decode",
+ "//sandbox/linux:chrome_sandbox",
+ "//sandbox/linux:sandbox_linux_unittests",
+- "//third_party/breakpad:minidump_stackwalk($host_toolchain)",
+
+ # Blocked on https://github.com/catapult-project/catapult/issues/2297
+ #"//third_party/catapult/telemetry:bitmaptools",
+@@ -942,7 +931,7 @@ if (!is_ios) {
+ ]
+ }
+
+- if (!is_win && !is_android) {
++ if (!is_win && !is_android && !is_bsd) {
+ data_deps +=
+ [ "//third_party/breakpad:minidump_stackwalk($host_toolchain)" ]
+ }
+@@ -951,7 +940,7 @@ if (!is_ios) {
+ data_deps += [ "//third_party/breakpad:dump_syms($host_toolchain)" ]
+ }
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ data_deps += [ "//third_party/breakpad:dump_syms($host_toolchain)" ]
+ }
+
+@@ -1076,9 +1065,6 @@ group("chromium_builder_perf") {
+
+ if (is_win) {
+ data_deps += [ "//chrome/installer/mini_installer:mini_installer" ]
+- } else {
+- data_deps +=
+- [ "//third_party/breakpad:minidump_stackwalk($host_toolchain)" ]
+ }
+ if (is_win || is_android) {
+ data_deps += [
diff --git a/devel/electron4/files/patch-apps_ui_views_app__window__frame__view.cc b/devel/electron4/files/patch-apps_ui_views_app__window__frame__view.cc
new file mode 100644
index 000000000000..5807afb7f09c
--- /dev/null
+++ b/devel/electron4/files/patch-apps_ui_views_app__window__frame__view.cc
@@ -0,0 +1,11 @@
+--- apps/ui/views/app_window_frame_view.cc.orig 2019-03-15 06:36:53 UTC
++++ apps/ui/views/app_window_frame_view.cc
+@@ -132,7 +132,7 @@ gfx::Rect AppWindowFrameView::GetBoundsForClientView()
+ gfx::Rect AppWindowFrameView::GetWindowBoundsForClientBounds(
+ const gfx::Rect& client_bounds) const {
+ gfx::Rect window_bounds = client_bounds;
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ // Get the difference between the widget's client area bounds and window
+ // bounds, and grow |window_bounds| by that amount.
+ gfx::Insets native_frame_insets =
diff --git a/devel/electron4/files/patch-ash_display_mirror__window__controller.cc b/devel/electron4/files/patch-ash_display_mirror__window__controller.cc
new file mode 100644
index 000000000000..eb173dbb11c9
--- /dev/null
+++ b/devel/electron4/files/patch-ash_display_mirror__window__controller.cc
@@ -0,0 +1,14 @@
+--- ash/display/mirror_window_controller.cc.orig 2019-03-15 06:36:54 UTC
++++ ash/display/mirror_window_controller.cc
+@@ -255,7 +255,11 @@ void MirrorWindowController::UpdateWindow(
+ return info.id() == iter->first;
+ }) == display_info_list.end()) {
+ CloseAndDeleteHost(iter->second, true);
++#if defined(__llvm__)
++ mirroring_host_info_map_.erase(iter++);
++#else
+ iter = mirroring_host_info_map_.erase(iter);
++#endif
+ } else {
+ ++iter;
+ }
diff --git a/devel/electron4/files/patch-base_BUILD.gn b/devel/electron4/files/patch-base_BUILD.gn
new file mode 100644
index 000000000000..0c88c218b6d1
--- /dev/null
+++ b/devel/electron4/files/patch-base_BUILD.gn
@@ -0,0 +1,67 @@
+--- base/BUILD.gn.orig 2019-03-16 09:15:20 UTC
++++ base/BUILD.gn
+@@ -1248,7 +1248,7 @@ jumbo_component("base") {
+ # Needed for <atomic> if using newer C++ library than sysroot, except if
+ # building inside the cros_sdk environment - use host_toolchain as a
+ # more robust check for this.
+- if ((is_android || (is_linux && !is_chromecast)) &&
++ if ((is_android || (is_linux && !is_chromecast) && !is_clang) &&
+ host_toolchain != "//build/toolchain/cros:host") {
+ libs += [ "atomic" ]
+ }
+@@ -1274,7 +1274,7 @@ jumbo_component("base") {
+ "allocator/allocator_shim_override_glibc_weak_symbols.h",
+ ]
+ deps += [ "//base/allocator:tcmalloc" ]
+- } else if (is_linux && use_allocator == "none") {
++ } else if ((is_linux && !is_bsd) && use_allocator == "none") {
+ sources += [ "allocator/allocator_shim_default_dispatch_to_glibc.cc" ]
+ } else if (is_android && use_allocator == "none") {
+ sources += [
+@@ -1704,6 +1704,33 @@ jumbo_component("base") {
+ }
+ }
+
++ if (is_bsd) {
++ sources -= [
++ "files/file_path_watcher_linux.cc",
++ "files/file_util_linux.cc",
++ "process/memory_linux.cc",
++ "process/process_linux.cc",
++ "process/process_handle_linux.cc",
++ "process/process_iterator_linux.cc",
++ "process/process_metrics_linux.cc",
++ "sys_info_linux.cc"
++ ]
++ sources += [
++ "files/file_path_watcher_kqueue.cc",
++ "files/file_path_watcher_kqueue.h",
++ "files/file_path_watcher_stub.cc",
++ "process/memory_stubs.cc",
++ "process/process_handle_freebsd.cc",
++ "process/process_iterator_freebsd.cc",
++ "process/process_metrics_freebsd.cc",
++ "sys_info_freebsd.cc",
++ ]
++ libs = [
++ "execinfo", # logging.cc
++ "kvm" # process_metrics_freebsd
++ ]
++ }
++
+ # iOS
+ if (is_ios) {
+ set_sources_assignment_filter([])
+@@ -2692,6 +2719,12 @@ test("base_unittests") {
+ "trace_event/trace_event_android_unittest.cc",
+ ]
+ set_sources_assignment_filter(sources_assignment_filter)
++ }
++
++ if (is_bsd) {
++ sources -= [
++ "debug/proc_maps_linux_unittest.cc",
++ ]
+ }
+
+ if (is_win) {
diff --git a/devel/electron4/files/patch-base_allocator_allocator__shim.cc b/devel/electron4/files/patch-base_allocator_allocator__shim.cc
new file mode 100644
index 000000000000..e29579ece684
--- /dev/null
+++ b/devel/electron4/files/patch-base_allocator_allocator__shim.cc
@@ -0,0 +1,11 @@
+--- base/allocator/allocator_shim.cc.orig 2019-03-15 06:36:56 UTC
++++ base/allocator/allocator_shim.cc
+@@ -69,7 +69,7 @@ inline const allocator::AllocatorDispatch* GetChainHea
+ // Unfortunately due to that bug NoBarrier_Load() is mistakenly fully
+ // barriered on Linux+Clang, and that causes visible perf regressons.
+ return reinterpret_cast<const allocator::AllocatorDispatch*>(
+-#if defined(OS_LINUX) && defined(__clang__)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && defined(__clang__)
+ *static_cast<const volatile subtle::AtomicWord*>(&g_chain_head)
+ #else
+ subtle::NoBarrier_Load(&g_chain_head)
diff --git a/devel/electron4/files/patch-base_allocator_allocator__shim__default__dispatch__to__glibc.cc b/devel/electron4/files/patch-base_allocator_allocator__shim__default__dispatch__to__glibc.cc
new file mode 100644
index 000000000000..ce0f933ab779
--- /dev/null
+++ b/devel/electron4/files/patch-base_allocator_allocator__shim__default__dispatch__to__glibc.cc
@@ -0,0 +1,77 @@
+--- base/allocator/allocator_shim_default_dispatch_to_glibc.cc.orig 2019-03-15 06:36:56 UTC
++++ base/allocator/allocator_shim_default_dispatch_to_glibc.cc
+@@ -3,19 +3,28 @@
+ // found in the LICENSE file.
+
+ #include "base/allocator/allocator_shim.h"
++#include <stdio.h>
++#include <stdlib.h>
++#include <malloc_np.h>
+
+-#include <malloc.h>
+-
+ // This translation unit defines a default dispatch for the allocator shim which
+ // routes allocations to libc functions.
+-// The code here is strongly inspired from tcmalloc's libc_override_glibc.h.
++// The code here is strongly inspired from tcmalloc's override_glibc.h.
+
+ extern "C" {
+-void* __libc_malloc(size_t size);
+-void* __libc_calloc(size_t n, size_t size);
+-void* __libc_realloc(void* address, size_t size);
+-void* __libc_memalign(size_t alignment, size_t size);
+-void __libc_free(void* ptr);
++void* __malloc(size_t size);
++void* __calloc(size_t n, size_t size);
++void* __realloc(void* address, size_t size);
++void* __memalign(size_t alignment, size_t size) {
++ void *ret;
++ if (__posix_memalign(&ret, alignment, size) != 0) {
++ return nullptr;
++ } else {
++ return ret;
++ }
++}
++int __posix_memalign(void **ptr, size_t alignment, size_t size);
++void __free(void* ptr);
+ } // extern "C"
+
+ namespace {
+@@ -23,32 +32,32 @@ namespace {
+ using base::allocator::AllocatorDispatch;
+
+ void* GlibcMalloc(const AllocatorDispatch*, size_t size, void* context) {
+- return __libc_malloc(size);
++ return __malloc(size);
+ }
+
+ void* GlibcCalloc(const AllocatorDispatch*,
+ size_t n,
+ size_t size,
+ void* context) {
+- return __libc_calloc(n, size);
++ return __calloc(n, size);
+ }
+
+ void* GlibcRealloc(const AllocatorDispatch*,
+ void* address,
+ size_t size,
+ void* context) {
+- return __libc_realloc(address, size);
++ return __realloc(address, size);
+ }
+
+ void* GlibcMemalign(const AllocatorDispatch*,
+ size_t alignment,
+ size_t size,
+ void* context) {
+- return __libc_memalign(alignment, size);
++ return __memalign(alignment, size);
+ }
+
+ void GlibcFree(const AllocatorDispatch*, void* address, void* context) {
+- __libc_free(address);
++ __free(address);
+ }
+
+ size_t GlibcGetSizeEstimate(const AllocatorDispatch*,
diff --git a/devel/electron4/files/patch-base_allocator_allocator__shim__override__libc__symbols.h b/devel/electron4/files/patch-base_allocator_allocator__shim__override__libc__symbols.h
new file mode 100644
index 000000000000..a5372f0f8258
--- /dev/null
+++ b/devel/electron4/files/patch-base_allocator_allocator__shim__override__libc__symbols.h
@@ -0,0 +1,11 @@
+--- base/allocator/allocator_shim_override_libc_symbols.h.orig 2019-03-15 06:25:27 UTC
++++ base/allocator/allocator_shim_override_libc_symbols.h
+@@ -10,7 +10,7 @@
+ #endif
+ #define BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_LIBC_SYMBOLS_H_
+
+-#include <malloc.h>
++#include <stdlib.h>
+
+ #include "base/allocator/allocator_shim_internals.h"
+
diff --git a/devel/electron4/files/patch-base_allocator_allocator__shim__unittest.cc b/devel/electron4/files/patch-base_allocator_allocator__shim__unittest.cc
new file mode 100644
index 000000000000..2ffbbaff5675
--- /dev/null
+++ b/devel/electron4/files/patch-base_allocator_allocator__shim__unittest.cc
@@ -0,0 +1,36 @@
+--- base/allocator/allocator_shim_unittest.cc.orig 2019-03-15 06:36:56 UTC
++++ base/allocator/allocator_shim_unittest.cc
+@@ -294,7 +294,7 @@ TEST_F(AllocatorShimTest, InterceptLibcSymbols) {
+ ASSERT_GE(aligned_allocs_intercepted_by_size[61], 1u);
+ #endif // !OS_WIN
+
+-#if !defined(OS_WIN) && !defined(OS_MACOSX)
++#if !defined(OS_WIN) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ void* memalign_ptr = memalign(128, 53);
+ ASSERT_NE(nullptr, memalign_ptr);
+ ASSERT_EQ(0u, reinterpret_cast<uintptr_t>(memalign_ptr) % 128);
+@@ -307,7 +307,7 @@ TEST_F(AllocatorShimTest, InterceptLibcSymbols) {
+ ASSERT_GE(aligned_allocs_intercepted_by_alignment[kPageSize], 1u);
+ // pvalloc rounds the size up to the next page.
+ ASSERT_GE(aligned_allocs_intercepted_by_size[kPageSize], 1u);
+-#endif // !OS_WIN && !OS_MACOSX
++#endif // !OS_WIN && !OS_MACOSX && !OS_BSD
+
+ char* realloc_ptr = static_cast<char*>(malloc(10));
+ strcpy(realloc_ptr, "foobar");
+@@ -323,13 +323,13 @@ TEST_F(AllocatorShimTest, InterceptLibcSymbols) {
+ free(zero_alloc_ptr);
+ ASSERT_GE(frees_intercepted_by_addr[Hash(zero_alloc_ptr)], 1u);
+
+-#if !defined(OS_WIN) && !defined(OS_MACOSX)
++#if !defined(OS_WIN) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ free(memalign_ptr);
+ ASSERT_GE(frees_intercepted_by_addr[Hash(memalign_ptr)], 1u);
+
+ free(pvalloc_ptr);
+ ASSERT_GE(frees_intercepted_by_addr[Hash(pvalloc_ptr)], 1u);
+-#endif // !OS_WIN && !OS_MACOSX
++#endif // !OS_WIN && !OS_MACOSX && !OS_BSD
+
+ #if !defined(OS_WIN)
+ free(posix_memalign_ptr);
diff --git a/devel/electron4/files/patch-base_allocator_partition__allocator_partition__alloc__unittest.cc b/devel/electron4/files/patch-base_allocator_partition__allocator_partition__alloc__unittest.cc
new file mode 100644
index 000000000000..51053e2ba725
--- /dev/null
+++ b/devel/electron4/files/patch-base_allocator_partition__allocator_partition__alloc__unittest.cc
@@ -0,0 +1,11 @@
+--- base/allocator/partition_allocator/partition_alloc_unittest.cc.orig 2019-03-15 06:36:56 UTC
++++ base/allocator/partition_allocator/partition_alloc_unittest.cc
+@@ -1305,7 +1305,7 @@ TEST_F(PartitionAllocTest, LostFreePagesBug) {
+ #if !defined(OS_WIN) && \
+ (!defined(ARCH_CPU_64_BITS) || \
+ (defined(OS_POSIX) && \
+- !(defined(OS_FUCHSIA) || defined(OS_MACOSX) || defined(OS_ANDROID))))
++ !(defined(OS_FUCHSIA) || defined(OS_MACOSX) || defined(OS_ANDROID) || defined(OS_BSD))))
+
+ // The following four tests wrap a called function in an expect death statement
+ // to perform their test, because they are non-hermetic. Specifically they are
diff --git a/devel/electron4/files/patch-base_debug_debugger__posix.cc b/devel/electron4/files/patch-base_debug_debugger__posix.cc
new file mode 100644
index 000000000000..c54dbd19e7b0
--- /dev/null
+++ b/devel/electron4/files/patch-base_debug_debugger__posix.cc
@@ -0,0 +1,57 @@
+--- base/debug/debugger_posix.cc.orig 2019-03-15 06:36:56 UTC
++++ base/debug/debugger_posix.cc
+@@ -84,7 +84,7 @@ bool BeingDebugged() {
+ KERN_PROC,
+ KERN_PROC_PID,
+ getpid()
+-#if defined(OS_OPENBSD)
++#if defined(OS_BSD)
+ , sizeof(struct kinfo_proc),
+ 0
+ #endif
+@@ -92,33 +92,36 @@ bool BeingDebugged() {
+
+ // Caution: struct kinfo_proc is marked __APPLE_API_UNSTABLE. The source and
+ // binary interfaces may change.
+- struct kinfo_proc info;
+- size_t info_size = sizeof(info);
++ struct kinfo_proc *info;
++ size_t info_size;
+
+-#if defined(OS_OPENBSD)
+ if (sysctl(mib, arraysize(mib), NULL, &info_size, NULL, 0) < 0)
+ return -1;
+
++ info = (struct kinfo_proc *)malloc(info_size);
++
+ mib[5] = (info_size / sizeof(struct kinfo_proc));
+-#endif
+
+- int sysctl_result = sysctl(mib, arraysize(mib), &info, &info_size, NULL, 0);
++ int sysctl_result = sysctl(mib, arraysize(mib), info, &info_size, NULL, 0);
+ DCHECK_EQ(sysctl_result, 0);
+ if (sysctl_result != 0) {
+ is_set = true;
+ being_debugged = false;
+- return being_debugged;
++ goto out;
+ }
+
+ // This process is being debugged if the P_TRACED flag is set.
+ is_set = true;
+ #if defined(OS_FREEBSD)
+- being_debugged = (info.ki_flag & P_TRACED) != 0;
++ being_debugged = (info->ki_flag & P_TRACED) != 0;
+ #elif defined(OS_BSD)
+- being_debugged = (info.p_flag & P_TRACED) != 0;
++ being_debugged = (info->p_flag & P_TRACED) != 0;
+ #else
+- being_debugged = (info.kp_proc.p_flag & P_TRACED) != 0;
++ being_debugged = (info->kp_proc.p_flag & P_TRACED) != 0;
+ #endif
++
++out:
++ free(info);
+ return being_debugged;
+ }
+
diff --git a/devel/electron4/files/patch-base_debug_elf__reader__linux.cc b/devel/electron4/files/patch-base_debug_elf__reader__linux.cc
new file mode 100644
index 000000000000..6bffb4a0c249
--- /dev/null
+++ b/devel/electron4/files/patch-base_debug_elf__reader__linux.cc
@@ -0,0 +1,13 @@
+--- base/debug/elf_reader_linux.cc.orig 2019-03-15 06:36:56 UTC
++++ base/debug/elf_reader_linux.cc
+@@ -41,8 +41,10 @@ Optional<std::string> ElfSegmentBuildIDNoteAsString(co
+ const void* section_end = segment.data() + segment.size_bytes();
+ const Nhdr* note_header = reinterpret_cast<const Nhdr*>(segment.data());
+ while (note_header < section_end) {
++#if !defined(OS_BSD)
+ if (note_header->n_type == NT_GNU_BUILD_ID)
+ break;
++#endif
+ note_header = reinterpret_cast<const Nhdr*>(
+ reinterpret_cast<const char*>(note_header) + sizeof(Nhdr) +
+ bits::Align(note_header->n_namesz, 4) +
diff --git a/devel/electron4/files/patch-base_debug_proc__maps__linux.cc b/devel/electron4/files/patch-base_debug_proc__maps__linux.cc
new file mode 100644
index 000000000000..146cc0a07cc0
--- /dev/null
+++ b/devel/electron4/files/patch-base_debug_proc__maps__linux.cc
@@ -0,0 +1,11 @@
+--- base/debug/proc_maps_linux.cc.orig 2019-03-15 06:25:27 UTC
++++ base/debug/proc_maps_linux.cc
+@@ -12,7 +12,7 @@
+ #include "base/strings/string_split.h"
+ #include "build/build_config.h"
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_BSD) || defined(OS_ANDROID)
+ #include <inttypes.h>
+ #endif
+
diff --git a/devel/electron4/files/patch-base_debug_stack__trace.h b/devel/electron4/files/patch-base_debug_stack__trace.h
new file mode 100644
index 000000000000..6caa0f79f328
--- /dev/null
+++ b/devel/electron4/files/patch-base_debug_stack__trace.h
@@ -0,0 +1,10 @@
+--- base/debug/stack_trace.h.orig 2019-03-15 06:36:56 UTC
++++ base/debug/stack_trace.h
+@@ -16,6 +16,7 @@
+ #include "build/build_config.h"
+
+ #if defined(OS_POSIX)
++#include <sys/stdint.h>
+ #include <unistd.h>
+ #endif
+
diff --git a/devel/electron4/files/patch-base_debug_stack__trace__posix.cc b/devel/electron4/files/patch-base_debug_stack__trace__posix.cc
new file mode 100644
index 000000000000..802a2f70a991
--- /dev/null
+++ b/devel/electron4/files/patch-base_debug_stack__trace__posix.cc
@@ -0,0 +1,40 @@
+--- base/debug/stack_trace_posix.cc.orig 2019-03-15 06:36:56 UTC
++++ base/debug/stack_trace_posix.cc
+@@ -35,7 +35,7 @@
+ #include <AvailabilityMacros.h>
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/debug/proc_maps_linux.h"
+ #endif
+
+@@ -646,6 +646,11 @@ class SandboxSymbolizeHelper {
+ // for the modules that are loaded in the current process.
+ // Returns true on success.
+ bool CacheMemoryRegions() {
++#if defined(OS_BSD)
++ // TODO (rene) avoid link error, implement something?
++ NOTIMPLEMENTED();
++ return false;
++#else
+ // Reads /proc/self/maps.
+ std::string contents;
+ if (!ReadProcMaps(&contents)) {
+@@ -663,6 +668,7 @@ class SandboxSymbolizeHelper {
+
+ is_initialized_ = true;
+ return true;
++#endif
+ }
+
+ // Opens all object files and caches their file descriptors.
+@@ -800,7 +806,7 @@ StackTrace::StackTrace(size_t count) {
+ // NOTE: This code MUST be async-signal safe (it's used by in-process
+ // stack dumping signal handler). NO malloc or stdio is allowed here.
+
+-#if !defined(__UCLIBC__) && !defined(_AIX)
++#if !defined(__UCLIBC__) && !defined(_AIX) && !defined(OS_BSD)
+ count = std::min(arraysize(trace_), count);
+
+ // Though the backtrace API man page does not list any possible negative
diff --git a/devel/electron4/files/patch-base_debug_thread__heap__usage__tracker.cc b/devel/electron4/files/patch-base_debug_thread__heap__usage__tracker.cc
new file mode 100644
index 000000000000..cb6de6913b80
--- /dev/null
+++ b/devel/electron4/files/patch-base_debug_thread__heap__usage__tracker.cc
@@ -0,0 +1,15 @@
+--- base/debug/thread_heap_usage_tracker.cc.orig 2019-03-15 06:36:56 UTC
++++ base/debug/thread_heap_usage_tracker.cc
+@@ -17,10 +17,12 @@
+ #include "base/threading/thread_local_storage.h"
+ #include "build/build_config.h"
+
++#if !defined(OS_BSD)
+ #if defined(OS_MACOSX) || defined(OS_IOS)
+ #include <malloc/malloc.h>
+ #else
+ #include <malloc.h>
++#endif
+ #endif
+
+ namespace base {
diff --git a/devel/electron4/files/patch-base_files_file__path__unittest.cc b/devel/electron4/files/patch-base_files_file__path__unittest.cc
new file mode 100644
index 000000000000..69caeee666b7
--- /dev/null
+++ b/devel/electron4/files/patch-base_files_file__path__unittest.cc
@@ -0,0 +1,11 @@
+--- base/files/file_path_unittest.cc.orig 2019-03-15 06:36:56 UTC
++++ base/files/file_path_unittest.cc
+@@ -1136,7 +1136,7 @@ TEST_F(FilePathTest, FromUTF8Unsafe_And_AsUTF8Unsafe)
+ "\xEF\xBC\xA1\xEF\xBC\xA2\xEF\xBC\xA3.txt" },
+ };
+
+-#if !defined(SYSTEM_NATIVE_UTF8) && defined(OS_LINUX)
++#if !defined(SYSTEM_NATIVE_UTF8) && (defined(OS_LINUX) || defined(OS_BSD))
+ ScopedLocale locale("en_US.UTF-8");
+ #endif
+
diff --git a/devel/electron4/files/patch-base_files_file__path__watcher__kqueue.h b/devel/electron4/files/patch-base_files_file__path__watcher__kqueue.h
new file mode 100644
index 000000000000..ae6e9f89fd84
--- /dev/null
+++ b/devel/electron4/files/patch-base_files_file__path__watcher__kqueue.h
@@ -0,0 +1,13 @@
+--- base/files/file_path_watcher_kqueue.h.orig 2019-03-15 06:25:27 UTC
++++ base/files/file_path_watcher_kqueue.h
+@@ -5,6 +5,10 @@
+ #ifndef BASE_FILES_FILE_PATH_WATCHER_KQUEUE_H_
+ #define BASE_FILES_FILE_PATH_WATCHER_KQUEUE_H_
+
++#ifdef __FreeBSD__
++#include <sys/stdint.h>
++#include <sys/types.h>
++#endif
+ #include <sys/event.h>
+
+ #include <memory>
diff --git a/devel/electron4/files/patch-base_files_file__path__watcher__stub.cc b/devel/electron4/files/patch-base_files_file__path__watcher__stub.cc
new file mode 100644
index 000000000000..f07d136744eb
--- /dev/null
+++ b/devel/electron4/files/patch-base_files_file__path__watcher__stub.cc
@@ -0,0 +1,51 @@
+--- base/files/file_path_watcher_stub.cc.orig 2019-03-15 06:25:27 UTC
++++ base/files/file_path_watcher_stub.cc
+@@ -1,14 +1,15 @@
+-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
++// Copyright 2014 The Chromium Authors. All rights reserved.
+ // Use of this source code is governed by a BSD-style license that can be
+ // found in the LICENSE file.
+
+-// This file exists for Unix systems which don't have the inotify headers, and
+-// thus cannot build file_watcher_inotify.cc
+
+-#include "base/files/file_path_watcher.h"
++#include <memory>
+
++#include "base/files/file_path_watcher.h"
++#include "base/files/file_path_watcher_kqueue.h"
+ #include "base/macros.h"
+ #include "base/memory/ptr_util.h"
++#include "build/build_config.h"
+
+ namespace base {
+
+@@ -22,12 +23,26 @@ class FilePathWatcherImpl : public FilePathWatcher::Pl
+ bool Watch(const FilePath& path,
+ bool recursive,
+ const FilePathWatcher::Callback& callback) override {
+- return false;
++ DCHECK(!impl_.get());
++ if (recursive) {
++ if (!FilePathWatcher::RecursiveWatchAvailable())
++ return false;
++ } else {
++ impl_ = std::make_unique<FilePathWatcherKQueue>();
++ }
++ DCHECK(impl_.get());
++ return impl_->Watch(path, recursive, callback);
+ }
+
+- void Cancel() override {}
++ void Cancel() override {
++ if (impl_.get())
++ impl_->Cancel();
++ set_cancelled();
++ }
+
+ private:
++ std::unique_ptr<PlatformDelegate> impl_;
++
+ DISALLOW_COPY_AND_ASSIGN(FilePathWatcherImpl);
+ };
+
diff --git a/devel/electron4/files/patch-base_files_file__path__watcher__unittest.cc b/devel/electron4/files/patch-base_files_file__path__watcher__unittest.cc
new file mode 100644
index 000000000000..a8284c603a85
--- /dev/null
+++ b/devel/electron4/files/patch-base_files_file__path__watcher__unittest.cc
@@ -0,0 +1,11 @@
+--- base/files/file_path_watcher_unittest.cc.orig 2019-03-15 06:36:56 UTC
++++ base/files/file_path_watcher_unittest.cc
+@@ -438,7 +438,7 @@ TEST_F(FilePathWatcherTest, WatchDirectory) {
+ VLOG(1) << "Waiting for file1 creation";
+ ASSERT_TRUE(WaitForEvents());
+
+-#if !defined(OS_MACOSX)
++#if !defined(OS_MACOSX) && !defined(OS_BSD)
+ // Mac implementation does not detect files modified in a directory.
+ ASSERT_TRUE(WriteFile(file1, "content v2"));
+ VLOG(1) << "Waiting for file1 modification";
diff --git a/devel/electron4/files/patch-base_files_file__util.h b/devel/electron4/files/patch-base_files_file__util.h
new file mode 100644
index 000000000000..77b900b289a8
--- /dev/null
+++ b/devel/electron4/files/patch-base_files_file__util.h
@@ -0,0 +1,11 @@
+--- base/files/file_util.h.orig 2019-03-15 06:36:56 UTC
++++ base/files/file_util.h
+@@ -445,7 +445,7 @@ BASE_EXPORT bool VerifyPathControlledByAdmin(const bas
+ // the directory |path|, in the number of FilePath::CharType, or -1 on failure.
+ BASE_EXPORT int GetMaximumPathComponentLength(const base::FilePath& path);
+
+-#if defined(OS_LINUX) || defined(OS_AIX)
++#if defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
+ // Broad categories of file systems as returned by statfs() on Linux.
+ enum FileSystemType {
+ FILE_SYSTEM_UNKNOWN, // statfs failed.
diff --git a/devel/electron4/files/patch-base_files_memory__mapped__file__posix.cc b/devel/electron4/files/patch-base_files_memory__mapped__file__posix.cc
new file mode 100644
index 000000000000..50b78a85ece7
--- /dev/null
+++ b/devel/electron4/files/patch-base_files_memory__mapped__file__posix.cc
@@ -0,0 +1,11 @@
+--- base/files/memory_mapped_file_posix.cc.orig 2019-03-15 06:36:56 UTC
++++ base/files/memory_mapped_file_posix.cc
+@@ -110,6 +110,8 @@ bool MemoryMappedFile::MapFileRegionToMemory(
+ // Only Android API>=21 supports the fallocate call. Older versions need
+ // to manually extend the file by writing zeros at block intervals.
+ do_manual_extension = true;
++#elif defined(OS_BSD)
++ do_manual_extension = true;
+ #elif defined(OS_MACOSX)
+ // MacOS doesn't support fallocate even though their new APFS filesystem
+ // does support sparse files. It does, however, have the functionality
diff --git a/devel/electron4/files/patch-base_i18n_icu__util.cc b/devel/electron4/files/patch-base_i18n_icu__util.cc
new file mode 100644
index 000000000000..8182486e67e6
--- /dev/null
+++ b/devel/electron4/files/patch-base_i18n_icu__util.cc
@@ -0,0 +1,20 @@
+--- base/i18n/icu_util.cc.orig 2019-03-15 06:36:56 UTC
++++ base/i18n/icu_util.cc
+@@ -20,7 +20,7 @@
+ #include "build/build_config.h"
+ #include "third_party/icu/source/common/unicode/putil.h"
+ #include "third_party/icu/source/common/unicode/udata.h"
+-#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_ANDROID)
++#if (defined(OS_LINUX) || defined(OS_BSD) && !defined(OS_CHROMEOS)) || defined(OS_ANDROID)
+ #include "third_party/icu/source/i18n/unicode/timezone.h"
+ #endif
+
+@@ -315,7 +315,7 @@ bool InitializeICU() {
+ // TODO(jungshik): Some callers do not care about tz at all. If necessary,
+ // add a boolean argument to this function to init'd the default tz only
+ // when requested.
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ if (result)
+ std::unique_ptr<icu::TimeZone> zone(icu::TimeZone::createDefault());
+ #endif
diff --git a/devel/electron4/files/patch-base_linux__util.cc b/devel/electron4/files/patch-base_linux__util.cc
new file mode 100644
index 000000000000..5f24914ba132
--- /dev/null
+++ b/devel/electron4/files/patch-base_linux__util.cc
@@ -0,0 +1,18 @@
+--- base/linux_util.cc.orig 2019-03-15 06:36:56 UTC
++++ base/linux_util.cc
+@@ -111,12 +111,14 @@ char g_linux_distro[kDistroSize] =
+ "CrOS";
+ #elif defined(OS_ANDROID)
+ "Android";
++#elif defined(OS_BSD)
++ "BSD";
+ #else // if defined(OS_LINUX)
+ "Unknown";
+ #endif
+
+ std::string GetLinuxDistro() {
+-#if defined(OS_CHROMEOS) || defined(OS_ANDROID)
++#if defined(OS_CHROMEOS) || defined(OS_ANDROID) || defined(OS_BSD)
+ return g_linux_distro;
+ #elif defined(OS_LINUX)
+ LinuxDistroHelper* distro_state_singleton = LinuxDistroHelper::GetInstance();
diff --git a/devel/electron4/files/patch-base_logging__unittest.cc b/devel/electron4/files/patch-base_logging__unittest.cc
new file mode 100644
index 000000000000..e7361e177307
--- /dev/null
+++ b/devel/electron4/files/patch-base_logging__unittest.cc
@@ -0,0 +1,11 @@
+--- base/logging_unittest.cc.orig 2019-03-15 06:36:56 UTC
++++ base/logging_unittest.cc
+@@ -420,7 +420,7 @@ void CheckCrashTestSighandler(int, siginfo_t* info, vo
+ // need the arch-specific boilerplate below, which is inspired by breakpad.
+ // At the same time, on OSX, ucontext.h is deprecated but si_addr works fine.
+ uintptr_t crash_addr = 0;
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ crash_addr = reinterpret_cast<uintptr_t>(info->si_addr);
+ #else // OS_POSIX && !OS_MACOSX
+ ucontext_t* context = reinterpret_cast<ucontext_t*>(context_ptr);
diff --git a/devel/electron4/files/patch-base_native__library__posix.cc b/devel/electron4/files/patch-base_native__library__posix.cc
new file mode 100644
index 000000000000..97c5380af358
--- /dev/null
+++ b/devel/electron4/files/patch-base_native__library__posix.cc
@@ -0,0 +1,11 @@
+--- base/native_library_posix.cc.orig 2019-03-15 06:36:56 UTC
++++ base/native_library_posix.cc
+@@ -29,7 +29,7 @@ NativeLibrary LoadNativeLibraryWithOptions(const FileP
+ // http://crbug.com/17943, http://crbug.com/17557, http://crbug.com/36892,
+ // and http://crbug.com/40794.
+ int flags = RTLD_LAZY;
+-#if defined(OS_ANDROID) || !defined(RTLD_DEEPBIND)
++#if defined(OS_ANDROID) || !defined(RTLD_DEEPBIND) || defined(OS_BSD)
+ // Certain platforms don't define RTLD_DEEPBIND. Android dlopen() requires
+ // further investigation, as it might vary across versions. Crash here to
+ // warn developers that they're trying to rely on uncertain behavior.
diff --git a/devel/electron4/files/patch-base_native__library__unittest.cc b/devel/electron4/files/patch-base_native__library__unittest.cc
new file mode 100644
index 000000000000..6cca3ee8f911
--- /dev/null
+++ b/devel/electron4/files/patch-base_native__library__unittest.cc
@@ -0,0 +1,11 @@
+--- base/native_library_unittest.cc.orig 2019-03-15 06:25:27 UTC
++++ base/native_library_unittest.cc
+@@ -120,7 +120,7 @@ TEST(NativeLibraryTest, LoadLibrary) {
+ // Android dlopen() requires further investigation, as it might vary across
+ // versions with respect to symbol resolution scope.
+ // TSan and MSan error out on RTLD_DEEPBIND, https://crbug.com/705255
+-#if !defined(OS_ANDROID) && !defined(THREAD_SANITIZER) && \
++#if !defined(OS_ANDROID) && !defined(OS_BSD) && !defined(THREAD_SANITIZER) && \
+ !defined(MEMORY_SANITIZER)
+
+ // Verifies that the |prefer_own_symbols| option satisfies its guarantee that
diff --git a/devel/electron4/files/patch-base_posix_unix__domain__socket.cc b/devel/electron4/files/patch-base_posix_unix__domain__socket.cc
new file mode 100644
index 000000000000..68b77e9b98a7
--- /dev/null
+++ b/devel/electron4/files/patch-base_posix_unix__domain__socket.cc
@@ -0,0 +1,49 @@
+--- base/posix/unix_domain_socket.cc.orig 2019-03-15 06:25:27 UTC
++++ base/posix/unix_domain_socket.cc
+@@ -5,7 +5,10 @@
+ #include "base/posix/unix_domain_socket.h"
+
+ #include <errno.h>
++#include <sys/param.h>
+ #include <sys/socket.h>
++#include <sys/types.h>
++#include <sys/ucred.h>
+ #if !defined(OS_NACL_NONSFI)
+ #include <sys/un.h>
+ #endif
+@@ -28,6 +31,14 @@ namespace base {
+
+ const size_t UnixDomainSocket::kMaxFileDescriptors = 16;
+
++#ifndef SCM_CREDENTIALS
++# define SCM_CREDENTIALS 0x9001
++#endif
++
++#ifndef SO_PASSCRED
++# define SO_PASSCRED 0x9002
++#endif
++
+ #if !defined(OS_NACL_NONSFI)
+ bool CreateSocketPair(ScopedFD* one, ScopedFD* two) {
+ int raw_socks[2];
+@@ -150,7 +161,7 @@ ssize_t UnixDomainSocket::RecvMsgWithFlags(int fd,
+ #if !defined(OS_NACL_NONSFI) && !defined(OS_MACOSX)
+ // The PNaCl toolchain for Non-SFI binary build and macOS do not support
+ // ucred. macOS supports xucred, but this structure is insufficient.
+- + CMSG_SPACE(sizeof(struct ucred))
++ + CMSG_SPACE(sizeof(struct cmsgcred))
+ #endif // OS_NACL_NONSFI or OS_MACOSX
+ ;
+ char control_buffer[kControlBufferSize];
+@@ -180,9 +191,9 @@ ssize_t UnixDomainSocket::RecvMsgWithFlags(int fd,
+ // SCM_CREDENTIALS.
+ if (cmsg->cmsg_level == SOL_SOCKET &&
+ cmsg->cmsg_type == SCM_CREDENTIALS) {
+- DCHECK_EQ(payload_len, sizeof(struct ucred));
++ DCHECK_EQ(payload_len, sizeof(struct cmsgcred));
+ DCHECK_EQ(pid, -1);
+- pid = reinterpret_cast<struct ucred*>(CMSG_DATA(cmsg))->pid;
++ pid = getpid();
+ }
+ #endif // !defined(OS_NACL_NONSFI) && !defined(OS_MACOSX)
+ }
diff --git a/devel/electron4/files/patch-base_posix_unix__domain__socket__unittest.cc b/devel/electron4/files/patch-base_posix_unix__domain__socket__unittest.cc
new file mode 100644
index 000000000000..c5c160fb4aaa
--- /dev/null
+++ b/devel/electron4/files/patch-base_posix_unix__domain__socket__unittest.cc
@@ -0,0 +1,12 @@
+--- base/posix/unix_domain_socket_unittest.cc.orig 2019-03-15 06:25:27 UTC
++++ base/posix/unix_domain_socket_unittest.cc
+@@ -8,6 +8,9 @@
+ #include <stdint.h>
+ #include <sys/socket.h>
+ #include <sys/types.h>
++#if defined(OS_BSD)
++#include <signal.h>
++#endif
+ #include <unistd.h>
+
+ #include "base/bind.h"
diff --git a/devel/electron4/files/patch-base_process_internal__linux.cc b/devel/electron4/files/patch-base_process_internal__linux.cc
new file mode 100644
index 000000000000..6e94da56120c
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_internal__linux.cc
@@ -0,0 +1,16 @@
+--- base/process/internal_linux.cc.orig 2019-03-15 06:36:56 UTC
++++ base/process/internal_linux.cc
+@@ -60,10 +60,13 @@ bool ReadProcFile(const FilePath& file, std::string* b
+ // Synchronously reading files in /proc is safe.
+ ThreadRestrictions::ScopedAllowIO allow_io;
+
++#if !defined(OS_BSD)
+ if (!ReadFileToString(file, buffer)) {
+ DLOG(WARNING) << "Failed to read " << file.MaybeAsASCII();
+ return false;
+ }
++#endif
++
+ return !buffer->empty();
+ }
+
diff --git a/devel/electron4/files/patch-base_process_internal__linux.h b/devel/electron4/files/patch-base_process_internal__linux.h
new file mode 100644
index 000000000000..ef05a5c8cceb
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_internal__linux.h
@@ -0,0 +1,11 @@
+--- base/process/internal_linux.h.orig 2019-03-15 06:25:27 UTC
++++ base/process/internal_linux.h
+@@ -14,6 +14,8 @@
+
+ #include "base/files/file_path.h"
+
++#include <unistd.h> /* pid_t */
++
+ namespace base {
+
+ class Time;
diff --git a/devel/electron4/files/patch-base_process_kill.h b/devel/electron4/files/patch-base_process_kill.h
new file mode 100644
index 000000000000..8997d5f538c9
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_kill.h
@@ -0,0 +1,11 @@
+--- base/process/kill.h.orig 2019-03-15 06:25:27 UTC
++++ base/process/kill.h
+@@ -111,7 +111,7 @@ BASE_EXPORT TerminationStatus GetTerminationStatus(Pro
+ BASE_EXPORT TerminationStatus GetKnownDeadTerminationStatus(
+ ProcessHandle handle, int* exit_code);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Spawns a thread to wait asynchronously for the child |process| to exit
+ // and then reaps it.
+ BASE_EXPORT void EnsureProcessGetsReaped(Process process);
diff --git a/devel/electron4/files/patch-base_process_kill__posix.cc b/devel/electron4/files/patch-base_process_kill__posix.cc
new file mode 100644
index 000000000000..b1cdcc21fc3e
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_kill__posix.cc
@@ -0,0 +1,11 @@
+--- base/process/kill_posix.cc.orig 2019-03-15 06:36:56 UTC
++++ base/process/kill_posix.cc
+@@ -167,7 +167,7 @@ void EnsureProcessTerminated(Process process) {
+ 0, new BackgroundReaper(std::move(process), TimeDelta::FromSeconds(2)));
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void EnsureProcessGetsReaped(Process process) {
+ DCHECK(!process.is_current());
+
diff --git a/devel/electron4/files/patch-base_process_launch.cc b/devel/electron4/files/patch-base_process_launch.cc
new file mode 100644
index 000000000000..81924414c9a3
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_launch.cc
@@ -0,0 +1,11 @@
+--- base/process/launch.cc.orig 2019-03-15 06:25:27 UTC
++++ base/process/launch.cc
+@@ -15,7 +15,7 @@ LaunchOptions::~LaunchOptions() = default;
+
+ LaunchOptions LaunchOptionsForTest() {
+ LaunchOptions options;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // To prevent accidental privilege sharing to an untrusted child, processes
+ // are started with PR_SET_NO_NEW_PRIVS. Do not set that here, since this
+ // new child will be used for testing only.
diff --git a/devel/electron4/files/patch-base_process_launch.h b/devel/electron4/files/patch-base_process_launch.h
new file mode 100644
index 000000000000..af0e894b664a
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_launch.h
@@ -0,0 +1,20 @@
+--- base/process/launch.h.orig 2019-03-16 09:15:20 UTC
++++ base/process/launch.h
+@@ -171,7 +171,7 @@ struct BASE_EXPORT LaunchOptions {
+ FileHandleMappingVector fds_to_remap;
+ #endif // defined(OS_WIN)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // If non-zero, start the process using clone(), using flags as provided.
+ // Unlike in clone, clone_flags may not contain a custom termination signal
+ // that is sent to the parent when the child dies. The termination signal will
+@@ -184,7 +184,7 @@ struct BASE_EXPORT LaunchOptions {
+
+ // Sets parent process death signal to SIGKILL.
+ bool kill_on_parent_death = false;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_FUCHSIA)
+ // If valid, launches the application in that job object.
diff --git a/devel/electron4/files/patch-base_process_launch__posix.cc b/devel/electron4/files/patch-base_process_launch__posix.cc
new file mode 100644
index 000000000000..b0e4edf20c92
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_launch__posix.cc
@@ -0,0 +1,10 @@
+--- base/process/launch_posix.cc.orig 2019-03-15 06:36:56 UTC
++++ base/process/launch_posix.cc
+@@ -65,6 +65,7 @@
+ #include "base/feature_list.h"
+ #else
+ extern char** environ;
++#pragma weak environ
+ #endif
+
+ namespace base {
diff --git a/devel/electron4/files/patch-base_process_memory.cc b/devel/electron4/files/patch-base_process_memory.cc
new file mode 100644
index 000000000000..5bab682d55c1
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_memory.cc
@@ -0,0 +1,20 @@
+--- base/process/memory.cc.orig 2019-03-15 06:25:27 UTC
++++ base/process/memory.cc
+@@ -10,7 +10,7 @@
+ namespace base {
+
+ // Defined in memory_win.cc for Windows.
+-#if !defined(OS_WIN)
++#if !defined(OS_WIN) && !defined(OS_BSD)
+
+ namespace {
+
+@@ -31,7 +31,7 @@ void TerminateBecauseOutOfMemory(size_t size) {
+ #endif
+
+ // Defined in memory_mac.mm for Mac.
+-#if !defined(OS_MACOSX)
++#if !defined(OS_MACOSX) && !defined(OS_BSD)
+
+ bool UncheckedCalloc(size_t num_items, size_t size, void** result) {
+ const size_t alloc_size = num_items * size;
diff --git a/devel/electron4/files/patch-base_process_memory.h b/devel/electron4/files/patch-base_process_memory.h
new file mode 100644
index 000000000000..803a731c3231
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_memory.h
@@ -0,0 +1,11 @@
+--- base/process/memory.h.orig 2019-03-15 06:25:27 UTC
++++ base/process/memory.h
+@@ -32,7 +32,7 @@ BASE_EXPORT void EnableTerminationOnOutOfMemory();
+ // Crash reporting classifies such crashes as OOM.
+ BASE_EXPORT void TerminateBecauseOutOfMemory(size_t size);
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX) || defined(OS_BSD)
+ BASE_EXPORT extern size_t g_oom_size;
+
+ // The maximum allowed value for the OOM score.
diff --git a/devel/electron4/files/patch-base_process_memory__unittest.cc b/devel/electron4/files/patch-base_process_memory__unittest.cc
new file mode 100644
index 000000000000..ee68a2c14619
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_memory__unittest.cc
@@ -0,0 +1,18 @@
+--- base/process/memory_unittest.cc.orig 2019-03-15 06:25:27 UTC
++++ base/process/memory_unittest.cc
+@@ -104,7 +104,7 @@ TEST(MemoryTest, AllocatorShimWorking) {
+ // OpenBSD does not support these tests. Don't test these on ASan/TSan/MSan
+ // configurations: only test the real allocator.
+ // Windows only supports these tests with the allocator shim in place.
+-#if !defined(OS_OPENBSD) && BUILDFLAG(USE_ALLOCATOR_SHIM) && \
++#if !defined(OS_BSD) && BUILDFLAG(USE_ALLOCATOR_SHIM) && \
+ !defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
+
+ namespace {
+@@ -529,5 +529,5 @@ TEST_F(OutOfMemoryHandledTest, UncheckedCalloc) {
+ EXPECT_FALSE(base::UncheckedCalloc(1, test_size_, &value_));
+ EXPECT_TRUE(value_ == nullptr);
+ }
+-#endif // !defined(OS_OPENBSD) && BUILDFLAG(ENABLE_WIN_ALLOCATOR_SHIM_TESTS) &&
++#endif // !defined(OS_BSD) && BUILDFLAG(ENABLE_WIN_ALLOCATOR_SHIM_TESTS) &&
+ // !defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
diff --git a/devel/electron4/files/patch-base_process_process__handle.cc b/devel/electron4/files/patch-base_process_process__handle.cc
new file mode 100644
index 000000000000..03dace3a6deb
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_process__handle.cc
@@ -0,0 +1,11 @@
+--- base/process/process_handle.cc.orig 2019-03-15 06:25:28 UTC
++++ base/process/process_handle.cc
+@@ -39,7 +39,7 @@ uint32_t GetUniqueIdForProcess() {
+ return g_unique_id;
+ }
+
+-#if defined(OS_LINUX) || defined(OS_AIX)
++#if defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
+
+ void InitUniqueIdForProcessInPidNamespace(ProcessId pid_outside_of_namespace) {
+ g_unique_id = MangleProcessId(pid_outside_of_namespace);
diff --git a/devel/electron4/files/patch-base_process_process__handle.h b/devel/electron4/files/patch-base_process_process__handle.h
new file mode 100644
index 000000000000..48af332eace5
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_process__handle.h
@@ -0,0 +1,11 @@
+--- base/process/process_handle.h.orig 2019-03-15 06:25:28 UTC
++++ base/process/process_handle.h
+@@ -64,7 +64,7 @@ BASE_EXPORT ProcessId GetCurrentProcId();
+ // a process's PID.
+ BASE_EXPORT uint32_t GetUniqueIdForProcess();
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // When a process is started in a different PID namespace from the browser
+ // process, this function must be called with the process's PID in the browser's
+ // PID namespace in order to initialize its unique ID. Not thread safe.
diff --git a/devel/electron4/files/patch-base_process_process__handle__freebsd.cc b/devel/electron4/files/patch-base_process_process__handle__freebsd.cc
new file mode 100644
index 000000000000..28fa6621f166
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_process__handle__freebsd.cc
@@ -0,0 +1,17 @@
+--- base/process/process_handle_freebsd.cc.orig 2019-03-15 06:36:56 UTC
++++ base/process/process_handle_freebsd.cc
+@@ -16,10 +16,13 @@ namespace base {
+
+ ProcessId GetParentProcessId(ProcessHandle process) {
+ struct kinfo_proc info;
+- size_t length;
++ size_t length = sizeof(struct kinfo_proc);
+ int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process };
+
+ if (sysctl(mib, arraysize(mib), &info, &length, NULL, 0) < 0)
++ return -1;
++
++ if (length < sizeof(struct kinfo_proc))
+ return -1;
+
+ return info.ki_ppid;
diff --git a/devel/electron4/files/patch-base_process_process__info__linux.cc b/devel/electron4/files/patch-base_process_process__info__linux.cc
new file mode 100644
index 000000000000..c034a20bd2ea
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_process__info__linux.cc
@@ -0,0 +1,39 @@
+--- base/process/process_info_linux.cc.orig 2019-03-15 06:36:56 UTC
++++ base/process/process_info_linux.cc
+@@ -11,10 +11,28 @@
+ #include "base/process/process_handle.h"
+ #include "base/time/time.h"
+
++#if defined(__FreeBSD__) || defined(__DragonFly__)
++#include <sys/types.h>
++#include <sys/sysctl.h>
++#include <sys/user.h>
++#endif
++
+ namespace base {
+
+ // static
+ const Time CurrentProcessInfo::CreationTime() {
++#if defined(__FreeBSD__) || defined(__DragonFly__)
++ int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid() };
++ struct kinfo_proc proc;
++ size_t len = sizeof(struct kinfo_proc);
++ if (sysctl(mib, arraysize(mib), &proc, &len, NULL, 0) < 0)
++ return Time();
++#if defined(__DragonFly__)
++ return Time::FromTimeVal(proc.kp_start);
++#else
++ return Time::FromTimeVal(proc.ki_start);
++#endif
++#else
+ int64_t start_ticks =
+ internal::ReadProcSelfStatsAndGetFieldAsInt64(internal::VM_STARTTIME);
+ if (!start_ticks)
+@@ -24,6 +42,7 @@ const Time CurrentProcessInfo::CreationTime() {
+ if (boot_time.is_null())
+ return Time();
+ return Time(boot_time + start_offset);
++#endif
+ }
+
+ } // namespace base
diff --git a/devel/electron4/files/patch-base_process_process__iterator__freebsd.cc b/devel/electron4/files/patch-base_process_process__iterator__freebsd.cc
new file mode 100644
index 000000000000..4c973defafc1
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_process__iterator__freebsd.cc
@@ -0,0 +1,45 @@
+--- base/process/process_iterator_freebsd.cc.orig 2019-03-15 06:36:56 UTC
++++ base/process/process_iterator_freebsd.cc
+@@ -10,6 +10,10 @@
+ #include <sys/sysctl.h>
+ #include <unistd.h>
+
++/* getuid() */
++#include <unistd.h>
++#include <sys/types.h>
++
+ #include "base/logging.h"
+ #include "base/macros.h"
+ #include "base/strings/string_split.h"
+@@ -40,7 +44,7 @@ ProcessIterator::ProcessIterator(const ProcessFilter*
+ num_of_kinfo_proc += 16;
+ kinfo_procs_.resize(num_of_kinfo_proc);
+ len = num_of_kinfo_proc * sizeof(struct kinfo_proc);
+- if (sysctl(mib, arraysize(mib), &kinfo_procs_[0], &len, NULL, 0) <0) {
++ if (sysctl(mib, arraysize(mib), kinfo_procs_.data(), &len, NULL, 0) <0) {
+ // If we get a mem error, it just means we need a bigger buffer, so
+ // loop around again. Anything else is a real error and give up.
+ if (errno != ENOMEM) {
+@@ -72,19 +76,13 @@ bool ProcessIterator::CheckForNextProcess() {
+ for (; index_of_kinfo_proc_ < kinfo_procs_.size(); ++index_of_kinfo_proc_) {
+ size_t length;
+ struct kinfo_proc kinfo = kinfo_procs_[index_of_kinfo_proc_];
+- int mib[] = { CTL_KERN, KERN_PROC_ARGS, kinfo.ki_pid };
++ int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_ARGS, kinfo.ki_pid };
+
+ if ((kinfo.ki_pid > 0) && (kinfo.ki_stat == SZOMB))
+ continue;
+
+- length = 0;
+- if (sysctl(mib, arraysize(mib), NULL, &length, NULL, 0) < 0) {
+- LOG(ERROR) << "failed to figure out the buffer size for a command line";
+- continue;
+- }
+-
+- data.resize(length);
+-
++ data.resize(ARG_MAX);
++ length = ARG_MAX;
+ if (sysctl(mib, arraysize(mib), &data[0], &length, NULL, 0) < 0) {
+ LOG(ERROR) << "failed to fetch a commandline";
+ continue;
diff --git a/devel/electron4/files/patch-base_process_process__metrics.h b/devel/electron4/files/patch-base_process_process__metrics.h
new file mode 100644
index 000000000000..430018bba160
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_process__metrics.h
@@ -0,0 +1,112 @@
+--- base/process/process_metrics.h.orig 2019-03-15 06:36:56 UTC
++++ base/process/process_metrics.h
+@@ -41,7 +41,7 @@ namespace base {
+ // Full declaration is in process_metrics_iocounters.h.
+ struct IoCounters;
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ // Minor and major page fault counts since the process creation.
+ // Both counts are process-wide, and exclude child processes.
+ //
+@@ -51,7 +51,7 @@ struct PageFaultCounts {
+ int64_t minor;
+ int64_t major;
+ };
+-#endif // defined(OS_LINUX) || defined(OS_ANDROID)
++#endif // defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+
+ // Convert a POSIX timeval to microseconds.
+ BASE_EXPORT int64_t TimeValToMicroseconds(const struct timeval& tv);
+@@ -177,7 +177,7 @@ class BASE_EXPORT ProcessMetrics {
+ // otherwise.
+ bool GetIOCounters(IoCounters* io_counters) const;
+
+-#if defined(OS_LINUX) || defined(OS_AIX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_AIX) || defined(OS_ANDROID) || defined(OS_BSD)
+ // Returns the number of file descriptors currently open by the process, or
+ // -1 on error.
+ int GetOpenFdCount() const;
+@@ -185,16 +185,16 @@ class BASE_EXPORT ProcessMetrics {
+ // Returns the soft limit of file descriptors that can be opened by the
+ // process, or -1 on error.
+ int GetOpenFdSoftLimit() const;
+-#endif // defined(OS_LINUX) || defined(OS_AIX) || defined(OS_ANDROID)
++#endif // defined(OS_LINUX) || defined(OS_AIX) || defined(OS_ANDROID) || defined(OS_BSD)
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ // Bytes of swap as reported by /proc/[pid]/status.
+ uint64_t GetVmSwapBytes() const;
+
+ // Minor and major page fault count as reported by /proc/[pid]/stat.
+ // Returns true for success.
+ bool GetPageFaultCounts(PageFaultCounts* counts) const;
+-#endif // defined(OS_LINUX) || defined(OS_ANDROID)
++#endif // defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+
+ // Returns total memory usage of malloc.
+ size_t GetMallocUsage();
+@@ -206,7 +206,7 @@ class BASE_EXPORT ProcessMetrics {
+ ProcessMetrics(ProcessHandle process, PortProvider* port_provider);
+ #endif // !defined(OS_MACOSX) || defined(OS_IOS)
+
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
+ int CalculateIdleWakeupsPerSecond(uint64_t absolute_idle_wakeups);
+ #endif
+ #if defined(OS_MACOSX)
+@@ -229,7 +229,7 @@ class BASE_EXPORT ProcessMetrics {
+ TimeDelta last_cumulative_cpu_;
+ #endif
+
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
+ // Same thing for idle wakeups.
+ TimeTicks last_idle_wakeups_time_;
+ uint64_t last_absolute_idle_wakeups_;
+@@ -275,7 +275,7 @@ BASE_EXPORT void IncreaseFdLimitTo(unsigned int max_de
+ #endif // defined(OS_POSIX)
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
+- defined(OS_ANDROID) || defined(OS_AIX) || defined(OS_FUCHSIA)
++ defined(OS_ANDROID) || defined(OS_AIX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ // Data about system-wide memory consumption. Values are in KB. Available on
+ // Windows, Mac, Linux, Android and Chrome OS.
+ //
+@@ -308,7 +308,7 @@ struct BASE_EXPORT SystemMemoryInfoKB {
+ int avail_phys = 0;
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX) || defined(OS_BSD)
+ // This provides an estimate of available memory as described here:
+ // https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
+ // NOTE: this is ONLY valid in kernels 3.14 and up. Its value will always
+@@ -323,7 +323,7 @@ struct BASE_EXPORT SystemMemoryInfoKB {
+ #endif
+
+ #if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_AIX) || \
+- defined(OS_FUCHSIA)
++ defined(OS_FUCHSIA) || defined(OS_BSD)
+ int buffers = 0;
+ int cached = 0;
+ int active_anon = 0;
+@@ -333,7 +333,7 @@ struct BASE_EXPORT SystemMemoryInfoKB {
+ int dirty = 0;
+ int reclaimable = 0;
+ #endif // defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_AIX) ||
+- // defined(OS_FUCHSIA)
++ // defined(OS_FUCHSIA) || defined(OS_BSD)
+
+ #if defined(OS_CHROMEOS)
+ int shmem = 0;
+@@ -361,7 +361,7 @@ BASE_EXPORT bool GetSystemMemoryInfo(SystemMemoryInfoK
+ #endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
+ // defined(OS_ANDROID) || defined(OS_AIX) || defined(OS_FUCHSIA)
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX) || defined(OS_BSD)
+ // Parse the data found in /proc/<pid>/stat and return the sum of the
+ // CPU-related ticks. Returns -1 on parse error.
+ // Exposed for testing.
diff --git a/devel/electron4/files/patch-base_process_process__metrics__freebsd.cc b/devel/electron4/files/patch-base_process_process__metrics__freebsd.cc
new file mode 100644
index 000000000000..3894b96d08d9
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_process__metrics__freebsd.cc
@@ -0,0 +1,85 @@
+--- base/process/process_metrics_freebsd.cc.orig 2019-03-15 06:25:28 UTC
++++ base/process/process_metrics_freebsd.cc
+@@ -14,11 +14,14 @@
+ #include "base/process/process_metrics_iocounters.h"
+ #include "base/stl_util.h"
+
++#include <unistd.h> /* getpagesize() */
++#include <fcntl.h> /* O_RDONLY */
++#include <kvm.h>
++
+ namespace base {
+
+ ProcessMetrics::ProcessMetrics(ProcessHandle process)
+- : process_(process),
+- last_cpu_(0) {}
++ : process_(process) {}
+
+ // static
+ std::unique_ptr<ProcessMetrics> ProcessMetrics::CreateProcessMetrics(
+@@ -67,6 +70,65 @@ size_t GetSystemCommitCharge() {
+ pagesize = getpagesize();
+
+ return mem_total - (mem_free*pagesize) - (mem_inactive*pagesize);
++}
++
++int GetNumberOfThreads(ProcessHandle process) {
++ // Taken from FreeBSD top (usr.bin/top/machine.c)
++
++ kvm_t* kd = kvm_open(NULL, "/dev/null", NULL, O_RDONLY, "kvm_open");
++ if (kd == NULL)
++ return 0;
++
++ struct kinfo_proc* pbase;
++ int nproc;
++ pbase = kvm_getprocs(kd, KERN_PROC_PID, process, &nproc);
++ if (pbase == NULL)
++ return 0;
++
++ if (kvm_close(kd) == -1)
++ return 0;
++
++ return nproc;
++}
++
++bool GetSystemMemoryInfo(SystemMemoryInfoKB *meminfo) {
++ unsigned int mem_total, mem_free, swap_total, swap_used;
++ size_t length;
++ int pagesizeKB;
++
++ pagesizeKB = getpagesize() / 1024;
++
++ length = sizeof(mem_total);
++ if (sysctlbyname("vm.stats.vm.v_page_count", &mem_total,
++ &length, NULL, 0) != 0 || length != sizeof(mem_total))
++ return false;
++
++ length = sizeof(mem_free);
++ if (sysctlbyname("vm.stats.vm.v_free_count", &mem_free, &length, NULL, 0)
++ != 0 || length != sizeof(mem_free))
++ return false;
++
++ length = sizeof(swap_total);
++ if (sysctlbyname("vm.swap_size", &swap_total, &length, NULL, 0)
++ != 0 || length != sizeof(swap_total))
++ return false;
++
++ length = sizeof(swap_used);
++ if (sysctlbyname("vm.swap_anon_use", &swap_used, &length, NULL, 0)
++ != 0 || length != sizeof(swap_used))
++ return false;
++
++ meminfo->total = mem_total * pagesizeKB;
++ meminfo->free = mem_free * pagesizeKB;
++ meminfo->swap_total = swap_total * pagesizeKB;
++ meminfo->swap_free = (swap_total - swap_used) * pagesizeKB;
++
++ return true;
++}
++
++uint64_t ProcessMetrics::GetVmSwapBytes() const {
++ NOTIMPLEMENTED();
++ return 0;
+ }
+
+ } // namespace base
diff --git a/devel/electron4/files/patch-base_process_process__metrics__posix.cc b/devel/electron4/files/patch-base_process_process__metrics__posix.cc
new file mode 100644
index 000000000000..2087bc29e98b
--- /dev/null
+++ b/devel/electron4/files/patch-base_process_process__metrics__posix.cc
@@ -0,0 +1,20 @@
+--- base/process/process_metrics_posix.cc.orig 2019-03-15 06:25:28 UTC
++++ base/process/process_metrics_posix.cc
+@@ -19,6 +19,8 @@
+
+ #if defined(OS_MACOSX)
+ #include <malloc/malloc.h>
++#elif defined(OS_FREEBSD)
++#include <stdlib.h>
+ #else
+ #include <malloc.h>
+ #endif
+@@ -107,7 +109,7 @@ size_t ProcessMetrics::GetMallocUsage() {
+ #else
+ return minfo.hblkhd + minfo.arena;
+ #endif
+-#elif defined(OS_FUCHSIA)
++#elif defined(OS_FUCHSIA) || defined(OS_BSD)
+ // TODO(fuchsia): Not currently exposed. https://crbug.com/735087.
+ return 0;
+ #endif
diff --git a/devel/electron4/files/patch-base_profiler_stack__sampling__profiler__unittest.cc b/devel/electron4/files/patch-base_profiler_stack__sampling__profiler__unittest.cc
new file mode 100644
index 000000000000..52dc41127106
--- /dev/null
+++ b/devel/electron4/files/patch-base_profiler_stack__sampling__profiler__unittest.cc
@@ -0,0 +1,11 @@
+--- base/profiler/stack_sampling_profiler_unittest.cc.orig 2019-03-15 06:36:56 UTC
++++ base/profiler/stack_sampling_profiler_unittest.cc
+@@ -39,7 +39,7 @@
+ #include <intrin.h>
+ #include <malloc.h>
+ #include <windows.h>
+-#else
++#elif !defined(OS_BSD)
+ #include <alloca.h>
+ #endif
+
diff --git a/devel/electron4/files/patch-base_security__unittest.cc b/devel/electron4/files/patch-base_security__unittest.cc
new file mode 100644
index 000000000000..61247d3901a4
--- /dev/null
+++ b/devel/electron4/files/patch-base_security__unittest.cc
@@ -0,0 +1,11 @@
+--- base/security_unittest.cc.orig 2019-03-15 06:36:56 UTC
++++ base/security_unittest.cc
+@@ -59,7 +59,7 @@ NOINLINE Type HideValueFromCompiler(volatile Type valu
+ // FAILS_ is too clunky.
+ void OverflowTestsSoftExpectTrue(bool overflow_detected) {
+ if (!overflow_detected) {
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_NACL)
+ // Sadly, on Linux, Android, and OSX we don't have a good story yet. Don't
+ // fail the test, but report.
+ printf("Platform has overflow: %s\n",
diff --git a/devel/electron4/files/patch-base_strings_safe__sprintf__unittest.cc b/devel/electron4/files/patch-base_strings_safe__sprintf__unittest.cc
new file mode 100644
index 000000000000..cb82544403c3
--- /dev/null
+++ b/devel/electron4/files/patch-base_strings_safe__sprintf__unittest.cc
@@ -0,0 +1,18 @@
+--- base/strings/safe_sprintf_unittest.cc.orig 2019-03-15 06:25:28 UTC
++++ base/strings/safe_sprintf_unittest.cc
+@@ -730,6 +730,7 @@ TEST(SafeSPrintfTest, EmbeddedNul) {
+ }
+
+ TEST(SafeSPrintfTest, EmitNULL) {
++/* Avoid compiler error: http://pastebin.com/1edWUE84
+ char buf[40];
+ #if defined(__GNUC__)
+ #pragma GCC diagnostic push
+@@ -741,6 +742,7 @@ TEST(SafeSPrintfTest, EmitNULL) {
+ EXPECT_EQ("0x0", std::string(buf));
+ EXPECT_EQ(6, SafeSPrintf(buf, "%s", NULL));
+ EXPECT_EQ("<NULL>", std::string(buf));
++*/
+ #if defined(__GCC__)
+ #pragma GCC diagnostic pop
+ #endif
diff --git a/devel/electron4/files/patch-base_sys__info__freebsd.cc b/devel/electron4/files/patch-base_sys__info__freebsd.cc
new file mode 100644
index 000000000000..0817663ccff2
--- /dev/null
+++ b/devel/electron4/files/patch-base_sys__info__freebsd.cc
@@ -0,0 +1,71 @@
+--- base/sys_info_freebsd.cc.orig 2019-03-15 06:36:56 UTC
++++ base/sys_info_freebsd.cc
+@@ -13,26 +13,58 @@
+ namespace base {
+
+ int64_t SysInfo::AmountOfPhysicalMemoryImpl() {
+- int pages, page_size;
++ int pages, page_size, r = 0;
+ size_t size = sizeof(pages);
+- sysctlbyname("vm.stats.vm.v_page_count", &pages, &size, NULL, 0);
+- sysctlbyname("vm.stats.vm.v_page_size", &page_size, &size, NULL, 0);
+- if (pages == -1 || page_size == -1) {
++ if(r == 0)
++ r = sysctlbyname("vm.stats.vm.v_page_count", &pages, &size, NULL, 0);
++ if(r == 0)
++ r =sysctlbyname("vm.stats.vm.v_page_size", &page_size, &size, NULL, 0);
++ if(r == -1) {
+ NOTREACHED();
+ return 0;
+ }
+ return static_cast<int64_t>(pages) * page_size;
+ }
+
+-// static
+-uint64_t SysInfo::MaxSharedMemorySize() {
+- size_t limit;
+- size_t size = sizeof(limit);
+- if (sysctlbyname("kern.ipc.shmmax", &limit, &size, NULL, 0) < 0) {
++int64_t SysInfo::AmountOfAvailablePhysicalMemoryImpl() {
++ int page_size, r = 0;
++ unsigned pgfree, pginact, pgcache;
++ size_t size = sizeof(page_size);
++ size_t szpg = sizeof(pgfree);
++ if(r == 0)
++ r = sysctlbyname("vm.stats.vm.v_page_size", &page_size, &size, NULL, 0);
++ if(r == 0)
++ r = sysctlbyname("vm.stats.vm.v_free_count", &pgfree, &szpg, NULL, 0);
++ if(r == 0)
++ r = sysctlbyname("vm.stats.vm.v_inactive_count", &pginact, &szpg, NULL, 0);
++ if(r == 0)
++ r = sysctlbyname("vm.stats.vm.v_cache_count", &pgcache, &szpg, NULL, 0);
++ if(r == -1) {
+ NOTREACHED();
+ return 0;
+ }
+- return static_cast<uint64_t>(limit);
++ return static_cast<int64_t>((pgfree + pginact + pgcache) * page_size);
++}
++
++// static
++std::string SysInfo::CPUModelName() {
++ int mib[] = { CTL_HW, HW_MODEL };
++ char name[256];
++ size_t size = arraysize(name);
++ if (sysctl(mib, arraysize(mib), &name, &size, NULL, 0) == 0)
++ return name;
++ return std::string();
++}
++
++int SysInfo::NumberOfProcessors() {
++ int mib[] = { CTL_HW, HW_NCPU };
++ int ncpu;
++ size_t size = sizeof(ncpu);
++ if (sysctl(mib, arraysize(mib), &ncpu, &size, NULL, 0) == -1) {
++ NOTREACHED();
++ return 1;
++ }
++ return ncpu;
+ }
+
+ } // namespace base
diff --git a/devel/electron4/files/patch-base_sys__info__posix.cc b/devel/electron4/files/patch-base_sys__info__posix.cc
new file mode 100644
index 000000000000..bd5c2dac20c2
--- /dev/null
+++ b/devel/electron4/files/patch-base_sys__info__posix.cc
@@ -0,0 +1,38 @@
+--- base/sys_info_posix.cc.orig 2019-03-15 06:36:56 UTC
++++ base/sys_info_posix.cc
+@@ -38,7 +38,7 @@
+
+ namespace {
+
+-#if !defined(OS_OPENBSD) && !defined(OS_FUCHSIA)
++#if !defined(OS_BSD) && !defined(OS_FUCHSIA)
+ int NumberOfProcessors() {
+ // sysconf returns the number of "logical" (not "physical") processors on both
+ // Mac and Linux. So we get the number of max available "logical" processors.
+@@ -65,7 +65,7 @@ int NumberOfProcessors() {
+ base::LazyInstance<
+ base::internal::LazySysInfoValue<int, NumberOfProcessors> >::Leaky
+ g_lazy_number_of_processors = LAZY_INSTANCE_INITIALIZER;
+-#endif // !defined(OS_OPENBSD) && !defined(OS_FUCHSIA)
++#endif // !defined(OS_BSD) && !defined(OS_FUCHSIA)
+
+ #if !defined(OS_FUCHSIA)
+ int64_t AmountOfVirtualMemory() {
+@@ -133,7 +133,7 @@ bool GetDiskSpaceInfo(const base::FilePath& path,
+
+ namespace base {
+
+-#if !defined(OS_OPENBSD) && !defined(OS_FUCHSIA)
++#if !defined(OS_BSD) && !defined(OS_FUCHSIA)
+ int SysInfo::NumberOfProcessors() {
+ return g_lazy_number_of_processors.Get().value();
+ }
+@@ -226,6 +226,8 @@ std::string SysInfo::OperatingSystemArchitecture() {
+ arch = "x86";
+ } else if (arch == "amd64") {
+ arch = "x86_64";
++ } else if (arch == "arm64") {
++ arch = "aarch64";
+ } else if (std::string(info.sysname) == "AIX") {
+ arch = "ppc64";
+ }
diff --git a/devel/electron4/files/patch-base_test_launcher_test__launcher.cc b/devel/electron4/files/patch-base_test_launcher_test__launcher.cc
new file mode 100644
index 000000000000..282354de80eb
--- /dev/null
+++ b/devel/electron4/files/patch-base_test_launcher_test__launcher.cc
@@ -0,0 +1,10 @@
+--- base/test/launcher/test_launcher.cc.orig 2019-03-15 06:36:56 UTC
++++ base/test/launcher/test_launcher.cc
+@@ -53,6 +53,7 @@
+ #include "testing/gtest/include/gtest/gtest.h"
+
+ #if defined(OS_POSIX)
++#include <signal.h>
+ #include <fcntl.h>
+
+ #include "base/files/file_descriptor_watcher_posix.h"
diff --git a/devel/electron4/files/patch-base_test_test__file__util__linux.cc b/devel/electron4/files/patch-base_test_test__file__util__linux.cc
new file mode 100644
index 000000000000..21affbd2bd60
--- /dev/null
+++ b/devel/electron4/files/patch-base_test_test__file__util__linux.cc
@@ -0,0 +1,13 @@
+--- base/test/test_file_util_linux.cc.orig 2019-03-15 06:25:28 UTC
++++ base/test/test_file_util_linux.cc
+@@ -51,8 +51,10 @@ bool EvictFileFromSystemCache(const FilePath& file) {
+ return false;
+ if (fdatasync(fd.get()) != 0)
+ return false;
++#if !defined(OS_BSD)
+ if (posix_fadvise(fd.get(), 0, 0, POSIX_FADV_DONTNEED) != 0)
+ return false;
++#endif
+ return true;
+ }
+
diff --git a/devel/electron4/files/patch-base_test_test__file__util__posix.cc b/devel/electron4/files/patch-base_test_test__file__util__posix.cc
new file mode 100644
index 000000000000..176b743e757b
--- /dev/null
+++ b/devel/electron4/files/patch-base_test_test__file__util__posix.cc
@@ -0,0 +1,11 @@
+--- base/test/test_file_util_posix.cc.orig 2019-03-15 06:36:56 UTC
++++ base/test/test_file_util_posix.cc
+@@ -79,7 +79,7 @@ bool DieFileDie(const FilePath& file, bool recurse) {
+ return DeleteFile(file, recurse);
+ }
+
+-#if !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
++#if !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) && !defined(OS_BSD)
+ bool EvictFileFromSystemCache(const FilePath& file) {
+ // There doesn't seem to be a POSIX way to cool the disk cache.
+ NOTIMPLEMENTED();
diff --git a/devel/electron4/files/patch-base_third__party_libevent_BUILD.gn b/devel/electron4/files/patch-base_third__party_libevent_BUILD.gn
new file mode 100644
index 000000000000..b0d5b4b71fb5
--- /dev/null
+++ b/devel/electron4/files/patch-base_third__party_libevent_BUILD.gn
@@ -0,0 +1,24 @@
+--- base/third_party/libevent/BUILD.gn.orig 2019-03-15 06:25:28 UTC
++++ base/third_party/libevent/BUILD.gn
+@@ -43,13 +43,20 @@ static_library("libevent") {
+ "mac/event-config.h",
+ ]
+ include_dirs = [ "mac" ]
+- } else if (is_linux) {
++ } else if (is_linux && !is_bsd) {
+ sources += [
+ "epoll.c",
+ "linux/config.h",
+ "linux/event-config.h",
+ ]
+ include_dirs = [ "linux" ]
++ } else if (is_bsd) {
++ sources += [
++ "kqueue.c",
++ "freebsd/config.h",
++ "freebsd/event-config.h",
++ ]
++ include_dirs = [ "freebsd" ]
+ } else if (is_android) {
+ sources += [
+ "android/config.h",
diff --git a/devel/electron4/files/patch-base_threading_platform__thread.h b/devel/electron4/files/patch-base_threading_platform__thread.h
new file mode 100644
index 000000000000..255e3d75b760
--- /dev/null
+++ b/devel/electron4/files/patch-base_threading_platform__thread.h
@@ -0,0 +1,11 @@
+--- base/threading/platform_thread.h.orig 2019-03-15 06:36:56 UTC
++++ base/threading/platform_thread.h
+@@ -217,7 +217,7 @@ class BASE_EXPORT PlatformThread {
+
+ static ThreadPriority GetCurrentThreadPriority();
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Toggles a specific thread's priority at runtime. This can be used to
+ // change the priority of a thread in a different process and will fail
+ // if the calling process does not have proper permissions. The
diff --git a/devel/electron4/files/patch-base_threading_platform__thread__linux.cc b/devel/electron4/files/patch-base_threading_platform__thread__linux.cc
new file mode 100644
index 000000000000..d6c093fb556d
--- /dev/null
+++ b/devel/electron4/files/patch-base_threading_platform__thread__linux.cc
@@ -0,0 +1,21 @@
+--- base/threading/platform_thread_linux.cc.orig 2019-03-15 06:36:56 UTC
++++ base/threading/platform_thread_linux.cc
+@@ -18,7 +18,9 @@
+
+ #if !defined(OS_NACL) && !defined(OS_AIX)
+ #include <pthread.h>
++#if !defined(OS_BSD)
+ #include <sys/prctl.h>
++#endif
+ #include <sys/resource.h>
+ #include <sys/time.h>
+ #include <sys/types.h>
+@@ -128,7 +130,7 @@ bool GetCurrentThreadPriorityForPlatform(ThreadPriorit
+ void PlatformThread::SetName(const std::string& name) {
+ ThreadIdNameManager::GetInstance()->SetName(name);
+
+-#if !defined(OS_NACL) && !defined(OS_AIX)
++#if !defined(OS_NACL) && !defined(OS_AIX) && !defined(OS_BSD)
+ // On linux we can get the thread names to show up in the debugger by setting
+ // the process name for the LWP. We don't want to do this for the main
+ // thread because that would rename the process, causing tools like killall
diff --git a/devel/electron4/files/patch-base_threading_platform__thread__posix.cc b/devel/electron4/files/patch-base_threading_platform__thread__posix.cc
new file mode 100644
index 000000000000..cc1ae6a871c3
--- /dev/null
+++ b/devel/electron4/files/patch-base_threading_platform__thread__posix.cc
@@ -0,0 +1,11 @@
+--- base/threading/platform_thread_posix.cc.orig 2019-03-15 06:36:56 UTC
++++ base/threading/platform_thread_posix.cc
+@@ -61,7 +61,7 @@ void* ThreadFunc(void* params) {
+ if (!thread_params->joinable)
+ base::ThreadRestrictions::SetSingletonAllowed(false);
+
+-#if !defined(OS_NACL)
++#if !defined(OS_NACL) && !defined(OS_BSD)
+ // Threads on linux/android may inherit their priority from the thread
+ // where they were created. This explicitly sets the priority of all new
+ // threads.
diff --git a/devel/electron4/files/patch-base_threading_thread__local__storage__unittest.cc b/devel/electron4/files/patch-base_threading_thread__local__storage__unittest.cc
new file mode 100644
index 000000000000..741a4b21fae9
--- /dev/null
+++ b/devel/electron4/files/patch-base_threading_thread__local__storage__unittest.cc
@@ -0,0 +1,11 @@
+--- base/threading/thread_local_storage_unittest.cc.orig 2019-03-15 06:36:56 UTC
++++ base/threading/thread_local_storage_unittest.cc
+@@ -86,7 +86,7 @@ class ThreadLocalStorageRunner : public DelegateSimple
+ void ThreadLocalStorageCleanup(void *value) {
+ int *ptr = reinterpret_cast<int*>(value);
+ // Destructors should never be called with a NULL.
+- ASSERT_NE(reinterpret_cast<int*>(NULL), ptr);
++ ASSERT_NE(static_cast<int*>(NULL), ptr);
+ if (*ptr == kFinalTlsValue)
+ return; // We've been called enough times.
+ ASSERT_LT(kFinalTlsValue, *ptr);
diff --git a/devel/electron4/files/patch-base_threading_thread__task__runner__handle.cc b/devel/electron4/files/patch-base_threading_thread__task__runner__handle.cc
new file mode 100644
index 000000000000..3b2e4911f2cb
--- /dev/null
+++ b/devel/electron4/files/patch-base_threading_thread__task__runner__handle.cc
@@ -0,0 +1,26 @@
+--- base/threading/thread_task_runner_handle.cc.orig 2019-03-15 06:36:56 UTC
++++ base/threading/thread_task_runner_handle.cc
+@@ -7,6 +7,7 @@
+ #include <utility>
+
+ #include "base/bind.h"
++#include "base/callback_helpers.h"
+ #include "base/lazy_instance.h"
+ #include "base/logging.h"
+ #include "base/memory/ptr_util.h"
+@@ -37,6 +38,7 @@ bool ThreadTaskRunnerHandle::IsSet() {
+ return !!thread_task_runner_tls.Pointer()->Get();
+ }
+
++#if defined(OS_BSD)
+ // static
+ ScopedClosureRunner ThreadTaskRunnerHandle::OverrideForTesting(
+ scoped_refptr<SingleThreadTaskRunner> overriding_task_runner) {
+@@ -86,6 +88,7 @@ ScopedClosureRunner ThreadTaskRunnerHandle::OverrideFo
+ base::Unretained(ttrh->task_runner_.get()),
+ std::move(no_running_during_override)));
+ }
++#endif
+
+ ThreadTaskRunnerHandle::ThreadTaskRunnerHandle(
+ scoped_refptr<SingleThreadTaskRunner> task_runner)
diff --git a/devel/electron4/files/patch-base_trace__event_malloc__dump__provider.cc b/devel/electron4/files/patch-base_trace__event_malloc__dump__provider.cc
new file mode 100644
index 000000000000..e172b1705c5c
--- /dev/null
+++ b/devel/electron4/files/patch-base_trace__event_malloc__dump__provider.cc
@@ -0,0 +1,21 @@
+--- base/trace_event/malloc_dump_provider.cc.orig 2019-03-15 06:36:56 UTC
++++ base/trace_event/malloc_dump_provider.cc
+@@ -17,6 +17,8 @@
+
+ #if defined(OS_MACOSX)
+ #include <malloc/malloc.h>
++#elif defined(OS_BSD)
++#include "stdlib.h"
+ #else
+ #include <malloc.h>
+ #endif
+@@ -132,6 +134,9 @@ bool MallocDumpProvider::OnMemoryDump(const MemoryDump
+ }
+ #elif defined(OS_FUCHSIA)
+ // TODO(fuchsia): Port, see https://crbug.com/706592.
++#elif defined(OS_BSD)
++ total_virtual_size = 0;
++ allocated_objects_size = 0;
+ #else
+ struct mallinfo info = mallinfo();
+ DCHECK_GE(info.arena + info.hblkhd, info.uordblks);
diff --git a/devel/electron4/files/patch-base_trace__event_process__memory__dump.cc b/devel/electron4/files/patch-base_trace__event_process__memory__dump.cc
new file mode 100644
index 000000000000..60c7ba4a90a1
--- /dev/null
+++ b/devel/electron4/files/patch-base_trace__event_process__memory__dump.cc
@@ -0,0 +1,11 @@
+--- base/trace_event/process_memory_dump.cc.orig 2019-03-15 06:36:56 UTC
++++ base/trace_event/process_memory_dump.cc
+@@ -93,7 +93,7 @@ size_t ProcessMemoryDump::CountResidentBytes(void* sta
+ #if defined(OS_WIN)
+ std::unique_ptr<PSAPI_WORKING_SET_EX_INFORMATION[]> vec(
+ new PSAPI_WORKING_SET_EX_INFORMATION[max_vec_size]);
+-#elif defined(OS_MACOSX)
++#elif defined(OS_MACOSX) || defined(OS_BSD)
+ std::unique_ptr<char[]> vec(new char[max_vec_size]);
+ #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
+ std::unique_ptr<unsigned char[]> vec(new unsigned char[max_vec_size]);
diff --git a/devel/electron4/files/patch-base_trace__event_process__memory__dump.h b/devel/electron4/files/patch-base_trace__event_process__memory__dump.h
new file mode 100644
index 000000000000..9645d8c2aa5d
--- /dev/null
+++ b/devel/electron4/files/patch-base_trace__event_process__memory__dump.h
@@ -0,0 +1,11 @@
+--- base/trace_event/process_memory_dump.h.orig 2019-03-15 06:36:56 UTC
++++ base/trace_event/process_memory_dump.h
+@@ -22,7 +22,7 @@
+
+ // Define COUNT_RESIDENT_BYTES_SUPPORTED if platform supports counting of the
+ // resident memory.
+-#if !defined(OS_NACL)
++#if !defined(OS_NACL) && !defined(OS_BSD)
+ #define COUNT_RESIDENT_BYTES_SUPPORTED
+ #endif
+
diff --git a/devel/electron4/files/patch-build_config_BUILD.gn b/devel/electron4/files/patch-build_config_BUILD.gn
new file mode 100644
index 000000000000..d09e5e6561bd
--- /dev/null
+++ b/devel/electron4/files/patch-build_config_BUILD.gn
@@ -0,0 +1,30 @@
+--- build/config/BUILD.gn.orig 2019-03-15 06:36:56 UTC
++++ build/config/BUILD.gn
+@@ -167,7 +167,7 @@ config("debug") {
+ # builds, and we have to tell it to turn it off.
+ defines += [ "_HAS_ITERATOR_DEBUGGING=0" ]
+ }
+- } else if (is_linux && current_cpu == "x64" && enable_iterator_debugging) {
++ } else if ((is_linux || is_bsd) && current_cpu == "x64" && enable_iterator_debugging) {
+ # Enable libstdc++ debugging facilities to help catch problems early, see
+ # http://crbug.com/65151 .
+ # TODO(phajdan.jr): Should we enable this for all of POSIX?
+@@ -269,9 +269,7 @@ config("default_libs") {
+ ]
+ } else if (is_linux) {
+ libs = [
+- "dl",
+ "pthread",
+- "rt",
+ ]
+ }
+ }
+@@ -327,7 +325,7 @@ config("executable_config") {
+ "//build/config/ios:ios_dynamic_flags",
+ "//build/config/ios:ios_executable_flags",
+ ]
+- } else if (is_linux || is_android || current_os == "aix") {
++ } else if (is_linux || is_bsd || is_android || current_os == "aix") {
+ configs += [ "//build/config/gcc:executable_ldconfig" ]
+ if (is_android) {
+ configs += [ "//build/config/android:executable_config" ]
diff --git a/devel/electron4/files/patch-build_config_BUILDCONFIG.gn b/devel/electron4/files/patch-build_config_BUILDCONFIG.gn
new file mode 100644
index 000000000000..2dd8598ea826
--- /dev/null
+++ b/devel/electron4/files/patch-build_config_BUILDCONFIG.gn
@@ -0,0 +1,119 @@
+--- build/config/BUILDCONFIG.gn.orig 2019-03-16 09:15:20 UTC
++++ build/config/BUILDCONFIG.gn
+@@ -134,10 +134,10 @@ declare_args() {
+ is_official_build = false
+
+ # Whether we're a traditional desktop unix.
+- is_desktop_linux = current_os == "linux"
++ is_desktop_linux = current_os == "linux" || current_os == "freebsd"
+
+ # Set to true when compiling with the Clang compiler.
+- is_clang = current_os != "linux" ||
++ is_clang = current_os != "linux" || current_os == "freebsd" ||
+ (current_cpu != "s390x" && current_cpu != "s390" &&
+ current_cpu != "ppc64" && current_cpu != "ppc" &&
+ current_cpu != "mips" && current_cpu != "mips64")
+@@ -189,8 +189,8 @@ if (host_toolchain == "") {
+ # TODO(dpranke): Add some sort of assert here that verifies that
+ # no toolchain omitted host_toolchain from its toolchain_args().
+
+- if (host_os == "linux") {
+- if (target_os != "linux") {
++ if (host_os == "linux" || host_os == "freebsd") {
++ if (target_os != "linux" || target_os != "freebsd") {
+ # TODO(dpranke) - is_clang normally applies only to the target
+ # build, and there is no way to indicate that you want to override
+ # it for both the target build *and* the host build. Do we need to
+@@ -230,7 +230,7 @@ if (target_os == "android") {
+ assert(host_os == "linux" || host_os == "mac",
+ "Android builds are only supported on Linux and Mac hosts.")
+ _default_toolchain = "//build/toolchain/android:android_clang_$target_cpu"
+-} else if (target_os == "chromeos" || target_os == "linux") {
++} else if (target_os == "chromeos" || target_os == "linux" || target_os == "freebsd") {
+ # See comments in build/toolchain/cros/BUILD.gn about board compiles.
+ if (is_clang) {
+ _default_toolchain = "//build/toolchain/linux:clang_$target_cpu"
+@@ -304,6 +304,7 @@ if (current_os == "win" || current_os == "winuwp") {
+ is_nacl = false
+ is_posix = false
+ is_win = true
++ is_bsd = false
+ } else if (current_os == "mac") {
+ is_aix = false
+ is_android = false
+@@ -315,6 +316,7 @@ if (current_os == "win" || current_os == "winuwp") {
+ is_nacl = false
+ is_posix = true
+ is_win = false
++ is_bsd = false
+ } else if (current_os == "android") {
+ is_aix = false
+ is_android = true
+@@ -326,6 +328,7 @@ if (current_os == "win" || current_os == "winuwp") {
+ is_nacl = false
+ is_posix = true
+ is_win = false
++ is_bsd = false
+ } else if (current_os == "chromeos") {
+ is_aix = false
+ is_android = false
+@@ -337,6 +340,7 @@ if (current_os == "win" || current_os == "winuwp") {
+ is_nacl = false
+ is_posix = true
+ is_win = false
++ is_bsd = false
+ } else if (current_os == "nacl") {
+ # current_os == "nacl" will be passed by the nacl toolchain definition.
+ # It is not set by default or on the command line. We treat is as a
+@@ -351,6 +355,7 @@ if (current_os == "win" || current_os == "winuwp") {
+ is_nacl = true
+ is_posix = true
+ is_win = false
++ is_bsd = false
+ } else if (current_os == "fuchsia") {
+ is_aix = false
+ is_android = false
+@@ -362,6 +367,7 @@ if (current_os == "win" || current_os == "winuwp") {
+ is_nacl = false
+ is_posix = false
+ is_win = false
++ is_bsd = false
+ } else if (current_os == "ios") {
+ is_aix = false
+ is_android = false
+@@ -373,6 +379,7 @@ if (current_os == "win" || current_os == "winuwp") {
+ is_nacl = false
+ is_posix = true
+ is_win = false
++ is_bsd = false
+ } else if (current_os == "linux") {
+ is_aix = false
+ is_android = false
+@@ -384,6 +391,7 @@ if (current_os == "win" || current_os == "winuwp") {
+ is_nacl = false
+ is_posix = true
+ is_win = false
++ is_bsd = false
+ } else if (current_os == "aix") {
+ is_aix = true
+ is_android = false
+@@ -395,6 +403,19 @@ if (current_os == "win" || current_os == "winuwp") {
+ is_nacl = false
+ is_posix = true
+ is_win = false
++ is_bsd = false
++} else if (current_os == "freebsd") {
++ is_aix = false
++ is_android = false
++ is_chromeos = false
++ is_fuchsia = false
++ is_ios = false
++ is_linux = true
++ is_mac = false
++ is_nacl = false
++ is_posix = true
++ is_win = false
++ is_bsd = true
+ }
+
+ # =============================================================================
diff --git a/devel/electron4/files/patch-build_config_allocator.gni b/devel/electron4/files/patch-build_config_allocator.gni
new file mode 100644
index 000000000000..b4c56f854e44
--- /dev/null
+++ b/devel/electron4/files/patch-build_config_allocator.gni
@@ -0,0 +1,20 @@
+--- build/config/allocator.gni.orig 2019-03-15 06:36:56 UTC
++++ build/config/allocator.gni
+@@ -6,7 +6,7 @@ import("//build/config/sanitizers/sanitizers.gni")
+
+ # Temporarily disable tcmalloc on arm64 linux to get rid of compilation errors.
+ if (is_android || is_mac || is_ios || is_asan || is_lsan || is_tsan ||
+- is_msan || is_win || is_fuchsia || (is_linux && target_cpu == "arm64")) {
++ is_msan || is_win || is_fuchsia || (is_linux && target_cpu == "arm64") || is_bsd) {
+ _default_allocator = "none"
+ } else {
+ _default_allocator = "tcmalloc"
+@@ -17,7 +17,7 @@ if (is_android || is_mac || is_ios || is_asan || is_ls
+ # against the debug CRT with "is_nacl=false".
+ if ((is_linux || is_android || is_mac ||
+ (is_win && !is_component_build && !is_debug)) && !is_asan && !is_lsan &&
+- !is_tsan && !is_msan) {
++ !is_tsan && !is_msan && !is_bsd) {
+ _default_use_allocator_shim = true
+ } else {
+ _default_use_allocator_shim = false
diff --git a/devel/electron4/files/patch-build_config_compiler_BUILD.gn b/devel/electron4/files/patch-build_config_compiler_BUILD.gn
new file mode 100644
index 000000000000..505659656f2e
--- /dev/null
+++ b/devel/electron4/files/patch-build_config_compiler_BUILD.gn
@@ -0,0 +1,89 @@
+--- build/config/compiler/BUILD.gn.orig 2019-03-16 09:15:20 UTC
++++ build/config/compiler/BUILD.gn
+@@ -52,7 +52,7 @@ declare_args() {
+ # only two architectures that are currently checked in). Turn this off when
+ # you are using a custom toolchain and need to control -B in cflags.
+ linux_use_bundled_binutils =
+- linux_use_bundled_binutils_override && is_linux &&
++ linux_use_bundled_binutils_override && (is_linux && !is_bsd) &&
+ (current_cpu == "x64" || current_cpu == "x86")
+ binutils_path = rebase_path("//third_party/binutils/Linux_x64/Release/bin",
+ root_build_dir)
+@@ -263,7 +263,7 @@ config("compiler") {
+ # Linker warnings.
+ if (fatal_linker_warnings && !(is_chromeos && current_cpu == "arm") &&
+ !(is_android && use_order_profiling) && !is_mac && !is_ios &&
+- current_os != "aix") {
++ current_os != "aix" && !is_bsd) {
+ # TODO(jochen): Enable this on chromeos on arm. http://crbug.com/356580
+ # TODO(lizeb,pasko): Fix link errors when linking with order_profiling=1
+ # crbug.com/485542
+@@ -380,12 +380,6 @@ config("compiler") {
+ "-Wl,-z,now",
+ "-Wl,-z,relro",
+ ]
+- if (!using_sanitizer) {
+- ldflags += [
+- "-Wl,-z,defs",
+- "-Wl,--as-needed",
+- ]
+- }
+ }
+
+ # Linux-specific compiler flags setup.
+@@ -489,7 +483,7 @@ config("compiler") {
+ }
+
+ if (is_clang && !is_nacl && current_toolchain == host_toolchain &&
+- target_os != "chromeos") {
++ target_os != "chromeos" && !is_bsd) {
+ cflags += [
+ # TODO(hans): Remove this once Clang generates better optimized debug info
+ # by default. https://crbug.com/765793
+@@ -742,7 +736,7 @@ config("compiler_cpu_abi") {
+ cflags += [ "-mtune=$arm_tune" ]
+ }
+ } else if (current_cpu == "arm64") {
+- if (is_clang && !is_android && !is_nacl && !is_fuchsia) {
++ if (is_clang && !is_android && !is_nacl && !is_fuchsia && !is_bsd) {
+ cflags += [ "--target=aarch64-linux-gnu" ]
+ ldflags += [ "--target=aarch64-linux-gnu" ]
+ }
+@@ -1477,10 +1471,6 @@ config("default_warnings") {
+ cflags += [
+ # TODO(thakis): https://crbug.com/753973
+ "-Wno-enum-compare-switch",
+-
+- # Ignore warnings about MSVC optimization pragmas.
+- # TODO(thakis): Only for no_chromium_code? http://crbug.com/505314
+- "-Wno-ignored-pragma-optimize",
+ ]
+ }
+ }
+@@ -1654,7 +1644,7 @@ config("thin_archive") {
+ # Mac and iOS use the mac-specific "libtool" command, not ar, which doesn't
+ # have a "thin archive" mode (it does accept -T, but it means truncating
+ # archive names to 16 characters, which is not what we want).
+- if ((is_posix && !is_nacl && !is_mac && !is_ios) || is_fuchsia) {
++ if ((is_posix && !is_nacl && !is_mac && !is_ios && !is_bsd) || is_fuchsia) {
+ arflags = [ "-T" ]
+ }
+ }
+@@ -2181,7 +2171,7 @@ config("symbols") {
+ # [1] crrev.com/a81d5ade0b043208e06ad71a38bcf9c348a1a52f
+ cflags += [ "-gdwarf-3" ]
+ }
+- cflags += [ "-g2" ]
++ cflags += [ "-g0" ]
+ }
+ if (use_debug_fission && !is_nacl && !is_android) {
+ # NOTE: Some Chrome OS builds globally set |use_debug_fission| to true,
+@@ -2201,7 +2191,7 @@ config("symbols") {
+ # DWARF info may be corrupt; offsets in a range list entry are in different
+ # sections" there. Maybe just a bug in nacl_switch_32.S.
+ if (!is_mac && !is_ios && !is_nacl && target_cpu != "x86" &&
+- (use_gold || use_lld)) {
++ (use_gold || use_lld) && !is_bsd) {
+ if (is_clang) {
+ # This flag enables the GNU-format pubnames and pubtypes sections,
+ # which lld needs in order to generate a correct GDB index.
diff --git a/devel/electron4/files/patch-build_config_compiler_compiler.gni b/devel/electron4/files/patch-build_config_compiler_compiler.gni
new file mode 100644
index 000000000000..63bab0381575
--- /dev/null
+++ b/devel/electron4/files/patch-build_config_compiler_compiler.gni
@@ -0,0 +1,11 @@
+--- build/config/compiler/compiler.gni.orig 2019-03-15 06:36:56 UTC
++++ build/config/compiler/compiler.gni
+@@ -172,7 +172,7 @@ declare_args() {
+
+ declare_args() {
+ # Whether to use the gold linker from binutils instead of lld or bfd.
+- use_gold = !use_lld && !(is_chromecast && is_linux &&
++ use_gold = !is_bsd && !use_lld && !(is_chromecast && is_linux &&
+ (current_cpu == "arm" || current_cpu == "mipsel")) &&
+ ((is_linux && (current_cpu == "x64" || current_cpu == "x86" ||
+ current_cpu == "arm" || current_cpu == "mipsel" ||
diff --git a/devel/electron4/files/patch-build_config_features.gni b/devel/electron4/files/patch-build_config_features.gni
new file mode 100644
index 000000000000..2e74393a4a7a
--- /dev/null
+++ b/devel/electron4/files/patch-build_config_features.gni
@@ -0,0 +1,11 @@
+--- build/config/features.gni.orig 2019-03-15 06:36:56 UTC
++++ build/config/features.gni
+@@ -46,7 +46,7 @@ declare_args() {
+ fieldtrial_testing_like_official_build = is_chrome_branded
+
+ # libudev usage. This currently only affects the content layer.
+- use_udev = is_linux && !is_chromecast
++ use_udev = is_linux && !is_chromecast && !is_bsd
+
+ use_dbus = is_linux && !is_chromecast
+
diff --git a/devel/electron4/files/patch-build_config_linux_BUILD.gn b/devel/electron4/files/patch-build_config_linux_BUILD.gn
new file mode 100644
index 000000000000..6db1b6fea181
--- /dev/null
+++ b/devel/electron4/files/patch-build_config_linux_BUILD.gn
@@ -0,0 +1,11 @@
+--- build/config/linux/BUILD.gn.orig 2019-03-15 06:25:28 UTC
++++ build/config/linux/BUILD.gn
+@@ -28,7 +28,7 @@ config("runtime_library") {
+ }
+
+ if ((!is_chromeos || default_toolchain != "//build/toolchain/cros:target") &&
+- (!use_custom_libcxx || current_cpu == "mipsel")) {
++ (!use_custom_libcxx || current_cpu == "mipsel") && !is_bsd) {
+ libs = [ "atomic" ]
+ }
+ }
diff --git a/devel/electron4/files/patch-build_config_linux_pkg-config.py b/devel/electron4/files/patch-build_config_linux_pkg-config.py
new file mode 100644
index 000000000000..e229b0490f02
--- /dev/null
+++ b/devel/electron4/files/patch-build_config_linux_pkg-config.py
@@ -0,0 +1,26 @@
+--- build/config/linux/pkg-config.py.orig 2019-03-15 06:36:56 UTC
++++ build/config/linux/pkg-config.py
+@@ -57,8 +57,12 @@ def SetConfigPath(options):
+ print "You must specify an architecture via -a if using a sysroot."
+ sys.exit(1)
+
+- libdir = sysroot + '/usr/' + options.system_libdir + '/pkgconfig'
+- libdir += ':' + sysroot + '/usr/share/pkgconfig'
++ if "linux" in sys.platform:
++ libdir = sysroot + '/libdata/' + options.system_libdir + '/pkgconfig'
++ libdir += ':' + sysroot + '/usr/share/pkgconfig'
++ elif "bsd" in sys.platform:
++ libdir = sysroot + '/libdata/pkgconfig'
++ libdir += ':' + '/usr/libdata/pkgconfig'
+ os.environ['PKG_CONFIG_LIBDIR'] = libdir
+ return libdir
+
+@@ -107,7 +111,7 @@ def main():
+ # If this is run on non-Linux platforms, just return nothing and indicate
+ # success. This allows us to "kind of emulate" a Linux build from other
+ # platforms.
+- if "linux" not in sys.platform:
++ if "bsd" not in sys.platform:
+ print "[[],[],[],[],[]]"
+ return 0
+
diff --git a/devel/electron4/files/patch-build_config_sysroot.gni b/devel/electron4/files/patch-build_config_sysroot.gni
new file mode 100644
index 000000000000..e2d5821ec120
--- /dev/null
+++ b/devel/electron4/files/patch-build_config_sysroot.gni
@@ -0,0 +1,15 @@
+--- build/config/sysroot.gni.orig 2019-03-15 06:36:56 UTC
++++ build/config/sysroot.gni
+@@ -15,9 +15,10 @@ declare_args() {
+ # The absolute path to directory containing linux sysroot images
+ target_sysroot_dir = "//build/linux"
+
+- use_sysroot = current_cpu == "x86" || current_cpu == "x64" ||
++ use_sysroot = !is_bsd && (
++ current_cpu == "x86" || current_cpu == "x64" ||
+ current_cpu == "arm" || current_cpu == "arm64" ||
+- current_cpu == "mipsel" || current_cpu == "mips64el"
++ current_cpu == "mipsel" || current_cpu == "mips64el")
+ }
+
+ if (current_os == target_os && current_cpu == target_cpu &&
diff --git a/devel/electron4/files/patch-build_gn__run__binary.py b/devel/electron4/files/patch-build_gn__run__binary.py
new file mode 100644
index 000000000000..d36affd55755
--- /dev/null
+++ b/devel/electron4/files/patch-build_gn__run__binary.py
@@ -0,0 +1,11 @@
+--- build/gn_run_binary.py.orig 2019-03-15 06:36:56 UTC
++++ build/gn_run_binary.py
+@@ -19,7 +19,7 @@ path = './' + sys.argv[1]
+ # The rest of the arguments are passed directly to the executable.
+ args = [path] + sys.argv[2:]
+
+-ret = subprocess.call(args)
++ret = subprocess.call(args, env={"CHROME_EXE_PATH":"${WRKSRC}/out/Release/chrome"})
+ if ret != 0:
+ if ret <= -100:
+ # Windows error codes such as 0xC0000005 and 0xC0000409 are much easier to
diff --git a/devel/electron4/files/patch-build_linux_chrome.map b/devel/electron4/files/patch-build_linux_chrome.map
new file mode 100644
index 000000000000..3e20c778bbd3
--- /dev/null
+++ b/devel/electron4/files/patch-build_linux_chrome.map
@@ -0,0 +1,29 @@
+--- build/linux/chrome.map.orig 2019-03-15 06:25:28 UTC
++++ build/linux/chrome.map
+@@ -1,4 +1,7 @@
+ {
++local:
++ *;
++
+ global:
+ __bss_start;
+ __data_start;
+@@ -20,6 +23,10 @@ global:
+ # Program entry point.
+ _start;
+
++ # FreeBSD specific variables.
++ __progname;
++ environ;
++
+ # Memory allocation symbols. We want chrome and any libraries to
+ # share the same heap, so it is correct to export these symbols.
+ calloc;
+@@ -81,7 +88,4 @@ global:
+ localtime64;
+ localtime64_r;
+ localtime_r;
+-
+-local:
+- *;
+ };
diff --git a/devel/electron4/files/patch-build_linux_libpci_BUILD.gn b/devel/electron4/files/patch-build_linux_libpci_BUILD.gn
new file mode 100644
index 000000000000..dcb372f6e756
--- /dev/null
+++ b/devel/electron4/files/patch-build_linux_libpci_BUILD.gn
@@ -0,0 +1,53 @@
+--- build/linux/libpci/BUILD.gn.orig 2019-03-15 06:25:28 UTC
++++ build/linux/libpci/BUILD.gn
+@@ -3,20 +3,36 @@
+ # found in the LICENSE file.
+
+ import("//tools/generate_library_loader/generate_library_loader.gni")
++import("//build/config/linux/pkg_config.gni")
+
+-# This generates a target named "libpci".
+-generate_library_loader("libpci") {
+- name = "LibPciLoader"
+- output_h = "libpci.h"
+- output_cc = "libpci_loader.cc"
+- header = "<pci/pci.h>"
++declare_args() {
++ use_system_libpci = is_bsd
++}
+
+- functions = [
+- "pci_alloc",
+- "pci_init",
+- "pci_cleanup",
+- "pci_scan_bus",
+- "pci_fill_info",
+- "pci_lookup_name",
+- ]
++if (use_system_libpci) {
++ pkg_config("system_libpci") {
++ packages = [ "libpci" ]
++ }
++
++ source_set("libpci") {
++ public_configs = [ ":system_libpci" ]
++ }
++
++} else {
++ # This generates a target named "libpci".
++ generate_library_loader("libpci") {
++ name = "LibPciLoader"
++ output_h = "libpci.h"
++ output_cc = "libpci_loader.cc"
++ header = "<pci/pci.h>"
++
++ functions = [
++ "pci_alloc",
++ "pci_init",
++ "pci_cleanup",
++ "pci_scan_bus",
++ "pci_fill_info",
++ "pci_lookup_name",
++ ]
++ }
+ }
diff --git a/devel/electron4/files/patch-build_linux_unbundle_libusb.gn b/devel/electron4/files/patch-build_linux_unbundle_libusb.gn
new file mode 100644
index 000000000000..883f60806f3b
--- /dev/null
+++ b/devel/electron4/files/patch-build_linux_unbundle_libusb.gn
@@ -0,0 +1,27 @@
+--- build/linux/unbundle/libusb.gn.orig 2019-03-16 09:16:25 UTC
++++ build/linux/unbundle/libusb.gn
+@@ -0,0 +1,24 @@
++# Copyright 2016 The Chromium Authors. All rights reserved.
++# Use of this source code is governed by a BSD-style license that can be
++# found in the LICENSE file.
++
++import("//build/config/linux/pkg_config.gni")
++import("//build/shim_headers.gni")
++
++pkg_config("system_libusb") {
++ packages = [ "libusb-1.0" ]
++}
++
++shim_headers("libusb_shim") {
++ root_path = "src/libusb"
++ headers = [
++ "libusb.h",
++ ]
++}
++
++source_set("libusb") {
++ deps = [
++ ":libusb_shim",
++ ]
++ public_configs = [ ":system_libusb" ]
++}
diff --git a/devel/electron4/files/patch-build_linux_unbundle_replace__gn__files.py b/devel/electron4/files/patch-build_linux_unbundle_replace__gn__files.py
new file mode 100644
index 000000000000..241ee6cbe685
--- /dev/null
+++ b/devel/electron4/files/patch-build_linux_unbundle_replace__gn__files.py
@@ -0,0 +1,10 @@
+--- build/linux/unbundle/replace_gn_files.py.orig 2019-03-15 06:25:28 UTC
++++ build/linux/unbundle/replace_gn_files.py
+@@ -27,6 +27,7 @@ REPLACEMENTS = {
+ 'libevent': 'base/third_party/libevent/BUILD.gn',
+ 'libjpeg': 'third_party/libjpeg.gni',
+ 'libpng': 'third_party/libpng/BUILD.gn',
++ 'libusb': 'third_party/libusb/BUILD.gn',
+ 'libvpx': 'third_party/libvpx/BUILD.gn',
+ 'libwebp': 'third_party/libwebp/BUILD.gn',
+ 'libxml': 'third_party/libxml/BUILD.gn',
diff --git a/devel/electron4/files/patch-build_toolchain_gcc__toolchain.gni b/devel/electron4/files/patch-build_toolchain_gcc__toolchain.gni
new file mode 100644
index 000000000000..ea85201b29ad
--- /dev/null
+++ b/devel/electron4/files/patch-build_toolchain_gcc__toolchain.gni
@@ -0,0 +1,45 @@
+--- build/toolchain/gcc_toolchain.gni.orig 2019-03-15 06:36:56 UTC
++++ build/toolchain/gcc_toolchain.gni
+@@ -25,6 +25,11 @@ analyzer_wrapper =
+ rebase_path("//build/toolchain/clang_static_analyzer_wrapper.py",
+ root_build_dir) + " --mode=clang"
+
++declare_args() {
++ extra_cxxflags = ""
++ extra_ldflags = ""
++}
++
+ # This template defines a toolchain for something that works like gcc
+ # (including clang).
+ #
+@@ -604,13 +609,23 @@ template("clang_toolchain") {
+ }
+
+ gcc_toolchain(target_name) {
+- prefix = rebase_path("$clang_base_path/bin", root_build_dir)
+- cc = "$prefix/clang"
+- cxx = "$prefix/clang++"
+- ld = cxx
+- readelf = "${toolprefix}readelf"
+- ar = "${prefix}/llvm-ar"
+- nm = "${toolprefix}nm"
++ if (is_bsd) {
++ prefix = "/usr/local/bin"
++ cc = "cc"
++ cxx = "c++"
++ ld = cxx
++ readelf = "readelf"
++ ar = "${prefix}/ar"
++ nm = "${toolprefix}nm"
++ } else {
++ prefix = rebase_path("$clang_base_path/bin", root_build_dir)
++ cc = "$prefix/clang"
++ cxx = "$prefix/clang++"
++ ld = cxx
++ readelf = "${toolprefix}readelf"
++ ar = "${prefix}/llvm-ar"
++ nm = "${toolprefix}nm"
++ }
+
+ forward_variables_from(invoker,
+ [
diff --git a/devel/electron4/files/patch-build_toolchain_get__concurrent__links.py b/devel/electron4/files/patch-build_toolchain_get__concurrent__links.py
new file mode 100644
index 000000000000..9463eb0e85f0
--- /dev/null
+++ b/devel/electron4/files/patch-build_toolchain_get__concurrent__links.py
@@ -0,0 +1,17 @@
+--- build/toolchain/get_concurrent_links.py.orig 2019-03-15 06:25:28 UTC
++++ build/toolchain/get_concurrent_links.py
+@@ -46,6 +46,14 @@ def _GetTotalMemoryInBytes():
+ return int(subprocess.check_output(['sysctl', '-n', 'hw.memsize']))
+ except Exception:
+ return 0
++ elif sys.platform.startswith('freebsd'):
++ try:
++ avail_bytes = int(subprocess.check_output(['sysctl', '-n', 'hw.physmem']))
++ # With -fuse-lld it doesn't take a lot of ram, feel free to change that
++ # 1 * ... to needed amount
++ return max(1, avail_bytes / (1 * (2 ** 30))) # total / 4GB
++ except Exception:
++ return 1
+ # TODO(scottmg): Implement this for other platforms.
+ return 0
+
diff --git a/devel/electron4/files/patch-build_toolchain_linux_BUILD.gn b/devel/electron4/files/patch-build_toolchain_linux_BUILD.gn
new file mode 100644
index 000000000000..9b5fc7d5b387
--- /dev/null
+++ b/devel/electron4/files/patch-build_toolchain_linux_BUILD.gn
@@ -0,0 +1,10 @@
+--- build/toolchain/linux/BUILD.gn.orig 2019-03-15 06:36:56 UTC
++++ build/toolchain/linux/BUILD.gn
+@@ -14,7 +14,6 @@ clang_toolchain("clang_arm") {
+ }
+
+ clang_toolchain("clang_arm64") {
+- toolprefix = "aarch64-linux-gnu-"
+ toolchain_args = {
+ current_cpu = "arm64"
+ current_os = "linux"
diff --git a/devel/electron4/files/patch-cc_BUILD.gn b/devel/electron4/files/patch-cc_BUILD.gn
new file mode 100644
index 000000000000..54de06a44294
--- /dev/null
+++ b/devel/electron4/files/patch-cc_BUILD.gn
@@ -0,0 +1,11 @@
+--- cc/BUILD.gn.orig 2019-03-15 06:36:56 UTC
++++ cc/BUILD.gn
+@@ -550,7 +550,7 @@ cc_static_library("test_support") {
+ "//ui/gl:test_support",
+ "//ui/latency",
+ ]
+- if (!is_android) {
++ if (!is_android && !is_bsd) {
+ data_deps = [
+ "//third_party/mesa:osmesa",
+ ]
diff --git a/devel/electron4/files/patch-cc_layers_scrollbar__layer__impl__base.cc b/devel/electron4/files/patch-cc_layers_scrollbar__layer__impl__base.cc
new file mode 100644
index 000000000000..2fb97afbb3e2
--- /dev/null
+++ b/devel/electron4/files/patch-cc_layers_scrollbar__layer__impl__base.cc
@@ -0,0 +1,13 @@
+--- cc/layers/scrollbar_layer_impl_base.cc.orig 2019-03-15 06:36:56 UTC
++++ cc/layers/scrollbar_layer_impl_base.cc
+@@ -210,8 +210,8 @@ gfx::Rect ScrollbarLayerImplBase::ComputeThumbQuadRect
+ int thumb_offset = TrackStart();
+ if (maximum > 0) {
+ float ratio = clamped_current_pos / maximum;
+- float max_offset = track_length - thumb_length;
+- thumb_offset += static_cast<int>(ratio * max_offset);
++ float _max_offset = track_length - thumb_length;
++ thumb_offset += static_cast<int>(ratio * _max_offset);
+ }
+
+ float thumb_thickness_adjustment =
diff --git a/devel/electron4/files/patch-cc_trees_property__tree.cc b/devel/electron4/files/patch-cc_trees_property__tree.cc
new file mode 100644
index 000000000000..c96f9634f53e
--- /dev/null
+++ b/devel/electron4/files/patch-cc_trees_property__tree.cc
@@ -0,0 +1,20 @@
+--- cc/trees/property_tree.cc.orig 2019-03-15 06:36:57 UTC
++++ cc/trees/property_tree.cc
+@@ -1295,13 +1295,13 @@ gfx::ScrollOffset ScrollTree::MaxScrollOffset(int scro
+
+ gfx::Size clip_layer_bounds = container_bounds(scroll_node->id);
+
+- gfx::ScrollOffset max_offset(
++ gfx::ScrollOffset _max_offset(
+ scaled_scroll_bounds.width() - clip_layer_bounds.width(),
+ scaled_scroll_bounds.height() - clip_layer_bounds.height());
+
+- max_offset.Scale(1 / scale_factor);
+- max_offset.SetToMax(gfx::ScrollOffset());
+- return max_offset;
++ _max_offset.Scale(1 / scale_factor);
++ _max_offset.SetToMax(gfx::ScrollOffset());
++ return _max_offset;
+ }
+
+ void ScrollTree::OnScrollOffsetAnimated(ElementId id,
diff --git a/devel/electron4/files/patch-chrome_app_chrome__command__ids.h b/devel/electron4/files/patch-chrome_app_chrome__command__ids.h
new file mode 100644
index 000000000000..9ded92e3af42
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_app_chrome__command__ids.h
@@ -0,0 +1,11 @@
+--- chrome/app/chrome_command_ids.h.orig 2019-03-15 06:36:59 UTC
++++ chrome/app/chrome_command_ids.h
+@@ -67,7 +67,7 @@
+ #define IDC_VISIT_DESKTOP_OF_LRU_USER_2 34049
+ #define IDC_VISIT_DESKTOP_OF_LRU_USER_3 34050
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ #define IDC_USE_SYSTEM_TITLE_BAR 34051
+ #define IDC_RESTORE_WINDOW 34052
+ #endif
diff --git a/devel/electron4/files/patch-chrome_app_chrome__main.cc b/devel/electron4/files/patch-chrome_app_chrome__main.cc
new file mode 100644
index 000000000000..f4563d1c5f78
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_app_chrome__main.cc
@@ -0,0 +1,19 @@
+--- chrome/app/chrome_main.cc.orig 2019-03-15 06:36:59 UTC
++++ chrome/app/chrome_main.cc
+@@ -89,14 +89,14 @@ int ChromeMain(int argc, const char** argv) {
+ ALLOW_UNUSED_LOCAL(command_line);
+
+ // Chrome-specific process modes.
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+ if (command_line->HasSwitch(switches::kHeadless)) {
+ #if defined(OS_MACOSX)
+ SetUpBundleOverrides();
+ #endif
+ return headless::HeadlessShellMain(params);
+ }
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+
+ int rv = content::ContentMain(params);
+
diff --git a/devel/electron4/files/patch-chrome_app_chrome__main__delegate.cc b/devel/electron4/files/patch-chrome_app_chrome__main__delegate.cc
new file mode 100644
index 000000000000..357c75eef4a7
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_app_chrome__main__delegate.cc
@@ -0,0 +1,74 @@
+--- chrome/app/chrome_main_delegate.cc.orig 2019-03-15 06:36:59 UTC
++++ chrome/app/chrome_main_delegate.cc
+@@ -98,7 +98,7 @@
+ #include "chrome/app/shutdown_signal_handlers_posix.h"
+ #endif
+
+-#if BUILDFLAG(ENABLE_NACL) && defined(OS_LINUX)
++#if BUILDFLAG(ENABLE_NACL) && defined(OS_LINUX) && !defined(OS_BSD)
+ #include "components/nacl/common/nacl_paths.h"
+ #include "components/nacl/zygote/nacl_fork_delegate_linux.h"
+ #endif
+@@ -133,7 +133,7 @@
+ #include "v8/include/v8.h"
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/environment.h"
+ #endif
+
+@@ -233,7 +233,7 @@ bool UseHooks() {
+
+ #endif // defined(OS_WIN)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) && !defined(OS_BSD)
+ void AdjustLinuxOOMScore(const std::string& process_type) {
+ // Browsers and zygotes should still be killable, but killed last.
+ const int kZygoteScore = 0;
+@@ -401,7 +401,7 @@ void InitializeUserDataDir(base::CommandLine* command_
+ std::string process_type =
+ command_line->GetSwitchValueASCII(switches::kProcessType);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // On Linux, Chrome does not support running multiple copies under different
+ // DISPLAYs, so the profile directory can be specified in the environment to
+ // support the virtual desktop use-case.
+@@ -574,7 +574,7 @@ bool ChromeMainDelegate::BasicStartupComplete(int* exi
+ #if defined(OS_CHROMEOS)
+ chromeos::RegisterPathProvider();
+ #endif
+-#if BUILDFLAG(ENABLE_NACL) && defined(OS_LINUX)
++#if BUILDFLAG(ENABLE_NACL) && defined(OS_LINUX) && !defined(OS_BSD)
+ nacl::RegisterPathProvider();
+ #endif
+
+@@ -885,7 +885,7 @@ void ChromeMainDelegate::PreSandboxStartup() {
+ InitializePDF();
+ #endif
+
+-#if defined(OS_POSIX) && !defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ // Zygote needs to call InitCrashReporter() in RunZygote().
+ if (process_type != service_manager::switches::kZygoteProcess) {
+ #if defined(OS_ANDROID)
+@@ -901,7 +901,7 @@ void ChromeMainDelegate::PreSandboxStartup() {
+ breakpad::InitCrashReporter(process_type);
+ #endif // defined(OS_ANDROID)
+ }
+-#endif // defined(OS_POSIX) && !defined(OS_MACOSX)
++#endif // defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+
+ // After all the platform Breakpads have been initialized, store the command
+ // line for crash reporting.
+@@ -911,7 +911,7 @@ void ChromeMainDelegate::PreSandboxStartup() {
+ void ChromeMainDelegate::SandboxInitialized(const std::string& process_type) {
+ // Note: If you are adding a new process type below, be sure to adjust the
+ // AdjustLinuxOOMScore function too.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) && !defined(OS_BSD)
+ AdjustLinuxOOMScore(process_type);
+ #endif
+ #if defined(OS_WIN)
diff --git a/devel/electron4/files/patch-chrome_app_chromium__strings.grd b/devel/electron4/files/patch-chrome_app_chromium__strings.grd
new file mode 100644
index 000000000000..d91e57b0fea5
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_app_chromium__strings.grd
@@ -0,0 +1,11 @@
+--- chrome/app/chromium_strings.grd.orig 2019-03-15 06:36:59 UTC
++++ chrome/app/chromium_strings.grd
+@@ -814,7 +814,7 @@ Signing in anyway will merge Chromium information like
+ </message>
+
+ <!-- ProcessSingleton -->
+- <if expr="is_linux or is_macosx">
++ <if expr="is_linux or is_macosx or is_posix">
+ <message name="IDS_PROFILE_IN_USE_POSIX" desc="Message shown when the browser cannot start because the profile is in use on a different host.">
+ The profile appears to be in use by another Chromium process (<ph name="PROCESS_ID">$1<ex>12345</ex></ph>) on another computer (<ph name="HOST_NAME">$2<ex>example.com</ex></ph>). Chromium has locked the profile so that it doesn't get corrupted. If you are sure no other processes are using this profile, you can unlock the profile and relaunch Chromium.
+ </message>
diff --git a/devel/electron4/files/patch-chrome_app_generated__resources.grd b/devel/electron4/files/patch-chrome_app_generated__resources.grd
new file mode 100644
index 000000000000..3b78a51859e9
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_app_generated__resources.grd
@@ -0,0 +1,20 @@
+--- chrome/app/generated_resources.grd.orig 2019-03-15 06:36:59 UTC
++++ chrome/app/generated_resources.grd
+@@ -6064,7 +6064,7 @@ the Bookmarks menu.">
+ Google Pay
+ </message>
+
+- <if expr="is_linux and not chromeos">
++ <if expr="is_posix and not chromeos">
+ <message name="IDS_SHOW_WINDOW_DECORATIONS" desc="The label of a radio button in the options dialog for using the system title bar and borders.">
+ Use system title bar and borders
+ </message>
+@@ -6895,7 +6895,7 @@ Please help our engineers fix this problem. Tell us wh
+ Set as default
+ </message>
+
+- <if expr="is_linux and not chromeos">
++ <if expr="is_posix and not chromeos">
+ <message name="IDS_MINIMIZE_WINDOW_MENU" desc="The Linux browser window menu item text for minimizing the window.">
+ Minimize
+ </message>
diff --git a/devel/electron4/files/patch-chrome_app_google__chrome__strings.grd b/devel/electron4/files/patch-chrome_app_google__chrome__strings.grd
new file mode 100644
index 000000000000..50079ff00d4c
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_app_google__chrome__strings.grd
@@ -0,0 +1,11 @@
+--- chrome/app/google_chrome_strings.grd.orig 2019-03-15 06:36:59 UTC
++++ chrome/app/google_chrome_strings.grd
+@@ -825,7 +825,7 @@ Signing in anyway will merge Chrome information like b
+ </message>
+
+ <!-- ProcessSingleton -->
+- <if expr="is_linux or is_macosx">
++ <if expr="is_linux or is_macosx or is_posix">
+ <message name="IDS_PROFILE_IN_USE_POSIX" desc="Message shown when the browser cannot start because the profile is in use on a different host.">
+ The profile appears to be in use by another Google Chrome process (<ph name="PROCESS_ID">$1<ex>12345</ex></ph>) on another computer (<ph name="HOST_NAME">$2<ex>example.com</ex></ph>). Chrome has locked the profile so that it doesn't get corrupted. If you are sure no other processes are using this profile, you can unlock the profile and relaunch Chrome.
+ </message>
diff --git a/devel/electron4/files/patch-chrome_app_settings__strings.grdp b/devel/electron4/files/patch-chrome_app_settings__strings.grdp
new file mode 100644
index 000000000000..c80fc4652bc8
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_app_settings__strings.grdp
@@ -0,0 +1,20 @@
+--- chrome/app/settings_strings.grdp.orig 2019-03-15 06:37:00 UTC
++++ chrome/app/settings_strings.grdp
+@@ -508,7 +508,7 @@
+ Themes
+ </message>
+ </if>
+- <if expr="is_linux and not chromeos">
++ <if expr="is_posix and not chromeos">
+ <message name="IDS_SETTINGS_SYSTEM_THEME" desc="Text of the label describing the system (GTK+) browser theme on Linux">
+ GTK+
+ </message>
+@@ -522,7 +522,7 @@
+ Use Classic
+ </message>
+ </if>
+- <if expr="not is_linux or chromeos">
++ <if expr="not is_posix or chromeos">
+ <message name="IDS_SETTINGS_RESET_TO_DEFAULT_THEME" desc="Name of the control which resets the browser theme back to the default theme.">
+ Reset to default
+ </message>
diff --git a/devel/electron4/files/patch-chrome_app_shutdown__signal__handlers__posix.cc b/devel/electron4/files/patch-chrome_app_shutdown__signal__handlers__posix.cc
new file mode 100644
index 000000000000..5d876581df7f
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_app_shutdown__signal__handlers__posix.cc
@@ -0,0 +1,15 @@
+--- chrome/app/shutdown_signal_handlers_posix.cc.orig 2019-03-15 06:37:00 UTC
++++ chrome/app/shutdown_signal_handlers_posix.cc
+@@ -183,7 +183,11 @@ void InstallShutdownSignalHandlers(
+ g_pipe_pid = getpid();
+ g_shutdown_pipe_read_fd = pipefd[0];
+ g_shutdown_pipe_write_fd = pipefd[1];
+-#if !defined(ADDRESS_SANITIZER) && !defined(KEEP_SHADOW_STACKS)
++#if defined(OS_BSD)
++ // PTHREAD_STACK_MIN causes chromium to crash under FreeBSD,
++ // we request the default pthread stack size by specifying 0 here.
++ const size_t kShutdownDetectorThreadStackSize = 0;
++#elif !defined(ADDRESS_SANITIZER) && !defined(KEEP_SHADOW_STACKS)
+ const size_t kShutdownDetectorThreadStackSize = PTHREAD_STACK_MIN * 2;
+ #else
+ // ASan instrumentation and -finstrument-functions (used for keeping the
diff --git a/devel/electron4/files/patch-chrome_app_theme_chrome__unscaled__resources.grd b/devel/electron4/files/patch-chrome_app_theme_chrome__unscaled__resources.grd
new file mode 100644
index 000000000000..1108956b9734
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_app_theme_chrome__unscaled__resources.grd
@@ -0,0 +1,11 @@
+--- chrome/app/theme/chrome_unscaled_resources.grd.orig 2019-03-15 06:37:00 UTC
++++ chrome/app/theme/chrome_unscaled_resources.grd
+@@ -88,7 +88,7 @@
+ <include name="IDR_PROFILE_AVATAR_2X_25" file="default_200_percent/common/profile_avatar_sun_cloud.png" type="BINDATA" />
+ <include name="IDR_PROFILE_AVATAR_2X_26" file="default_200_percent/common/profile_avatar_placeholder.png" type="BINDATA" />
+ </if>
+- <if expr="is_linux and enable_app_list">
++ <if expr="is_posix and enable_app_list">
+ <!-- App Launcher icons for desktop icon. -->
+ <if expr="_google_chrome">
+ <then>
diff --git a/devel/electron4/files/patch-chrome_browser_about__flags.cc b/devel/electron4/files/patch-chrome_browser_about__flags.cc
new file mode 100644
index 000000000000..9534385a24a6
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_about__flags.cc
@@ -0,0 +1,72 @@
+--- chrome/browser/about_flags.cc.orig 2019-03-15 06:37:01 UTC
++++ chrome/browser/about_flags.cc
+@@ -2436,7 +2436,7 @@ const FeatureEntry kFeatureEntries[] = {
+ {"force-text-direction", flag_descriptions::kForceTextDirectionName,
+ flag_descriptions::kForceTextDirectionDescription, kOsAll,
+ MULTI_VALUE_TYPE(kForceTextDirectionChoices)},
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ {"enable-input-ime-api", flag_descriptions::kEnableInputImeApiName,
+ flag_descriptions::kEnableInputImeApiDescription, kOsWin | kOsLinux,
+ ENABLE_DISABLE_VALUE_TYPE(switches::kEnableInputImeAPI,
+@@ -2446,7 +2446,7 @@ const FeatureEntry kFeatureEntries[] = {
+ flag_descriptions::kWarnBeforeQuittingFlagDescription, kOsWin | kOsLinux,
+ FEATURE_VALUE_TYPE(features::kWarnBeforeQuitting)},
+ #endif // OS_CHROMEOS
+-#endif // OS_WIN || OS_LINUX
++#endif // OS_WIN || OS_LINUX || OS_BSD
+ {"enable-origin-trials", flag_descriptions::kOriginTrialsName,
+ flag_descriptions::kOriginTrialsDescription, kOsAll,
+ FEATURE_VALUE_TYPE(features::kOriginTrials)},
+@@ -3059,7 +3059,7 @@ const FeatureEntry kFeatureEntries[] = {
+ flag_descriptions::kLeftToRightUrlsDescription, kOsDesktop,
+ FEATURE_VALUE_TYPE(features::kLeftToRightUrls)},
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+ {"omnibox-new-answer-layout",
+ flag_descriptions::kOmniboxNewAnswerLayoutName,
+ flag_descriptions::kOmniboxNewAnswerLayoutDescription, kOsDesktop,
+@@ -3081,7 +3081,7 @@ const FeatureEntry kFeatureEntries[] = {
+ {"enable-new-app-menu-icon", flag_descriptions::kEnableNewAppMenuIconName,
+ flag_descriptions::kEnableNewAppMenuIconDescription, kOsDesktop,
+ FEATURE_VALUE_TYPE(features::kAnimatedAppMenuIcon)},
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+
+ #if defined(OS_ANDROID)
+ {"enable-custom-feedback-ui",
+@@ -3415,13 +3415,13 @@ const FeatureEntry kFeatureEntries[] = {
+ flag_descriptions::kClickToOpenPDFDescription, kOsAll,
+ FEATURE_VALUE_TYPE(features::kClickToOpenPDFPlaceholder)},
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ {"direct-manipulation-stylus",
+ flag_descriptions::kDirectManipulationStylusName,
+ flag_descriptions::kDirectManipulationStylusDescription,
+ kOsWin | kOsMac | kOsLinux,
+ FEATURE_VALUE_TYPE(features::kDirectManipulationStylus)},
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ #if !defined(OS_ANDROID)
+ {"remove-deprecared-gaia-signin-endpoint",
+@@ -3913,7 +3913,7 @@ const FeatureEntry kFeatureEntries[] = {
+ FEATURE_VALUE_TYPE(ash::features::kOverviewSwipeToClose)},
+ #endif // OS_CHROMEOS
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ {"ntp-backgrounds", flag_descriptions::kNtpBackgroundsName,
+ flag_descriptions::kNtpBackgroundsDescription, kOsDesktop,
+ FEATURE_VALUE_TYPE(features::kNtpBackgrounds)},
+@@ -3929,7 +3929,7 @@ const FeatureEntry kFeatureEntries[] = {
+ {"ntp-ui-md", flag_descriptions::kNtpUIMdName,
+ flag_descriptions::kNtpUIMdDescription, kOsDesktop,
+ FEATURE_VALUE_TYPE(features::kNtpUIMd)},
+-#endif // OS_WIN || OS_MACOSX || OS_LINUX
++#endif // OS_WIN || OS_MACOSX || OS_LINUX || OS_BSD
+
+ #if defined(OS_ANDROID)
+ {"enable-display-cutout-api", flag_descriptions::kDisplayCutoutAPIName,
diff --git a/devel/electron4/files/patch-chrome_browser_after__startup__task__utils.cc b/devel/electron4/files/patch-chrome_browser_after__startup__task__utils.cc
new file mode 100644
index 000000000000..39d31800fc01
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_after__startup__task__utils.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/after_startup_task_utils.cc.orig 2019-03-15 06:37:01 UTC
++++ chrome/browser/after_startup_task_utils.cc
+@@ -105,7 +105,7 @@ void QueueTask(std::unique_ptr<AfterStartupTask> queue
+
+ void SetBrowserStartupIsComplete() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+-#if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ // CurrentProcessInfo::CreationTime() is not available on all platforms.
+ const base::Time process_creation_time =
+ base::CurrentProcessInfo::CreationTime();
diff --git a/devel/electron4/files/patch-chrome_browser_autocomplete_chrome__autocomplete__scheme__classifier.cc b/devel/electron4/files/patch-chrome_browser_autocomplete_chrome__autocomplete__scheme__classifier.cc
new file mode 100644
index 000000000000..114dd80096a2
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_autocomplete_chrome__autocomplete__scheme__classifier.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc.orig 2019-03-15 06:25:31 UTC
++++ chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
+@@ -59,7 +59,7 @@ ChromeAutocompleteSchemeClassifier::GetInputTypeForSch
+ return metrics::OmniboxInputType::QUERY;
+
+ case ExternalProtocolHandler::UNKNOWN: {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Linux impl of GetApplicationNameForProtocol doesn't distinguish
+ // between URL schemes with handers and those without. This will
+ // make the default behaviour be search on Linux.
diff --git a/devel/electron4/files/patch-chrome_browser_background_background__mode__optimizer.cc b/devel/electron4/files/patch-chrome_browser_background_background__mode__optimizer.cc
new file mode 100644
index 000000000000..e1e880dcc8ce
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_background_background__mode__optimizer.cc
@@ -0,0 +1,15 @@
+--- chrome/browser/background/background_mode_optimizer.cc.orig 2019-03-15 06:25:31 UTC
++++ chrome/browser/background/background_mode_optimizer.cc
+@@ -30,10 +30,10 @@ std::unique_ptr<BackgroundModeOptimizer> BackgroundMod
+ switches::kKeepAliveForTest))
+ return nullptr;
+
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ if (base::FeatureList::IsEnabled(features::kBackgroundModeAllowRestart))
+ return base::WrapUnique(new BackgroundModeOptimizer());
+-#endif // defined(OS_WIN) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+
+ return nullptr;
+ }
diff --git a/devel/electron4/files/patch-chrome_browser_browser__resources.grd b/devel/electron4/files/patch-chrome_browser_browser__resources.grd
new file mode 100644
index 000000000000..43f8656579c0
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_browser__resources.grd
@@ -0,0 +1,11 @@
+--- chrome/browser/browser_resources.grd.orig 2019-03-15 06:37:01 UTC
++++ chrome/browser/browser_resources.grd
+@@ -643,7 +643,7 @@
+ <include name="IDR_WELCOME_WIN10_PIN_WEBP" file="resources\welcome\pin.webp" type="BINDATA" />
+ </if>
+ <include name="IDR_SSL_ERROR_ASSISTANT_PB" file="${root_gen_dir}/chrome/browser/resources/ssl/ssl_error_assistant/ssl_error_assistant.pb" use_base_dir="false" type="BINDATA" />
+- <if expr="is_android or is_linux">
++ <if expr="is_android or is_posix">
+ <include name="IDR_SANDBOX_INTERNALS_HTML" file="resources\sandbox_internals\sandbox_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
+ <include name="IDR_SANDBOX_INTERNALS_JS" file="resources\sandbox_internals\sandbox_internals.js" type="BINDATA" compress="gzip" />
+ </if>
diff --git a/devel/electron4/files/patch-chrome_browser_chrome__browser__main.cc b/devel/electron4/files/patch-chrome_browser_chrome__browser__main.cc
new file mode 100644
index 000000000000..bebb15a6cc45
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_chrome__browser__main.cc
@@ -0,0 +1,42 @@
+--- chrome/browser/chrome_browser_main.cc.orig 2019-03-15 06:37:01 UTC
++++ chrome/browser/chrome_browser_main.cc
+@@ -216,7 +216,7 @@
+ #include "chromeos/settings/cros_settings_names.h"
+ #endif // defined(OS_CHROMEOS)
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ #include "chrome/browser/first_run/upgrade_util_linux.h"
+ #endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
+
+@@ -257,7 +257,7 @@
+ #endif // defined(OS_WIN)
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS) || defined(OS_BSD))
+ #include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h"
+ #endif
+
+@@ -1287,10 +1287,10 @@ int ChromeBrowserMainParts::PreCreateThreadsImpl() {
+ }
+ #endif // !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
+
+-#if defined(OS_LINUX) || defined(OS_OPENBSD)
++#if defined(OS_LINUX)
+ // Set the product channel for crash reports.
+ breakpad::SetChannelCrashKey(chrome::GetChannelName());
+-#endif // defined(OS_LINUX) || defined(OS_OPENBSD)
++#endif // defined(OS_LINUX)
+
+ #if defined(OS_MACOSX)
+ // Get the Keychain API to register for distributed notifications on the main
+@@ -1314,7 +1314,7 @@ int ChromeBrowserMainParts::PreCreateThreadsImpl() {
+ }
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS) || defined(OS_BSD))
+ metrics::DesktopSessionDurationTracker::Initialize();
+ #endif
+ metrics::RendererUptimeTracker::Initialize();
diff --git a/devel/electron4/files/patch-chrome_browser_chrome__browser__main__linux.cc b/devel/electron4/files/patch-chrome_browser_chrome__browser__main__linux.cc
new file mode 100644
index 000000000000..24942d687e92
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_chrome__browser__main__linux.cc
@@ -0,0 +1,27 @@
+--- chrome/browser/chrome_browser_main_linux.cc.orig 2019-03-15 06:37:01 UTC
++++ chrome/browser/chrome_browser_main_linux.cc
+@@ -88,12 +88,14 @@ void ChromeBrowserMainPartsLinux::PreProfileInit() {
+ void ChromeBrowserMainPartsLinux::PostProfileInit() {
+ ChromeBrowserMainPartsPosix::PostProfileInit();
+
++#if !defined(OS_BSD)
+ g_browser_process->metrics_service()->RecordBreakpadRegistration(
+ breakpad::IsCrashReporterEnabled());
++#endif
+ }
+
+ void ChromeBrowserMainPartsLinux::PostMainMessageLoopStart() {
+-#if !defined(OS_CHROMEOS)
++#if !defined(OS_CHROMEOS) && !defined(OS_BSD)
+ bluez::DBusThreadManagerLinux::Initialize();
+ bluez::BluezDBusManager::Initialize(
+ bluez::DBusThreadManagerLinux::Get()->GetSystemBus(), false);
+@@ -103,7 +105,7 @@ void ChromeBrowserMainPartsLinux::PostMainMessageLoopS
+ }
+
+ void ChromeBrowserMainPartsLinux::PostDestroyThreads() {
+-#if !defined(OS_CHROMEOS)
++#if !defined(OS_CHROMEOS) && !defined(OS_BSD)
+ bluez::BluezDBusManager::Shutdown();
+ bluez::DBusThreadManagerLinux::Shutdown();
+ #endif
diff --git a/devel/electron4/files/patch-chrome_browser_chrome__browser__main__posix.cc b/devel/electron4/files/patch-chrome_browser_chrome__browser__main__posix.cc
new file mode 100644
index 000000000000..f8af65e24a39
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_chrome__browser__main__posix.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/chrome_browser_main_posix.cc.orig 2019-03-15 06:37:01 UTC
++++ chrome/browser/chrome_browser_main_posix.cc
+@@ -139,7 +139,7 @@ void ChromeBrowserMainPartsPosix::PostMainMessageLoopS
+ void ChromeBrowserMainPartsPosix::ShowMissingLocaleMessageBox() {
+ #if defined(OS_CHROMEOS)
+ NOTREACHED(); // Should not ever happen on ChromeOS.
+-#elif defined(OS_MACOSX)
++#elif defined(OS_MACOSX) || defined(OS_BSD)
+ // Not called on Mac because we load the locale files differently.
+ NOTREACHED();
+ #elif defined(USE_AURA)
diff --git a/devel/electron4/files/patch-chrome_browser_chrome__content__browser__client.cc b/devel/electron4/files/patch-chrome_browser_chrome__content__browser__client.cc
new file mode 100644
index 000000000000..868ebc9e08f3
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_chrome__content__browser__client.cc
@@ -0,0 +1,83 @@
+--- chrome/browser/chrome_content_browser_client.cc.orig 2019-03-15 06:37:01 UTC
++++ chrome/browser/chrome_content_browser_client.cc
+@@ -334,7 +334,7 @@
+ #include "chromeos/services/secure_channel/secure_channel_service.h"
+ #include "components/user_manager/user_manager.h"
+ #include "services/service_manager/public/mojom/interface_provider_spec.mojom.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "chrome/browser/chrome_browser_main_linux.h"
+ #elif defined(OS_ANDROID)
+ #include "base/android/application_status_listener.h"
+@@ -373,7 +373,7 @@
+ #include "chrome/common/importer/profile_import.mojom.h"
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ #include "chrome/browser/webshare/share_service_impl.h"
+ #endif
+
+@@ -387,7 +387,7 @@
+ #include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views.h"
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ #include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.h"
+ #endif
+
+@@ -1099,7 +1099,7 @@ content::BrowserMainParts* ChromeContentBrowserClient:
+ #elif defined(OS_CHROMEOS)
+ main_parts = new chromeos::ChromeBrowserMainPartsChromeos(
+ parameters, std::move(service_manifest_data_pack_));
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ main_parts = new ChromeBrowserMainPartsLinux(
+ parameters, std::move(service_manifest_data_pack_));
+ #elif defined(OS_ANDROID)
+@@ -1119,7 +1119,7 @@ content::BrowserMainParts* ChromeContentBrowserClient:
+ // Construct additional browser parts. Stages are called in the order in
+ // which they are added.
+ #if defined(TOOLKIT_VIEWS)
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(USE_OZONE)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS) && !defined(USE_OZONE)
+ main_parts->AddParts(new ChromeBrowserMainExtraPartsViewsLinux());
+ #else
+ main_parts->AddParts(new ChromeBrowserMainExtraPartsViews());
+@@ -1886,7 +1886,7 @@ void ChromeContentBrowserClient::AppendExtraCommandLin
+ command_line->AppendSwitchASCII(switches::kMetricsClientID,
+ client_info->client_id);
+ }
+-#elif defined(OS_POSIX)
++#elif defined(OS_POSIX) && !defined(OS_BSD)
+ if (breakpad::IsCrashReporterEnabled()) {
+ std::string switch_value;
+ std::unique_ptr<metrics::ClientInfo> client_info =
+@@ -3335,7 +3335,7 @@ void ChromeContentBrowserClient::GetAdditionalFileSyst
+ }
+ }
+
+-#if defined(OS_POSIX) && !defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ void ChromeContentBrowserClient::GetAdditionalMappedFilesForChildProcess(
+ const base::CommandLine& command_line,
+ int child_process_id,
+@@ -4097,7 +4097,7 @@ void ChromeContentBrowserClient::InitWebContextInterfa
+ #if defined(OS_ANDROID)
+ frame_interfaces_parameterized_->AddInterface(base::Bind(
+ &ForwardToJavaWebContentsRegistry<blink::mojom::ShareService>));
+-#elif defined(OS_LINUX) || defined(OS_WIN)
++#elif defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ frame_interfaces_->AddInterface(base::Bind(&ShareServiceImpl::Create));
+ #endif
+
+@@ -4609,7 +4609,7 @@ std::unique_ptr<content::OverlayWindow>
+ ChromeContentBrowserClient::CreateWindowForPictureInPicture(
+ content::PictureInPictureWindowController* controller) {
+ #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
+- defined(OS_CHROMEOS)
++ defined(OS_CHROMEOS) || defined(OS_BSD)
+ // Note: content::OverlayWindow::Create() is defined by platform-specific
+ // implementation in chrome/browser/ui/views. This layering hack, which goes
+ // through //content and ContentBrowserClient, allows us to work around the
diff --git a/devel/electron4/files/patch-chrome_browser_chrome__content__browser__client.h b/devel/electron4/files/patch-chrome_browser_chrome__content__browser__client.h
new file mode 100644
index 000000000000..0c949eeb1dd7
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_chrome__content__browser__client.h
@@ -0,0 +1,17 @@
+--- chrome/browser/chrome_content_browser_client.h.orig 2019-03-15 06:37:01 UTC
++++ chrome/browser/chrome_content_browser_client.h
+@@ -326,12 +326,12 @@ class ChromeContentBrowserClient : public content::Con
+ void OverridePageVisibilityState(
+ content::RenderFrameHost* render_frame_host,
+ blink::mojom::PageVisibilityState* visibility_state) override;
+-#if defined(OS_POSIX) && !defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ void GetAdditionalMappedFilesForChildProcess(
+ const base::CommandLine& command_line,
+ int child_process_id,
+ content::PosixFileDescriptorInfo* mappings) override;
+-#endif // defined(OS_POSIX) && !defined(OS_MACOSX)
++#endif // defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ #if defined(OS_WIN)
+ bool PreSpawnRenderer(sandbox::TargetPolicy* policy) override;
+ base::string16 GetAppContainerSidForSandboxType(
diff --git a/devel/electron4/files/patch-chrome_browser_defaults.cc b/devel/electron4/files/patch-chrome_browser_defaults.cc
new file mode 100644
index 000000000000..9ea4cc448f4b
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_defaults.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/defaults.cc.orig 2019-03-15 06:37:02 UTC
++++ chrome/browser/defaults.cc
+@@ -44,7 +44,7 @@ const bool kSyncAutoStarts = true;
+ const bool kSyncAutoStarts = false;
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ const bool kScrollEventChangesTab = true;
+ #else
+ const bool kScrollEventChangesTab = false;
diff --git a/devel/electron4/files/patch-chrome_browser_devtools_devtools__eye__dropper.cc b/devel/electron4/files/patch-chrome_browser_devtools_devtools__eye__dropper.cc
new file mode 100644
index 000000000000..8e79fc5080ec
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_devtools_devtools__eye__dropper.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/devtools/devtools_eye_dropper.cc.orig 2019-03-15 06:37:02 UTC
++++ chrome/browser/devtools/devtools_eye_dropper.cc
+@@ -211,7 +211,7 @@ void DevToolsEyeDropper::UpdateCursor() {
+ // magnified projection only with centered hotspot.
+ // Mac Retina requires cursor to be > 120px in order to render smoothly.
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ const float kCursorSize = 63;
+ const float kDiameter = 63;
+ const float kHotspotOffset = 32;
diff --git a/devel/electron4/files/patch-chrome_browser_diagnostics_diagnostics__writer.h b/devel/electron4/files/patch-chrome_browser_diagnostics_diagnostics__writer.h
new file mode 100644
index 000000000000..2900fce0bf3c
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_diagnostics_diagnostics__writer.h
@@ -0,0 +1,11 @@
+--- chrome/browser/diagnostics/diagnostics_writer.h.orig 2019-03-15 06:25:32 UTC
++++ chrome/browser/diagnostics/diagnostics_writer.h
+@@ -15,6 +15,8 @@ namespace diagnostics {
+ // Console base class used internally.
+ class SimpleConsole;
+
++#undef MACHINE
++
+ class DiagnosticsWriter : public DiagnosticsModel::Observer {
+ public:
+ // The type of formatting done by this writer.
diff --git a/devel/electron4/files/patch-chrome_browser_download_chrome__download__manager__delegate.cc b/devel/electron4/files/patch-chrome_browser_download_chrome__download__manager__delegate.cc
new file mode 100644
index 000000000000..920ab89a7927
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_download_chrome__download__manager__delegate.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/download/chrome_download_manager_delegate.cc.orig 2019-03-15 06:37:02 UTC
++++ chrome/browser/download/chrome_download_manager_delegate.cc
+@@ -1157,7 +1157,7 @@ void ChromeDownloadManagerDelegate::OnDownloadTargetDe
+ target_info->is_filetype_handled_safely)
+ DownloadItemModel(item).SetShouldPreferOpeningInBrowser(true);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (item->GetOriginalMimeType() == "application/x-x509-user-cert")
+ DownloadItemModel(item).SetShouldPreferOpeningInBrowser(true);
+ #endif
+@@ -1177,7 +1177,7 @@ void ChromeDownloadManagerDelegate::OnDownloadTargetDe
+
+ bool ChromeDownloadManagerDelegate::IsOpenInBrowserPreferreredForFile(
+ const base::FilePath& path) {
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ if (path.MatchesExtension(FILE_PATH_LITERAL(".pdf"))) {
+ return !download_prefs_->ShouldOpenPdfInSystemReader();
+ }
diff --git a/devel/electron4/files/patch-chrome_browser_download_download__commands.cc b/devel/electron4/files/patch-chrome_browser_download_download__commands.cc
new file mode 100644
index 000000000000..be854b235511
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_download_download__commands.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/download/download_commands.cc.orig 2019-03-15 06:37:02 UTC
++++ chrome/browser/download/download_commands.cc
+@@ -408,7 +408,7 @@ Browser* DownloadCommands::GetBrowser() const {
+ return browser_displayer.browser();
+ }
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ bool DownloadCommands::IsDownloadPdf() const {
+ base::FilePath path = download_item_->GetTargetFilePath();
+ return path.MatchesExtension(FILE_PATH_LITERAL(".pdf"));
+@@ -425,7 +425,7 @@ bool DownloadCommands::CanOpenPdfInSystemViewer() cons
+ return IsDownloadPdf() &&
+ (IsAdobeReaderDefaultPDFViewer() ? is_adobe_pdf_reader_up_to_date
+ : true);
+-#elif defined(OS_MACOSX) || defined(OS_LINUX)
++#elif defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ return IsDownloadPdf();
+ #endif
+ }
diff --git a/devel/electron4/files/patch-chrome_browser_download_download__commands.h b/devel/electron4/files/patch-chrome_browser_download_download__commands.h
new file mode 100644
index 000000000000..d0069bff9595
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_download_download__commands.h
@@ -0,0 +1,11 @@
+--- chrome/browser/download/download_commands.h.orig 2019-03-15 06:37:02 UTC
++++ chrome/browser/download/download_commands.h
+@@ -42,7 +42,7 @@ class DownloadCommands {
+ bool IsCommandVisible(Command command) const;
+ void ExecuteCommand(Command command);
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ bool IsDownloadPdf() const;
+ bool CanOpenPdfInSystemViewer() const;
+ #endif
diff --git a/devel/electron4/files/patch-chrome_browser_download_download__prefs.cc b/devel/electron4/files/patch-chrome_browser_download_download__prefs.cc
new file mode 100644
index 000000000000..95d004f75f9c
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_download_download__prefs.cc
@@ -0,0 +1,65 @@
+--- chrome/browser/download/download_prefs.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/download/download_prefs.cc
+@@ -62,7 +62,7 @@ namespace {
+ // Consider downloads 'dangerous' if they go to the home directory on Linux and
+ // to the desktop on any platform.
+ bool DownloadPathIsDangerous(const base::FilePath& download_path) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ base::FilePath home_dir = base::GetHomeDir();
+ if (download_path == home_dir) {
+ return true;
+@@ -141,7 +141,7 @@ DownloadPrefs::DownloadPrefs(Profile* profile) : profi
+ GetDefaultDownloadDirectoryForProfile()));
+ #endif // defined(OS_CHROMEOS)
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ should_open_pdf_in_system_reader_ =
+ prefs->GetBoolean(prefs::kOpenPdfDownloadInSystemReader);
+ #endif
+@@ -238,7 +238,7 @@ void DownloadPrefs::RegisterProfilePrefs(
+ default_download_path);
+ registry->RegisterFilePathPref(prefs::kSaveFileDefaultDirectory,
+ default_download_path);
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ registry->RegisterBooleanPref(prefs::kOpenPdfDownloadInSystemReader, false);
+ #endif
+ #if defined(OS_ANDROID)
+@@ -346,7 +346,7 @@ bool DownloadPrefs::IsDownloadPathManaged() const {
+ }
+
+ bool DownloadPrefs::IsAutoOpenUsed() const {
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ if (ShouldOpenPdfInSystemReader())
+ return true;
+ #endif
+@@ -360,7 +360,7 @@ bool DownloadPrefs::IsAutoOpenEnabledBasedOnExtension(
+ return false;
+ DCHECK(extension[0] == base::FilePath::kExtensionSeparator);
+ extension.erase(0, 1);
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ if (base::FilePath::CompareEqualIgnoreCase(extension,
+ FILE_PATH_LITERAL("pdf")) &&
+ ShouldOpenPdfInSystemReader())
+@@ -397,7 +397,7 @@ void DownloadPrefs::DisableAutoOpenBasedOnExtension(
+ SaveAutoOpenState();
+ }
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ void DownloadPrefs::SetShouldOpenPdfInSystemReader(bool should_open) {
+ if (should_open_pdf_in_system_reader_ == should_open)
+ return;
+@@ -418,7 +418,7 @@ bool DownloadPrefs::ShouldOpenPdfInSystemReader() cons
+ #endif
+
+ void DownloadPrefs::ResetAutoOpen() {
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ SetShouldOpenPdfInSystemReader(false);
+ #endif
+ auto_open_.clear();
diff --git a/devel/electron4/files/patch-chrome_browser_download_download__prefs.h b/devel/electron4/files/patch-chrome_browser_download_download__prefs.h
new file mode 100644
index 000000000000..5717555784b0
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_download_download__prefs.h
@@ -0,0 +1,20 @@
+--- chrome/browser/download/download_prefs.h.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/download/download_prefs.h
+@@ -99,7 +99,7 @@ class DownloadPrefs {
+ // Disables auto-open based on file extension.
+ void DisableAutoOpenBasedOnExtension(const base::FilePath& file_name);
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ // Store the user preference to disk. If |should_open| is true, also disable
+ // the built-in PDF plugin. If |should_open| is false, enable the PDF plugin.
+ void SetShouldOpenPdfInSystemReader(bool should_open);
+@@ -143,7 +143,7 @@ class DownloadPrefs {
+ AutoOpenCompareFunctor> AutoOpenSet;
+ AutoOpenSet auto_open_;
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ bool should_open_pdf_in_system_reader_;
+ #endif
+
diff --git a/devel/electron4/files/patch-chrome_browser_download_download__query.cc b/devel/electron4/files/patch-chrome_browser_download_download__query.cc
new file mode 100644
index 000000000000..0ad35eb0e5a7
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_download_download__query.cc
@@ -0,0 +1,14 @@
+--- chrome/browser/download/download_query.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/download/download_query.cc
+@@ -27,7 +27,11 @@
+ #include "components/download/public/common/download_item.h"
+ #include "components/url_formatter/url_formatter.h"
+ #include "content/public/browser/content_browser_client.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+ #include "url/gurl.h"
+
+ using download::DownloadDangerType;
diff --git a/devel/electron4/files/patch-chrome_browser_download_download__shelf__context__menu.cc b/devel/electron4/files/patch-chrome_browser_download_download__shelf__context__menu.cc
new file mode 100644
index 000000000000..211d19223467
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_download_download__shelf__context__menu.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/download/download_shelf_context_menu.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/download/download_shelf_context_menu.cc
+@@ -131,7 +131,7 @@ base::string16 DownloadShelfContextMenu::GetLabelForCo
+ : IDS_DOWNLOAD_MENU_PLATFORM_OPEN_ALWAYS;
+ break;
+ }
+-#elif defined(OS_MACOSX) || defined(OS_LINUX)
++#elif defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ if (can_open_pdf_in_system_viewer) {
+ id = IDS_DOWNLOAD_MENU_PLATFORM_OPEN_ALWAYS;
+ break;
diff --git a/devel/electron4/files/patch-chrome_browser_download_download__status__updater.cc b/devel/electron4/files/patch-chrome_browser_download_download__status__updater.cc
new file mode 100644
index 000000000000..c9ade82b8d78
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_download_download__status__updater.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/download/download_status_updater.cc.orig 2019-03-15 06:25:32 UTC
++++ chrome/browser/download/download_status_updater.cc
+@@ -13,7 +13,7 @@
+ #include "base/memory/ptr_util.h"
+ #include "build/build_config.h"
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ #include "ui/views/linux_ui/linux_ui.h"
+ #endif
+
+@@ -136,7 +136,7 @@ void DownloadStatusUpdater::OnDownloadUpdated(content:
+ #if defined(OS_ANDROID) || (defined(USE_AURA) && !defined(OS_WIN))
+ void DownloadStatusUpdater::UpdateAppIconDownloadProgress(
+ download::DownloadItem* download) {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ const views::LinuxUI* linux_ui = views::LinuxUI::instance();
+ if (linux_ui) {
+ float progress = 0;
diff --git a/devel/electron4/files/patch-chrome_browser_extensions_BUILD.gn b/devel/electron4/files/patch-chrome_browser_extensions_BUILD.gn
new file mode 100644
index 000000000000..4309728ca481
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_extensions_BUILD.gn
@@ -0,0 +1,15 @@
+--- chrome/browser/extensions/BUILD.gn.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/extensions/BUILD.gn
+@@ -1133,6 +1133,12 @@ jumbo_static_library("extensions") {
+ deps += [ "//chrome/common:service_process_mojom" ]
+ }
+
++ if (is_bsd) {
++ sources -= [
++ "api/image_writer_private/removable_storage_provider_linux.cc",
++ ]
++ }
++
+ if (enable_service_discovery) {
+ sources += [
+ "api/mdns/mdns_api.cc",
diff --git a/devel/electron4/files/patch-chrome_browser_extensions_activity__log_activity__log.cc b/devel/electron4/files/patch-chrome_browser_extensions_activity__log_activity__log.cc
new file mode 100644
index 000000000000..12e99def1055
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_extensions_activity__log_activity__log.cc
@@ -0,0 +1,14 @@
+--- chrome/browser/extensions/activity_log/activity_log.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/extensions/activity_log/activity_log.cc
+@@ -50,7 +50,11 @@
+ #include "extensions/common/extension.h"
+ #include "extensions/common/extension_messages.h"
+ #include "extensions/common/one_shot_event.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+ #include "url/gurl.h"
+
+ namespace constants = activity_log_constants;
diff --git a/devel/electron4/files/patch-chrome_browser_extensions_api_image__writer__private_removable__storage__provider.cc b/devel/electron4/files/patch-chrome_browser_extensions_api_image__writer__private_removable__storage__provider.cc
new file mode 100644
index 000000000000..7d3c7be34433
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_extensions_api_image__writer__private_removable__storage__provider.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/extensions/api/image_writer_private/removable_storage_provider.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/extensions/api/image_writer_private/removable_storage_provider.cc
+@@ -20,6 +20,7 @@ static base::LazyInstance<scoped_refptr<StorageDeviceL
+
+ void RemovableStorageProvider::GetAllDevices(DeviceListReadyCallback callback) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
++#if !defined(OS_BSD)
+ if (g_test_device_list.Get().get() != nullptr) {
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE,
+@@ -33,6 +34,9 @@ void RemovableStorageProvider::GetAllDevices(DeviceLis
+ base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
+ base::BindOnce(&RemovableStorageProvider::PopulateDeviceList),
+ std::move(callback));
++#else
++ NOTIMPLEMENTED();
++#endif
+ }
+
+ // static
diff --git a/devel/electron4/files/patch-chrome_browser_extensions_api_input__ime_input__ime__api.h b/devel/electron4/files/patch-chrome_browser_extensions_api_input__ime_input__ime__api.h
new file mode 100644
index 000000000000..a3c6bd79d4f1
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_extensions_api_input__ime_input__ime__api.h
@@ -0,0 +1,11 @@
+--- chrome/browser/extensions/api/input_ime/input_ime_api.h.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/extensions/api/input_ime/input_ime_api.h
+@@ -31,7 +31,7 @@
+
+ #if defined(OS_CHROMEOS)
+ #include "chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.h"
+-#elif defined(OS_LINUX) || defined(OS_WIN)
++#elif defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ #include "chrome/browser/extensions/api/input_ime/input_ime_api_nonchromeos.h"
+ #endif // defined(OS_CHROMEOS)
+
diff --git a/devel/electron4/files/patch-chrome_browser_extensions_api_runtime_chrome__runtime__api__delegate.cc b/devel/electron4/files/patch-chrome_browser_extensions_api_runtime_chrome__runtime__api__delegate.cc
new file mode 100644
index 000000000000..3bc5cf16b73d
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_extensions_api_runtime_chrome__runtime__api__delegate.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc
+@@ -271,6 +271,8 @@ bool ChromeRuntimeAPIDelegate::GetPlatformInfo(Platfor
+ info->os = extensions::api::runtime::PLATFORM_OS_CROS;
+ } else if (strcmp(os, "linux") == 0) {
+ info->os = extensions::api::runtime::PLATFORM_OS_LINUX;
++ } else if (strcmp(os, "freebsd") == 0) {
++ info->os = extensions::api::runtime::PLATFORM_OS_FREEBSD;
+ } else if (strcmp(os, "openbsd") == 0) {
+ info->os = extensions::api::runtime::PLATFORM_OS_OPENBSD;
+ } else {
diff --git a/devel/electron4/files/patch-chrome_browser_extensions_api_settings__private_prefs__util.cc b/devel/electron4/files/patch-chrome_browser_extensions_api_settings__private_prefs__util.cc
new file mode 100644
index 000000000000..e55c9a16372d
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_extensions_api_settings__private_prefs__util.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/extensions/api/settings_private/prefs_util.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/extensions/api/settings_private/prefs_util.cc
+@@ -127,7 +127,7 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetWhitelist
+ settings_api::PrefType::PREF_TYPE_BOOLEAN;
+ (*s_whitelist)[bookmarks::prefs::kShowBookmarkBar] =
+ settings_api::PrefType::PREF_TYPE_BOOLEAN;
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ (*s_whitelist)[::prefs::kUseCustomChromeFrame] =
+ settings_api::PrefType::PREF_TYPE_BOOLEAN;
+ #endif
+@@ -137,7 +137,7 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetWhitelist
+ // Appearance settings.
+ (*s_whitelist)[::prefs::kCurrentThemeID] =
+ settings_api::PrefType::PREF_TYPE_STRING;
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ (*s_whitelist)[::prefs::kUsesSystemTheme] =
+ settings_api::PrefType::PREF_TYPE_BOOLEAN;
+ #endif
diff --git a/devel/electron4/files/patch-chrome_browser_extensions_bookmark__app__helper.cc b/devel/electron4/files/patch-chrome_browser_extensions_bookmark__app__helper.cc
new file mode 100644
index 000000000000..bd22e8d3769e
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_extensions_bookmark__app__helper.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/extensions/bookmark_app_helper.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/extensions/bookmark_app_helper.cc
+@@ -784,7 +784,7 @@ void BookmarkAppHelper::FinishInstallation(const Exten
+ #if !defined(OS_MACOSX)
+ #if !defined(OS_CHROMEOS)
+ web_app::ShortcutLocations creation_locations;
+-#if defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ creation_locations.on_desktop = true;
+ #else
+ creation_locations.on_desktop = false;
diff --git a/devel/electron4/files/patch-chrome_browser_extensions_browser__context__keyed__service__factories.cc b/devel/electron4/files/patch-chrome_browser_extensions_browser__context__keyed__service__factories.cc
new file mode 100644
index 000000000000..43c073c63006
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_extensions_browser__context__keyed__service__factories.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/extensions/browser_context_keyed_service_factories.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/extensions/browser_context_keyed_service_factories.cc
+@@ -57,7 +57,7 @@
+ #include "chrome/browser/chromeos/extensions/media_player_api.h"
+ #include "chrome/browser/extensions/api/input_ime/input_ime_api.h"
+ #include "chrome/browser/extensions/api/screenlock_private/screenlock_private_api.h"
+-#elif defined(OS_LINUX) || defined(OS_WIN)
++#elif defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ #include "chrome/browser/extensions/api/input_ime/input_ime_api.h"
+ #endif
+
+@@ -99,7 +99,7 @@ void EnsureBrowserContextKeyedServiceFactoriesBuilt()
+ #if defined(OS_CHROMEOS)
+ extensions::InputImeAPI::GetFactoryInstance();
+ extensions::InputMethodAPI::GetFactoryInstance();
+-#elif defined(OS_LINUX) || defined(OS_WIN)
++#elif defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ extensions::InputImeAPI::GetFactoryInstance();
+ #endif
+ extensions::LanguageSettingsPrivateDelegateFactory::GetInstance();
diff --git a/devel/electron4/files/patch-chrome_browser_extensions_external__provider__impl.cc b/devel/electron4/files/patch-chrome_browser_extensions_external__provider__impl.cc
new file mode 100644
index 000000000000..75705aeba174
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_extensions_external__provider__impl.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/extensions/external_provider_impl.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/extensions/external_provider_impl.cc
+@@ -689,7 +689,7 @@ void ExternalProviderImpl::CreateExternalProviders(
+ Manifest::EXTERNAL_PREF, Manifest::EXTERNAL_PREF_DOWNLOAD,
+ oem_extension_creation_flags));
+ }
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ if (!profile->IsLegacySupervised()) {
+ provider_list->push_back(std::make_unique<ExternalProviderImpl>(
+ service,
+@@ -717,7 +717,7 @@ void ExternalProviderImpl::CreateExternalProviders(
+ bundled_extension_creation_flags));
+
+ // Define a per-user source of external extensions.
+-#if defined(OS_MACOSX) || (defined(OS_LINUX) && defined(CHROMIUM_BUILD))
++#if defined(OS_MACOSX) || ((defined(OS_LINUX) || defined(OS_BSD)) && defined(CHROMIUM_BUILD))
+ provider_list->push_back(std::make_unique<ExternalProviderImpl>(
+ service,
+ new ExternalPrefLoader(chrome::DIR_USER_EXTERNAL_EXTENSIONS,
diff --git a/devel/electron4/files/patch-chrome_browser_first__run_first__run__internal__posix.cc b/devel/electron4/files/patch-chrome_browser_first__run_first__run__internal__posix.cc
new file mode 100644
index 000000000000..07937c76de0d
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_first__run_first__run__internal__posix.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/first_run/first_run_internal_posix.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/first_run/first_run_internal_posix.cc
+@@ -34,7 +34,7 @@ base::OnceClosure& GetBeforeShowFirstRunDialogHookForT
+ namespace internal {
+ namespace {
+
+-#if !defined(OS_CHROMEOS)
++#if !defined(OS_CHROMEOS) && !defined(OS_BSD)
+ // Returns whether the first run dialog should be shown. This is only true for
+ // certain builds, and only if the user has not already set preferences. In a
+ // real, official-build first run, initializes the default metrics reporting if
+@@ -80,7 +80,7 @@ bool ShouldShowFirstRunDialog() {
+ } // namespace
+
+ void DoPostImportPlatformSpecificTasks(Profile* profile) {
+-#if !defined(OS_CHROMEOS)
++#if !defined(OS_CHROMEOS) && !defined(OS_BSD)
+ if (!ShouldShowFirstRunDialog())
+ return;
+
diff --git a/devel/electron4/files/patch-chrome_browser_flag__descriptions.cc b/devel/electron4/files/patch-chrome_browser_flag__descriptions.cc
new file mode 100644
index 000000000000..6af013954e73
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_flag__descriptions.cc
@@ -0,0 +1,36 @@
+--- chrome/browser/flag_descriptions.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/flag_descriptions.cc
+@@ -3411,7 +3411,7 @@ extern const char kEnableContinueReadingDescription[]
+
+ // Random platform combinations -----------------------------------------------
+
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+
+ const char kEnableInputImeApiName[] = "Enable Input IME API";
+ const char kEnableInputImeApiDescription[] =
+@@ -3425,7 +3425,7 @@ const char kWarnBeforeQuittingFlagDescription[] =
+
+ #endif // !defined(OS_CHROMEOS)
+
+-#endif // defined(OS_WIN) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_WIN) || defined(OS_MACOSX)
+
+@@ -3438,13 +3438,13 @@ const char kAutomaticTabDiscardingDescription[] =
+
+ #endif // defined(OS_WIN) || defined(OS_MACOSX)
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ const char kDirectManipulationStylusName[] = "Direct Manipulation Stylus";
+ const char kDirectManipulationStylusDescription[] =
+ "If enabled, Chrome will scroll web pages on stylus drag.";
+
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ const char kExperimentalUiName[] = "Use all upcoming UI features";
+ const char kExperimentalUiDescription[] = "Use all upcoming UI features.";
diff --git a/devel/electron4/files/patch-chrome_browser_flag__descriptions.h b/devel/electron4/files/patch-chrome_browser_flag__descriptions.h
new file mode 100644
index 000000000000..c577865cbecf
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_flag__descriptions.h
@@ -0,0 +1,35 @@
+--- chrome/browser/flag_descriptions.h.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/flag_descriptions.h
+@@ -2087,7 +2087,7 @@ extern const char kEnableContinueReadingDescription[];
+
+ // Random platform combinations -----------------------------------------------
+
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+
+ extern const char kEnableInputImeApiName[];
+ extern const char kEnableInputImeApiDescription[];
+@@ -2099,7 +2099,7 @@ extern const char kWarnBeforeQuittingFlagDescription[]
+
+ #endif // !defined(OS_CHROMEOS)
+
+-#endif // defined(OS_WIN) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+
+ extern const char kExperimentalUiName[];
+ extern const char kExperimentalUiDescription[];
+@@ -2111,12 +2111,12 @@ extern const char kAutomaticTabDiscardingDescription[]
+
+ #endif // defined(OS_WIN) || defined(OS_MACOSX)
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ extern const char kDirectManipulationStylusName[];
+ extern const char kDirectManipulationStylusDescription[];
+
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ // Feature flags --------------------------------------------------------------
+
diff --git a/devel/electron4/files/patch-chrome_browser_media__galleries_fileapi_mtp__device__map__service.cc b/devel/electron4/files/patch-chrome_browser_media__galleries_fileapi_mtp__device__map__service.cc
new file mode 100644
index 000000000000..76f0311801ac
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_media__galleries_fileapi_mtp__device__map__service.cc
@@ -0,0 +1,15 @@
+--- chrome/browser/media_galleries/fileapi/mtp_device_map_service.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/media_galleries/fileapi/mtp_device_map_service.cc
+@@ -38,10 +38,12 @@ void MTPDeviceMapService::RegisterMTPFileSystem(
+ // Note that this initializes the delegate asynchronously, but since
+ // the delegate will only be used from the IO thread, it is guaranteed
+ // to be created before use of it expects it to be there.
++#if !defined(OS_FREEBSD)
+ CreateMTPDeviceAsyncDelegate(
+ device_location, read_only,
+ base::Bind(&MTPDeviceMapService::AddAsyncDelegate,
+ base::Unretained(this), device_location, read_only));
++#endif
+ mtp_device_usage_map_[key] = 0;
+ }
+
diff --git a/devel/electron4/files/patch-chrome_browser_media__galleries_media__file__system__registry.cc b/devel/electron4/files/patch-chrome_browser_media__galleries_media__file__system__registry.cc
new file mode 100644
index 000000000000..2d4468f1fdb6
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_media__galleries_media__file__system__registry.cc
@@ -0,0 +1,14 @@
+--- chrome/browser/media_galleries/media_file_system_registry.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/media_galleries/media_file_system_registry.cc
+@@ -739,7 +739,10 @@ class MediaFileSystemRegistry::MediaFileSystemContextI
+ // Constructor in 'private' section because depends on private class definition.
+ MediaFileSystemRegistry::MediaFileSystemRegistry()
+ : file_system_context_(new MediaFileSystemContextImpl) {
+- StorageMonitor::GetInstance()->AddObserver(this);
++ // This conditional is needed for shutdown. Destructors
++ // try to get the media file system registry.
++ if (StorageMonitor::GetInstance())
++ StorageMonitor::GetInstance()->AddObserver(this);
+ }
+
+ MediaFileSystemRegistry::~MediaFileSystemRegistry() {
diff --git a/devel/electron4/files/patch-chrome_browser_media_router_discovery_discovery__network__list__posix.cc b/devel/electron4/files/patch-chrome_browser_media_router_discovery_discovery__network__list__posix.cc
new file mode 100644
index 000000000000..98e275669535
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_media_router_discovery_discovery__network__list__posix.cc
@@ -0,0 +1,28 @@
+--- chrome/browser/media/router/discovery/discovery_network_list_posix.cc.orig 2019-03-15 06:25:32 UTC
++++ chrome/browser/media/router/discovery/discovery_network_list_posix.cc
+@@ -10,6 +10,7 @@
+ #include <netinet/in.h>
+ #include <sys/socket.h>
+ #include <sys/types.h>
++#include <sys/time.h>
+
+ #include <algorithm>
+
+@@ -19,7 +20,7 @@
+ #include "chrome/browser/media/router/discovery/discovery_network_list_wifi.h"
+ #include "net/base/net_errors.h"
+
+-#if !defined(OS_MACOSX)
++#if !defined(OS_MACOSX) && !defined(OS_BSD)
+ #include <netpacket/packet.h>
+ #else
+ #include <net/if_dl.h>
+@@ -28,7 +29,7 @@
+ namespace media_router {
+ namespace {
+
+-#if !defined(OS_MACOSX)
++#if !defined(OS_MACOSX) && !defined(OS_BSD)
+ using sll = struct sockaddr_ll;
+ #define SOCKET_ARP_TYPE(s) ((s)->sll_hatype)
+ #define SOCKET_ADDRESS_LEN(s) ((s)->sll_halen)
diff --git a/devel/electron4/files/patch-chrome_browser_media_router_discovery_discovery__network__list__wifi__linux.cc b/devel/electron4/files/patch-chrome_browser_media_router_discovery_discovery__network__list__wifi__linux.cc
new file mode 100644
index 000000000000..b7ce3914c722
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_media_router_discovery_discovery__network__list__wifi__linux.cc
@@ -0,0 +1,27 @@
+--- chrome/browser/media/router/discovery/discovery_network_list_wifi_linux.cc.orig 2019-03-15 06:25:32 UTC
++++ chrome/browser/media/router/discovery/discovery_network_list_wifi_linux.cc
+@@ -9,8 +9,6 @@
+ #include <sys/socket.h>
+ #include <sys/types.h>
+
+-#include <linux/wireless.h>
+-
+ #include "base/files/scoped_file.h"
+ #include "base/logging.h"
+ #include "net/base/network_interfaces_linux.h"
+@@ -20,6 +18,7 @@ namespace media_router {
+ bool MaybeGetWifiSSID(const std::string& if_name, std::string* ssid_out) {
+ DCHECK(ssid_out);
+
++#if !defined(OS_BSD)
+ base::ScopedFD ioctl_socket(socket(AF_INET, SOCK_DGRAM, 0));
+ if (!ioctl_socket.is_valid()) {
+ // AF_INET is for IPv4, so it may fail for IPv6-only hosts even when there
+@@ -41,6 +40,7 @@ bool MaybeGetWifiSSID(const std::string& if_name, std:
+ ssid_out->assign(ssid);
+ return true;
+ }
++#endif
+ return false;
+ }
+
diff --git a/devel/electron4/files/patch-chrome_browser_media_router_providers_wired__display_wired__display__media__route__provider.cc b/devel/electron4/files/patch-chrome_browser_media_router_providers_wired__display_wired__display__media__route__provider.cc
new file mode 100644
index 000000000000..0165e42a8bd6
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_media_router_providers_wired__display_wired__display__media__route__provider.cc
@@ -0,0 +1,23 @@
+--- chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.cc
+@@ -111,6 +111,12 @@ void WiredDisplayMediaRouteProvider::CreateRoute(
+ bool incognito,
+ CreateRouteCallback callback) {
+ DCHECK(!base::ContainsKey(presentations_, presentation_id));
++#if defined(OS_BSD) // XXX
++ std::move(callback).Run(base::nullopt, nullptr,
++ std::string("Not implemented"),
++ RouteRequestResult::UNKNOWN_ERROR);
++ return;
++#else
+ base::Optional<Display> display = GetDisplayBySinkId(sink_id);
+ if (!display) {
+ std::move(callback).Run(base::nullopt, std::string("Display not found"),
+@@ -135,6 +141,7 @@ void WiredDisplayMediaRouteProvider::CreateRoute(
+ presentation.receiver()->Start(presentation_id, GURL(media_source));
+ std::move(callback).Run(route, base::nullopt, RouteRequestResult::OK);
+ NotifyRouteObservers();
++#endif
+ }
+
+ void WiredDisplayMediaRouteProvider::JoinRoute(
diff --git a/devel/electron4/files/patch-chrome_browser_media_webrtc_webrtc__event__log__uploader.cc b/devel/electron4/files/patch-chrome_browser_media_webrtc_webrtc__event__log__uploader.cc
new file mode 100644
index 000000000000..9e9f297ff3f3
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_media_webrtc_webrtc__event__log__uploader.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/media/webrtc/webrtc_event_log_uploader.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/media/webrtc/webrtc_event_log_uploader.cc
+@@ -29,7 +29,7 @@ constexpr size_t kExpectedMimeOverheadBytes = 1000; /
+ const char kProduct[] = "Chrome";
+ #elif defined(OS_MACOSX)
+ const char kProduct[] = "Chrome_Mac";
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ const char kProduct[] = "Chrome_Linux";
+ #elif defined(OS_ANDROID)
+ const char kProduct[] = "Chrome_Android";
diff --git a/devel/electron4/files/patch-chrome_browser_media_webrtc_webrtc__log__uploader.cc b/devel/electron4/files/patch-chrome_browser_media_webrtc_webrtc__log__uploader.cc
new file mode 100644
index 000000000000..7e8c0342f064
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_media_webrtc_webrtc__log__uploader.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/media/webrtc/webrtc_log_uploader.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/media/webrtc/webrtc_log_uploader.cc
+@@ -346,6 +346,8 @@ void WebRtcLogUploader::SetupMultipart(
+ const char product[] = "Chrome_Android";
+ #elif defined(OS_CHROMEOS)
+ const char product[] = "Chrome_ChromeOS";
++#elif defined(OS_FREEBSD)
++ const char product[] = "Chrome_FreeBSD";
+ #else
+ #error Platform not supported.
+ #endif
diff --git a/devel/electron4/files/patch-chrome_browser_memory__details.cc b/devel/electron4/files/patch-chrome_browser_memory__details.cc
new file mode 100644
index 000000000000..c6a7ff2081c3
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_memory__details.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/memory_details.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/memory_details.cc
+@@ -36,7 +36,7 @@
+ #include "services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.h"
+ #include "ui/base/l10n/l10n_util.h"
+
+-#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) && !defined(OS_BSD)
+ #include "services/service_manager/zygote/zygote_host_linux.h"
+ #endif
+
+@@ -341,7 +341,7 @@ void MemoryDetails::CollectChildInfoOnUIThread() {
+ process.titles.push_back(title);
+ }
+
+-#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) && !defined(OS_BSD)
+ if (service_manager::ZygoteHost::GetInstance()->IsZygotePid(process.pid)) {
+ process.process_type = content::PROCESS_TYPE_ZYGOTE;
+ }
diff --git a/devel/electron4/files/patch-chrome_browser_memory__details__linux.cc b/devel/electron4/files/patch-chrome_browser_memory__details__linux.cc
new file mode 100644
index 000000000000..6a077d2a6054
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_memory__details__linux.cc
@@ -0,0 +1,13 @@
+--- chrome/browser/memory_details_linux.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/memory_details_linux.cc
+@@ -70,8 +70,10 @@ ProcessData GetProcessDataMemoryInformation(
+
+ std::unique_ptr<base::ProcessMetrics> metrics(
+ base::ProcessMetrics::CreateProcessMetrics(pid));
++#if !defined(OS_BSD)
+ pmi.num_open_fds = metrics->GetOpenFdCount();
+ pmi.open_fds_soft_limit = metrics->GetOpenFdSoftLimit();
++#endif
+
+ process_data.processes.push_back(pmi);
+ }
diff --git a/devel/electron4/files/patch-chrome_browser_metrics_chrome__browser__main__extra__parts__metrics.cc b/devel/electron4/files/patch-chrome_browser_metrics_chrome__browser__main__extra__parts__metrics.cc
new file mode 100644
index 000000000000..e6500dd8bd28
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_metrics_chrome__browser__main__extra__parts__metrics.cc
@@ -0,0 +1,21 @@
+--- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
+@@ -44,7 +44,9 @@
+
+ #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+ #include <gnu/libc-version.h>
++#endif
+
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #include "base/linux_util.h"
+ #include "base/strings/string_split.h"
+ #include "base/strings/string_util.h"
+@@ -52,7 +54,7 @@
+ #if defined(USE_X11)
+ #include "ui/base/x/x11_util.h"
+ #endif
+-#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+
+ #if defined(USE_OZONE) || defined(USE_X11)
+ #include "ui/events/devices/input_device_event_observer.h"
diff --git a/devel/electron4/files/patch-chrome_browser_net_system__network__context__manager.cc b/devel/electron4/files/patch-chrome_browser_net_system__network__context__manager.cc
new file mode 100644
index 000000000000..6e1168cb74ea
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_net_system__network__context__manager.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/net/system_network_context_manager.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/net/system_network_context_manager.cc
+@@ -49,7 +49,7 @@
+ #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+ #endif // defined(OS_CHROMEOS)
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ #include "chrome/common/chrome_paths_internal.h"
+ #include "chrome/common/chrome_switches.h"
+ #include "chrome/grit/chromium_strings.h"
+@@ -440,7 +440,7 @@ void SystemNetworkContextManager::OnNetworkServiceCrea
+ content::GetNetworkService()->ConfigureStubHostResolver(
+ stub_resolver_enabled, std::move(dns_over_https_servers));
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ const base::CommandLine& command_line =
+ *base::CommandLine::ForCurrentProcess();
+
diff --git a/devel/electron4/files/patch-chrome_browser_password__manager_chrome__password__manager__client.cc b/devel/electron4/files/patch-chrome_browser_password__manager_chrome__password__manager__client.cc
new file mode 100644
index 000000000000..846e2e575b29
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_password__manager_chrome__password__manager__client.cc
@@ -0,0 +1,14 @@
+--- chrome/browser/password_manager/chrome_password_manager_client.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/password_manager/chrome_password_manager_client.cc
+@@ -76,7 +76,11 @@
+ #include "net/base/url_util.h"
+ #include "net/cert/cert_status_flags.h"
+ #include "services/metrics/public/cpp/ukm_recorder.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+ #include "url/url_constants.h"
+
+ #if defined(SAFE_BROWSING_DB_LOCAL)
diff --git a/devel/electron4/files/patch-chrome_browser_password__manager_password__store__factory.cc b/devel/electron4/files/patch-chrome_browser_password__manager_password__store__factory.cc
new file mode 100644
index 000000000000..e959a2b29cd3
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_password__manager_password__store__factory.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/password_manager/password_store_factory.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/password_manager/password_store_factory.cc
+@@ -283,7 +283,7 @@ PasswordStoreFactory::BuildServiceInstanceFor(
+ password_manager_util::CleanUserDataInBlacklistedCredentials(
+ ps.get(), profile->GetPrefs(), 60);
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_BSD) || \
+ (defined(OS_LINUX) && !defined(OS_CHROMEOS))
+ std::unique_ptr<password_manager::PasswordStoreSigninNotifier> notifier =
+ std::make_unique<password_manager::PasswordStoreSigninNotifierImpl>(
diff --git a/devel/electron4/files/patch-chrome_browser_platform__util.h b/devel/electron4/files/patch-chrome_browser_platform__util.h
new file mode 100644
index 000000000000..74227b410d94
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_platform__util.h
@@ -0,0 +1,11 @@
+--- chrome/browser/platform_util.h.orig 2019-03-15 06:25:33 UTC
++++ chrome/browser/platform_util.h
+@@ -40,7 +40,7 @@ enum OpenOperationResult {
+ enum OpenItemType {
+ OPEN_FILE,
+ OPEN_FOLDER,
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ SHOW_ITEM_IN_FOLDER
+ #endif
+ };
diff --git a/devel/electron4/files/patch-chrome_browser_plugins_plugins__resource__service.cc b/devel/electron4/files/patch-chrome_browser_plugins_plugins__resource__service.cc
new file mode 100644
index 000000000000..c209295e680e
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_plugins_plugins__resource__service.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/plugins/plugins_resource_service.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/plugins/plugins_resource_service.cc
+@@ -62,7 +62,7 @@ GURL GetPluginsServerURL() {
+ filename = "plugins_win.json";
+ #elif defined(OS_CHROMEOS)
+ filename = "plugins_chromeos.json";
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ filename = "plugins_linux.json";
+ #elif defined(OS_MACOSX)
+ filename = "plugins_mac.json";
diff --git a/devel/electron4/files/patch-chrome_browser_policy_policy__prefs__browsertest.cc b/devel/electron4/files/patch-chrome_browser_policy_policy__prefs__browsertest.cc
new file mode 100644
index 000000000000..843b4b9b9d70
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_policy_policy__prefs__browsertest.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/policy/policy_prefs_browsertest.cc.orig 2019-03-15 06:37:03 UTC
++++ chrome/browser/policy/policy_prefs_browsertest.cc
+@@ -185,6 +185,8 @@ class PolicyTestCase {
+ const std::string os("chromeos");
+ #elif defined(OS_LINUX)
+ const std::string os("linux");
++#elif defined(OS_FREEBSD)
++ const std::string os("freebsd");
+ #else
+ #error "Unknown platform"
+ #endif
diff --git a/devel/electron4/files/patch-chrome_browser_process__singleton__posix.cc b/devel/electron4/files/patch-chrome_browser_process__singleton__posix.cc
new file mode 100644
index 000000000000..3a1240569215
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_process__singleton__posix.cc
@@ -0,0 +1,34 @@
+--- chrome/browser/process_singleton_posix.cc.orig 2019-03-15 06:37:04 UTC
++++ chrome/browser/process_singleton_posix.cc
+@@ -91,11 +91,11 @@
+ #include "net/base/network_interfaces.h"
+ #include "ui/base/l10n/l10n_util.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "chrome/browser/ui/process_singleton_dialog_linux.h"
+ #endif
+
+-#if defined(TOOLKIT_VIEWS) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(TOOLKIT_VIEWS) && (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ #include "ui/views/linux_ui/linux_ui.h"
+ #endif
+
+@@ -323,7 +323,7 @@ bool DisplayProfileInUseError(const base::FilePath& lo
+ if (g_disable_prompt)
+ return g_user_opted_unlock_in_use_profile;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ base::string16 relaunch_button_text = l10n_util::GetStringUTF16(
+ IDS_PROFILE_IN_USE_LINUX_RELAUNCH);
+ return ShowProcessSingletonDialog(error, relaunch_button_text);
+@@ -903,7 +903,7 @@ ProcessSingleton::NotifyResult ProcessSingleton::Notif
+ SendRemoteProcessInteractionResultHistogram(REMOTE_PROCESS_SHUTTING_DOWN);
+ return PROCESS_NONE;
+ } else if (strncmp(buf, kACKToken, arraysize(kACKToken) - 1) == 0) {
+-#if defined(TOOLKIT_VIEWS) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(TOOLKIT_VIEWS) && (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ // Likely NULL in unit tests.
+ views::LinuxUI* linux_ui = views::LinuxUI::instance();
+ if (linux_ui)
diff --git a/devel/electron4/files/patch-chrome_browser_profiles_chrome__browser__main__extra__parts__profiles.cc b/devel/electron4/files/patch-chrome_browser_profiles_chrome__browser__main__extra__parts__profiles.cc
new file mode 100644
index 000000000000..b27db1832df7
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_profiles_chrome__browser__main__extra__parts__profiles.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc.orig 2019-03-15 06:37:04 UTC
++++ chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+@@ -305,7 +305,7 @@ void ChromeBrowserMainExtraPartsProfiles::
+ #if !defined(OS_ANDROID)
+ MediaGalleriesPreferencesFactory::GetInstance();
+ #endif
+-#if defined(OS_WIN) || defined(OS_MACOSX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_BSD) || \
+ (defined(OS_LINUX) && !defined(OS_CHROMEOS))
+ metrics::DesktopProfileSessionDurationsServiceFactory::GetInstance();
+ #endif
diff --git a/devel/electron4/files/patch-chrome_browser_renderer__context__menu_render__view__context__menu.cc b/devel/electron4/files/patch-chrome_browser_renderer__context__menu_render__view__context__menu.cc
new file mode 100644
index 000000000000..991d0097d90d
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_renderer__context__menu_render__view__context__menu.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/renderer_context_menu/render_view_context_menu.cc.orig 2019-03-15 06:37:04 UTC
++++ chrome/browser/renderer_context_menu/render_view_context_menu.cc
+@@ -1471,7 +1471,7 @@ void RenderViewContextMenu::AppendEditableItems() {
+ // 'Undo' and 'Redo' for text input with no suggestions and no text selected.
+ // We make an exception for OS X as context clicking will select the closest
+ // word. In this case both items are always shown.
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_UNDO,
+ IDS_CONTENT_CONTEXT_UNDO);
+ menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_REDO,
+@@ -1513,7 +1513,7 @@ void RenderViewContextMenu::AppendLanguageSettings() {
+ if (!use_spelling)
+ return;
+
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS,
+ IDS_CONTENT_CONTEXT_LANGUAGE_SETTINGS);
+ #else
+@@ -1777,7 +1777,7 @@ bool RenderViewContextMenu::IsCommandIdEnabled(int id)
+ case IDC_CHECK_SPELLING_WHILE_TYPING:
+ return prefs->GetBoolean(spellcheck::prefs::kSpellCheckEnable);
+
+-#if !defined(OS_MACOSX) && defined(OS_POSIX)
++#if !defined(OS_MACOSX) && !defined(OS_BSD) && defined(OS_POSIX)
+ // TODO(suzhe): this should not be enabled for password fields.
+ case IDC_INPUT_METHODS_MENU:
+ return true;
diff --git a/devel/electron4/files/patch-chrome_browser_renderer__preferences__util.cc b/devel/electron4/files/patch-chrome_browser_renderer__preferences__util.cc
new file mode 100644
index 000000000000..59b92a104338
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_renderer__preferences__util.cc
@@ -0,0 +1,38 @@
+--- chrome/browser/renderer_preferences_util.cc.orig 2019-03-15 06:37:04 UTC
++++ chrome/browser/renderer_preferences_util.cc
+@@ -19,7 +19,7 @@
+ #include "third_party/blink/public/public_buildflags.h"
+ #include "third_party/skia/include/core/SkColor.h"
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ #include "ui/gfx/font_render_params.h"
+ #endif
+
+@@ -31,7 +31,7 @@
+ #include "ui/base/cocoa/defaults_utils.h"
+ #endif
+
+-#if defined(USE_AURA) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(USE_AURA) && (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ #include "chrome/browser/themes/theme_service.h"
+ #include "chrome/browser/themes/theme_service_factory.h"
+ #include "ui/views/linux_ui/linux_ui.h"
+@@ -130,7 +130,7 @@ void UpdateFromSystemSettings(content::RendererPrefere
+ prefs->caret_blink_interval = interval;
+ #endif
+
+-#if defined(USE_AURA) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(USE_AURA) && (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ views::LinuxUI* linux_ui = views::LinuxUI::instance();
+ if (linux_ui) {
+ if (ThemeServiceFactory::GetForProfile(profile)->UsingSystemTheme()) {
+@@ -152,7 +152,7 @@ void UpdateFromSystemSettings(content::RendererPrefere
+ }
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_WIN) || defined(OS_BSD)
+ CR_DEFINE_STATIC_LOCAL(const gfx::FontRenderParams, params,
+ (gfx::GetFontRenderParams(gfx::FontRenderParamsQuery(), NULL)));
+ prefs->should_antialias_text = params.antialiasing;
diff --git a/devel/electron4/files/patch-chrome_browser_resources_safe__browsing_gen__file__type__proto.py b/devel/electron4/files/patch-chrome_browser_resources_safe__browsing_gen__file__type__proto.py
new file mode 100644
index 000000000000..2ac3cc6503c1
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_resources_safe__browsing_gen__file__type__proto.py
@@ -0,0 +1,19 @@
+--- chrome/browser/resources/safe_browsing/gen_file_type_proto.py.orig 2019-03-15 06:37:05 UTC
++++ chrome/browser/resources/safe_browsing/gen_file_type_proto.py
+@@ -31,6 +31,7 @@ def PlatformTypes():
+ "android": download_file_types_pb2.DownloadFileType.PLATFORM_ANDROID,
+ "chromeos": download_file_types_pb2.DownloadFileType.PLATFORM_CHROME_OS,
+ "linux": download_file_types_pb2.DownloadFileType.PLATFORM_LINUX,
++ "bsd": download_file_types_pb2.DownloadFileType.PLATFORM_LINUX,
+ "mac": download_file_types_pb2.DownloadFileType.PLATFORM_MAC,
+ "win": download_file_types_pb2.DownloadFileType.PLATFORM_WINDOWS,
+ }
+@@ -169,7 +170,7 @@ class DownloadFileTypeProtoGenerator(BinaryProtoGenera
+ 'Outfile must have a %d for version and %s for platform.')
+ parser.add_option('-t', '--type',
+ help='The platform type. One of android, chromeos, ' +
+- 'linux, mac, win')
++ 'linux, bsd, mac, win')
+
+ def AddExtraCommandLineArgsForVirtualEnvRun(self, opts, command):
+ if opts.type is not None:
diff --git a/devel/electron4/files/patch-chrome_browser_resources_settings_appearance__page_appearance__browser__proxy.js b/devel/electron4/files/patch-chrome_browser_resources_settings_appearance__page_appearance__browser__proxy.js
new file mode 100644
index 000000000000..e458972839d7
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_resources_settings_appearance__page_appearance__browser__proxy.js
@@ -0,0 +1,20 @@
+--- chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.js.orig 2019-03-15 06:25:33 UTC
++++ chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.js
+@@ -35,7 +35,7 @@ cr.define('settings', function() {
+
+ useDefaultTheme() {}
+
+- // <if expr="is_linux and not chromeos">
++ // <if expr="is_bsd and not chromeos">
+ useSystemTheme() {}
+
+ // </if>
+@@ -93,7 +93,7 @@ cr.define('settings', function() {
+ chrome.send('useDefaultTheme');
+ }
+
+- // <if expr="is_linux and not chromeos">
++ // <if expr="is_bsd and not chromeos">
+ /** @override */
+ useSystemTheme() {
+ chrome.send('useSystemTheme');
diff --git a/devel/electron4/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.html b/devel/electron4/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.html
new file mode 100644
index 000000000000..825d647d6af5
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.html
@@ -0,0 +1,29 @@
+--- chrome/browser/resources/settings/appearance_page/appearance_page.html.orig 2019-03-15 06:37:05 UTC
++++ chrome/browser/resources/settings/appearance_page/appearance_page.html
+@@ -70,7 +70,7 @@
+ hidden="[[!pageVisibility.setTheme]]"
+ label="$i18n{themes}" sub-label="[[themeSublabel_]]"
+ on-click="openThemeUrl_"></cr-link-row>
+-<if expr="not is_linux or chromeos">
++<if expr="not is_posix or chromeos">
+ <template is="dom-if" if="[[prefs.extensions.theme.id.value]]">
+ <div class="separator"></div>
+ <paper-button id="useDefault" on-click="onUseDefaultTap_"
+@@ -79,7 +79,7 @@
+ </paper-button>
+ </template>
+ </if>
+-<if expr="is_linux and not chromeos">
++<if expr="is_posix and not chromeos">
+ <div class="settings-row continuation"
+ hidden="[[!showThemesSecondary_(
+ prefs.extensions.theme.id.value, useSystemTheme_)]]"
+@@ -144,7 +144,7 @@
+ pref="{{prefs.bookmark_bar.show_on_all_tabs}}"
+ label="$i18n{showBookmarksBar}">
+ </settings-toggle-button>
+-<if expr="is_linux and not chromeos">
++<if expr="is_posix and not chromeos">
+ <settings-toggle-button
+ class$="[[getFirst_(pageVisibility.bookmarksBar)]]"
+ pref="{{prefs.browser.custom_chrome_frame}}"
diff --git a/devel/electron4/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.js b/devel/electron4/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.js
new file mode 100644
index 000000000000..4e517b41072b
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.js
@@ -0,0 +1,33 @@
+--- chrome/browser/resources/settings/appearance_page/appearance_page.js.orig 2019-03-15 06:37:05 UTC
++++ chrome/browser/resources/settings/appearance_page/appearance_page.js
+@@ -120,7 +120,7 @@ Polymer({
+ 'defaultFontSizeChanged_(prefs.webkit.webprefs.default_font_size.value)',
+ 'themeChanged_(prefs.extensions.theme.id.value, useSystemTheme_)',
+
+- // <if expr="is_linux and not chromeos">
++ // <if expr="is_bsd and not chromeos">
+ // NOTE: this pref only exists on Linux.
+ 'useSystemThemePrefChanged_(prefs.extensions.theme.use_system.value)',
+ // </if>
+@@ -221,7 +221,7 @@ Polymer({
+ this.browserProxy_.useDefaultTheme();
+ },
+
+- // <if expr="is_linux and not chromeos">
++ // <if expr="is_bsd and not chromeos">
+ /**
+ * @param {boolean} useSystemTheme
+ * @private
+@@ -289,10 +289,10 @@ Polymer({
+ }
+
+ let i18nId;
+- // <if expr="is_linux and not chromeos">
++ // <if expr="is_bsd and not chromeos">
+ i18nId = useSystemTheme ? 'systemTheme' : 'classicTheme';
+ // </if>
+- // <if expr="not is_linux or chromeos">
++ // <if expr="not is_bsd or chromeos">
+ i18nId = 'chooseFromWebStore';
+ // </if>
+ this.themeSublabel_ = this.i18n(i18nId);
diff --git a/devel/electron4/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__handler__util.cc b/devel/electron4/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__handler__util.cc
new file mode 100644
index 000000000000..914efa8bcf54
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__handler__util.cc
@@ -0,0 +1,15 @@
+--- chrome/browser/safe_browsing/incident_reporting/incident_handler_util.cc.orig 2019-03-15 06:25:33 UTC
++++ chrome/browser/safe_browsing/incident_reporting/incident_handler_util.cc
+@@ -8,7 +8,12 @@
+
+ #include "base/hash.h"
+ #include "base/logging.h"
++//XXX(rene) needs shim headers?
++#if defined(USE_SYSTEM_PROTOBUF)
++#include <google/protobuf/message_lite.h>
++#else
+ #include "third_party/protobuf/src/google/protobuf/message_lite.h"
++#endif
+
+ namespace safe_browsing {
+
diff --git a/devel/electron4/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__reporting__service.cc b/devel/electron4/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__reporting__service.cc
new file mode 100644
index 000000000000..08fbeae3f9fa
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__reporting__service.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc.orig 2019-03-15 06:37:05 UTC
++++ chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc
+@@ -715,7 +715,7 @@ void IncidentReportingService::OnEnvironmentDataCollec
+ environment_collection_pending_ = false;
+
+ // CurrentProcessInfo::CreationTime() is missing on some platforms.
+-#if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ base::TimeDelta uptime =
+ first_incident_time_ - base::CurrentProcessInfo::CreationTime();
+ environment_data->mutable_process()->set_uptime_msec(uptime.InMilliseconds());
diff --git a/devel/electron4/files/patch-chrome_browser_search_local__files__ntp__source.cc b/devel/electron4/files/patch-chrome_browser_search_local__files__ntp__source.cc
new file mode 100644
index 000000000000..eefe27620b10
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_search_local__files__ntp__source.cc
@@ -0,0 +1,16 @@
+--- chrome/browser/search/local_files_ntp_source.cc.orig 2019-03-15 06:37:05 UTC
++++ chrome/browser/search/local_files_ntp_source.cc
+@@ -20,8 +20,13 @@
+ #include "build/build_config.h"
+ #include "chrome/common/url_constants.h"
+ #include "content/public/browser/url_data_source.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#include <re2/stringpiece.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
+ #include "third_party/re2/src/re2/stringpiece.h"
++#endif
+
+ namespace {
+
diff --git a/devel/electron4/files/patch-chrome_browser_speech_tts__controller__impl.cc b/devel/electron4/files/patch-chrome_browser_speech_tts__controller__impl.cc
new file mode 100644
index 000000000000..7856441802b2
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_speech_tts__controller__impl.cc
@@ -0,0 +1,16 @@
+--- chrome/browser/speech/tts_controller_impl.cc.orig 2019-03-16 09:15:21 UTC
++++ chrome/browser/speech/tts_controller_impl.cc
+@@ -449,9 +449,13 @@ int TtsControllerImpl::QueueSize() {
+ }
+
+ TtsPlatformImpl* TtsControllerImpl::GetPlatformImpl() {
++#if defined(OS_BSD)
++ return NULL;
++#else
+ if (!platform_impl_)
+ platform_impl_ = TtsPlatformImpl::GetInstance();
+ return platform_impl_;
++#endif
+ }
+
+ int TtsControllerImpl::GetMatchingVoice(
diff --git a/devel/electron4/files/patch-chrome_browser_ssl_ssl__error__controller__client.cc b/devel/electron4/files/patch-chrome_browser_ssl_ssl__error__controller__client.cc
new file mode 100644
index 000000000000..93a94c89453e
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ssl_ssl__error__controller__client.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ssl/ssl_error_controller_client.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/ssl/ssl_error_controller_client.cc
+@@ -77,7 +77,7 @@ void LaunchDateAndTimeSettingsImpl() {
+ #if defined(OS_ANDROID)
+ chrome::android::OpenDateAndTimeSettings();
+
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ struct ClockCommand {
+ const char* const pathname;
+ const char* const argument;
+@@ -219,7 +219,7 @@ void SSLErrorControllerClient::Proceed() {
+
+ bool SSLErrorControllerClient::CanLaunchDateAndTimeSettings() {
+ #if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_MACOSX) || \
+- defined(OS_WIN)
++ defined(OS_WIN) || defined(OS_BSD)
+ return true;
+ #else
+ return false;
diff --git a/devel/electron4/files/patch-chrome_browser_sync_chrome__sync__client.cc b/devel/electron4/files/patch-chrome_browser_sync_chrome__sync__client.cc
new file mode 100644
index 000000000000..e6b2240632b0
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_sync_chrome__sync__client.cc
@@ -0,0 +1,19 @@
+--- chrome/browser/sync/chrome_sync_client.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/sync/chrome_sync_client.cc
+@@ -389,14 +389,14 @@ ChromeSyncClient::CreateDataTypeControllers(
+ BrowserThread::GetTaskRunnerForThread(BrowserThread::UI)));
+ #endif // BUILDFLAG(ENABLE_APP_LIST)
+
+-#if defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ // Dictionary sync is enabled by default.
+ if (!disabled_types.Has(syncer::DICTIONARY)) {
+ controllers.push_back(std::make_unique<AsyncDirectoryTypeController>(
+ syncer::DICTIONARY, error_callback, this, syncer::GROUP_UI,
+ BrowserThread::GetTaskRunnerForThread(BrowserThread::UI)));
+ }
+-#endif // defined(OS_LINUX) || defined(OS_WIN)
++#endif // defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+
+ #if defined(OS_CHROMEOS)
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
diff --git a/devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__group.cc b/devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__group.cc
new file mode 100644
index 000000000000..0a3b8c4191c2
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__group.cc
@@ -0,0 +1,56 @@
+--- chrome/browser/task_manager/sampling/task_group.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/task_manager/sampling/task_group.cc
+@@ -32,9 +32,9 @@ const int kBackgroundRefreshTypesMask =
+ #if defined(OS_WIN)
+ REFRESH_TYPE_START_TIME | REFRESH_TYPE_CPU_TIME |
+ #endif // defined(OS_WIN)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ REFRESH_TYPE_FD_COUNT |
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ #if BUILDFLAG(ENABLE_NACL)
+ REFRESH_TYPE_NACL |
+ #endif // BUILDFLAG(ENABLE_NACL)
+@@ -109,9 +109,9 @@ TaskGroup::TaskGroup(
+ #if BUILDFLAG(ENABLE_NACL)
+ nacl_debug_stub_port_(nacl::kGdbDebugStubPortUnknown),
+ #endif // BUILDFLAG(ENABLE_NACL)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ open_fd_count_(-1),
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ idle_wakeups_per_second_(-1),
+ gpu_memory_has_duplicates_(false),
+ is_backgrounded_(false),
+@@ -125,10 +125,10 @@ TaskGroup::TaskGroup(
+ weak_ptr_factory_.GetWeakPtr()),
+ base::Bind(&TaskGroup::OnIdleWakeupsRefreshDone,
+ weak_ptr_factory_.GetWeakPtr()),
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ base::Bind(&TaskGroup::OnOpenFdCountRefreshDone,
+ weak_ptr_factory_.GetWeakPtr()),
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ base::Bind(&TaskGroup::OnProcessPriorityDone,
+ weak_ptr_factory_.GetWeakPtr()));
+
+@@ -288,14 +288,14 @@ void TaskGroup::OnRefreshNaClDebugStubPortDone(int nac
+ }
+ #endif // BUILDFLAG(ENABLE_NACL)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void TaskGroup::OnOpenFdCountRefreshDone(int open_fd_count) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+ open_fd_count_ = open_fd_count;
+ OnBackgroundRefreshTypeFinished(REFRESH_TYPE_FD_COUNT);
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ void TaskGroup::OnCpuRefreshDone(double cpu_usage) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
diff --git a/devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__group.h b/devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__group.h
new file mode 100644
index 000000000000..ea7140bf7b1d
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__group.h
@@ -0,0 +1,39 @@
+--- chrome/browser/task_manager/sampling/task_group.h.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/task_manager/sampling/task_group.h
+@@ -103,9 +103,9 @@ class TaskGroup {
+ int nacl_debug_stub_port() const { return nacl_debug_stub_port_; }
+ #endif // BUILDFLAG(ENABLE_NACL)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ int open_fd_count() const { return open_fd_count_; }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ int idle_wakeups_per_second() const { return idle_wakeups_per_second_; }
+
+@@ -119,9 +119,9 @@ class TaskGroup {
+ void RefreshNaClDebugStubPort(int child_process_unique_id);
+ void OnRefreshNaClDebugStubPortDone(int port);
+ #endif
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void OnOpenFdCountRefreshDone(int open_fd_count);
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ void OnCpuRefreshDone(double cpu_usage);
+ void OnSwappedMemRefreshDone(int64_t swapped_mem_bytes);
+@@ -181,10 +181,10 @@ class TaskGroup {
+ #if BUILDFLAG(ENABLE_NACL)
+ int nacl_debug_stub_port_;
+ #endif // BUILDFLAG(ENABLE_NACL)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // The number of file descriptors currently open by the process.
+ int open_fd_count_;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ int idle_wakeups_per_second_;
+ bool gpu_memory_has_duplicates_;
+ bool is_backgrounded_;
diff --git a/devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.cc b/devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.cc
new file mode 100644
index 000000000000..6dbd4d16c0c2
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.cc
@@ -0,0 +1,44 @@
+--- chrome/browser/task_manager/sampling/task_group_sampler.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/task_manager/sampling/task_group_sampler.cc
+@@ -42,9 +42,9 @@ TaskGroupSampler::TaskGroupSampler(
+ const OnCpuRefreshCallback& on_cpu_refresh,
+ const OnSwappedMemRefreshCallback& on_swapped_mem_refresh,
+ const OnIdleWakeupsCallback& on_idle_wakeups,
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ const OnOpenFdCountCallback& on_open_fd_count,
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ const OnProcessPriorityCallback& on_process_priority)
+ : process_(std::move(process)),
+ process_metrics_(CreateProcessMetrics(process_.Handle())),
+@@ -52,9 +52,9 @@ TaskGroupSampler::TaskGroupSampler(
+ on_cpu_refresh_callback_(on_cpu_refresh),
+ on_swapped_mem_refresh_callback_(on_swapped_mem_refresh),
+ on_idle_wakeups_callback_(on_idle_wakeups),
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ on_open_fd_count_callback_(on_open_fd_count),
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ on_process_priority_callback_(on_process_priority) {
+ DCHECK(blocking_pool_runner.get());
+
+@@ -85,7 +85,7 @@ void TaskGroupSampler::Refresh(int64_t refresh_flags)
+ on_swapped_mem_refresh_callback_);
+ }
+
+-#if defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ if (TaskManagerObserver::IsResourceRefreshEnabled(REFRESH_TYPE_IDLE_WAKEUPS,
+ refresh_flags)) {
+ base::PostTaskAndReplyWithResult(
+@@ -94,7 +94,7 @@ void TaskGroupSampler::Refresh(int64_t refresh_flags)
+ base::Bind(&TaskGroupSampler::RefreshIdleWakeupsPerSecond, this),
+ on_idle_wakeups_callback_);
+ }
+-#endif // defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_LINUX)
+ if (TaskManagerObserver::IsResourceRefreshEnabled(REFRESH_TYPE_FD_COUNT,
diff --git a/devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.h b/devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.h
new file mode 100644
index 000000000000..491defc3c900
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.h
@@ -0,0 +1,50 @@
+--- chrome/browser/task_manager/sampling/task_group_sampler.h.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/task_manager/sampling/task_group_sampler.h
+@@ -32,9 +32,9 @@ class TaskGroupSampler : public base::RefCountedThread
+ using OnCpuRefreshCallback = base::Callback<void(double)>;
+ using OnSwappedMemRefreshCallback = base::Callback<void(int64_t)>;
+ using OnIdleWakeupsCallback = base::Callback<void(int)>;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ using OnOpenFdCountCallback = base::Callback<void(int)>;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ using OnProcessPriorityCallback = base::Callback<void(bool)>;
+
+ TaskGroupSampler(
+@@ -43,9 +43,9 @@ class TaskGroupSampler : public base::RefCountedThread
+ const OnCpuRefreshCallback& on_cpu_refresh,
+ const OnSwappedMemRefreshCallback& on_memory_refresh,
+ const OnIdleWakeupsCallback& on_idle_wakeups,
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ const OnOpenFdCountCallback& on_open_fd_count,
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ const OnProcessPriorityCallback& on_process_priority);
+
+ // Refreshes the expensive process' stats (CPU usage, memory usage, and idle
+@@ -60,9 +60,9 @@ class TaskGroupSampler : public base::RefCountedThread
+ double RefreshCpuUsage();
+ int64_t RefreshSwappedMem();
+ int RefreshIdleWakeupsPerSecond();
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ int RefreshOpenFdCount();
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ bool RefreshProcessPriority();
+
+ // The process that holds the handle that we own so that we can use it for
+@@ -80,9 +80,9 @@ class TaskGroupSampler : public base::RefCountedThread
+ const OnCpuRefreshCallback on_cpu_refresh_callback_;
+ const OnSwappedMemRefreshCallback on_swapped_mem_refresh_callback_;
+ const OnIdleWakeupsCallback on_idle_wakeups_callback_;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ const OnOpenFdCountCallback on_open_fd_count_callback_;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ const OnProcessPriorityCallback on_process_priority_callback_;
+
+ // To assert we're running on the correct thread.
diff --git a/devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__manager__impl.cc b/devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__manager__impl.cc
new file mode 100644
index 000000000000..59c2d87c6034
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_task__manager_sampling_task__manager__impl.cc
@@ -0,0 +1,16 @@
+--- chrome/browser/task_manager/sampling/task_manager_impl.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/task_manager/sampling/task_manager_impl.cc
+@@ -205,11 +205,11 @@ void TaskManagerImpl::GetUSERHandles(TaskId task_id,
+ }
+
+ int TaskManagerImpl::GetOpenFdCount(TaskId task_id) const {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ return GetTaskGroupByTaskId(task_id)->open_fd_count();
+ #else
+ return -1;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ }
+
+ bool TaskManagerImpl::IsTaskOnBackgroundedProcess(TaskId task_id) const {
diff --git a/devel/electron4/files/patch-chrome_browser_task__manager_task__manager__observer.h b/devel/electron4/files/patch-chrome_browser_task__manager_task__manager__observer.h
new file mode 100644
index 000000000000..8c186996133e
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_task__manager_task__manager__observer.h
@@ -0,0 +1,16 @@
+--- chrome/browser/task_manager/task_manager_observer.h.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/task_manager/task_manager_observer.h
+@@ -43,11 +43,11 @@ enum RefreshType {
+ // or backgrounded.
+ REFRESH_TYPE_PRIORITY = 1 << 13,
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // For observers interested in getting the number of open file descriptors of
+ // processes.
+ REFRESH_TYPE_FD_COUNT = 1 << 14,
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ REFRESH_TYPE_MEMORY_STATE = 1 << 15,
+ REFRESH_TYPE_KEEPALIVE_COUNT = 1 << 16,
diff --git a/devel/electron4/files/patch-chrome_browser_tracing_crash__service__uploader.cc b/devel/electron4/files/patch-chrome_browser_tracing_crash__service__uploader.cc
new file mode 100644
index 000000000000..54697c6f92f2
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_tracing_crash__service__uploader.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/tracing/crash_service_uploader.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/tracing/crash_service_uploader.cc
+@@ -158,6 +158,8 @@ void TraceCrashServiceUploader::DoCompressOnBackground
+ const char product[] = "Chrome_Linux";
+ #elif defined(OS_ANDROID)
+ const char product[] = "Chrome_Android";
++#elif defined(OS_FREEBSD)
++ const char product[] = "Chrome_FreeBSD";
+ #else
+ #error Platform not supported.
+ #endif
diff --git a/devel/electron4/files/patch-chrome_browser_ui_browser__command__controller.cc b/devel/electron4/files/patch-chrome_browser_ui_browser__command__controller.cc
new file mode 100644
index 000000000000..aff726887f56
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_browser__command__controller.cc
@@ -0,0 +1,38 @@
+--- chrome/browser/ui/browser_command_controller.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/ui/browser_command_controller.cc
+@@ -77,7 +77,7 @@
+ #include "chrome/browser/ui/browser_commands_chromeos.h"
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ #include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h"
+ #endif
+
+@@ -210,7 +210,7 @@ bool BrowserCommandController::IsReservedCommandOrKey(
+ #endif
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ // If this key was registered by the user as a content editing hotkey, then
+ // it is not reserved.
+ ui::TextEditKeyBindingsDelegateAuraLinux* delegate =
+@@ -415,7 +415,7 @@ bool BrowserCommandController::ExecuteCommandWithDispo
+ break;
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ case IDC_MINIMIZE_WINDOW:
+ browser_->window()->Minimize();
+ break;
+@@ -840,7 +840,7 @@ void BrowserCommandController::InitCommandState() {
+ command_updater_.UpdateCommandEnabled(IDC_VISIT_DESKTOP_OF_LRU_USER_2, true);
+ command_updater_.UpdateCommandEnabled(IDC_VISIT_DESKTOP_OF_LRU_USER_3, true);
+ #endif
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ command_updater_.UpdateCommandEnabled(IDC_MINIMIZE_WINDOW, true);
+ command_updater_.UpdateCommandEnabled(IDC_MAXIMIZE_WINDOW, true);
+ command_updater_.UpdateCommandEnabled(IDC_RESTORE_WINDOW, true);
diff --git a/devel/electron4/files/patch-chrome_browser_ui_exclusive__access_exclusive__access__bubble.cc b/devel/electron4/files/patch-chrome_browser_ui_exclusive__access_exclusive__access__bubble.cc
new file mode 100644
index 000000000000..9a8cdc88b4e1
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_exclusive__access_exclusive__access__bubble.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/exclusive_access/exclusive_access_bubble.cc.orig 2019-03-15 06:25:34 UTC
++++ chrome/browser/ui/exclusive_access/exclusive_access_bubble.cc
+@@ -16,7 +16,7 @@
+
+ // NOTE(koz): Linux doesn't use the thick shadowed border, so we add padding
+ // here.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ const int ExclusiveAccessBubble::kPaddingPx = 8;
+ #else
+ const int ExclusiveAccessBubble::kPaddingPx = 15;
diff --git a/devel/electron4/files/patch-chrome_browser_ui_input__method_input__method__engine.h b/devel/electron4/files/patch-chrome_browser_ui_input__method_input__method__engine.h
new file mode 100644
index 000000000000..fc56cc3e5dd1
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_input__method_input__method__engine.h
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/input_method/input_method_engine.h.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/ui/input_method/input_method_engine.h
+@@ -27,7 +27,7 @@ class InputMethodEngine : public InputMethodEngineBase
+
+ // ui::IMEEngineHandlerInterface:
+ bool IsActive() const override;
+- std::string GetExtensionId() const override;
++ std::string GetExtensionId() const;
+
+ // Creates and shows the IME window.
+ // Returns 0 for errors and |error| will contains the error message.
diff --git a/devel/electron4/files/patch-chrome_browser_ui_input__method_input__method__engine__base.cc b/devel/electron4/files/patch-chrome_browser_ui_input__method_input__method__engine__base.cc
new file mode 100644
index 000000000000..bcac258b0186
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_input__method_input__method__engine__base.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/input_method/input_method_engine_base.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/ui/input_method/input_method_engine_base.cc
+@@ -31,7 +31,7 @@
+ #include "ui/base/ime/chromeos/ime_keymap.h"
+ #elif defined(OS_WIN)
+ #include "ui/events/keycodes/keyboard_codes_win.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/events/keycodes/keyboard_codes_posix.h"
+ #endif
+
diff --git a/devel/electron4/files/patch-chrome_browser_ui_libgtkui_print__dialog__gtk.cc b/devel/electron4/files/patch-chrome_browser_ui_libgtkui_print__dialog__gtk.cc
new file mode 100644
index 000000000000..c63c49612184
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_libgtkui_print__dialog__gtk.cc
@@ -0,0 +1,10 @@
+--- chrome/browser/ui/libgtkui/print_dialog_gtk.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/ui/libgtkui/print_dialog_gtk.cc
+@@ -350,6 +350,7 @@ void PrintDialogGtk2::ShowDialog(
+ // Since we only generate PDF, only show printers that support PDF.
+ // TODO(thestig) Add more capabilities to support?
+ GtkPrintCapabilities cap = static_cast<GtkPrintCapabilities>(
++ GTK_PRINT_CAPABILITY_GENERATE_PS |
+ GTK_PRINT_CAPABILITY_GENERATE_PDF |
+ GTK_PRINT_CAPABILITY_PAGE_SET |
+ GTK_PRINT_CAPABILITY_COPIES |
diff --git a/devel/electron4/files/patch-chrome_browser_ui_sad__tab.cc b/devel/electron4/files/patch-chrome_browser_ui_sad__tab.cc
new file mode 100644
index 000000000000..3bebb0c90bb0
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_sad__tab.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/sad_tab.cc.orig 2019-03-15 06:25:34 UTC
++++ chrome/browser/ui/sad_tab.cc
+@@ -180,7 +180,7 @@ std::vector<int> SadTab::GetSubMessages() {
+ // Only show incognito suggestion if not already in Incognito mode.
+ if (!web_contents_->GetBrowserContext()->IsOffTheRecord())
+ message_ids.insert(message_ids.begin(), IDS_SAD_TAB_RELOAD_INCOGNITO);
+-#if defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ // Note: on macOS, Linux and ChromeOS, the first bullet is either one of
+ // IDS_SAD_TAB_RELOAD_CLOSE_TABS or IDS_SAD_TAB_RELOAD_CLOSE_NOTABS
+ // followed by one of the above suggestions.
diff --git a/devel/electron4/files/patch-chrome_browser_ui_startup_bad__flags__prompt.cc b/devel/electron4/files/patch-chrome_browser_ui_startup_bad__flags__prompt.cc
new file mode 100644
index 000000000000..6fcff97a10b7
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_startup_bad__flags__prompt.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/startup/bad_flags_prompt.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/ui/startup/bad_flags_prompt.cc
+@@ -82,7 +82,7 @@ static const char* kBadFlags[] = {
+ extensions::switches::kExtensionsOnChromeURLs,
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ // Speech dispatcher is buggy, it can crash and it can make Chrome freeze.
+ // http://crbug.com/327295
+ switches::kEnableSpeechDispatcher,
diff --git a/devel/electron4/files/patch-chrome_browser_ui_startup_startup__browser__creator.cc b/devel/electron4/files/patch-chrome_browser_ui_startup_startup__browser__creator.cc
new file mode 100644
index 000000000000..c9967ce7d047
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_startup_startup__browser__creator.cc
@@ -0,0 +1,22 @@
+--- chrome/browser/ui/startup/startup_browser_creator.cc.orig 2019-04-06 12:09:25 UTC
++++ chrome/browser/ui/startup/startup_browser_creator.cc
+@@ -79,7 +79,7 @@
+ #include "chrome/browser/ui/user_manager.h"
+ #endif
+
+-#if defined(TOOLKIT_VIEWS) && defined(OS_LINUX)
++#if defined(TOOLKIT_VIEWS) && (defined(OS_LINUX) || defined(OS_BSD))
+ #include "ui/events/devices/x11/touch_factory_x11.h" // nogncheck
+ #endif
+
+@@ -630,8 +630,10 @@ bool StartupBrowserCreator::ProcessCmdLineImpl(
+ }
+ #endif // OS_CHROMEOS
+
++#if 0 /* XXX */
+ #if defined(TOOLKIT_VIEWS) && defined(USE_X11)
+ ui::TouchFactory::SetTouchDeviceListFromCommandLine();
++#endif
+ #endif
+
+ #if defined(OS_MACOSX)
diff --git a/devel/electron4/files/patch-chrome_browser_ui_tab__helpers.cc b/devel/electron4/files/patch-chrome_browser_ui_tab__helpers.cc
new file mode 100644
index 000000000000..ab2fe9b7316f
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_tab__helpers.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/tab_helpers.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/ui/tab_helpers.cc
+@@ -306,7 +306,7 @@ void TabHelpers::AttachTabHelpers(WebContents* web_con
+ #endif
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ metrics::DesktopSessionDurationObserver::CreateForWebContents(web_contents);
+ #endif
+
diff --git a/devel/electron4/files/patch-chrome_browser_ui_task__manager_task__manager__columns.cc b/devel/electron4/files/patch-chrome_browser_ui_task__manager_task__manager__columns.cc
new file mode 100644
index 000000000000..90711ca1c235
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_task__manager_task__manager__columns.cc
@@ -0,0 +1,15 @@
+--- chrome/browser/ui/task_manager/task_manager_columns.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/ui/task_manager/task_manager_columns.cc
+@@ -93,10 +93,10 @@ const TableColumnData kColumns[] = {
+ arraysize("100000") * kCharWidth, -1, true, false, false},
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ {IDS_TASK_MANAGER_OPEN_FD_COUNT_COLUMN, ui::TableColumn::RIGHT, -1, 0,
+ arraysize("999") * kCharWidth, -1, true, false, false},
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ {IDS_TASK_MANAGER_PROCESS_PRIORITY_COLUMN, ui::TableColumn::LEFT, -1, 0,
+ arraysize("background") * kCharWidth, -1, true, true, false},
+ {IDS_TASK_MANAGER_MEMORY_STATE_COLUMN, ui::TableColumn::LEFT, -1, 0,
diff --git a/devel/electron4/files/patch-chrome_browser_ui_task__manager_task__manager__table__model.cc b/devel/electron4/files/patch-chrome_browser_ui_task__manager_task__manager__table__model.cc
new file mode 100644
index 000000000000..6cc5d9e0db9d
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_task__manager_task__manager__table__model.cc
@@ -0,0 +1,50 @@
+--- chrome/browser/ui/task_manager/task_manager_table_model.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/ui/task_manager/task_manager_table_model.cc
+@@ -457,13 +457,13 @@ base::string16 TaskManagerTableModel::GetText(int row,
+ ? stringifier_->backgrounded_string()
+ : stringifier_->foregrounded_string();
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ case IDS_TASK_MANAGER_OPEN_FD_COUNT_COLUMN: {
+ const int fd_count = observed_task_manager()->GetOpenFdCount(tasks_[row]);
+ return fd_count >= 0 ? base::FormatNumber(fd_count)
+ : stringifier_->n_a_string();
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ case IDS_TASK_MANAGER_MEMORY_STATE_COLUMN: {
+ return stringifier_->GetMemoryStateText(
+@@ -623,7 +623,7 @@ int TaskManagerTableModel::CompareValues(int row1,
+ return BooleanCompare(is_proc1_bg, is_proc2_bg);
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ case IDS_TASK_MANAGER_OPEN_FD_COUNT_COLUMN: {
+ const int proc1_fd_count =
+ observed_task_manager()->GetOpenFdCount(tasks_[row1]);
+@@ -631,7 +631,7 @@ int TaskManagerTableModel::CompareValues(int row1,
+ observed_task_manager()->GetOpenFdCount(tasks_[row2]);
+ return ValueCompare(proc1_fd_count, proc2_fd_count);
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ default:
+ NOTREACHED();
+@@ -797,11 +797,11 @@ void TaskManagerTableModel::UpdateRefreshTypes(int col
+ type = REFRESH_TYPE_KEEPALIVE_COUNT;
+ break;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ case IDS_TASK_MANAGER_OPEN_FD_COUNT_COLUMN:
+ type = REFRESH_TYPE_FD_COUNT;
+ break;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ default:
+ NOTREACHED();
diff --git a/devel/electron4/files/patch-chrome_browser_ui_toolbar_app__menu__model.cc b/devel/electron4/files/patch-chrome_browser_ui_toolbar_app__menu__model.cc
new file mode 100644
index 000000000000..e9018ba99f40
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_toolbar_app__menu__model.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/toolbar/app_menu_model.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/ui/toolbar/app_menu_model.cc
+@@ -664,7 +664,7 @@ bool AppMenuModel::IsCommandIdVisible(int command_id)
+ case IDC_UPGRADE_DIALOG:
+ return browser_defaults::kShowUpgradeMenuItem &&
+ UpgradeDetector::GetInstance()->notify_upgrade();
+-#if !defined(OS_LINUX) || defined(USE_AURA)
++#if (!defined(OS_LINUX) && !defined(OS_BSD)) || defined(USE_AURA)
+ case IDC_BOOKMARK_PAGE:
+ return !chrome::ShouldRemoveBookmarkThisPageUI(browser_->profile());
+ case IDC_BOOKMARK_ALL_TABS:
diff --git a/devel/electron4/files/patch-chrome_browser_ui_views_accelerator__table.cc b/devel/electron4/files/patch-chrome_browser_ui_views_accelerator__table.cc
new file mode 100644
index 000000000000..96f5c5e0c33c
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_views_accelerator__table.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/ui/views/accelerator_table.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/ui/views/accelerator_table.cc
+@@ -49,7 +49,7 @@ const AcceleratorMapping kAcceleratorMap[] = {
+ {ui::VKEY_S, ui::EF_PLATFORM_ACCELERATOR, IDC_SAVE_PAGE},
+ {ui::VKEY_9, ui::EF_PLATFORM_ACCELERATOR, IDC_SELECT_LAST_TAB},
+ {ui::VKEY_NUMPAD9, ui::EF_PLATFORM_ACCELERATOR, IDC_SELECT_LAST_TAB},
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ {ui::VKEY_9, ui::EF_ALT_DOWN, IDC_SELECT_LAST_TAB},
+ {ui::VKEY_NUMPAD9, ui::EF_ALT_DOWN, IDC_SELECT_LAST_TAB},
+ {ui::VKEY_NEXT, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, IDC_MOVE_TAB_NEXT},
+@@ -79,7 +79,7 @@ const AcceleratorMapping kAcceleratorMap[] = {
+ {ui::VKEY_NUMPAD7, ui::EF_PLATFORM_ACCELERATOR, IDC_SELECT_TAB_6},
+ {ui::VKEY_8, ui::EF_PLATFORM_ACCELERATOR, IDC_SELECT_TAB_7},
+ {ui::VKEY_NUMPAD8, ui::EF_PLATFORM_ACCELERATOR, IDC_SELECT_TAB_7},
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ {ui::VKEY_1, ui::EF_ALT_DOWN, IDC_SELECT_TAB_0},
+ {ui::VKEY_NUMPAD1, ui::EF_ALT_DOWN, IDC_SELECT_TAB_0},
+ {ui::VKEY_2, ui::EF_ALT_DOWN, IDC_SELECT_TAB_1},
+@@ -121,7 +121,7 @@ const AcceleratorMapping kAcceleratorMap[] = {
+ {ui::VKEY_F11, ui::EF_NONE, IDC_FULLSCREEN},
+
+ // Platform-specific key maps.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ {ui::VKEY_BROWSER_BACK, ui::EF_NONE, IDC_BACK},
+ {ui::VKEY_BROWSER_FORWARD, ui::EF_NONE, IDC_FORWARD},
+ {ui::VKEY_BROWSER_HOME, ui::EF_NONE, IDC_HOME},
diff --git a/devel/electron4/files/patch-chrome_browser_ui_views_chrome__browser__main__extra__parts__views.cc b/devel/electron4/files/patch-chrome_browser_ui_views_chrome__browser__main__extra__parts__views.cc
new file mode 100644
index 000000000000..9979195f9e1a
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_views_chrome__browser__main__extra__parts__views.cc
@@ -0,0 +1,38 @@
+--- chrome/browser/ui/views/chrome_browser_main_extra_parts_views.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/ui/views/chrome_browser_main_extra_parts_views.cc
+@@ -38,7 +38,7 @@
+ #include "ui/wm/core/wm_state.h"
+ #endif // defined(USE_AURA)
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ #include <sys/stat.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+@@ -48,7 +48,7 @@
+ #include "chrome/grit/generated_resources.h"
+ #include "content/public/common/content_switches.h"
+ #include "ui/base/l10n/l10n_util.h"
+-#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#endif // (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+
+ #if defined(OS_CHROMEOS)
+ #include "ash/public/interfaces/constants.mojom.h"
+@@ -119,7 +119,7 @@ void ChromeBrowserMainExtraPartsViews::PreProfileInit(
+ }
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ // On the Linux desktop, we want to prevent the user from logging in as root,
+ // so that we don't destroy the profile. Now that we have some minimal ui
+ // initialized, check to see if we're running as root and bail if we are.
+@@ -150,7 +150,7 @@ void ChromeBrowserMainExtraPartsViews::PreProfileInit(
+ base::RunLoop().RunUntilIdle();
+
+ exit(EXIT_FAILURE);
+-#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#endif // (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ }
+
+ void ChromeBrowserMainExtraPartsViews::ServiceManagerConnectionStarted(
diff --git a/devel/electron4/files/patch-chrome_browser_ui_views_chrome__views__delegate.h b/devel/electron4/files/patch-chrome_browser_ui_views_chrome__views__delegate.h
new file mode 100644
index 000000000000..8cf88d9a305a
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_views_chrome__views__delegate.h
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/chrome_views_delegate.h.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/ui/views/chrome_views_delegate.h
+@@ -43,7 +43,7 @@ class ChromeViewsDelegate : public views::ViewsDelegat
+ HICON GetSmallWindowIcon() const override;
+ int GetAppbarAutohideEdges(HMONITOR monitor,
+ const base::Closure& callback) override;
+-#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#elif (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ gfx::ImageSkia* GetDefaultWindowIcon() const override;
+ bool WindowManagerProvidesTitleBar(bool maximized) override;
+ #endif
diff --git a/devel/electron4/files/patch-chrome_browser_ui_views_first__run__dialog.cc b/devel/electron4/files/patch-chrome_browser_ui_views_first__run__dialog.cc
new file mode 100644
index 000000000000..39f6c785ac65
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_views_first__run__dialog.cc
@@ -0,0 +1,24 @@
+--- chrome/browser/ui/views/first_run_dialog.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/ui/views/first_run_dialog.cc
+@@ -37,8 +37,10 @@
+ namespace {
+
+ void InitCrashReporterIfEnabled(bool enabled) {
++#if !defined(OS_BSD)
+ if (enabled)
+ breakpad::InitCrashReporter(std::string());
++#endif
+ }
+
+ } // namespace
+@@ -111,8 +113,10 @@ views::View* FirstRunDialog::CreateExtraView() {
+ bool FirstRunDialog::Accept() {
+ GetWidget()->Hide();
+
++#if !defined(OS_BSD)
+ ChangeMetricsReportingStateWithReply(report_crashes_->checked(),
+ base::Bind(&InitCrashReporterIfEnabled));
++#endif
+
+ if (make_default_->checked())
+ shell_integration::SetAsDefaultBrowser();
diff --git a/devel/electron4/files/patch-chrome_browser_ui_views_frame_browser__frame.cc b/devel/electron4/files/patch-chrome_browser_ui_views_frame_browser__frame.cc
new file mode 100644
index 000000000000..13879e56699e
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_views_frame_browser__frame.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/views/frame/browser_frame.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/ui/views/frame/browser_frame.cc
+@@ -36,7 +36,7 @@
+ #include "components/user_manager/user_manager.h"
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "chrome/browser/ui/views/frame/browser_command_handler_linux.h"
+ #endif
+
+@@ -90,7 +90,7 @@ void BrowserFrame::InitBrowserFrame() {
+ non_client_view()->set_context_menu_controller(this);
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ browser_command_handler_.reset(new BrowserCommandHandlerLinux(browser_view_));
+ #endif
+ }
diff --git a/devel/electron4/files/patch-chrome_browser_ui_views_frame_browser__non__client__frame__view__factory__views.cc b/devel/electron4/files/patch-chrome_browser_ui_views_frame_browser__non__client__frame__view__factory__views.cc
new file mode 100644
index 000000000000..12984936491c
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_views_frame_browser__non__client__frame__view__factory__views.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/frame/browser_non_client_frame_view_factory_views.cc.orig 2019-03-15 06:37:06 UTC
++++ chrome/browser/ui/views/frame/browser_non_client_frame_view_factory_views.cc
+@@ -13,7 +13,7 @@
+ #include "chrome/browser/ui/views/frame/glass_browser_frame_view.h"
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ #include "ui/views/linux_ui/linux_ui.h"
+ #endif
+
diff --git a/devel/electron4/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view.cc b/devel/electron4/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view.cc
new file mode 100644
index 000000000000..1146aac1b835
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/views/frame/opaque_browser_frame_view.cc.orig 2019-03-15 06:37:07 UTC
++++ chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
+@@ -41,7 +41,7 @@
+ #include "ui/views/window/frame_background.h"
+ #include "ui/views/window/window_shape.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/views/controls/menu/menu_runner.h"
+ #endif
+
+@@ -326,7 +326,7 @@ void OpaqueBrowserFrameView::ButtonPressed(views::Butt
+ void OpaqueBrowserFrameView::OnMenuButtonClicked(views::MenuButton* source,
+ const gfx::Point& point,
+ const ui::Event* event) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ views::MenuRunner menu_runner(frame()->GetSystemMenuModel(),
+ views::MenuRunner::HAS_MNEMONICS);
+ menu_runner.RunMenuAt(browser_view()->GetWidget(), window_icon_,
diff --git a/devel/electron4/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view__layout.cc b/devel/electron4/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view__layout.cc
new file mode 100644
index 000000000000..75b8b5d11701
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view__layout.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc.orig 2019-03-15 06:37:07 UTC
++++ chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc
+@@ -20,7 +20,7 @@ namespace {
+
+ constexpr int kCaptionButtonHeight = 18;
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ // Default spacing around window caption buttons.
+ constexpr int kCaptionButtonSpacing = 2;
+ #else
diff --git a/devel/electron4/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view__platform__specific.cc b/devel/electron4/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view__platform__specific.cc
new file mode 100644
index 000000000000..764b5983f1e3
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view__platform__specific.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/frame/opaque_browser_frame_view_platform_specific.cc.orig 2019-03-15 06:37:07 UTC
++++ chrome/browser/ui/views/frame/opaque_browser_frame_view_platform_specific.cc
+@@ -10,7 +10,7 @@ bool OpaqueBrowserFrameViewPlatformSpecific::IsUsingSy
+ return false;
+ }
+
+-#if !defined(OS_LINUX)
++#if !defined(OS_LINUX) && !defined(OS_FREEBSD)
+
+ // static
+ OpaqueBrowserFrameViewPlatformSpecific*
diff --git a/devel/electron4/files/patch-chrome_browser_ui_views_frame_system__menu__model__builder.cc b/devel/electron4/files/patch-chrome_browser_ui_views_frame_system__menu__model__builder.cc
new file mode 100644
index 000000000000..11d8e2ee4a7a
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_views_frame_system__menu__model__builder.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/views/frame/system_menu_model_builder.cc.orig 2019-03-15 06:37:07 UTC
++++ chrome/browser/ui/views/frame/system_menu_model_builder.cc
+@@ -89,7 +89,7 @@ void SystemMenuModelBuilder::BuildSystemMenuForBrowser
+ model->AddSeparator(ui::NORMAL_SEPARATOR);
+ model->AddItemWithStringId(IDC_TASK_MANAGER, IDS_TASK_MANAGER);
+ }
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ model->AddSeparator(ui::NORMAL_SEPARATOR);
+ model->AddCheckItemWithStringId(IDC_USE_SYSTEM_TITLE_BAR,
+ IDS_SHOW_WINDOW_DECORATIONS_MENU);
+@@ -125,7 +125,7 @@ void SystemMenuModelBuilder::BuildSystemMenuForAppOrPo
+ model->AddSeparator(ui::NORMAL_SEPARATOR);
+ model->AddItemWithStringId(IDC_TASK_MANAGER, IDS_TASK_MANAGER);
+ }
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ model->AddSeparator(ui::NORMAL_SEPARATOR);
+ model->AddItemWithStringId(IDC_CLOSE_WINDOW, IDS_CLOSE);
+ #endif
diff --git a/devel/electron4/files/patch-chrome_browser_ui_views_frame_system__menu__model__delegate.cc b/devel/electron4/files/patch-chrome_browser_ui_views_frame_system__menu__model__delegate.cc
new file mode 100644
index 000000000000..1f9e0d69a14d
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_views_frame_system__menu__model__delegate.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/views/frame/system_menu_model_delegate.cc.orig 2019-03-15 06:37:07 UTC
++++ chrome/browser/ui/views/frame/system_menu_model_delegate.cc
+@@ -15,7 +15,7 @@
+ #include "components/sessions/core/tab_restore_service.h"
+ #include "ui/base/l10n/l10n_util.h"
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ #include "chrome/common/pref_names.h"
+ #include "components/prefs/pref_service.h"
+ #endif
+@@ -30,7 +30,7 @@ SystemMenuModelDelegate::SystemMenuModelDelegate(
+ SystemMenuModelDelegate::~SystemMenuModelDelegate() {}
+
+ bool SystemMenuModelDelegate::IsCommandIdChecked(int command_id) const {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ if (command_id == IDC_USE_SYSTEM_TITLE_BAR) {
+ PrefService* prefs = browser_->profile()->GetPrefs();
+ return !prefs->GetBoolean(prefs::kUseCustomChromeFrame);
diff --git a/devel/electron4/files/patch-chrome_browser_ui_views_tabs_new__tab__button.cc b/devel/electron4/files/patch-chrome_browser_ui_views_tabs_new__tab__button.cc
new file mode 100644
index 000000000000..2e3abc4654c4
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_views_tabs_new__tab__button.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/tabs/new_tab_button.cc.orig 2019-03-15 06:37:07 UTC
++++ chrome/browser/ui/views/tabs/new_tab_button.cc
+@@ -94,7 +94,7 @@ NewTabButton::NewTabButton(TabStrip* tab_strip, views:
+ tab_strip_(tab_strip),
+ is_incognito_(tab_strip->IsIncognito()) {
+ set_animate_on_state_change(true);
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ set_triggerable_event_flags(triggerable_event_flags() |
+ ui::EF_MIDDLE_MOUSE_BUTTON);
+ #endif
diff --git a/devel/electron4/files/patch-chrome_browser_ui_views_tabs_tab__drag__controller.cc b/devel/electron4/files/patch-chrome_browser_ui_views_tabs_tab__drag__controller.cc
new file mode 100644
index 000000000000..537d5166dbbd
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_views_tabs_tab__drag__controller.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/ui/views/tabs/tab_drag_controller.cc.orig 2019-03-15 06:37:07 UTC
++++ chrome/browser/ui/views/tabs/tab_drag_controller.cc
+@@ -394,7 +394,7 @@ void TabDragController::Init(TabStrip* source_tabstrip
+ // synchronous on desktop Linux, so use that.
+ // - Chrome OS
+ // Releasing capture on Ash cancels gestures so avoid it.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ can_release_capture_ = false;
+ #endif
+ start_point_in_screen_ = gfx::Point(source_tab_offset, mouse_offset.y());
+@@ -762,7 +762,7 @@ TabDragController::DragBrowserToNewTabStrip(TabStrip*
+ else
+ target_tabstrip->GetWidget()->SetCapture(attached_tabstrip_);
+
+-#if !defined(OS_LINUX)
++#if !defined(OS_LINUX) || defined(OS_BSD)
+ // EndMoveLoop is going to snap the window back to its original location.
+ // Hide it so users don't see this. Hiding a window in Linux aura causes
+ // it to lose capture so skip it.
+@@ -2043,7 +2043,7 @@ TabDragController::Liveness TabDragController::GetLoca
+ if (dragged_window)
+ exclude.insert(dragged_window);
+ }
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // Exclude windows which are pending deletion via Browser::TabStripEmpty().
+ // These windows can be returned in the Linux Aura port because the browser
+ // window which was used for dragging is not hidden once all of its tabs are
diff --git a/devel/electron4/files/patch-chrome_browser_ui_webui_about__ui.cc b/devel/electron4/files/patch-chrome_browser_ui_webui_about__ui.cc
new file mode 100644
index 000000000000..4a31d8074cb8
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_webui_about__ui.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/webui/about_ui.cc.orig 2019-03-15 06:37:07 UTC
++++ chrome/browser/ui/webui/about_ui.cc
+@@ -391,7 +391,7 @@ std::string ChromeURLs() {
+ return html;
+ }
+
+-#if defined(OS_LINUX) || defined(OS_OPENBSD)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ std::string AboutLinuxProxyConfig() {
+ std::string data;
+ AppendHeader(&data, 0,
+@@ -446,7 +446,7 @@ void AboutUIHTMLSource::StartDataRequest(
+ .GetRawDataResource(idr)
+ .as_string();
+ }
+-#if defined(OS_LINUX) || defined(OS_OPENBSD)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ } else if (source_name_ == chrome::kChromeUILinuxProxyConfigHost) {
+ response = AboutLinuxProxyConfig();
+ #endif
diff --git a/devel/electron4/files/patch-chrome_browser_ui_webui_chrome__web__ui__controller__factory.cc b/devel/electron4/files/patch-chrome_browser_ui_webui_chrome__web__ui__controller__factory.cc
new file mode 100644
index 000000000000..9c681861daaa
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_webui_chrome__web__ui__controller__factory.cc
@@ -0,0 +1,49 @@
+--- chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc.orig 2019-03-15 06:37:08 UTC
++++ chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+@@ -185,11 +185,11 @@
+ #include "chrome/browser/ui/webui/welcome_win10_ui.h"
+ #endif
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ #include "chrome/browser/ui/webui/discards/discards_ui.h"
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ #include "chrome/browser/ui/webui/sandbox_internals_ui.h"
+ #endif
+
+@@ -317,7 +317,7 @@ bool IsAboutUI(const GURL& url) {
+ #if !defined(OS_ANDROID)
+ || url.host_piece() == chrome::kChromeUITermsHost
+ #endif
+-#if defined(OS_LINUX) || defined(OS_OPENBSD)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ || url.host_piece() == chrome::kChromeUILinuxProxyConfigHost
+ #endif
+ #if defined(OS_CHROMEOS)
+@@ -566,7 +566,7 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* we
+ if (url.host_piece() == chrome::kChromeUINaClHost)
+ return &NewWebUI<NaClUI>;
+ #endif
+-#if (defined(OS_LINUX) && defined(TOOLKIT_VIEWS)) || defined(USE_AURA)
++#if (defined(OS_LINUX) && defined(TOOLKIT_VIEWS)) || defined(USE_AURA) || defined(OS_BSD)
+ if (url.host_piece() == chrome::kChromeUITabModalConfirmDialogHost)
+ return &NewWebUI<ConstrainedWebDialogUI>;
+ #endif
+@@ -625,12 +625,12 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* we
+ return &NewWebUI<CastUI>;
+ }
+ #endif
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ if (url.host_piece() == chrome::kChromeUISandboxHost) {
+ return &NewWebUI<SandboxInternalsUI>;
+ }
+ #endif
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ if (url.host_piece() == chrome::kChromeUIDiscardsHost)
+ return &NewWebUI<DiscardsUI>;
+ #endif
diff --git a/devel/electron4/files/patch-chrome_browser_ui_webui_settings_appearance__handler.cc b/devel/electron4/files/patch-chrome_browser_ui_webui_settings_appearance__handler.cc
new file mode 100644
index 000000000000..438f21384b7b
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_webui_settings_appearance__handler.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/webui/settings/appearance_handler.cc.orig 2019-03-15 06:25:35 UTC
++++ chrome/browser/ui/webui/settings/appearance_handler.cc
+@@ -31,7 +31,7 @@ void AppearanceHandler::RegisterMessages() {
+ "useDefaultTheme",
+ base::BindRepeating(&AppearanceHandler::HandleUseDefaultTheme,
+ base::Unretained(this)));
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_BSD) && !defined(OS_CHROMEOS)
+ web_ui()->RegisterMessageCallback(
+ "useSystemTheme",
+ base::BindRepeating(&AppearanceHandler::HandleUseSystemTheme,
+@@ -59,7 +59,7 @@ void AppearanceHandler::HandleUseDefaultTheme(const ba
+ ThemeServiceFactory::GetForProfile(profile_)->UseDefaultTheme();
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_BSD) && !defined(OS_CHROMEOS)
+ void AppearanceHandler::HandleUseSystemTheme(const base::ListValue* args) {
+ if (profile_->IsSupervised())
+ NOTREACHED();
diff --git a/devel/electron4/files/patch-chrome_browser_ui_webui_settings_appearance__handler.h b/devel/electron4/files/patch-chrome_browser_ui_webui_settings_appearance__handler.h
new file mode 100644
index 000000000000..27797f1e5260
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_webui_settings_appearance__handler.h
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/webui/settings/appearance_handler.h.orig 2019-03-15 06:25:35 UTC
++++ chrome/browser/ui/webui/settings/appearance_handler.h
+@@ -36,7 +36,7 @@ class AppearanceHandler : public SettingsPageUIHandler
+ // Changes the UI theme of the browser to the default theme.
+ void HandleUseDefaultTheme(const base::ListValue* args);
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ // Changes the UI theme of the browser to the system (GTK+) theme.
+ void HandleUseSystemTheme(const base::ListValue* args);
+ #endif
diff --git a/devel/electron4/files/patch-chrome_browser_ui_webui_settings_md__settings__localized__strings__provider.cc b/devel/electron4/files/patch-chrome_browser_ui_webui_settings_md__settings__localized__strings__provider.cc
new file mode 100644
index 000000000000..3bd2c7ff234f
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_browser_ui_webui_settings_md__settings__localized__strings__provider.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc.orig 2019-03-15 06:37:08 UTC
++++ chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
+@@ -442,7 +442,7 @@ void AddAppearanceStrings(content::WebUIDataSource* ht
+ {"enterCustomWebAddress", IDS_SETTINGS_ENTER_CUSTOM_WEB_ADDRESS},
+ {"homeButtonDisabled", IDS_SETTINGS_HOME_BUTTON_DISABLED},
+ {"themes", IDS_SETTINGS_THEMES},
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ {"systemTheme", IDS_SETTINGS_SYSTEM_THEME},
+ {"useSystemTheme", IDS_SETTINGS_USE_SYSTEM_THEME},
+ {"classicTheme", IDS_SETTINGS_CLASSIC_THEME},
+@@ -460,7 +460,7 @@ void AddAppearanceStrings(content::WebUIDataSource* ht
+ {"openWallpaperApp", IDS_SETTINGS_OPEN_WALLPAPER_APP},
+ {"setWallpaper", IDS_SETTINGS_SET_WALLPAPER},
+ #endif
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ {"showWindowDecorations", IDS_SHOW_WINDOW_DECORATIONS},
+ #endif
+ #if defined(OS_MACOSX)
diff --git a/devel/electron4/files/patch-chrome_common_BUILD.gn b/devel/electron4/files/patch-chrome_common_BUILD.gn
new file mode 100644
index 000000000000..438ad94c398d
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_common_BUILD.gn
@@ -0,0 +1,13 @@
+--- chrome/common/BUILD.gn.orig 2019-03-15 06:37:09 UTC
++++ chrome/common/BUILD.gn
+@@ -295,6 +295,10 @@ static_library("common") {
+ public_deps += [ "//ppapi/shared_impl" ]
+ }
+
++ if (is_bsd) {
++ sources -= [ "component_flash_hint_file_linux.cc" ]
++ }
++
+ if (enable_extensions) {
+ sources += [
+ "cast_messages.cc",
diff --git a/devel/electron4/files/patch-chrome_common_chrome__features.cc b/devel/electron4/files/patch-chrome_common_chrome__features.cc
new file mode 100644
index 000000000000..399a5be0b46e
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_common_chrome__features.cc
@@ -0,0 +1,45 @@
+--- chrome/common/chrome_features.cc.orig 2019-03-15 06:37:09 UTC
++++ chrome/common/chrome_features.cc
+@@ -90,13 +90,13 @@ const base::Feature kAutomaticTabDiscarding{"Automatic
+ base::FEATURE_ENABLED_BY_DEFAULT};
+ #endif // defined(OS_WIN) || defined(OS_MACOSX)
+
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ // Enables the Restart background mode optimization. When all Chrome UI is
+ // closed and it goes in the background, allows to restart the browser to
+ // discard memory.
+ const base::Feature kBackgroundModeAllowRestart{
+ "BackgroundModeAllowRestart", base::FEATURE_DISABLED_BY_DEFAULT};
+-#endif // defined(OS_WIN) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+
+ // Enables or disables whether permission prompts are automatically blocked
+ // after the user has explicitly dismissed them too many times.
+@@ -155,7 +155,7 @@ const base::Feature kThirdPartyModulesBlocking{
+ "ThirdPartyModulesBlocking", base::FEATURE_DISABLED_BY_DEFAULT};
+ #endif
+
+-#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_MACOSX)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_MACOSX) || defined(OS_BSD)
+ // Enables the dual certificate verification trial feature.
+ // https://crbug.com/649026
+ const base::Feature kCertDualVerificationTrialFeature{
+@@ -365,7 +365,7 @@ const base::Feature kAcknowledgeNtpOverrideOnDeactivat
+ "AcknowledgeNtpOverrideOnDeactivate", base::FEATURE_DISABLED_BY_DEFAULT};
+ #endif
+
+-#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ const base::Feature kWarnBeforeQuitting{"WarnBeforeQuitting",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+ #endif
+@@ -388,7 +388,7 @@ const base::Feature kModalPermissionPrompts{"ModalPerm
+ // Center for displaying the toasts. The feature is hardcoded to enabled for
+ // Chrome OS.
+ #if BUILDFLAG(ENABLE_NATIVE_NOTIFICATIONS) && !defined(OS_CHROMEOS)
+-#if defined(OS_MACOSX) || defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_MACOSX) || defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ const base::Feature kNativeNotifications{"NativeNotifications",
+ base::FEATURE_ENABLED_BY_DEFAULT};
+ #else
diff --git a/devel/electron4/files/patch-chrome_common_chrome__features.h b/devel/electron4/files/patch-chrome_common_chrome__features.h
new file mode 100644
index 000000000000..0b0c5ad82dcc
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_common_chrome__features.h
@@ -0,0 +1,20 @@
+--- chrome/common/chrome_features.h.orig 2019-03-15 06:37:09 UTC
++++ chrome/common/chrome_features.h
+@@ -52,7 +52,7 @@ extern const base::Feature kAsyncDns;
+ extern const base::Feature kAutomaticTabDiscarding;
+ #endif // defined(OS_WIN) || defined(OS_MACOSX)
+
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ extern const base::Feature kBackgroundModeAllowRestart;
+ #endif // defined(OS_WIN) || defined(OS_LINUX)
+
+@@ -76,7 +76,7 @@ extern const base::Feature kDialogTouchBar;
+ extern const base::Feature kTabStripKeyboardFocus;
+ #endif // defined(OS_MACOSX)
+
+-#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_MACOSX)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_MACOSX) || defined(OS_BSD)
+ extern const base::Feature kCertDualVerificationTrialFeature;
+ #endif
+
diff --git a/devel/electron4/files/patch-chrome_common_chrome__paths.cc b/devel/electron4/files/patch-chrome_common_chrome__paths.cc
new file mode 100644
index 000000000000..6047bac0e3a2
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_common_chrome__paths.cc
@@ -0,0 +1,97 @@
+--- chrome/common/chrome_paths.cc.orig 2019-03-15 06:37:09 UTC
++++ chrome/common/chrome_paths.cc
+@@ -52,14 +52,14 @@ const base::FilePath::CharType kPepperFlashSystemBaseD
+ const base::FilePath::CharType kInternalNaClPluginFileName[] =
+ FILE_PATH_LITERAL("internal-nacl-plugin");
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // The path to the external extension <id>.json files.
+ // /usr/share seems like a good choice, see: http://www.pathname.com/fhs/
+ const base::FilePath::CharType kFilepathSinglePrefExtensions[] =
+ #if defined(GOOGLE_CHROME_BUILD)
+ FILE_PATH_LITERAL("/usr/share/google-chrome/extensions");
+ #else
+- FILE_PATH_LITERAL("/usr/share/chromium/extensions");
++ FILE_PATH_LITERAL("/usr/local/share/chromium/extensions");
+ #endif // defined(GOOGLE_CHROME_BUILD)
+
+ // The path to the hint file that tells the pepper plugin loader
+@@ -193,7 +193,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ return false;
+ break;
+ case chrome::DIR_DEFAULT_DOWNLOADS_SAFE:
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ if (!GetUserDownloadsDirectorySafe(&cur))
+ return false;
+ break;
+@@ -422,7 +422,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ break;
+ #endif
+ #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ case chrome::DIR_SUPERVISED_USERS_DEFAULT_APPS:
+ if (!base::PathService::Get(chrome::DIR_STANDALONE_EXTERNAL_EXTENSIONS,
+ &cur)) {
+@@ -472,10 +472,12 @@ bool PathProvider(int key, base::FilePath* result) {
+ if (!base::PathExists(cur)) // We don't want to create this
+ return false;
+ break;
+-#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD)
++#if defined(OS_POSIX) && !defined(OS_MACOSX)
+ case chrome::DIR_POLICY_FILES: {
+ #if defined(GOOGLE_CHROME_BUILD)
+ cur = base::FilePath(FILE_PATH_LITERAL("/etc/opt/chrome/policies"));
++#elif defined(OS_BSD)
++ cur = base::FilePath(FILE_PATH_LITERAL("/usr/local/etc/chrome/policies"));
+ #else
+ cur = base::FilePath(FILE_PATH_LITERAL("/etc/chromium/policies"));
+ #endif
+@@ -483,7 +485,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ }
+ #endif
+ #if defined(OS_CHROMEOS) || (defined(OS_LINUX) && defined(CHROMIUM_BUILD)) || \
+- defined(OS_MACOSX)
++ defined(OS_MACOSX) || defined(OS_BSD)
+ case chrome::DIR_USER_EXTERNAL_EXTENSIONS: {
+ if (!base::PathService::Get(chrome::DIR_USER_DATA, &cur))
+ return false;
+@@ -491,7 +493,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ break;
+ }
+ #endif
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ case chrome::DIR_STANDALONE_EXTERNAL_EXTENSIONS: {
+ cur = base::FilePath(kFilepathSinglePrefExtensions);
+ break;
+@@ -526,7 +528,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ #endif
+ break;
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ case chrome::DIR_NATIVE_MESSAGING:
+ #if defined(OS_MACOSX)
+ #if defined(GOOGLE_CHROME_BUILD)
+@@ -540,6 +542,9 @@ bool PathProvider(int key, base::FilePath* result) {
+ #if defined(GOOGLE_CHROME_BUILD)
+ cur = base::FilePath(FILE_PATH_LITERAL(
+ "/etc/opt/chrome/native-messaging-hosts"));
++#elif defined(OS_BSD)
++ cur = base::FilePath(FILE_PATH_LITERAL(
++ "/usr/local/etc/chrome/native-messaging-hosts"));
+ #else
+ cur = base::FilePath(FILE_PATH_LITERAL(
+ "/etc/chromium/native-messaging-hosts"));
+@@ -552,7 +557,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ return false;
+ cur = cur.Append(FILE_PATH_LITERAL("NativeMessagingHosts"));
+ break;
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ #if !defined(OS_ANDROID)
+ case chrome::DIR_GLOBAL_GCM_STORE:
+ if (!base::PathService::Get(chrome::DIR_USER_DATA, &cur))
diff --git a/devel/electron4/files/patch-chrome_common_chrome__paths.h b/devel/electron4/files/patch-chrome_common_chrome__paths.h
new file mode 100644
index 000000000000..e9691698bd06
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_common_chrome__paths.h
@@ -0,0 +1,29 @@
+--- chrome/common/chrome_paths.h.orig 2019-03-15 06:37:09 UTC
++++ chrome/common/chrome_paths.h
+@@ -51,7 +51,7 @@ enum {
+ // to set policies for chrome. This directory
+ // contains subdirectories.
+ #endif
+-#if defined(OS_CHROMEOS) || (defined(OS_LINUX) && defined(CHROMIUM_BUILD)) || \
++#if defined(OS_CHROMEOS) || ((defined(OS_LINUX) || defined(OS_BSD)) && defined(CHROMIUM_BUILD)) || \
+ defined(OS_MACOSX)
+ DIR_USER_EXTERNAL_EXTENSIONS, // Directory for per-user external extensions
+ // on Chrome Mac and Chromium Linux.
+@@ -60,7 +60,7 @@ enum {
+ // create it.
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ DIR_STANDALONE_EXTERNAL_EXTENSIONS, // Directory for 'per-extension'
+ // definition manifest files that
+ // describe extensions which are to be
+@@ -111,7 +111,7 @@ enum {
+ DIR_SUPERVISED_USER_INSTALLED_WHITELISTS, // Directory where sanitized
+ // supervised user whitelists are
+ // installed.
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_BSD) || defined(OS_MACOSX)
+ DIR_NATIVE_MESSAGING, // System directory where native messaging host
+ // manifest files are stored.
+ DIR_USER_NATIVE_MESSAGING, // Directory with Native Messaging Hosts
diff --git a/devel/electron4/files/patch-chrome_common_chrome__paths__internal.h b/devel/electron4/files/patch-chrome_common_chrome__paths__internal.h
new file mode 100644
index 000000000000..e12ab5f2d5d1
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_common_chrome__paths__internal.h
@@ -0,0 +1,11 @@
+--- chrome/common/chrome_paths_internal.h.orig 2019-03-15 06:25:36 UTC
++++ chrome/common/chrome_paths_internal.h
+@@ -45,7 +45,7 @@ void GetUserCacheDirectory(const base::FilePath& profi
+ // Get the path to the user's documents directory.
+ bool GetUserDocumentsDirectory(base::FilePath* result);
+
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ // Gets the path to a safe default download directory for a user.
+ bool GetUserDownloadsDirectorySafe(base::FilePath* result);
+ #endif
diff --git a/devel/electron4/files/patch-chrome_common_chrome__switches.cc b/devel/electron4/files/patch-chrome_common_chrome__switches.cc
new file mode 100644
index 000000000000..0a8139a4b80b
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_common_chrome__switches.cc
@@ -0,0 +1,17 @@
+--- chrome/common/chrome_switches.cc.orig 2019-03-15 06:37:09 UTC
++++ chrome/common/chrome_switches.cc
+@@ -987,12 +987,12 @@ const char kAllowNaClFileHandleAPI[] = "allow-n
+ const char kAllowNaClSocketAPI[] = "allow-nacl-socket-api";
+ #endif
+
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ const char kDisableInputImeAPI[] = "disable-input-ime-api";
+ const char kEnableInputImeAPI[] = "enable-input-ime-api";
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+ const char kEnableNewAppMenuIcon[] = "enable-new-app-menu-icon";
+ #endif
+
diff --git a/devel/electron4/files/patch-chrome_common_chrome__switches.h b/devel/electron4/files/patch-chrome_common_chrome__switches.h
new file mode 100644
index 000000000000..02340af2b7d6
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_common_chrome__switches.h
@@ -0,0 +1,17 @@
+--- chrome/common/chrome_switches.h.orig 2019-03-15 06:37:09 UTC
++++ chrome/common/chrome_switches.h
+@@ -302,12 +302,12 @@ extern const char kAllowNaClFileHandleAPI[];
+ extern const char kAllowNaClSocketAPI[];
+ #endif
+
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ extern const char kDisableInputImeAPI[];
+ extern const char kEnableInputImeAPI[];
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+ extern const char kEnableNewAppMenuIcon[];
+ #endif
+
diff --git a/devel/electron4/files/patch-chrome_common_extensions_api_api__sources.gni b/devel/electron4/files/patch-chrome_common_extensions_api_api__sources.gni
new file mode 100644
index 000000000000..6b5fad5bb385
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_common_extensions_api_api__sources.gni
@@ -0,0 +1,11 @@
+--- chrome/common/extensions/api/api_sources.gni.orig 2019-03-15 06:37:09 UTC
++++ chrome/common/extensions/api/api_sources.gni
+@@ -116,7 +116,7 @@ if (is_chromeos) {
+ "wallpaper.json",
+ "wallpaper_private.json",
+ ]
+-} else if (is_linux || is_win) {
++} else if (is_linux || is_bsd || is_win) {
+ schema_sources_ += [ "input_ime.json" ]
+ }
+
diff --git a/devel/electron4/files/patch-chrome_common_extensions_command.cc b/devel/electron4/files/patch-chrome_common_extensions_command.cc
new file mode 100644
index 000000000000..c8d3cca29ec2
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_common_extensions_command.cc
@@ -0,0 +1,11 @@
+--- chrome/common/extensions/command.cc.orig 2019-03-15 06:37:09 UTC
++++ chrome/common/extensions/command.cc
+@@ -311,7 +311,7 @@ std::string Command::CommandPlatform() {
+ return values::kKeybindingPlatformMac;
+ #elif defined(OS_CHROMEOS)
+ return values::kKeybindingPlatformChromeOs;
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return values::kKeybindingPlatformLinux;
+ #else
+ return "";
diff --git a/devel/electron4/files/patch-chrome_common_features.gni b/devel/electron4/files/patch-chrome_common_features.gni
new file mode 100644
index 000000000000..08918fc2e8bd
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_common_features.gni
@@ -0,0 +1,14 @@
+--- chrome/common/features.gni.orig 2019-03-15 06:37:09 UTC
++++ chrome/common/features.gni
+@@ -46,9 +46,9 @@ declare_args() {
+ (is_desktop_linux && use_dbus) || is_chromeos
+
+ enable_one_click_signin =
+- is_win || is_mac || (is_linux && !is_chromeos && !is_chromecast)
++ is_win || is_mac || is_bsd || (is_linux && !is_chromeos && !is_chromecast)
+
+- enable_service_discovery = enable_mdns || is_mac
++ enable_service_discovery = enable_mdns || is_mac || is_bsd
+
+ # Enables use of the session service, which is enabled by default.
+ # Android stores them separately on the Java side.
diff --git a/devel/electron4/files/patch-chrome_common_pref__names.cc b/devel/electron4/files/patch-chrome_common_pref__names.cc
new file mode 100644
index 000000000000..205bfe265531
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_common_pref__names.cc
@@ -0,0 +1,29 @@
+--- chrome/common/pref_names.cc.orig 2019-03-15 06:37:09 UTC
++++ chrome/common/pref_names.cc
+@@ -918,7 +918,7 @@ const char kAllowedDomainsForApps[] = "settings.allowe
+ // See the SafeSitesFilterBehavior policy for details.
+ const char kSafeSitesFilterBehavior[] = "settings.safe_sites_filter_behavior";
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ // Linux specific preference on whether we should match the system theme.
+ const char kUsesSystemTheme[] = "extensions.theme.use_system";
+ #endif
+@@ -1001,7 +1001,7 @@ const char kShowUpdatePromotionInfoBar[] =
+ "browser.show_update_promotion_info_bar";
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ // Boolean that is false if we should show window manager decorations. If
+ // true, we draw a custom chrome frame (thicker title bar and blue border).
+ const char kUseCustomChromeFrame[] = "browser.custom_chrome_frame";
+@@ -1363,7 +1363,7 @@ const char kDownloadDefaultDirectory[] = "download.def
+ // upgrade a unsafe location to a safe location.
+ const char kDownloadDirUpgraded[] = "download.directory_upgrade";
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ const char kOpenPdfDownloadInSystemReader[] =
+ "download.open_pdf_in_system_reader";
+ #endif
diff --git a/devel/electron4/files/patch-chrome_common_pref__names.h b/devel/electron4/files/patch-chrome_common_pref__names.h
new file mode 100644
index 000000000000..6e1b9bd4600d
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_common_pref__names.h
@@ -0,0 +1,38 @@
+--- chrome/common/pref_names.h.orig 2019-03-15 06:37:09 UTC
++++ chrome/common/pref_names.h
+@@ -166,7 +166,7 @@ extern const char kSearchSuggestEnabled[];
+ extern const char kContextualSearchEnabled[];
+ #endif // defined(OS_ANDROID)
+ #if defined(OS_MACOSX) || defined(OS_WIN) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ extern const char kConfirmToQuitEnabled[];
+ #endif
+ #if defined(OS_MACOSX)
+@@ -294,7 +294,7 @@ extern const char kForceYouTubeRestrict[];
+ extern const char kForceSessionSync[];
+ extern const char kAllowedDomainsForApps[];
+ extern const char kSafeSitesFilterBehavior[];
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ extern const char kUsesSystemTheme[];
+ #endif
+ extern const char kCurrentThemePackFilename[];
+@@ -327,7 +327,7 @@ extern const char kDefaultBrowserSettingEnabled[];
+ #if defined(OS_MACOSX)
+ extern const char kShowUpdatePromotionInfoBar[];
+ #endif
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ extern const char kUseCustomChromeFrame[];
+ #endif
+ #if BUILDFLAG(ENABLE_PLUGINS)
+@@ -474,7 +474,7 @@ extern const char kAppWindowPlacement[];
+ extern const char kDownloadDefaultDirectory[];
+ extern const char kDownloadExtensionsToOpen[];
+ extern const char kDownloadDirUpgraded[];
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ extern const char kOpenPdfDownloadInSystemReader[];
+ #endif
+ #if defined(OS_ANDROID)
diff --git a/devel/electron4/files/patch-chrome_common_webui__url__constants.cc b/devel/electron4/files/patch-chrome_common_webui__url__constants.cc
new file mode 100644
index 000000000000..ababd04a9476
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_common_webui__url__constants.cc
@@ -0,0 +1,41 @@
+--- chrome/common/webui_url_constants.cc.orig 2019-03-15 06:37:09 UTC
++++ chrome/common/webui_url_constants.cc
+@@ -237,7 +237,7 @@ const char kChromeUICastHost[] = "cast";
+ const char kChromeUICastURL[] = "chrome://cast/";
+ #endif
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ const char kChromeUIDiscardsHost[] = "discards";
+ const char kChromeUIDiscardsURL[] = "chrome://discards/";
+ #endif
+@@ -246,11 +246,11 @@ const char kChromeUIDiscardsURL[] = "chrome://discards
+ const char kChromeUILinuxProxyConfigHost[] = "linux-proxy-config";
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ const char kChromeUISandboxHost[] = "sandbox";
+ #endif
+
+-#if (defined(OS_LINUX) && defined(TOOLKIT_VIEWS)) || defined(USE_AURA)
++#if ((defined(OS_BSD) || defined(OS_LINUX)) && defined(TOOLKIT_VIEWS)) || defined(USE_AURA)
+ const char kChromeUITabModalConfirmDialogHost[] = "tab-modal-confirm-dialog";
+ #endif
+
+@@ -398,13 +398,13 @@ const char* const kChromeHostURLs[] = {
+ kChromeUIInternetDetailDialogHost,
+ kChromeUIAssistantOptInHost,
+ #endif
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ kChromeUIDiscardsHost,
+ #endif
+ #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
+ kChromeUILinuxProxyConfigHost,
+ #endif
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ kChromeUISandboxHost,
+ #endif
+ #if defined(OS_WIN)
diff --git a/devel/electron4/files/patch-chrome_common_webui__url__constants.h b/devel/electron4/files/patch-chrome_common_webui__url__constants.h
new file mode 100644
index 000000000000..ec696af6d108
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_common_webui__url__constants.h
@@ -0,0 +1,25 @@
+--- chrome/common/webui_url_constants.h.orig 2019-03-15 06:37:09 UTC
++++ chrome/common/webui_url_constants.h
+@@ -232,7 +232,7 @@ extern const char kChromeUICastHost[];
+ extern const char kChromeUICastURL[];
+ #endif
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ extern const char kChromeUIDiscardsHost[];
+ extern const char kChromeUIDiscardsURL[];
+ #endif
+@@ -241,11 +241,11 @@ extern const char kChromeUIDiscardsURL[];
+ extern const char kChromeUILinuxProxyConfigHost[];
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ extern const char kChromeUISandboxHost[];
+ #endif
+
+-#if (defined(OS_LINUX) && defined(TOOLKIT_VIEWS)) || defined(USE_AURA)
++#if ((defined(OS_BSD) || defined(OS_LINUX)) && defined(TOOLKIT_VIEWS)) || defined(USE_AURA)
+ extern const char kChromeUITabModalConfirmDialogHost[];
+ #endif
+
diff --git a/devel/electron4/files/patch-chrome_renderer_pepper_pepper__flash__font__file__host.cc b/devel/electron4/files/patch-chrome_renderer_pepper_pepper__flash__font__file__host.cc
new file mode 100644
index 000000000000..aadc2690f688
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_renderer_pepper_pepper__flash__font__file__host.cc
@@ -0,0 +1,29 @@
+--- chrome/renderer/pepper/pepper_flash_font_file_host.cc.orig 2019-03-15 06:25:37 UTC
++++ chrome/renderer/pepper/pepper_flash_font_file_host.cc
+@@ -15,7 +15,7 @@
+ #include "ppapi/proxy/ppapi_messages.h"
+ #include "ppapi/proxy/serialized_structs.h"
+
+-#if defined(OS_LINUX) || defined(OS_OPENBSD)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "components/services/font/public/cpp/font_loader.h"
+ #include "content/public/common/common_sandbox_support_linux.h"
+ #elif defined(OS_WIN)
+@@ -29,7 +29,7 @@ PepperFlashFontFileHost::PepperFlashFontFileHost(
+ const ppapi::proxy::SerializedFontDescription& description,
+ PP_PrivateFontCharset charset)
+ : ResourceHost(host->GetPpapiHost(), instance, resource) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // The global SkFontConfigInterface is configured and initialized with a
+ // SkFontconfigInterface compatible font_service::FontLoader in
+ // RendererBlinkPlatformImpl (called from RenderThreadImpl::Init) at startup
+@@ -74,7 +74,7 @@ bool PepperFlashFontFileHost::GetFontData(uint32_t tab
+ void* buffer,
+ size_t* length) {
+ bool result = false;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (font_file_.IsValid()) {
+ result = content::GetFontTable(font_file_.GetPlatformFile(), table,
+ 0 /* offset */,
diff --git a/devel/electron4/files/patch-chrome_renderer_pepper_pepper__flash__font__file__host.h b/devel/electron4/files/patch-chrome_renderer_pepper_pepper__flash__font__file__host.h
new file mode 100644
index 000000000000..5c4656ec10a4
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_renderer_pepper_pepper__flash__font__file__host.h
@@ -0,0 +1,20 @@
+--- chrome/renderer/pepper/pepper_flash_font_file_host.h.orig 2019-03-15 06:25:37 UTC
++++ chrome/renderer/pepper/pepper_flash_font_file_host.h
+@@ -14,7 +14,7 @@
+ #include "ppapi/c/private/pp_private_font_charset.h"
+ #include "ppapi/host/resource_host.h"
+
+-#if defined(OS_LINUX) || defined(OS_OPENBSD)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/files/file.h"
+ #elif defined(OS_WIN)
+ #include "third_party/skia/include/core/SkRefCnt.h"
+@@ -50,7 +50,7 @@ class PepperFlashFontFileHost : public ppapi::host::Re
+ uint32_t table);
+ bool GetFontData(uint32_t table, void* buffer, size_t* length);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ base::File font_file_;
+ #elif defined(OS_WIN)
+ sk_sp<SkTypeface> typeface_;
diff --git a/devel/electron4/files/patch-chrome_service_cloud__print_print__system.cc b/devel/electron4/files/patch-chrome_service_cloud__print_print__system.cc
new file mode 100644
index 000000000000..afe7c88bcaa0
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_service_cloud__print_print__system.cc
@@ -0,0 +1,11 @@
+--- chrome/service/cloud_print/print_system.cc.orig 2019-03-15 06:25:37 UTC
++++ chrome/service/cloud_print/print_system.cc
+@@ -36,7 +36,7 @@ std::string PrintSystem::GenerateProxyId() {
+ return base::GenerateGUID();
+ }
+
+-#if defined(OS_LINUX) && !defined(USE_CUPS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(USE_CUPS)
+ scoped_refptr<PrintSystem> PrintSystem::CreateInstance(
+ const base::DictionaryValue*) {
+ return nullptr;
diff --git a/devel/electron4/files/patch-chrome_test_base_in__process__browser__test.cc b/devel/electron4/files/patch-chrome_test_base_in__process__browser__test.cc
new file mode 100644
index 000000000000..ebaab151f50a
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_test_base_in__process__browser__test.cc
@@ -0,0 +1,22 @@
+--- chrome/test/base/in_process_browser_test.cc.orig 2019-03-15 06:37:10 UTC
++++ chrome/test/base/in_process_browser_test.cc
+@@ -72,6 +72,10 @@
+ #include "chrome/test/base/scoped_bundle_swizzler_mac.h"
+ #endif
+
++#if defined(OS_FREEBSD)
++#include <signal.h>
++#endif
++
+ #if defined(OS_WIN)
+ #include "base/win/scoped_com_initializer.h"
+ #include "base/win/windows_version.h"
+@@ -91,7 +95,7 @@
+ #include "chrome/test/base/default_ash_event_generator_delegate.h"
+ #endif // defined(OS_CHROMEOS)
+
+-#if !defined(OS_CHROMEOS) && defined(OS_LINUX)
++#if !defined(OS_CHROMEOS) && (defined(OS_LINUX) || defined(OS_BSD))
+ #include "ui/views/test/test_desktop_screen_x11.h"
+ #endif
+
diff --git a/devel/electron4/files/patch-chrome_test_base_testing__browser__process.h b/devel/electron4/files/patch-chrome_test_base_testing__browser__process.h
new file mode 100644
index 000000000000..9be7b7c2ab77
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_test_base_testing__browser__process.h
@@ -0,0 +1,13 @@
+--- chrome/test/base/testing_browser_process.h.orig 2019-03-15 06:37:10 UTC
++++ chrome/test/base/testing_browser_process.h
+@@ -114,8 +114,8 @@ class TestingBrowserProcess : public BrowserProcess {
+ DownloadStatusUpdater* download_status_updater() override;
+ DownloadRequestLimiter* download_request_limiter() override;
+
+-#if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+- void StartAutoupdateTimer() override {}
++#if (defined(OS_WIN) || defined(OS_LINUX) || defined(OS_FREEBSD)) && !defined(OS_CHROMEOS)
++ void StartAutoupdateTimer() /*override*/ {}
+ #endif
+
+ net_log::ChromeNetLog* net_log() override;
diff --git a/devel/electron4/files/patch-chrome_test_chromedriver_chrome_chrome__finder.cc b/devel/electron4/files/patch-chrome_test_chromedriver_chrome_chrome__finder.cc
new file mode 100644
index 000000000000..21f5c76d2efa
--- /dev/null
+++ b/devel/electron4/files/patch-chrome_test_chromedriver_chrome_chrome__finder.cc
@@ -0,0 +1,20 @@
+--- chrome/test/chromedriver/chrome/chrome_finder.cc.orig 2019-03-15 06:37:10 UTC
++++ chrome/test/chromedriver/chrome/chrome_finder.cc
+@@ -45,7 +45,7 @@ void GetApplicationDirs(std::vector<base::FilePath>* l
+ installation_locations[i].Append(L"Chromium\\Application"));
+ }
+ }
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ void GetApplicationDirs(std::vector<base::FilePath>* locations) {
+ // TODO: Respect users' PATH variables.
+ // Until then, we use an approximation of the most common defaults.
+@@ -98,7 +98,7 @@ bool FindChrome(base::FilePath* browser_exe) {
+ #elif defined(OS_MACOSX)
+ base::FilePath("Google Chrome.app/Contents/MacOS/Google Chrome"),
+ base::FilePath("Chromium.app/Contents/MacOS/Chromium")
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ base::FilePath("google-chrome"),
+ base::FilePath("chrome"),
+ base::FilePath("chromium"),
diff --git a/devel/electron4/files/patch-chromecast_browser_cast__browser__main__parts.cc b/devel/electron4/files/patch-chromecast_browser_cast__browser__main__parts.cc
new file mode 100644
index 000000000000..0430daf0e7de
--- /dev/null
+++ b/devel/electron4/files/patch-chromecast_browser_cast__browser__main__parts.cc
@@ -0,0 +1,29 @@
+--- chromecast/browser/cast_browser_main_parts.cc.orig 2019-03-15 06:37:10 UTC
++++ chromecast/browser/cast_browser_main_parts.cc
+@@ -68,7 +68,7 @@
+ #include "ui/compositor/compositor_switches.h"
+ #include "ui/gl/gl_switches.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <fontconfig/fontconfig.h>
+ #include <signal.h>
+ #include <sys/prctl.h>
+@@ -241,7 +241,7 @@ const DefaultCommandLineSwitch kDefaultSwitches[] = {
+ {cc::switches::kDisableThreadedAnimation, ""},
+ #endif // defined(OS_ANDROID)
+ #endif // BUILDFLAG(IS_CAST_AUDIO_ONLY)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #if defined(ARCH_CPU_X86_FAMILY)
+ // This is needed for now to enable the x11 Ozone platform to work with
+ // current Linux/NVidia OpenGL drivers.
+@@ -399,7 +399,7 @@ void CastBrowserMainParts::PostMainMessageLoopStart()
+ }
+
+ void CastBrowserMainParts::ToolkitInitialized() {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Without this call, the FontConfig library gets implicitly initialized
+ // on the first call to FontConfig. Since it's not safe to initialize it
+ // concurrently from multiple threads, we explicitly initialize it here
diff --git a/devel/electron4/files/patch-chromecast_browser_cast__content__browser__client.cc b/devel/electron4/files/patch-chromecast_browser_cast__content__browser__client.cc
new file mode 100644
index 000000000000..d1e737eba2e6
--- /dev/null
+++ b/devel/electron4/files/patch-chromecast_browser_cast__content__browser__client.cc
@@ -0,0 +1,11 @@
+--- chromecast/browser/cast_content_browser_client.cc.orig 2019-03-15 06:37:10 UTC
++++ chromecast/browser/cast_content_browser_client.cc
+@@ -426,7 +426,7 @@ void CastContentBrowserClient::AppendExtraCommandLineS
+ switches::kAudioOutputChannels));
+ }
+ } else if (process_type == switches::kGpuProcess) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Necessary for accelerated 2d canvas. By default on Linux, Chromium assumes
+ // GLES2 contexts can be lost to a power-save mode, which breaks GPU canvas
+ // apps.
diff --git a/devel/electron4/files/patch-components_autofill__strings.grdp b/devel/electron4/files/patch-components_autofill__strings.grdp
new file mode 100644
index 000000000000..effefbb19f6d
--- /dev/null
+++ b/devel/electron4/files/patch-components_autofill__strings.grdp
@@ -0,0 +1,11 @@
+--- components/autofill_strings.grdp.orig 2019-03-15 06:37:13 UTC
++++ components/autofill_strings.grdp
+@@ -201,7 +201,7 @@
+ <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION" desc="Explanation of the effect of the Autofill save card prompt when the card is to be saved by uploading it to Google Payments and also saved locally. The prompt can be either a bubble or an infobar.">
+ Pay quickly on sites and apps across devices using cards you have saved with Google.
+ </message>
+- <if expr="is_linux and not chromeos">
++ <if expr="is_posix and not chromeos">
+ <then>
+ <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION_V2" desc="Explanation of the effect of the Autofill save card prompt when the card is to be saved by uploading it to Google Payments, according to June 2017 UI guidelines. The prompt will be shown in a bubble below the omnibox.">
+ To pay faster next time, save this card to your Google Account.
diff --git a/devel/electron4/files/patch-components_autofill_content_renderer_password__form__conversion__utils.cc b/devel/electron4/files/patch-components_autofill_content_renderer_password__form__conversion__utils.cc
new file mode 100644
index 000000000000..1c9649b52c67
--- /dev/null
+++ b/devel/electron4/files/patch-components_autofill_content_renderer_password__form__conversion__utils.cc
@@ -0,0 +1,14 @@
+--- components/autofill/content/renderer/password_form_conversion_utils.cc.orig 2019-03-15 06:37:12 UTC
++++ components/autofill/content/renderer/password_form_conversion_utils.cc
+@@ -37,7 +37,11 @@
+ #include "third_party/blink/public/web/web_form_control_element.h"
+ #include "third_party/blink/public/web/web_input_element.h"
+ #include "third_party/blink/public/web/web_local_frame.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+ #include "url/gurl.h"
+
+ using blink::WebFormControlElement;
diff --git a/devel/electron4/files/patch-components_autofill_core_browser_autofill__experiments.cc b/devel/electron4/files/patch-components_autofill_core_browser_autofill__experiments.cc
new file mode 100644
index 000000000000..b86bd2530134
--- /dev/null
+++ b/devel/electron4/files/patch-components_autofill_core_browser_autofill__experiments.cc
@@ -0,0 +1,20 @@
+--- components/autofill/core/browser/autofill_experiments.cc.orig 2019-03-15 06:37:12 UTC
++++ components/autofill/core/browser/autofill_experiments.cc
+@@ -109,7 +109,7 @@ bool IsAutofillCreditCardLocalCardMigrationExperimentE
+ }
+
+ bool OfferStoreUnmaskedCards() {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ // The checkbox can be forced on with a flag, but by default we don't store
+ // on Linux due to lack of system keychain integration. See crbug.com/162735
+ return base::CommandLine::ForCurrentProcess()->HasSwitch(
+@@ -212,7 +212,7 @@ bool IsMacViewsAutofillPopupExperimentEnabled() {
+ #endif // defined(OS_MACOSX)
+
+ bool ShouldUseNativeViews() {
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ return base::FeatureList::IsEnabled(kAutofillExpandedPopupViews) ||
+ base::FeatureList::IsEnabled(::features::kExperimentalUi);
+ #else
diff --git a/devel/electron4/files/patch-components_autofill_core_common_autofill__util.cc b/devel/electron4/files/patch-components_autofill_core_common_autofill__util.cc
new file mode 100644
index 000000000000..c9c47209745f
--- /dev/null
+++ b/devel/electron4/files/patch-components_autofill_core_common_autofill__util.cc
@@ -0,0 +1,11 @@
+--- components/autofill/core/common/autofill_util.cc.orig 2019-03-15 06:37:13 UTC
++++ components/autofill/core/common/autofill_util.cc
+@@ -202,7 +202,7 @@ bool SanitizedFieldIsEmpty(const base::string16& value
+ }
+
+ bool ShouldAutoselectFirstSuggestionOnArrowDown() {
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ return true;
+ #else
+ return false;
diff --git a/devel/electron4/files/patch-components_content__settings_core_browser_website__settings__registry.cc b/devel/electron4/files/patch-components_content__settings_core_browser_website__settings__registry.cc
new file mode 100644
index 000000000000..78dc54c7e50c
--- /dev/null
+++ b/devel/electron4/files/patch-components_content__settings_core_browser_website__settings__registry.cc
@@ -0,0 +1,11 @@
+--- components/content_settings/core/browser/website_settings_registry.cc.orig 2019-03-15 06:37:13 UTC
++++ components/content_settings/core/browser/website_settings_registry.cc
+@@ -67,7 +67,7 @@ const WebsiteSettingsInfo* WebsiteSettingsRegistry::Re
+ #if defined(OS_WIN)
+ if (!(platform & PLATFORM_WINDOWS))
+ return nullptr;
+-#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#elif (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ if (!(platform & PLATFORM_LINUX))
+ return nullptr;
+ #elif defined(OS_MACOSX) && !defined(OS_IOS)
diff --git a/devel/electron4/files/patch-components_cookie__config_cookie__store__util.cc b/devel/electron4/files/patch-components_cookie__config_cookie__store__util.cc
new file mode 100644
index 000000000000..b100302ec53b
--- /dev/null
+++ b/devel/electron4/files/patch-components_cookie__config_cookie__store__util.cc
@@ -0,0 +1,24 @@
+--- components/cookie_config/cookie_store_util.cc.orig 2019-03-15 06:25:41 UTC
++++ components/cookie_config/cookie_store_util.cc
+@@ -11,7 +11,7 @@
+
+ namespace cookie_config {
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ namespace {
+
+ // Use the operating system's mechanisms to encrypt cookies before writing
+@@ -63,10 +63,10 @@ base::LazyInstance<CookieOSCryptoDelegate>::Destructor
+ net::CookieCryptoDelegate* GetCookieCryptoDelegate() {
+ return g_cookie_crypto_delegate.Pointer();
+ }
+-#else // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#else // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ net::CookieCryptoDelegate* GetCookieCryptoDelegate() {
+ return NULL;
+ }
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ } // namespace cookie_config
diff --git a/devel/electron4/files/patch-components_crash_content_app_BUILD.gn b/devel/electron4/files/patch-components_crash_content_app_BUILD.gn
new file mode 100644
index 000000000000..64ae3e401a45
--- /dev/null
+++ b/devel/electron4/files/patch-components_crash_content_app_BUILD.gn
@@ -0,0 +1,20 @@
+--- components/crash/content/app/BUILD.gn.orig 2019-03-15 06:37:13 UTC
++++ components/crash/content/app/BUILD.gn
+@@ -36,7 +36,7 @@ static_library("app") {
+ sources += [ "crashpad.cc" ]
+ }
+
+- if (is_android || is_linux) {
++ if (is_android || is_linux && !is_bsd) {
+ # Want these files on both Linux and Android.
+ set_sources_assignment_filter([])
+ sources += [
+@@ -73,8 +73,6 @@ static_library("app") {
+ "//content/public/common:content_descriptors",
+ "//content/public/common:result_codes",
+ "//sandbox",
+- "//third_party/breakpad:client",
+- "//third_party/crashpad/crashpad/snapshot",
+ ]
+
+ # Clang's -mstackrealign doesn't work well with
diff --git a/devel/electron4/files/patch-components_crash_content_app_crashpad.cc b/devel/electron4/files/patch-components_crash_content_app_crashpad.cc
new file mode 100644
index 000000000000..7bfdc826461b
--- /dev/null
+++ b/devel/electron4/files/patch-components_crash_content_app_crashpad.cc
@@ -0,0 +1,43 @@
+--- components/crash/content/app/crashpad.cc.orig 2019-03-15 06:37:13 UTC
++++ components/crash/content/app/crashpad.cc
+@@ -101,6 +101,12 @@ void InitializeCrashpadImpl(bool initial_client,
+ const std::string& user_data_dir,
+ const base::FilePath& exe_path,
+ bool embedded_handler) {
++
++#if defined(OS_BSD)
++ NOTIMPLEMENTED();
++ return;
++#endif
++
+ static bool initialized = false;
+ DCHECK(!initialized);
+ initialized = true;
+@@ -119,7 +125,7 @@ void InitializeCrashpadImpl(bool initial_client,
+ // as processed by the backend.
+ DCHECK(browser_process || process_type == "Chrome Installer" ||
+ process_type == "notification-helper");
+-#elif defined(OS_LINUX) || defined(OS_ANDROID)
++#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ DCHECK(browser_process);
+ #else
+ #error Port.
+@@ -184,7 +190,7 @@ void InitializeCrashpadImpl(bool initial_client,
+ // other "main, first process" to initialize things. There is no "relauncher"
+ // on Windows, so this is synonymous with initial_client.
+ const bool should_initialize_database_and_set_upload_policy = initial_client;
+-#elif defined(OS_LINUX) || defined(OS_ANDROID)
++#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ const bool should_initialize_database_and_set_upload_policy = browser_process;
+ #endif
+ if (should_initialize_database_and_set_upload_policy) {
+@@ -253,7 +259,9 @@ bool GetUploadsEnabled() {
+ }
+
+ void DumpWithoutCrashing() {
++#if !defined(OS_BSD)
+ CRASHPAD_SIMULATE_CRASH();
++#endif
+ }
+
+ void GetReports(std::vector<Report>* reports) {
diff --git a/devel/electron4/files/patch-components_crash_content_browser_BUILD.gn b/devel/electron4/files/patch-components_crash_content_browser_BUILD.gn
new file mode 100644
index 000000000000..df6ea2cc8d95
--- /dev/null
+++ b/devel/electron4/files/patch-components_crash_content_browser_BUILD.gn
@@ -0,0 +1,23 @@
+--- components/crash/content/browser/BUILD.gn.orig 2019-03-15 06:37:13 UTC
++++ components/crash/content/browser/BUILD.gn
+@@ -26,10 +26,9 @@ source_set("browser") {
+ "//components/crash/content/app",
+ "//content/public/browser",
+ "//content/public/common",
+- "//third_party/breakpad:client",
+ ]
+
+- if (is_linux || is_android) {
++ if ((is_linux && !is_bsd) || is_android) {
+ set_sources_assignment_filter([])
+
+ # Want this file on both Linux and Android.
+@@ -45,7 +44,7 @@ source_set("browser") {
+
+ # This is not in the GYP build but this target includes breakpad client
+ # headers, so add the dependency here.
+- if ((is_posix && !is_ios) || is_fuchsia) {
++ if ((is_posix && !is_ios && !is_bsd) || is_fuchsia) {
+ configs += [ "//third_party/breakpad:client_config" ]
+ public_configs = [ "//third_party/breakpad:client_config" ]
+ }
diff --git a/devel/electron4/files/patch-components_crash_core_common_BUILD.gn b/devel/electron4/files/patch-components_crash_core_common_BUILD.gn
new file mode 100644
index 000000000000..53ab007587b2
--- /dev/null
+++ b/devel/electron4/files/patch-components_crash_core_common_BUILD.gn
@@ -0,0 +1,28 @@
+--- components/crash/core/common/BUILD.gn.orig 2019-03-15 06:37:13 UTC
++++ components/crash/core/common/BUILD.gn
+@@ -6,7 +6,7 @@ import("//build/buildflag_header.gni")
+
+ declare_args() {
+ # If set to true, this will stub out and disable the entire crash key system.
+- use_crash_key_stubs = is_fuchsia
++ use_crash_key_stubs = is_fuchsia || is_bsd
+ }
+
+ group("common") {
+@@ -88,7 +88,6 @@ target(crash_key_target_type, "crash_key") {
+ ]
+ }
+
+- deps += [ "//third_party/breakpad:client" ]
+ }
+ }
+
+@@ -143,7 +142,7 @@ source_set("unit_tests") {
+ sources += [ "objc_zombie_unittest.mm" ]
+ }
+
+- if (!is_mac && !is_win && !is_fuchsia) {
++ if (!is_mac && !is_win && !is_fuchsia && !is_bsd) {
+ include_dirs = [ "//third_party/breakpad/breakpad/src/" ]
+ sources += [ "crash_key_breakpad_unittest.cc" ]
+ }
diff --git a/devel/electron4/files/patch-components_download_internal_common_base__file.cc b/devel/electron4/files/patch-components_download_internal_common_base__file.cc
new file mode 100644
index 000000000000..57871d7ab2dc
--- /dev/null
+++ b/devel/electron4/files/patch-components_download_internal_common_base__file.cc
@@ -0,0 +1,11 @@
+--- components/download/internal/common/base_file.cc.orig 2019-03-15 06:37:14 UTC
++++ components/download/internal/common/base_file.cc
+@@ -446,7 +446,7 @@ DownloadInterruptReason BaseFile::LogInterruptReason(
+ return reason;
+ }
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ namespace {
+
diff --git a/devel/electron4/files/patch-components_download_quarantine_quarantine__linux.cc b/devel/electron4/files/patch-components_download_quarantine_quarantine__linux.cc
new file mode 100644
index 000000000000..ee969234e47a
--- /dev/null
+++ b/devel/electron4/files/patch-components_download_quarantine_quarantine__linux.cc
@@ -0,0 +1,49 @@
+--- components/download/quarantine/quarantine_linux.cc.orig 2019-03-15 06:37:14 UTC
++++ components/download/quarantine/quarantine_linux.cc
+@@ -2,11 +2,15 @@
+ // Use of this source code is governed by a BSD-style license that can be
+ // found in the LICENSE file.
+
++#include "build/build_config.h"
++
+ #include "components/download/quarantine/quarantine.h"
+
+ #include <stddef.h>
+ #include <sys/types.h>
++#if !defined(OS_BSD)
+ #include <sys/xattr.h>
++#endif
+
+ #include "base/files/file_path.h"
+ #include "base/files/file_util.h"
+@@ -29,17 +33,20 @@ bool SetExtendedFileAttribute(const char* path,
+ size_t value_size,
+ int flags) {
+ base::AssertBlockingAllowed();
++#if !defined(OS_BSD)
+ int result = setxattr(path, name, value, value_size, flags);
+ if (result) {
+ DPLOG(ERROR) << "Could not set extended attribute " << name << " on file "
+ << path;
+ return false;
+ }
++#endif
+ return true;
+ }
+
+ std::string GetExtendedFileAttribute(const char* path, const char* name) {
+ base::AssertBlockingAllowed();
++#if !defined(OS_BSD)
+ ssize_t len = getxattr(path, name, nullptr, 0);
+ if (len <= 0)
+ return std::string();
+@@ -49,6 +56,9 @@ std::string GetExtendedFileAttribute(const char* path,
+ if (len < static_cast<ssize_t>(buffer.size()))
+ return std::string();
+ return std::string(buffer.begin(), buffer.end());
++#else
++ return std::string();
++#endif
+ }
+
+ } // namespace
diff --git a/devel/electron4/files/patch-components_feature__engagement_public_event__constants.cc b/devel/electron4/files/patch-components_feature__engagement_public_event__constants.cc
new file mode 100644
index 000000000000..3eec881cb311
--- /dev/null
+++ b/devel/electron4/files/patch-components_feature__engagement_public_event__constants.cc
@@ -0,0 +1,14 @@
+--- components/feature_engagement/public/event_constants.cc.orig 2019-03-15 06:37:14 UTC
++++ components/feature_engagement/public/event_constants.cc
+@@ -24,9 +24,9 @@ const char kIncognitoWindowSessionTimeMet[] =
+
+ #endif // BUILDFLAG(ENABLE_DESKTOP_IN_PRODUCT_HELP)
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_IOS)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_IOS) || defined(OS_BSD)
+ const char kNewTabOpened[] = "new_tab_opened";
+-#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_IOS)
++#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_IOS) || defined(OS_BSD)
+
+ #if defined(OS_IOS)
+ const char kChromeOpened[] = "chrome_opened";
diff --git a/devel/electron4/files/patch-components_feature__engagement_public_event__constants.h b/devel/electron4/files/patch-components_feature__engagement_public_event__constants.h
new file mode 100644
index 000000000000..cf5015e6dcfd
--- /dev/null
+++ b/devel/electron4/files/patch-components_feature__engagement_public_event__constants.h
@@ -0,0 +1,20 @@
+--- components/feature_engagement/public/event_constants.h.orig 2019-03-15 06:37:14 UTC
++++ components/feature_engagement/public/event_constants.h
+@@ -42,7 +42,7 @@ extern const char kIncognitoWindowOpened[];
+ extern const char kIncognitoWindowSessionTimeMet[];
+ #endif // BUILDFLAG(ENABLE_DESKTOP_IN_PRODUCT_HELP)
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_IOS)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_IOS) || defined(OS_BSD)
+ // This event is included in the deferred onboarding events for the New Tab
+ // described above, but it is also used on iOS, so it must be compiled
+ // separately.
+@@ -50,7 +50,7 @@ extern const char kIncognitoWindowSessionTimeMet[];
+ // The user has explicitly opened a new tab via an entry point from inside of
+ // Chrome.
+ extern const char kNewTabOpened[];
+-#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_IOS)
++#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_IOS) || defined(OS_BSD)
+
+ #if defined(OS_IOS)
+ // The user has opened Chrome (cold start or from background).
diff --git a/devel/electron4/files/patch-components_feedback_anonymizer__tool.cc b/devel/electron4/files/patch-components_feedback_anonymizer__tool.cc
new file mode 100644
index 000000000000..657c8de832aa
--- /dev/null
+++ b/devel/electron4/files/patch-components_feedback_anonymizer__tool.cc
@@ -0,0 +1,14 @@
+--- components/feedback/anonymizer_tool.cc.orig 2019-03-15 06:37:14 UTC
++++ components/feedback/anonymizer_tool.cc
+@@ -11,7 +11,11 @@
+ #include "base/strings/string_util.h"
+ #include "base/strings/stringprintf.h"
+ #include "content/public/browser/browser_thread.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ using re2::RE2;
+
diff --git a/devel/electron4/files/patch-components_flags__ui_flags__state.cc b/devel/electron4/files/patch-components_flags__ui_flags__state.cc
new file mode 100644
index 000000000000..fa8f2acefa25
--- /dev/null
+++ b/devel/electron4/files/patch-components_flags__ui_flags__state.cc
@@ -0,0 +1,11 @@
+--- components/flags_ui/flags_state.cc.orig 2019-03-15 06:37:14 UTC
++++ components/flags_ui/flags_state.cc
+@@ -653,7 +653,7 @@ int FlagsState::GetCurrentPlatform() {
+ return kOsWin;
+ #elif defined(OS_CHROMEOS) // Needs to be before the OS_LINUX check.
+ return kOsCrOS;
+-#elif defined(OS_LINUX) || defined(OS_OPENBSD)
++#elif defined(OS_LINUX) || defined(OS_OPENBSD) || defined(OS_FREEBSD)
+ return kOsLinux;
+ #elif defined(OS_ANDROID)
+ return kOsAndroid;
diff --git a/devel/electron4/files/patch-components_gcm__driver_gcm__client.h b/devel/electron4/files/patch-components_gcm__driver_gcm__client.h
new file mode 100644
index 000000000000..aa2bebfdd363
--- /dev/null
+++ b/devel/electron4/files/patch-components_gcm__driver_gcm__client.h
@@ -0,0 +1,10 @@
+--- components/gcm_driver/gcm_client.h.orig 2019-03-15 06:37:14 UTC
++++ components/gcm_driver/gcm_client.h
+@@ -86,6 +86,7 @@ class GCMClient {
+ PLATFORM_CROS,
+ PLATFORM_IOS,
+ PLATFORM_ANDROID,
++ PLATFORM_BSD,
+ PLATFORM_UNSPECIFIED
+ };
+
diff --git a/devel/electron4/files/patch-components_gcm__driver_gcm__client__impl.cc b/devel/electron4/files/patch-components_gcm__driver_gcm__client__impl.cc
new file mode 100644
index 000000000000..f08ffb01cf84
--- /dev/null
+++ b/devel/electron4/files/patch-components_gcm__driver_gcm__client__impl.cc
@@ -0,0 +1,12 @@
+--- components/gcm_driver/gcm_client_impl.cc.orig 2019-03-15 06:37:14 UTC
++++ components/gcm_driver/gcm_client_impl.cc
+@@ -151,6 +151,9 @@ void ToCheckinProtoVersion(
+ case GCMClient::PLATFORM_CROS:
+ platform = checkin_proto::ChromeBuildProto_Platform_PLATFORM_CROS;
+ break;
++ case GCMClient::PLATFORM_BSD:
++ platform = checkin_proto::ChromeBuildProto_Platform_PLATFORM_LINUX;
++ break;
+ case GCMClient::PLATFORM_UNSPECIFIED:
+ // For unknown platform, return as LINUX.
+ platform = checkin_proto::ChromeBuildProto_Platform_PLATFORM_LINUX;
diff --git a/devel/electron4/files/patch-components_keyed__service_core_dependency__graph__unittest.cc b/devel/electron4/files/patch-components_keyed__service_core_dependency__graph__unittest.cc
new file mode 100644
index 000000000000..076e35b26e7f
--- /dev/null
+++ b/devel/electron4/files/patch-components_keyed__service_core_dependency__graph__unittest.cc
@@ -0,0 +1,14 @@
+--- components/keyed_service/core/dependency_graph_unittest.cc.orig 2019-03-15 06:25:41 UTC
++++ components/keyed_service/core/dependency_graph_unittest.cc
+@@ -9,7 +9,11 @@
+ #include "components/keyed_service/core/dependency_graph.h"
+ #include "components/keyed_service/core/dependency_node.h"
+ #include "testing/gtest/include/gtest/gtest.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ namespace {
+
diff --git a/devel/electron4/files/patch-components_metrics_BUILD.gn b/devel/electron4/files/patch-components_metrics_BUILD.gn
new file mode 100644
index 000000000000..c82987bba8bb
--- /dev/null
+++ b/devel/electron4/files/patch-components_metrics_BUILD.gn
@@ -0,0 +1,14 @@
+--- components/metrics/BUILD.gn.orig 2019-03-15 06:37:14 UTC
++++ components/metrics/BUILD.gn
+@@ -142,6 +142,11 @@ static_library("metrics") {
+ if (is_fuchsia) {
+ sources += [ "drive_metrics_provider_fuchsia.cc" ]
+ }
++
++ if (is_bsd) {
++ sources -= [ "system_memory_stats_recorder_linux.cc" ]
++ }
++
+ }
+
+ # The component metrics provider is a separate target because it depends upon
diff --git a/devel/electron4/files/patch-components_metrics_drive__metrics__provider__linux.cc b/devel/electron4/files/patch-components_metrics_drive__metrics__provider__linux.cc
new file mode 100644
index 000000000000..3f700bbe8df2
--- /dev/null
+++ b/devel/electron4/files/patch-components_metrics_drive__metrics__provider__linux.cc
@@ -0,0 +1,16 @@
+--- components/metrics/drive_metrics_provider_linux.cc.orig 2019-03-15 06:25:41 UTC
++++ components/metrics/drive_metrics_provider_linux.cc
+@@ -4,7 +4,13 @@
+
+ #include "components/metrics/drive_metrics_provider.h"
+
++#if defined(OS_BSD)
++#include <sys/types.h>
++#define MAJOR(dev) major(dev)
++#define MINOR(dev) minor(dev)
++#else
+ #include <linux/kdev_t.h> // For MAJOR()/MINOR().
++#endif
+ #include <sys/stat.h>
+ #include <string>
+
diff --git a/devel/electron4/files/patch-components_metrics_system__memory__stats__recorder__linux.cc b/devel/electron4/files/patch-components_metrics_system__memory__stats__recorder__linux.cc
new file mode 100644
index 000000000000..dd00fef551a0
--- /dev/null
+++ b/devel/electron4/files/patch-components_metrics_system__memory__stats__recorder__linux.cc
@@ -0,0 +1,18 @@
+--- components/metrics/system_memory_stats_recorder_linux.cc.orig 2019-03-15 06:25:41 UTC
++++ components/metrics/system_memory_stats_recorder_linux.cc
+@@ -30,6 +30,7 @@ namespace metrics {
+ UMA_HISTOGRAM_LINEAR(name, sample, 2500, 50)
+
+ void RecordMemoryStats(RecordMemoryStatsType type) {
++#if !defined(OS_FREEBSD)
+ base::SystemMemoryInfoKB memory;
+ if (!base::GetSystemMemoryInfo(&memory))
+ return;
+@@ -93,6 +94,7 @@ void RecordMemoryStats(RecordMemoryStatsType type) {
+ break;
+ }
+ }
++#endif // !defined(OS_FREEBSD)
+ }
+
+ } // namespace metrics
diff --git a/devel/electron4/files/patch-components_neterror_resources_neterror.js b/devel/electron4/files/patch-components_neterror_resources_neterror.js
new file mode 100644
index 000000000000..1029008e5837
--- /dev/null
+++ b/devel/electron4/files/patch-components_neterror_resources_neterror.js
@@ -0,0 +1,11 @@
+--- components/neterror/resources/neterror.js.orig 2019-03-15 06:37:14 UTC
++++ components/neterror/resources/neterror.js
+@@ -153,7 +153,7 @@ function setUpCachedButton(buttonStrings) {
+ }
+
+ var primaryControlOnLeft = true;
+-// <if expr="is_macosx or is_ios or is_linux or is_android">
++// <if expr="is_macosx or is_ios or is_linux or is_android or is_bsd">
+ primaryControlOnLeft = false;
+ // </if>
+
diff --git a/devel/electron4/files/patch-components_network__session__configurator_browser_network__session__configurator.cc b/devel/electron4/files/patch-components_network__session__configurator_browser_network__session__configurator.cc
new file mode 100644
index 000000000000..0623dbc92c1e
--- /dev/null
+++ b/devel/electron4/files/patch-components_network__session__configurator_browser_network__session__configurator.cc
@@ -0,0 +1,11 @@
+--- components/network_session_configurator/browser/network_session_configurator.cc.orig 2019-03-15 06:37:14 UTC
++++ components/network_session_configurator/browser/network_session_configurator.cc
+@@ -591,7 +591,7 @@ net::URLRequestContextBuilder::HttpCacheParams::Type C
+ }
+ #endif // #if !defined(OS_ANDROID)
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ return net::URLRequestContextBuilder::HttpCacheParams::DISK_SIMPLE;
+ #else
+ return net::URLRequestContextBuilder::HttpCacheParams::DISK_BLOCKFILE;
diff --git a/devel/electron4/files/patch-components_new__or__sad__tab__strings.grdp b/devel/electron4/files/patch-components_new__or__sad__tab__strings.grdp
new file mode 100644
index 000000000000..2c06c9bb3118
--- /dev/null
+++ b/devel/electron4/files/patch-components_new__or__sad__tab__strings.grdp
@@ -0,0 +1,38 @@
+--- components/new_or_sad_tab_strings.grdp.orig 2019-03-15 06:37:14 UTC
++++ components/new_or_sad_tab_strings.grdp
+@@ -51,7 +51,7 @@
+ Open page in a new Incognito window (⇧⌘N)
+ </message>
+ </if>
+- <if expr="is_win or is_linux or chromeos">
++ <if expr="is_win or is_posix or chromeos">
+ <message name="IDS_SAD_TAB_RELOAD_INCOGNITO" desc="One of the bullet points displayed on the web page if a reload failed to fix the issue, advising the user to open the web page in Chrome's Incognito mode.">
+ Open page in a new Incognito window (Ctrl-Shift-N)
+ </message>
+@@ -66,7 +66,7 @@
+ Close other tabs or apps
+ </message>
+ </if>
+- <if expr="is_linux and not chromeos">
++ <if expr="is_posix and not chromeos">
+ <message name="IDS_SAD_TAB_RELOAD_CLOSE_TABS" desc="One of the bullet points displayed on the web page if a reload failed to fix the issue, advising the user to close other Chrome tabs or programs running on their computer.">
+ Close other tabs or programs
+ </message>
+@@ -76,7 +76,7 @@
+ Close other apps
+ </message>
+ </if>
+- <if expr="is_linux and not chromeos">
++ <if expr="is_posix and not chromeos">
+ <message name="IDS_SAD_TAB_RELOAD_CLOSE_NOTABS" desc="One of the bullet points displayed on the web page if a reload failed to fix the issue, advising the user to close other programs running on their computer (Linux).">
+ Close other programs
+ </message>
+@@ -91,7 +91,7 @@
+ Restart Chromium
+ </message>
+ </if>
+- <if expr="is_win or is_linux or is_macosx or chromeos">
++ <if expr="is_win or is_posix or is_macosx or chromeos">
+ <message name="IDS_SAD_TAB_RELOAD_RESTART_DEVICE" desc="One of the bullet points displayed on the web page if a reload failed to fix the issue, advising the user to restart their computer.">
+ Restart your computer
+ </message>
diff --git a/devel/electron4/files/patch-components_os__crypt_os__crypt.h b/devel/electron4/files/patch-components_os__crypt_os__crypt.h
new file mode 100644
index 000000000000..54c88bfe301d
--- /dev/null
+++ b/devel/electron4/files/patch-components_os__crypt_os__crypt.h
@@ -0,0 +1,29 @@
+--- components/os_crypt/os_crypt.h.orig 2019-03-15 06:37:14 UTC
++++ components/os_crypt/os_crypt.h
+@@ -14,7 +14,7 @@
+ #include "base/strings/string16.h"
+ #include "build/build_config.h"
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(UNIT_TEST)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD) && defined(UNIT_TEST)
+ class KeyStorageLinux;
+ #endif // defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(UNIT_TEST)
+
+@@ -28,7 +28,7 @@ struct Config;
+ // true for Linux, if a password management tool is available.
+ class OSCrypt {
+ public:
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // Set the configuration of OSCrypt.
+ static void SetConfig(std::unique_ptr<os_crypt::Config> config);
+
+@@ -67,7 +67,7 @@ class OSCrypt {
+ DISALLOW_IMPLICIT_CONSTRUCTORS(OSCrypt);
+ };
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(UNIT_TEST)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD) && defined(UNIT_TEST)
+ // For unit testing purposes, inject methods to be used.
+ // |get_key_storage_mock| provides the desired |KeyStorage| implementation.
+ // If the provider returns |nullptr|, a hardcoded password will be used.
diff --git a/devel/electron4/files/patch-components_os__crypt_os__crypt__unittest.cc b/devel/electron4/files/patch-components_os__crypt_os__crypt__unittest.cc
new file mode 100644
index 000000000000..cb406f6564ca
--- /dev/null
+++ b/devel/electron4/files/patch-components_os__crypt_os__crypt__unittest.cc
@@ -0,0 +1,11 @@
+--- components/os_crypt/os_crypt_unittest.cc.orig 2019-03-15 06:37:14 UTC
++++ components/os_crypt/os_crypt_unittest.cc
+@@ -18,7 +18,7 @@
+ #include "components/os_crypt/os_crypt_mocker.h"
+ #include "testing/gtest/include/gtest/gtest.h"
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ #include "components/os_crypt/os_crypt_mocker_linux.h"
+ #endif
+
diff --git a/devel/electron4/files/patch-components_password__manager_core_browser_import_csv__reader.cc b/devel/electron4/files/patch-components_password__manager_core_browser_import_csv__reader.cc
new file mode 100644
index 000000000000..b538fee4aafc
--- /dev/null
+++ b/devel/electron4/files/patch-components_password__manager_core_browser_import_csv__reader.cc
@@ -0,0 +1,14 @@
+--- components/password_manager/core/browser/import/csv_reader.cc.orig 2019-03-15 06:37:14 UTC
++++ components/password_manager/core/browser/import/csv_reader.cc
+@@ -9,7 +9,11 @@
+ #include "base/logging.h"
+ #include "base/macros.h"
+ #include "base/strings/string_util.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ namespace {
+
diff --git a/devel/electron4/files/patch-components_plugins_renderer_plugin__placeholder.cc b/devel/electron4/files/patch-components_plugins_renderer_plugin__placeholder.cc
new file mode 100644
index 000000000000..b38a35c6292c
--- /dev/null
+++ b/devel/electron4/files/patch-components_plugins_renderer_plugin__placeholder.cc
@@ -0,0 +1,14 @@
+--- components/plugins/renderer/plugin_placeholder.cc.orig 2019-03-15 06:37:14 UTC
++++ components/plugins/renderer/plugin_placeholder.cc
+@@ -11,7 +11,11 @@
+ #include "gin/object_template_builder.h"
+ #include "third_party/blink/public/web/web_element.h"
+ #include "third_party/blink/public/web/web_plugin_container.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ namespace plugins {
+
diff --git a/devel/electron4/files/patch-components_policy_core_common_schema.cc b/devel/electron4/files/patch-components_policy_core_common_schema.cc
new file mode 100644
index 000000000000..c891ae36f902
--- /dev/null
+++ b/devel/electron4/files/patch-components_policy_core_common_schema.cc
@@ -0,0 +1,14 @@
+--- components/policy/core/common/schema.cc.orig 2019-03-15 06:37:14 UTC
++++ components/policy/core/common/schema.cc
+@@ -22,7 +22,11 @@
+ #include "components/json_schema/json_schema_constants.h"
+ #include "components/json_schema/json_schema_validator.h"
+ #include "components/policy/core/common/schema_internal.h"
++#if defined(OS_FREEBSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ namespace schema = json_schema_constants;
+
diff --git a/devel/electron4/files/patch-components_policy_resources_policy__templates.json b/devel/electron4/files/patch-components_policy_resources_policy__templates.json
new file mode 100644
index 000000000000..29283289f155
--- /dev/null
+++ b/devel/electron4/files/patch-components_policy_resources_policy__templates.json
@@ -0,0 +1,83 @@
+--- components/policy/resources/policy_templates.json.orig 2019-03-15 06:37:14 UTC
++++ components/policy/resources/policy_templates.json
+@@ -646,7 +646,7 @@
+ 'name': 'HomepageLocation',
+ 'type': 'string',
+ 'schema': { 'type': 'string' },
+- 'supported_on': ['chrome.*:8-', 'chrome_os:11-'],
++ 'supported_on': ['chrome.*:8-', 'chrome_os:11-', 'chrome.bsd:9-'],
+ 'features': {
+ 'can_be_recommended': True,
+ 'dynamic_refresh': True,
+@@ -674,7 +674,7 @@
+ 'name': 'HomepageIsNewTabPage',
+ 'type': 'main',
+ 'schema': { 'type': 'boolean' },
+- 'supported_on': ['chrome.*:8-', 'chrome_os:11-'],
++ 'supported_on': ['chrome.*:8-', 'chrome_os:11-', 'chrome.bsd:9-'],
+ 'features': {
+ 'can_be_recommended': True,
+ 'dynamic_refresh': True,
+@@ -701,7 +701,7 @@
+ 'name': 'NewTabPageLocation',
+ 'type': 'string',
+ 'schema': { 'type': 'string' },
+- 'supported_on': ['chrome.*:58-', 'chrome_os:58-'],
++ 'supported_on': ['chrome.*:58-', 'chrome_os:58-', 'chrome.bsd:9-'],
+ 'features': {
+ 'can_be_recommended': True,
+ 'dynamic_refresh': True,
+@@ -1392,7 +1392,7 @@
+ 'name': 'RemoteAccessHostMatchUsername',
+ 'type': 'main',
+ 'schema': { 'type': 'boolean' },
+- 'supported_on': ['chrome.linux:25-', 'chrome.mac:25-', 'chrome_os:42-'],
++ 'supported_on': ['chrome.linux:25-', 'chrome.mac:25-', 'chrome_os:42-', 'chrome.bsd:25-'],
+ 'features': {
+ 'dynamic_refresh': True,
+ 'per_profile': False,
+@@ -2646,7 +2646,7 @@
+ 'name': 'GSSAPILibraryName',
+ 'type': 'string',
+ 'schema': { 'type': 'string' },
+- 'supported_on': ['chrome.linux:9-'],
++ 'supported_on': ['chrome.linux:9-', 'chrome.bsd:9-'],
+ 'features': {
+ 'dynamic_refresh': False,
+ 'per_profile': False,
+@@ -2698,7 +2698,7 @@
+ 'name': 'NtlmV2Enabled',
+ 'type': 'main',
+ 'schema': { 'type': 'boolean' },
+- 'supported_on': ['chrome.linux:63-','chrome.mac:63-','chrome_os:63-','android:63-','webview_android:63-'],
++ 'supported_on': ['chrome.linux:63-','chrome.mac:63-','chrome_os:63-','android:63-','webview_android:63-', 'chrome.bsd:63-'],
+ 'features': {
+ 'dynamic_refresh': True,
+ 'per_profile': False,
+@@ -5609,7 +5609,7 @@
+ 'name': 'RequireOnlineRevocationChecksForLocalAnchors',
+ 'type': 'main',
+ 'schema': { 'type': 'boolean' },
+- 'supported_on': ['chrome_os:30-', 'chrome.linux:30-', 'chrome.win:30-'],
++ 'supported_on': ['chrome_os:30-', 'chrome.linux:30-', 'chrome.win:30-', 'chrome.bsd:30-'],
+ 'features': {
+ 'dynamic_refresh': True,
+ 'per_profile': False,
+@@ -6625,7 +6625,7 @@
+ 'name': 'BackgroundModeEnabled',
+ 'type': 'main',
+ 'schema': { 'type': 'boolean' },
+- 'supported_on': ['chrome.win:19-', 'chrome.linux:19-'],
++ 'supported_on': ['chrome.win:19-', 'chrome.linux:19-', 'chrome.bsd:19-'],
+ 'features': {
+ 'can_be_recommended': True,
+ 'dynamic_refresh': True,
+@@ -7140,7 +7140,7 @@
+ 'name': 'FullscreenAllowed',
+ 'type': 'main',
+ 'schema': { 'type': 'boolean' },
+- 'supported_on': ['chrome.win:31-', 'chrome.linux:31-', 'chrome_os:31-'],
++ 'supported_on': ['chrome.win:31-', 'chrome.linux:31-', 'chrome_os:31-', 'chrome.bsd:31-'],
+ 'features': {
+ 'dynamic_refresh': True,
+ 'per_profile': True,
diff --git a/devel/electron4/files/patch-components_policy_tools_generate__policy__source.py b/devel/electron4/files/patch-components_policy_tools_generate__policy__source.py
new file mode 100644
index 000000000000..442cc906648a
--- /dev/null
+++ b/devel/electron4/files/patch-components_policy_tools_generate__policy__source.py
@@ -0,0 +1,20 @@
+--- components/policy/tools/generate_policy_source.py.orig 2019-03-15 06:37:17 UTC
++++ components/policy/tools/generate_policy_source.py
+@@ -92,7 +92,7 @@ class PolicyDetails:
+ raise RuntimeError('is_device_only is only allowed for Chrome OS: "%s"'
+ % p)
+ if platform not in ['chrome_frame', 'chrome_os',
+- 'android', 'webview_android',
++ 'android', 'webview_android', 'chrome.bsd',
+ 'chrome.win', 'chrome.linux', 'chrome.mac',
+ 'chrome.fuchsia', 'chrome.*']:
+ raise RuntimeError('Platform "%s" is not supported' % platform)
+@@ -112,7 +112,7 @@ class PolicyDetails:
+ if platform.startswith('chrome.'):
+ platform_sub = platform[7:]
+ if platform_sub == '*':
+- self.platforms.extend(['win', 'mac', 'linux', 'fuchsia'])
++ self.platforms.extend(['win', 'mac', 'linux', 'fuchsia', 'freebsd'])
+ else:
+ self.platforms.append(platform_sub)
+ else:
diff --git a/devel/electron4/files/patch-components_previews_core_previews__features.cc b/devel/electron4/files/patch-components_previews_core_previews__features.cc
new file mode 100644
index 000000000000..99b9a7dc4abc
--- /dev/null
+++ b/devel/electron4/files/patch-components_previews_core_previews__features.cc
@@ -0,0 +1,11 @@
+--- components/previews/core/previews_features.cc.orig 2019-03-15 06:37:17 UTC
++++ components/previews/core/previews_features.cc
+@@ -14,7 +14,7 @@ namespace features {
+ // are enabled are controlled by other features.
+ const base::Feature kPreviews {
+ "Previews",
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ // Previews allowed for Android (but also allow on Linux for dev/debug).
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else // !defined(OS_ANDROID) || defined(OS_LINUX)
diff --git a/devel/electron4/files/patch-components_services_filesystem_file__system__app.cc b/devel/electron4/files/patch-components_services_filesystem_file__system__app.cc
new file mode 100644
index 000000000000..7cd6e765c19a
--- /dev/null
+++ b/devel/electron4/files/patch-components_services_filesystem_file__system__app.cc
@@ -0,0 +1,20 @@
+--- components/services/filesystem/file_system_app.cc.orig 2019-03-15 06:37:17 UTC
++++ components/services/filesystem/file_system_app.cc
+@@ -20,7 +20,7 @@
+ #elif defined(OS_ANDROID)
+ #include "base/base_paths_android.h"
+ #include "base/path_service.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/environment.h"
+ #include "base/nix/xdg_util.h"
+ #elif defined(OS_MACOSX)
+@@ -75,7 +75,7 @@ base::FilePath FileSystemApp::GetUserDataDir() {
+ CHECK(base::PathService::Get(base::DIR_APP_DATA, &path));
+ #elif defined(OS_ANDROID)
+ CHECK(base::PathService::Get(base::DIR_ANDROID_APP_DATA, &path));
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ std::unique_ptr<base::Environment> env(base::Environment::Create());
+ path = base::nix::GetXDGDirectory(
+ env.get(), base::nix::kXdgConfigHomeEnvVar, base::nix::kDotConfigDir);
diff --git a/devel/electron4/files/patch-components_services_font_font__service__app.cc b/devel/electron4/files/patch-components_services_font_font__service__app.cc
new file mode 100644
index 000000000000..47844fc9f181
--- /dev/null
+++ b/devel/electron4/files/patch-components_services_font_font__service__app.cc
@@ -0,0 +1,11 @@
+--- components/services/font/font_service_app.cc.orig 2019-03-15 06:37:17 UTC
++++ components/services/font/font_service_app.cc
+@@ -20,7 +20,7 @@
+ #include "components/services/font/ppapi_fontconfig_matching.h" // nogncheck
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/test/fontconfig_util_linux.h"
+ #endif
+
diff --git a/devel/electron4/files/patch-components_storage__monitor_BUILD.gn b/devel/electron4/files/patch-components_storage__monitor_BUILD.gn
new file mode 100644
index 000000000000..7e99c5c2728c
--- /dev/null
+++ b/devel/electron4/files/patch-components_storage__monitor_BUILD.gn
@@ -0,0 +1,20 @@
+--- components/storage_monitor/BUILD.gn.orig 2019-03-15 06:37:17 UTC
++++ components/storage_monitor/BUILD.gn
+@@ -65,6 +65,17 @@ static_library("storage_monitor") {
+ ]
+ }
+
++ if (is_bsd) {
++ sources -= [
++ "mtab_watcher_linux.cc",
++ "mtab_watcher_linux.h",
++ ]
++ sources += [
++ "storage_monitor_freebsd.cc",
++ "storage_monitor_freebsd.h",
++ ]
++ }
++
+ if (use_udev) {
+ deps += [ "//device/udev_linux" ]
+ } else if (is_linux) {
diff --git a/devel/electron4/files/patch-components_storage__monitor_removable__device__constants.cc b/devel/electron4/files/patch-components_storage__monitor_removable__device__constants.cc
new file mode 100644
index 000000000000..561e2d810f31
--- /dev/null
+++ b/devel/electron4/files/patch-components_storage__monitor_removable__device__constants.cc
@@ -0,0 +1,11 @@
+--- components/storage_monitor/removable_device_constants.cc.orig 2019-03-15 06:25:42 UTC
++++ components/storage_monitor/removable_device_constants.cc
+@@ -10,7 +10,7 @@ namespace storage_monitor {
+ const char kFSUniqueIdPrefix[] = "UUID:";
+ const char kVendorModelSerialPrefix[] = "VendorModelSerial:";
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ const char kVendorModelVolumeStoragePrefix[] = "VendorModelVolumeStorage:";
+ #endif
+
diff --git a/devel/electron4/files/patch-components_storage__monitor_removable__device__constants.h b/devel/electron4/files/patch-components_storage__monitor_removable__device__constants.h
new file mode 100644
index 000000000000..1ff748d47d15
--- /dev/null
+++ b/devel/electron4/files/patch-components_storage__monitor_removable__device__constants.h
@@ -0,0 +1,11 @@
+--- components/storage_monitor/removable_device_constants.h.orig 2019-03-15 06:25:42 UTC
++++ components/storage_monitor/removable_device_constants.h
+@@ -15,7 +15,7 @@ namespace storage_monitor {
+ extern const char kFSUniqueIdPrefix[];
+ extern const char kVendorModelSerialPrefix[];
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ extern const char kVendorModelVolumeStoragePrefix[];
+ #endif
+
diff --git a/devel/electron4/files/patch-components_storage__monitor_storage__monitor__freebsd.cc b/devel/electron4/files/patch-components_storage__monitor_storage__monitor__freebsd.cc
new file mode 100644
index 000000000000..809e21cf13d7
--- /dev/null
+++ b/devel/electron4/files/patch-components_storage__monitor_storage__monitor__freebsd.cc
@@ -0,0 +1,57 @@
+--- components/storage_monitor/storage_monitor_freebsd.cc.orig 2019-03-16 09:16:47 UTC
++++ components/storage_monitor/storage_monitor_freebsd.cc
+@@ -0,0 +1,54 @@
++// Copyright 2014 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++// StorageMonitorFreeBSD implementation.
++
++#include "components/storage_monitor/storage_monitor_freebsd.h"
++
++#include <stdio.h>
++
++#include <list>
++
++#include "base/bind.h"
++#include "base/metrics/histogram.h"
++#include "base/process/kill.h"
++#include "base/process/launch.h"
++#include "base/stl_util.h"
++#include "base/strings/string_number_conversions.h"
++#include "base/strings/string_util.h"
++#include "base/strings/utf_string_conversions.h"
++#include "components/storage_monitor/media_storage_util.h"
++#include "components/storage_monitor/removable_device_constants.h"
++#include "components/storage_monitor/storage_info.h"
++
++using content::BrowserThread;
++
++namespace storage_monitor {
++
++namespace {
++
++} // namespace
++
++StorageMonitorFreeBSD::StorageMonitorFreeBSD() {
++ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
++}
++
++StorageMonitorFreeBSD::~StorageMonitorFreeBSD() {
++ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
++}
++
++void StorageMonitorFreeBSD::Init() {
++}
++
++bool StorageMonitorFreeBSD::GetStorageInfoForPath(
++ const base::FilePath& path,
++ StorageInfo* device_info) const {
++ return false; // TODO
++}
++
++StorageMonitor* StorageMonitor::CreateInternal() {
++ return new StorageMonitorFreeBSD();
++}
++
++} // namespace storage_monitor
diff --git a/devel/electron4/files/patch-components_storage__monitor_storage__monitor__freebsd.h b/devel/electron4/files/patch-components_storage__monitor_storage__monitor__freebsd.h
new file mode 100644
index 000000000000..a5607d315055
--- /dev/null
+++ b/devel/electron4/files/patch-components_storage__monitor_storage__monitor__freebsd.h
@@ -0,0 +1,48 @@
+--- components/storage_monitor/storage_monitor_freebsd.h.orig 2019-03-16 09:16:47 UTC
++++ components/storage_monitor/storage_monitor_freebsd.h
+@@ -0,0 +1,45 @@
++// Copyright 2014 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++// StorageMonitorFreeBSD processes mount point change events, notifies listeners
++// about the addition and deletion of media devices, and answers queries about
++// mounted devices.
++// StorageMonitorFreeBSD lives on the UI thread, and uses ???
++// the FILE thread to get mount point change events.
++
++#ifndef COMPONENTS_STORAGE_MONITOR_STORAGE_MONITOR_FREEBSD_H_
++#define COMPONENTS_STORAGE_MONITOR_STORAGE_MONITOR_FREEBSD_H_
++
++#include <map>
++#include <string>
++
++#include "base/compiler_specific.h"
++#include "base/files/file_path.h"
++#include "base/files/file_path_watcher.h"
++#include "base/memory/weak_ptr.h"
++#include "components/storage_monitor/storage_monitor.h"
++#include "content/public/browser/browser_thread.h"
++
++namespace storage_monitor {
++
++class StorageMonitorFreeBSD : public StorageMonitor {
++ public:
++ // Should only be called by browser start up code.
++ // Use StorageMonitor::GetInstance() instead.
++ explicit StorageMonitorFreeBSD();
++ virtual ~StorageMonitorFreeBSD();
++
++ // Must be called for StorageMonitorFreeBSD to work.
++ virtual void Init() override;
++ private:
++ // StorageMonitor implementation.
++ virtual bool GetStorageInfoForPath(const base::FilePath& path,
++ StorageInfo* device_info) const override;
++
++ DISALLOW_COPY_AND_ASSIGN(StorageMonitorFreeBSD);
++};
++
++} // namespace storage_monitor
++
++#endif // COMPONENTS_STORAGE_MONITOR_STORAGE_MONITOR_FREEBSD_H_
diff --git a/devel/electron4/files/patch-components_sync_base_get__session__name.cc b/devel/electron4/files/patch-components_sync_base_get__session__name.cc
new file mode 100644
index 000000000000..cdf82a872b5b
--- /dev/null
+++ b/devel/electron4/files/patch-components_sync_base_get__session__name.cc
@@ -0,0 +1,20 @@
+--- components/sync/base/get_session_name.cc.orig 2019-03-15 06:37:19 UTC
++++ components/sync/base/get_session_name.cc
+@@ -17,7 +17,7 @@
+
+ #if defined(OS_CHROMEOS)
+ #include "chromeos/system/devicetype.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "components/sync/base/get_session_name_linux.h"
+ #elif defined(OS_IOS)
+ #include "components/sync/base/get_session_name_ios.h"
+@@ -54,7 +54,7 @@ std::string GetSessionNameSynchronously() {
+ session_name = "Chromebook";
+ break;
+ }
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ session_name = internal::GetHostname();
+ #elif defined(OS_IOS)
+ session_name = internal::GetComputerName();
diff --git a/devel/electron4/files/patch-components_sync_base_get__session__name__linux.cc b/devel/electron4/files/patch-components_sync_base_get__session__name__linux.cc
new file mode 100644
index 000000000000..c7a5b3259f20
--- /dev/null
+++ b/devel/electron4/files/patch-components_sync_base_get__session__name__linux.cc
@@ -0,0 +1,14 @@
+--- components/sync/base/get_session_name_linux.cc.orig 2019-03-15 06:25:43 UTC
++++ components/sync/base/get_session_name_linux.cc
+@@ -13,8 +13,9 @@ namespace syncer {
+ namespace internal {
+
+ std::string GetHostname() {
+- char hostname[HOST_NAME_MAX];
+- if (gethostname(hostname, HOST_NAME_MAX) == 0) // Success.
++ int len = sysconf(_SC_HOST_NAME_MAX);
++ char hostname[len];
++ if (gethostname(hostname, len) == 0) // Success.
+ return hostname;
+ return base::GetLinuxDistro();
+ }
diff --git a/devel/electron4/files/patch-components_update__client_update__query__params.cc b/devel/electron4/files/patch-components_update__client_update__query__params.cc
new file mode 100644
index 000000000000..a1fbde7ad4ed
--- /dev/null
+++ b/devel/electron4/files/patch-components_update__client_update__query__params.cc
@@ -0,0 +1,11 @@
+--- components/update_client/update_query_params.cc.orig 2019-03-15 06:37:19 UTC
++++ components/update_client/update_query_params.cc
+@@ -38,6 +38,8 @@ const char kOs[] =
+ "fuchsia";
+ #elif defined(OS_OPENBSD)
+ "openbsd";
++#elif defined(OS_FREEBSD)
++ "freebsd";
+ #else
+ #error "unknown os"
+ #endif
diff --git a/devel/electron4/files/patch-components_url__matcher_regex__set__matcher.cc b/devel/electron4/files/patch-components_url__matcher_regex__set__matcher.cc
new file mode 100644
index 000000000000..fc7fc6e066e5
--- /dev/null
+++ b/devel/electron4/files/patch-components_url__matcher_regex__set__matcher.cc
@@ -0,0 +1,16 @@
+--- components/url_matcher/regex_set_matcher.cc.orig 2019-03-15 06:37:19 UTC
++++ components/url_matcher/regex_set_matcher.cc
+@@ -11,8 +11,13 @@
+ #include "base/logging.h"
+ #include "base/strings/string_util.h"
+ #include "components/url_matcher/substring_set_matcher.h"
++#if defined(OS_BSD)
++#include <re2/filtered_re2.h>
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/filtered_re2.h"
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ namespace url_matcher {
+
diff --git a/devel/electron4/files/patch-components_url__matcher_url__matcher__factory.cc b/devel/electron4/files/patch-components_url__matcher_url__matcher__factory.cc
new file mode 100644
index 000000000000..1b45923d8325
--- /dev/null
+++ b/devel/electron4/files/patch-components_url__matcher_url__matcher__factory.cc
@@ -0,0 +1,14 @@
+--- components/url_matcher/url_matcher_factory.cc.orig 2019-03-15 06:37:19 UTC
++++ components/url_matcher/url_matcher_factory.cc
+@@ -16,7 +16,11 @@
+ #include "base/values.h"
+ #include "components/url_matcher/url_matcher_constants.h"
+ #include "components/url_matcher/url_matcher_helpers.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ namespace url_matcher {
+
diff --git a/devel/electron4/files/patch-components_webcrypto_algorithms_test__helpers.cc b/devel/electron4/files/patch-components_webcrypto_algorithms_test__helpers.cc
new file mode 100644
index 000000000000..096720a219ad
--- /dev/null
+++ b/devel/electron4/files/patch-components_webcrypto_algorithms_test__helpers.cc
@@ -0,0 +1,14 @@
+--- components/webcrypto/algorithms/test_helpers.cc.orig 2019-03-15 06:37:19 UTC
++++ components/webcrypto/algorithms/test_helpers.cc
+@@ -25,7 +25,11 @@
+ #include "components/webcrypto/status.h"
+ #include "third_party/blink/public/platform/web_crypto_algorithm_params.h"
+ #include "third_party/blink/public/platform/web_crypto_key_algorithm.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ namespace webcrypto {
+
diff --git a/devel/electron4/files/patch-content_app_content__main__runner__impl.cc b/devel/electron4/files/patch-content_app_content__main__runner__impl.cc
new file mode 100644
index 000000000000..7cd5745d6776
--- /dev/null
+++ b/devel/electron4/files/patch-content_app_content__main__runner__impl.cc
@@ -0,0 +1,29 @@
+--- content/app/content_main_runner_impl.cc.orig 2019-03-16 09:15:21 UTC
++++ content/app/content_main_runner_impl.cc
+@@ -85,10 +85,10 @@
+ #include "base/posix/global_descriptors.h"
+ #include "content/public/common/content_descriptors.h"
+
+-#if !defined(OS_MACOSX)
++#if !defined(OS_MACOSX) && !defined(OS_BSD)
+ #include "services/service_manager/zygote/common/zygote_fork_delegate_linux.h"
+ #endif
+-#if !defined(OS_MACOSX) && !defined(OS_ANDROID)
++#if !defined(OS_MACOSX) && !defined(OS_ANDROID) && !defined(OS_BSD)
+ #include "sandbox/linux/services/libc_interceptor.h"
+ #include "services/service_manager/zygote/zygote_main.h"
+ #endif
+@@ -688,11 +688,11 @@ int ContentMainRunnerImpl::Initialize(const ContentMai
+ base::GlobalDescriptors::kBaseDescriptor);
+ #endif // !OS_ANDROID
+
+-#if defined(OS_LINUX) || defined(OS_OPENBSD)
++#if defined(OS_LINUX)
+ g_fds->Set(service_manager::kCrashDumpSignal,
+ service_manager::kCrashDumpSignal +
+ base::GlobalDescriptors::kBaseDescriptor);
+-#endif // OS_LINUX || OS_OPENBSD
++#endif // OS_LINUX
+
+ #endif // !OS_WIN
+
diff --git a/devel/electron4/files/patch-content_browser_BUILD.gn b/devel/electron4/files/patch-content_browser_BUILD.gn
new file mode 100644
index 000000000000..441879f3d2de
--- /dev/null
+++ b/devel/electron4/files/patch-content_browser_BUILD.gn
@@ -0,0 +1,14 @@
+--- content/browser/BUILD.gn.orig 2019-03-15 06:37:19 UTC
++++ content/browser/BUILD.gn
+@@ -1817,11 +1817,6 @@ jumbo_source_set("browser") {
+ "tracing/cros_tracing_agent.cc",
+ "tracing/cros_tracing_agent.h",
+ ]
+- } else {
+- sources += [
+- "memory/memory_monitor_linux.cc",
+- "memory/memory_monitor_linux.h",
+- ]
+ }
+
+ if (is_chromeos || is_android || is_chromecast) {
diff --git a/devel/electron4/files/patch-content_browser_browser__main__loop.cc b/devel/electron4/files/patch-content_browser_browser__main__loop.cc
new file mode 100644
index 000000000000..b9b2e2f72958
--- /dev/null
+++ b/devel/electron4/files/patch-content_browser_browser__main__loop.cc
@@ -0,0 +1,28 @@
+--- content/browser/browser_main_loop.cc.orig 2019-03-16 09:15:20 UTC
++++ content/browser/browser_main_loop.cc
+@@ -238,6 +238,13 @@
+ #include "base/mac/foundation_util.h"
+ #endif
+
++#if defined(OS_BSD)
++#include "content/browser/sandbox_host_linux.h"
++#include "services/service_manager/zygote/common/common_sandbox_support_linux.h"
++#include "content/public/common/common_sandbox_support_linux.h"
++#include "services/service_manager/sandbox/sandbox.h"
++#endif
++
+ // One of the linux specific headers defines this as a macro.
+ #ifdef DestroyAll
+ #undef DestroyAll
+@@ -587,6 +594,11 @@ int BrowserMainLoop::EarlyInitialization() {
+ // by now since a thread to start the ServiceManager has been created
+ // before the browser main loop starts.
+ DCHECK(SandboxHostLinux::GetInstance()->IsInitialized());
++#elif defined(OS_BSD)
++ SandboxHostLinux::GetInstance()->Init();
++ base::FileHandleMappingVector fds_to_map;
++ const int sfd = SandboxHostLinux::GetInstance()->GetChildSocket();
++ fds_to_map.push_back(std::make_pair(sfd, service_manager::GetSandboxFD()));
+ #endif
+
+ #if defined(USE_X11)
diff --git a/devel/electron4/files/patch-content_browser_child__process__launcher__helper__linux.cc b/devel/electron4/files/patch-content_browser_child__process__launcher__helper__linux.cc
new file mode 100644
index 000000000000..3418a8f6d87e
--- /dev/null
+++ b/devel/electron4/files/patch-content_browser_child__process__launcher__helper__linux.cc
@@ -0,0 +1,76 @@
+--- content/browser/child_process_launcher_helper_linux.cc.orig 2019-03-15 06:37:20 UTC
++++ content/browser/child_process_launcher_helper_linux.cc
+@@ -17,7 +17,9 @@
+ #include "content/public/common/sandboxed_process_launcher_delegate.h"
+ #include "services/service_manager/sandbox/linux/sandbox_linux.h"
+ #include "services/service_manager/zygote/common/common_sandbox_support_linux.h"
++#if !defined(OS_BSD)
+ #include "services/service_manager/zygote/common/zygote_handle.h"
++#endif
+ #include "services/service_manager/zygote/host/zygote_communication_linux.h"
+ #include "services/service_manager/zygote/host/zygote_host_impl_linux.h"
+
+@@ -69,6 +71,7 @@ ChildProcessLauncherHelper::LaunchProcessOnLauncherThr
+ int* launch_result) {
+ *is_synchronous_launch = true;
+
++#if !defined(OS_BSD)
+ service_manager::ZygoteHandle zygote_handle =
+ base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kNoZygote)
+ ? nullptr
+@@ -82,7 +85,6 @@ ChildProcessLauncherHelper::LaunchProcessOnLauncherThr
+ GetProcessType());
+ *launch_result = LAUNCH_RESULT_SUCCESS;
+
+-#if !defined(OS_OPENBSD)
+ if (handle) {
+ // This is just a starting score for a renderer or extension (the
+ // only types of processes that will be started this way). It will
+@@ -93,13 +95,13 @@ ChildProcessLauncherHelper::LaunchProcessOnLauncherThr
+ service_manager::ZygoteHostImpl::GetInstance()->AdjustRendererOOMScore(
+ handle, kLowestRendererOomScore);
+ }
+-#endif
+
+ Process process;
+ process.process = base::Process(handle);
+ process.zygote = zygote_handle;
+ return process;
+ }
++#endif
+
+ Process process;
+ process.process = base::LaunchProcess(*command_line(), options);
+@@ -117,10 +119,14 @@ ChildProcessTerminationInfo ChildProcessLauncherHelper
+ const ChildProcessLauncherHelper::Process& process,
+ bool known_dead) {
+ ChildProcessTerminationInfo info;
++#if !defined(OS_BSD)
+ if (process.zygote) {
+ info.status = process.zygote->GetTerminationStatus(
+ process.process.Handle(), known_dead, &info.exit_code);
+ } else if (known_dead) {
++#else
++ if (known_dead) {
++#endif
+ info.status = base::GetKnownDeadTerminationStatus(process.process.Handle(),
+ &info.exit_code);
+ } else {
+@@ -144,13 +150,17 @@ void ChildProcessLauncherHelper::ForceNormalProcessTer
+ DCHECK(CurrentlyOnProcessLauncherTaskRunner());
+ process.process.Terminate(service_manager::RESULT_CODE_NORMAL_EXIT, false);
+ // On POSIX, we must additionally reap the child.
++#if !defined(OS_BSD)
+ if (process.zygote) {
+ // If the renderer was created via a zygote, we have to proxy the reaping
+ // through the zygote process.
+ process.zygote->EnsureProcessTerminated(process.process.Handle());
+ } else {
++#endif
+ base::EnsureProcessTerminated(std::move(process.process));
++#if !defined(OS_BSD)
+ }
++#endif
+ }
+
+ void ChildProcessLauncherHelper::SetProcessPriorityOnLauncherThread(
diff --git a/devel/electron4/files/patch-content_browser_media_media__internals.cc b/devel/electron4/files/patch-content_browser_media_media__internals.cc
new file mode 100644
index 000000000000..9f0c2dfbc6fe
--- /dev/null
+++ b/devel/electron4/files/patch-content_browser_media_media__internals.cc
@@ -0,0 +1,11 @@
+--- content/browser/media/media_internals.cc.orig 2019-03-15 06:37:20 UTC
++++ content/browser/media/media_internals.cc
+@@ -724,7 +724,7 @@ void MediaInternals::UpdateVideoCaptureDeviceCapabilit
+ device_dict->SetString("name", descriptor.GetNameAndModel());
+ device_dict->Set("formats", std::move(format_list));
+ #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
+- defined(OS_ANDROID)
++ defined(OS_ANDROID) || defined(OS_BSD)
+ device_dict->SetString("captureApi", descriptor.GetCaptureApiTypeString());
+ #endif
+ video_capture_capabilities_cached_data_.Append(std::move(device_dict));
diff --git a/devel/electron4/files/patch-content_browser_memory_memory__monitor.cc b/devel/electron4/files/patch-content_browser_memory_memory__monitor.cc
new file mode 100644
index 000000000000..02baaf048f92
--- /dev/null
+++ b/devel/electron4/files/patch-content_browser_memory_memory__monitor.cc
@@ -0,0 +1,11 @@
+--- content/browser/memory/memory_monitor.cc.orig 2019-03-15 06:25:43 UTC
++++ content/browser/memory/memory_monitor.cc
+@@ -22,7 +22,7 @@ void MemoryMonitorDelegate::GetSystemMemoryInfo(
+ base::GetSystemMemoryInfo(mem_info);
+ }
+
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ // TODO(bashi,bcwhite): Remove when memory monitor for mac is available.
+ std::unique_ptr<MemoryMonitor> CreateMemoryMonitor() {
+ NOTREACHED();
diff --git a/devel/electron4/files/patch-content_browser_memory_swap__metrics__driver__impl__linux.cc b/devel/electron4/files/patch-content_browser_memory_swap__metrics__driver__impl__linux.cc
new file mode 100644
index 000000000000..4e395b9bdb59
--- /dev/null
+++ b/devel/electron4/files/patch-content_browser_memory_swap__metrics__driver__impl__linux.cc
@@ -0,0 +1,16 @@
+--- content/browser/memory/swap_metrics_driver_impl_linux.cc.orig 2019-03-15 06:25:43 UTC
++++ content/browser/memory/swap_metrics_driver_impl_linux.cc
+@@ -44,9 +44,13 @@ SwapMetricsDriverImplLinux::~SwapMetricsDriverImplLinu
+ SwapMetricsDriver::SwapMetricsUpdateResult
+ SwapMetricsDriverImplLinux::UpdateMetricsInternal(base::TimeDelta interval) {
+ base::VmStatInfo vmstat;
++#if !defined(OS_BSD)
+ if (!base::GetVmStatInfo(&vmstat)) {
+ return SwapMetricsDriver::SwapMetricsUpdateResult::kSwapMetricsUpdateFailed;
+ }
++#else
++ return SwapMetricsDriver::SwapMetricsUpdateResult::kSwapMetricsUpdateFailed;
++#endif
+
+ uint64_t in_counts = vmstat.pswpin - last_pswpin_;
+ uint64_t out_counts = vmstat.pswpout - last_pswpout_;
diff --git a/devel/electron4/files/patch-content_browser_renderer__host_input_input__device__change__observer.cc b/devel/electron4/files/patch-content_browser_renderer__host_input_input__device__change__observer.cc
new file mode 100644
index 000000000000..c5dd15599161
--- /dev/null
+++ b/devel/electron4/files/patch-content_browser_renderer__host_input_input__device__change__observer.cc
@@ -0,0 +1,29 @@
+--- content/browser/renderer_host/input/input_device_change_observer.cc.orig 2019-03-15 06:37:20 UTC
++++ content/browser/renderer_host/input/input_device_change_observer.cc
+@@ -9,7 +9,7 @@
+
+ #if defined(OS_WIN)
+ #include "ui/events/devices/input_device_observer_win.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/events/devices/input_device_manager.h"
+ #elif defined(OS_ANDROID)
+ #include "ui/events/devices/input_device_observer_android.h"
+@@ -21,7 +21,7 @@ InputDeviceChangeObserver::InputDeviceChangeObserver(R
+ render_view_host_ = rvh;
+ #if defined(OS_WIN)
+ ui::InputDeviceObserverWin::GetInstance()->AddObserver(this);
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ ui::InputDeviceManager::GetInstance()->AddObserver(this);
+ #elif defined(OS_ANDROID)
+ ui::InputDeviceObserverAndroid::GetInstance()->AddObserver(this);
+@@ -31,7 +31,7 @@ InputDeviceChangeObserver::InputDeviceChangeObserver(R
+ InputDeviceChangeObserver::~InputDeviceChangeObserver() {
+ #if defined(OS_WIN)
+ ui::InputDeviceObserverWin::GetInstance()->RemoveObserver(this);
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ ui::InputDeviceManager::GetInstance()->RemoveObserver(this);
+ #elif defined(OS_ANDROID)
+ ui::InputDeviceObserverAndroid::GetInstance()->RemoveObserver(this);
diff --git a/devel/electron4/files/patch-content_browser_renderer__host_render__message__filter.cc b/devel/electron4/files/patch-content_browser_renderer__host_render__message__filter.cc
new file mode 100644
index 000000000000..355d6d0a0caf
--- /dev/null
+++ b/devel/electron4/files/patch-content_browser_renderer__host_render__message__filter.cc
@@ -0,0 +1,29 @@
+--- content/browser/renderer_host/render_message_filter.cc.orig 2019-03-15 06:37:20 UTC
++++ content/browser/renderer_host/render_message_filter.cc
+@@ -73,7 +73,7 @@
+ #if defined(OS_MACOSX)
+ #include "ui/accelerated_widget_mac/window_resize_helper_mac.h"
+ #endif
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/linux_util.h"
+ #include "base/threading/platform_thread.h"
+ #endif
+@@ -165,7 +165,7 @@ void RenderMessageFilter::CreateFullscreenWidget(
+ std::move(callback).Run(route_id);
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void RenderMessageFilter::SetThreadPriorityOnFileThread(
+ base::PlatformThreadId ns_tid,
+ base::ThreadPriority priority) {
+@@ -186,7 +186,7 @@ void RenderMessageFilter::SetThreadPriorityOnFileThrea
+ }
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void RenderMessageFilter::SetThreadPriority(int32_t ns_tid,
+ base::ThreadPriority priority) {
+ constexpr base::TaskTraits kTraits = {
diff --git a/devel/electron4/files/patch-content_browser_renderer__host_render__message__filter.h b/devel/electron4/files/patch-content_browser_renderer__host_render__message__filter.h
new file mode 100644
index 000000000000..5f7dd1d48d67
--- /dev/null
+++ b/devel/electron4/files/patch-content_browser_renderer__host_render__message__filter.h
@@ -0,0 +1,19 @@
+--- content/browser/renderer_host/render_message_filter.h.orig 2019-03-15 06:37:20 UTC
++++ content/browser/renderer_host/render_message_filter.h
+@@ -110,14 +110,14 @@ class CONTENT_EXPORT RenderMessageFilter
+ const url::Origin& cache_storage_origin,
+ const std::string& cache_storage_cache_name) override;
+ void HasGpuProcess(HasGpuProcessCallback callback) override;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void SetThreadPriority(int32_t ns_tid,
+ base::ThreadPriority priority) override;
+ #endif
+
+ void OnResolveProxy(const GURL& url, IPC::Message* reply_msg);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void SetThreadPriorityOnFileThread(base::PlatformThreadId ns_tid,
+ base::ThreadPriority priority);
+ #endif
diff --git a/devel/electron4/files/patch-content_browser_renderer__host_render__process__host__impl.h b/devel/electron4/files/patch-content_browser_renderer__host_render__process__host__impl.h
new file mode 100644
index 000000000000..ced1b1e6a67f
--- /dev/null
+++ b/devel/electron4/files/patch-content_browser_renderer__host_render__process__host__impl.h
@@ -0,0 +1,15 @@
+--- content/browser/renderer_host/render_process_host_impl.h.orig 2019-03-15 06:37:20 UTC
++++ content/browser/renderer_host/render_process_host_impl.h
+@@ -343,10 +343,10 @@ class CONTENT_EXPORT RenderProcessHostImpl
+ is_for_guests_only_ = is_for_guests_only;
+ }
+
+-#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ // Launch the zygote early in the browser startup.
+ static void EarlyZygoteLaunch();
+-#endif // defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX)
++#endif // defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX) && !defined(OS_BSD)
+
+ void RecomputeAndUpdateWebKitPreferences();
+
diff --git a/devel/electron4/files/patch-content_browser_renderer__host_render__view__host__impl.cc b/devel/electron4/files/patch-content_browser_renderer__host_render__view__host__impl.cc
new file mode 100644
index 000000000000..671b3c0ee1ce
--- /dev/null
+++ b/devel/electron4/files/patch-content_browser_renderer__host_render__view__host__impl.cc
@@ -0,0 +1,11 @@
+--- content/browser/renderer_host/render_view_host_impl.cc.orig 2019-03-15 06:37:20 UTC
++++ content/browser/renderer_host/render_view_host_impl.cc
+@@ -151,7 +151,7 @@ void GetPlatformSpecificPrefs(RendererPreferences* pre
+ display::win::ScreenWin::GetSystemMetricsInDIP(SM_CYVSCROLL);
+ prefs->arrow_bitmap_width_horizontal_scroll_bar_in_dips =
+ display::win::ScreenWin::GetSystemMetricsInDIP(SM_CXHSCROLL);
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ prefs->system_font_family_name = gfx::Font().GetFontName();
+ #endif
+ }
diff --git a/devel/electron4/files/patch-content_browser_renderer__host_render__widget__host__view__aura.cc b/devel/electron4/files/patch-content_browser_renderer__host_render__widget__host__view__aura.cc
new file mode 100644
index 000000000000..4d74fee6a68c
--- /dev/null
+++ b/devel/electron4/files/patch-content_browser_renderer__host_render__widget__host__view__aura.cc
@@ -0,0 +1,29 @@
+--- content/browser/renderer_host/render_widget_host_view_aura.cc.orig 2019-03-15 06:37:20 UTC
++++ content/browser/renderer_host/render_widget_host_view_aura.cc
+@@ -119,7 +119,7 @@
+ #include "content/browser/accessibility/browser_accessibility_auralinux.h"
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ #include "ui/base/ime/linux/text_edit_command_auralinux.h"
+ #include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h"
+ #endif
+@@ -2077,7 +2077,7 @@ bool RenderWidgetHostViewAura::NeedsInputGrab() {
+ }
+
+ bool RenderWidgetHostViewAura::NeedsMouseCapture() {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ return NeedsInputGrab();
+ #endif
+ return false;
+@@ -2277,7 +2277,7 @@ void RenderWidgetHostViewAura::ForwardKeyboardEventWit
+ if (!target_host)
+ return;
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ ui::TextEditKeyBindingsDelegateAuraLinux* keybinding_delegate =
+ ui::GetTextEditKeyBindingsDelegate();
+ std::vector<ui::TextEditCommandAuraLinux> commands;
diff --git a/devel/electron4/files/patch-content_browser_renderer__host_render__widget__host__view__event__handler.cc b/devel/electron4/files/patch-content_browser_renderer__host_render__widget__host__view__event__handler.cc
new file mode 100644
index 000000000000..975b3dd3dfb9
--- /dev/null
+++ b/devel/electron4/files/patch-content_browser_renderer__host_render__widget__host__view__event__handler.cc
@@ -0,0 +1,11 @@
+--- content/browser/renderer_host/render_widget_host_view_event_handler.cc.orig 2019-03-15 06:37:20 UTC
++++ content/browser/renderer_host/render_widget_host_view_event_handler.cc
+@@ -619,7 +619,7 @@ bool RenderWidgetHostViewEventHandler::CanRendererHand
+ if (event->type() == ui::ET_MOUSE_EXITED) {
+ if (mouse_locked || selection_popup)
+ return false;
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ // Don't forward the mouse leave message which is received when the context
+ // menu is displayed by the page. This confuses the page and causes state
+ // changes.
diff --git a/devel/electron4/files/patch-content_browser_service__worker_service__worker__fetch__dispatcher.cc b/devel/electron4/files/patch-content_browser_service__worker_service__worker__fetch__dispatcher.cc
new file mode 100644
index 000000000000..409da3bd509d
--- /dev/null
+++ b/devel/electron4/files/patch-content_browser_service__worker_service__worker__fetch__dispatcher.cc
@@ -0,0 +1,11 @@
+--- content/browser/service_worker/service_worker_fetch_dispatcher.cc.orig 2019-03-15 06:37:21 UTC
++++ content/browser/service_worker/service_worker_fetch_dispatcher.cc
+@@ -695,7 +695,7 @@ bool ServiceWorkerFetchDispatcher::MaybeStartNavigatio
+ network::ResourceRequest request;
+ request.method = original_request->method();
+ request.url = original_request->url();
+- // TODO(horo): Set site_for_cookies to support Same-site Cookies.
++ request.site_for_cookies = original_request->site_for_cookies();
+ request.request_initiator =
+ original_request->initiator().has_value()
+ ? original_request->initiator()
diff --git a/devel/electron4/files/patch-content_browser_webui_web__ui__data__source__impl.cc b/devel/electron4/files/patch-content_browser_webui_web__ui__data__source__impl.cc
new file mode 100644
index 000000000000..d1373c1f0ce9
--- /dev/null
+++ b/devel/electron4/files/patch-content_browser_webui_web__ui__data__source__impl.cc
@@ -0,0 +1,69 @@
+--- content/browser/webui/web_ui_data_source_impl.cc.orig 2019-03-15 06:37:21 UTC
++++ content/browser/webui/web_ui_data_source_impl.cc
+@@ -120,24 +120,24 @@ WebUIDataSourceImpl::WebUIDataSourceImpl(const std::st
+ WebUIDataSourceImpl::~WebUIDataSourceImpl() {
+ }
+
+-void WebUIDataSourceImpl::AddString(base::StringPiece name,
++void WebUIDataSourceImpl::AddString(const std::string& name,
+ const base::string16& value) {
+ // TODO(dschuyler): Share only one copy of these strings.
+ localized_strings_.SetKey(name, base::Value(value));
+- replacements_[name.as_string()] = base::UTF16ToUTF8(value);
++ replacements_[name] = base::UTF16ToUTF8(value);
+ }
+
+-void WebUIDataSourceImpl::AddString(base::StringPiece name,
++void WebUIDataSourceImpl::AddString(const std::string& name,
+ const std::string& value) {
+ localized_strings_.SetKey(name, base::Value(value));
+- replacements_[name.as_string()] = value;
++ replacements_[name] = value;
+ }
+
+-void WebUIDataSourceImpl::AddLocalizedString(base::StringPiece name, int ids) {
++void WebUIDataSourceImpl::AddLocalizedString(const std::string& name, int ids) {
+ std::string utf8_str =
+ base::UTF16ToUTF8(GetContentClient()->GetLocalizedString(ids));
+ localized_strings_.SetKey(name, base::Value(utf8_str));
+- replacements_[name.as_string()] = utf8_str;
++ replacements_[name] = utf8_str;
+ }
+
+ void WebUIDataSourceImpl::AddLocalizedStrings(
+@@ -147,7 +147,7 @@ void WebUIDataSourceImpl::AddLocalizedStrings(
+ &replacements_);
+ }
+
+-void WebUIDataSourceImpl::AddBoolean(base::StringPiece name, bool value) {
++void WebUIDataSourceImpl::AddBoolean(const std::string& name, bool value) {
+ localized_strings_.SetBoolean(name, value);
+ // TODO(dschuyler): Change name of |localized_strings_| to |load_time_data_|
+ // or similar. These values haven't been found as strings for
+@@ -156,21 +156,21 @@ void WebUIDataSourceImpl::AddBoolean(base::StringPiece
+ // replacements.
+ }
+
+-void WebUIDataSourceImpl::AddInteger(base::StringPiece name, int32_t value) {
++void WebUIDataSourceImpl::AddInteger(const std::string& name, int32_t value) {
+ localized_strings_.SetInteger(name, value);
+ }
+
+-void WebUIDataSourceImpl::SetJsonPath(base::StringPiece path) {
++void WebUIDataSourceImpl::SetJsonPath(const std::string& path) {
+ DCHECK(json_path_.empty());
+ DCHECK(!path.empty());
+
+- json_path_ = path.as_string();
++ json_path_ = path;
+ excluded_paths_.insert(json_path_);
+ }
+
+-void WebUIDataSourceImpl::AddResourcePath(base::StringPiece path,
++void WebUIDataSourceImpl::AddResourcePath(const std::string& path,
+ int resource_id) {
+- path_to_idr_map_[path.as_string()] = resource_id;
++ path_to_idr_map_[path] = resource_id;
+ }
+
+ void WebUIDataSourceImpl::SetDefaultResource(int resource_id) {
diff --git a/devel/electron4/files/patch-content_browser_webui_web__ui__data__source__impl.h b/devel/electron4/files/patch-content_browser_webui_web__ui__data__source__impl.h
new file mode 100644
index 000000000000..9c1f3148bc5a
--- /dev/null
+++ b/devel/electron4/files/patch-content_browser_webui_web__ui__data__source__impl.h
@@ -0,0 +1,25 @@
+--- content/browser/webui/web_ui_data_source_impl.h.orig 2019-03-15 06:37:21 UTC
++++ content/browser/webui/web_ui_data_source_impl.h
+@@ -31,15 +31,15 @@ class CONTENT_EXPORT WebUIDataSourceImpl : public URLD
+ public WebUIDataSource {
+ public:
+ // WebUIDataSource implementation:
+- void AddString(base::StringPiece name, const base::string16& value) override;
+- void AddString(base::StringPiece name, const std::string& value) override;
+- void AddLocalizedString(base::StringPiece name, int ids) override;
++ void AddString(const std::string& name, const base::string16& value) override;
++ void AddString(const std::string& name, const std::string& value) override;
++ void AddLocalizedString(const std::string& name, int ids) override;
+ void AddLocalizedStrings(
+ const base::DictionaryValue& localized_strings) override;
+- void AddBoolean(base::StringPiece name, bool value) override;
+- void AddInteger(base::StringPiece name, int32_t value) override;
+- void SetJsonPath(base::StringPiece path) override;
+- void AddResourcePath(base::StringPiece path, int resource_id) override;
++ void AddBoolean(const std::string& name, bool value) override;
++ void AddInteger(const std::string& name, int32_t value) override;
++ void SetJsonPath(const std::string& path) override;
++ void AddResourcePath(const std::string& path, int resource_id) override;
+ void SetDefaultResource(int resource_id) override;
+ void SetRequestFilter(
+ const WebUIDataSource::HandleRequestCallback& callback) override;
diff --git a/devel/electron4/files/patch-content_common_BUILD.gn b/devel/electron4/files/patch-content_common_BUILD.gn
new file mode 100644
index 000000000000..62966fa52a10
--- /dev/null
+++ b/devel/electron4/files/patch-content_common_BUILD.gn
@@ -0,0 +1,15 @@
+--- content/common/BUILD.gn.orig 2019-03-15 06:37:21 UTC
++++ content/common/BUILD.gn
+@@ -417,6 +417,12 @@ source_set("common") {
+ libs += [ "android" ]
+ }
+
++ if (is_bsd) {
++ sources -= [
++ "sandbox_init_linux.cc",
++ ]
++ }
++
+ if (is_debug && !is_component_build && enable_plugins) {
+ # Content depends on the PPAPI message logging stuff; if this isn't here,
+ # some unit test binaries won't compile. This only worked in release mode
diff --git a/devel/electron4/files/patch-content_common_common__sandbox__support__linux.cc b/devel/electron4/files/patch-content_common_common__sandbox__support__linux.cc
new file mode 100644
index 000000000000..6ad4424dfcc5
--- /dev/null
+++ b/devel/electron4/files/patch-content_common_common__sandbox__support__linux.cc
@@ -0,0 +1,10 @@
+--- content/common/common_sandbox_support_linux.cc.orig 2019-03-15 06:25:44 UTC
++++ content/common/common_sandbox_support_linux.cc
+@@ -5,6 +5,7 @@
+ #include "content/public/common/common_sandbox_support_linux.h"
+
+ #include <sys/stat.h>
++#include <unistd.h>
+
+ #include <limits>
+ #include <memory>
diff --git a/devel/electron4/files/patch-content_common_user__agent.cc b/devel/electron4/files/patch-content_common_user__agent.cc
new file mode 100644
index 000000000000..79c47f9d503a
--- /dev/null
+++ b/devel/electron4/files/patch-content_common_user__agent.cc
@@ -0,0 +1,17 @@
+--- content/common/user_agent.cc.orig 2019-03-15 06:37:22 UTC
++++ content/common/user_agent.cc
+@@ -125,6 +125,14 @@ std::string BuildOSCpuInfo() {
+ #endif
+ ); // NOLINT
+
++#if defined(OS_BSD)
++#if defined(__x86_64__)
++ base::StringAppendF(&os_cpu, "; Linux x86_64");
++#else
++ base::StringAppendF(&os_cpu, "; Linux i686");
++#endif
++#endif
++
+ return os_cpu;
+ }
+
diff --git a/devel/electron4/files/patch-content_gpu_BUILD.gn b/devel/electron4/files/patch-content_gpu_BUILD.gn
new file mode 100644
index 000000000000..8a8eea1b0d4a
--- /dev/null
+++ b/devel/electron4/files/patch-content_gpu_BUILD.gn
@@ -0,0 +1,11 @@
+--- content/gpu/BUILD.gn.orig 2019-03-15 06:37:22 UTC
++++ content/gpu/BUILD.gn
+@@ -130,7 +130,7 @@ target(link_target_type, "gpu_sources") {
+
+ # Use DRI on desktop Linux builds.
+ if (current_cpu != "s390x" && current_cpu != "ppc64" && is_desktop_linux &&
+- (!is_chromecast || is_cast_desktop_build)) {
++ (!is_chromecast || is_cast_desktop_build) && !is_bsd) {
+ configs += [ "//build/config/linux/dri" ]
+ }
+ }
diff --git a/devel/electron4/files/patch-content_gpu_gpu__main.cc b/devel/electron4/files/patch-content_gpu_gpu__main.cc
new file mode 100644
index 000000000000..111a59379b2f
--- /dev/null
+++ b/devel/electron4/files/patch-content_gpu_gpu__main.cc
@@ -0,0 +1,47 @@
+--- content/gpu/gpu_main.cc.orig 2019-03-16 09:15:21 UTC
++++ content/gpu/gpu_main.cc
+@@ -77,7 +77,7 @@
+ #include "ui/gfx/x/x11_switches.h" // nogncheck
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "content/gpu/gpu_sandbox_hook_linux.h"
+ #include "content/public/common/sandbox_init.h"
+ #include "services/service_manager/sandbox/linux/sandbox_linux.h"
+@@ -110,7 +110,7 @@ namespace content {
+
+ namespace {
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) && !defined(OS_BSD)
+ bool StartSandboxLinux(gpu::GpuWatchdogThread*,
+ const gpu::GPUInfo*,
+ const gpu::GpuPreferences&);
+@@ -171,7 +171,7 @@ class ContentSandboxHelper : public gpu::GpuSandboxHel
+ bool EnsureSandboxInitialized(gpu::GpuWatchdogThread* watchdog_thread,
+ const gpu::GPUInfo* gpu_info,
+ const gpu::GpuPreferences& gpu_prefs) override {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) && !defined(OS_BSD)
+ return StartSandboxLinux(watchdog_thread, gpu_info, gpu_prefs);
+ #elif defined(OS_WIN)
+ return StartSandboxWindows(sandbox_info_);
+@@ -355,7 +355,7 @@ int GpuMain(const MainFunctionParams& parameters) {
+
+ namespace {
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) && !defined(OS_BSD)
+ bool StartSandboxLinux(gpu::GpuWatchdogThread* watchdog_thread,
+ const gpu::GPUInfo* gpu_info,
+ const gpu::GpuPreferences& gpu_prefs) {
+@@ -390,7 +390,7 @@ bool StartSandboxLinux(gpu::GpuWatchdogThread* watchdo
+
+ return res;
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) && !defined(OS_BSD)
+
+ #if defined(OS_WIN)
+ bool StartSandboxWindows(const sandbox::SandboxInterfaceInfo* sandbox_info) {
diff --git a/devel/electron4/files/patch-content_gpu_gpu__sandbox__hook__linux.cc b/devel/electron4/files/patch-content_gpu_gpu__sandbox__hook__linux.cc
new file mode 100644
index 000000000000..0a987c7903c1
--- /dev/null
+++ b/devel/electron4/files/patch-content_gpu_gpu__sandbox__hook__linux.cc
@@ -0,0 +1,11 @@
+--- content/gpu/gpu_sandbox_hook_linux.cc.orig 2019-03-15 06:37:22 UTC
++++ content/gpu/gpu_sandbox_hook_linux.cc
+@@ -68,7 +68,7 @@ inline bool UseLibV4L2() {
+ #endif
+ }
+
+-constexpr int dlopen_flag = RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE;
++constexpr int dlopen_flag = RTLD_NOW | RTLD_GLOBAL;
+
+ void AddV4L2GpuWhitelist(
+ std::vector<BrokerFilePermission>* permissions,
diff --git a/devel/electron4/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.cc b/devel/electron4/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.cc
new file mode 100644
index 000000000000..a37b064b2501
--- /dev/null
+++ b/devel/electron4/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.cc
@@ -0,0 +1,29 @@
+--- content/ppapi_plugin/ppapi_blink_platform_impl.cc.orig 2019-03-15 06:37:22 UTC
++++ content/ppapi_plugin/ppapi_blink_platform_impl.cc
+@@ -40,7 +40,7 @@ namespace content {
+
+ class PpapiBlinkPlatformImpl::SandboxSupport : public WebSandboxSupport {
+ public:
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ explicit SandboxSupport(sk_sp<font_service::FontLoader> font_loader)
+ : font_loader_(std::move(font_loader)) {}
+ #endif
+@@ -48,7 +48,7 @@ class PpapiBlinkPlatformImpl::SandboxSupport : public
+
+ #if defined(OS_MACOSX)
+ bool LoadFont(CTFontRef srcFont, CGFontRef* out, uint32_t* fontID) override;
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ SandboxSupport();
+ void GetFallbackFontForCharacter(
+ WebUChar32 character,
+@@ -129,7 +129,7 @@ void PpapiBlinkPlatformImpl::SandboxSupport::GetWebFon
+ #endif // !defined(OS_ANDROID) && !defined(OS_WIN)
+
+ PpapiBlinkPlatformImpl::PpapiBlinkPlatformImpl() {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ font_loader_ =
+ sk_make_sp<font_service::FontLoader>(ChildThread::Get()->GetConnector());
+ SkFontConfigInterface::SetGlobal(font_loader_);
diff --git a/devel/electron4/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.h b/devel/electron4/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.h
new file mode 100644
index 000000000000..2260a2dbe158
--- /dev/null
+++ b/devel/electron4/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.h
@@ -0,0 +1,20 @@
+--- content/ppapi_plugin/ppapi_blink_platform_impl.h.orig 2019-03-15 06:37:22 UTC
++++ content/ppapi_plugin/ppapi_blink_platform_impl.h
+@@ -13,7 +13,7 @@
+ #include "build/build_config.h"
+ #include "content/child/blink_platform_impl.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "components/services/font/public/cpp/font_loader.h"
+ #include "third_party/skia/include/core/SkRefCnt.h"
+ #endif
+@@ -58,7 +58,7 @@ class PpapiBlinkPlatformImpl : public BlinkPlatformImp
+ std::unique_ptr<SandboxSupport> sandbox_support_;
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ sk_sp<font_service::FontLoader> font_loader_;
+ #endif
+
diff --git a/devel/electron4/files/patch-content_ppapi__plugin_ppapi__plugin__main.cc b/devel/electron4/files/patch-content_ppapi__plugin_ppapi__plugin__main.cc
new file mode 100644
index 000000000000..32d5adf76a24
--- /dev/null
+++ b/devel/electron4/files/patch-content_ppapi__plugin_ppapi__plugin__main.cc
@@ -0,0 +1,11 @@
+--- content/ppapi_plugin/ppapi_plugin_main.cc.orig 2019-03-15 06:37:22 UTC
++++ content/ppapi_plugin/ppapi_plugin_main.cc
+@@ -126,6 +126,8 @@ int PpapiPluginMain(const MainFunctionParams& paramete
+ service_manager::SandboxTypeFromCommandLine(command_line),
+ service_manager::SandboxLinux::PreSandboxHook(),
+ service_manager::SandboxLinux::Options());
++#elif defined(OS_BSD)
++ NOTIMPLEMENTED();
+ #endif
+
+ ChildProcess ppapi_process;
diff --git a/devel/electron4/files/patch-content_public_browser_web__ui__data__source.h b/devel/electron4/files/patch-content_public_browser_web__ui__data__source.h
new file mode 100644
index 000000000000..785d7a47071d
--- /dev/null
+++ b/devel/electron4/files/patch-content_public_browser_web__ui__data__source.h
@@ -0,0 +1,51 @@
+--- content/public/browser/web_ui_data_source.h.orig 2019-03-15 06:37:23 UTC
++++ content/public/browser/web_ui_data_source.h
+@@ -13,7 +13,6 @@
+
+ #include "base/callback.h"
+ #include "base/strings/string16.h"
+-#include "base/strings/string_piece.h"
+ #include "content/common/content_export.h"
+
+ namespace base {
+@@ -45,33 +44,33 @@ class WebUIDataSource {
+ std::unique_ptr<base::DictionaryValue> update);
+
+ // Adds a string keyed to its name to our dictionary.
+- virtual void AddString(base::StringPiece name,
++ virtual void AddString(const std::string& name,
+ const base::string16& value) = 0;
+
+ // Adds a string keyed to its name to our dictionary.
+- virtual void AddString(base::StringPiece name, const std::string& value) = 0;
++ virtual void AddString(const std::string& name, const std::string& value) = 0;
+
+ // Adds a localized string with resource |ids| keyed to its name to our
+ // dictionary.
+- virtual void AddLocalizedString(base::StringPiece name, int ids) = 0;
++ virtual void AddLocalizedString(const std::string& name, int ids) = 0;
+
+ // Add strings from |localized_strings| to our dictionary.
+ virtual void AddLocalizedStrings(
+ const base::DictionaryValue& localized_strings) = 0;
+
+ // Adds a boolean keyed to its name to our dictionary.
+- virtual void AddBoolean(base::StringPiece name, bool value) = 0;
++ virtual void AddBoolean(const std::string& name, bool value) = 0;
+
+ // Adds a signed 32-bit integer keyed to its name to our dictionary. Larger
+ // integers may not be exactly representable in JavaScript. See
+ // MAX_SAFE_INTEGER in /v8/src/globals.h.
+- virtual void AddInteger(base::StringPiece name, int32_t value) = 0;
++ virtual void AddInteger(const std::string& name, int32_t value) = 0;
+
+ // Sets the path which will return the JSON strings.
+- virtual void SetJsonPath(base::StringPiece path) = 0;
++ virtual void SetJsonPath(const std::string& path) = 0;
+
+ // Adds a mapping between a path name and a resource to return.
+- virtual void AddResourcePath(base::StringPiece path, int resource_id) = 0;
++ virtual void AddResourcePath(const std::string& path, int resource_id) = 0;
+
+ // Sets the resource to returned when no other paths match.
+ virtual void SetDefaultResource(int resource_id) = 0;
diff --git a/devel/electron4/files/patch-content_public_common_child__process__host.h b/devel/electron4/files/patch-content_public_common_child__process__host.h
new file mode 100644
index 000000000000..30c511a7d81e
--- /dev/null
+++ b/devel/electron4/files/patch-content_public_common_child__process__host.h
@@ -0,0 +1,20 @@
+--- content/public/common/child_process_host.h.orig 2019-03-15 06:37:23 UTC
++++ content/public/common/child_process_host.h
+@@ -45,7 +45,7 @@ class CONTENT_EXPORT ChildProcessHost : public IPC::Se
+ // No special behavior requested.
+ CHILD_NORMAL = 0,
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Indicates that the child execed after forking may be execced from
+ // /proc/self/exe rather than using the "real" app path. This prevents
+ // autoupdate from confusing us if it changes the file out from under us.
+@@ -54,7 +54,7 @@ class CONTENT_EXPORT ChildProcessHost : public IPC::Se
+ // gdb). In this case, you'd use GetChildPath to get the real executable
+ // file name, and then prepend the GDB command to the command line.
+ CHILD_ALLOW_SELF = 1 << 0,
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ };
+
+ // Returns the pathname to be used for a child process. If a subprocess
diff --git a/devel/electron4/files/patch-content_public_common_content__switches.cc b/devel/electron4/files/patch-content_public_common_content__switches.cc
new file mode 100644
index 000000000000..4ad38ad7d40f
--- /dev/null
+++ b/devel/electron4/files/patch-content_public_common_content__switches.cc
@@ -0,0 +1,11 @@
+--- content/public/common/content_switches.cc.orig 2019-04-06 12:09:25 UTC
++++ content/public/common/content_switches.cc
+@@ -972,7 +972,7 @@ const char kDisableAudioSupportForDesktopShare[] =
+ const char kDisablePanelFitting[] = "disable-panel-fitting";
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_FREEBSD)
+ // Allows sending text-to-speech requests to speech-dispatcher, a common
+ // Linux speech service. Because it's buggy, the user must explicitly
+ // enable it so that visiting a random webpage can't cause instability.
diff --git a/devel/electron4/files/patch-content_public_common_content__switches.h b/devel/electron4/files/patch-content_public_common_content__switches.h
new file mode 100644
index 000000000000..2582c765fcdd
--- /dev/null
+++ b/devel/electron4/files/patch-content_public_common_content__switches.h
@@ -0,0 +1,11 @@
+--- content/public/common/content_switches.h.orig 2019-04-06 12:09:25 UTC
++++ content/public/common/content_switches.h
+@@ -270,7 +270,7 @@ CONTENT_EXPORT extern const char kEnableOSKOverscroll[
+ CONTENT_EXPORT extern const char kDisablePanelFitting[];
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_FREEBSD)
+ CONTENT_EXPORT extern const char kEnableSpeechDispatcher[];
+ #endif
+
diff --git a/devel/electron4/files/patch-content_public_common_renderer__preferences.h b/devel/electron4/files/patch-content_public_common_renderer__preferences.h
new file mode 100644
index 000000000000..9118d2b258c3
--- /dev/null
+++ b/devel/electron4/files/patch-content_public_common_renderer__preferences.h
@@ -0,0 +1,11 @@
+--- content/public/common/renderer_preferences.h.orig 2019-03-15 06:37:23 UTC
++++ content/public/common/renderer_preferences.h
+@@ -137,7 +137,7 @@ struct CONTENT_EXPORT RendererPreferences {
+ // Country iso of the mobile network for content detection purpose.
+ std::string network_contry_iso;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ std::string system_font_family_name;
+ #endif
+
diff --git a/devel/electron4/files/patch-content_public_common_use__zoom__for__dsf__policy.cc b/devel/electron4/files/patch-content_public_common_use__zoom__for__dsf__policy.cc
new file mode 100644
index 000000000000..28a408c67484
--- /dev/null
+++ b/devel/electron4/files/patch-content_public_common_use__zoom__for__dsf__policy.cc
@@ -0,0 +1,11 @@
+--- content/public/common/use_zoom_for_dsf_policy.cc.orig 2019-03-15 06:37:23 UTC
++++ content/public/common/use_zoom_for_dsf_policy.cc
+@@ -20,7 +20,7 @@ const base::Feature kUseZoomForDsfEnabledByDefault{
+ #endif
+
+ bool IsUseZoomForDSFEnabledByDefault() {
+-#if defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ return true;
+ #elif defined(OS_WIN)
+ return base::FeatureList::IsEnabled(kUseZoomForDsfEnabledByDefault);
diff --git a/devel/electron4/files/patch-content_public_test_browser__test__base.cc b/devel/electron4/files/patch-content_public_test_browser__test__base.cc
new file mode 100644
index 000000000000..1c27a15035ff
--- /dev/null
+++ b/devel/electron4/files/patch-content_public_test_browser__test__base.cc
@@ -0,0 +1,13 @@
+--- content/public/test/browser_test_base.cc.orig 2019-03-15 06:37:23 UTC
++++ content/public/test/browser_test_base.cc
+@@ -52,6 +52,10 @@
+ #include "ui/gl/gl_implementation.h"
+ #include "ui/gl/gl_switches.h"
+
++#if defined(OS_FREEBSD)
++#include <sys/signal.h>
++#endif
++
+ #if defined(OS_POSIX)
+ #include "base/process/process_handle.h"
+ #endif
diff --git a/devel/electron4/files/patch-content_renderer_media_stream_processed__local__audio__source.cc b/devel/electron4/files/patch-content_renderer_media_stream_processed__local__audio__source.cc
new file mode 100644
index 000000000000..36db1bdd67d0
--- /dev/null
+++ b/devel/electron4/files/patch-content_renderer_media_stream_processed__local__audio__source.cc
@@ -0,0 +1,11 @@
+--- content/renderer/media/stream/processed_local_audio_source.cc.orig 2019-03-15 06:37:23 UTC
++++ content/renderer/media/stream/processed_local_audio_source.cc
+@@ -267,7 +267,7 @@ void ProcessedLocalAudioSource::Capture(const media::A
+ bool key_pressed) {
+ #if defined(OS_WIN) || defined(OS_MACOSX)
+ DCHECK_LE(volume, 1.0);
+-#elif (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_OPENBSD)
++#elif (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // We have a special situation on Linux where the microphone volume can be
+ // "higher than maximum". The input volume slider in the sound preference
+ // allows the user to set a scaling that is higher than 100%. It means that
diff --git a/devel/electron4/files/patch-content_renderer_render__thread__impl.cc b/devel/electron4/files/patch-content_renderer_render__thread__impl.cc
new file mode 100644
index 000000000000..0a4261ebe298
--- /dev/null
+++ b/devel/electron4/files/patch-content_renderer_render__thread__impl.cc
@@ -0,0 +1,56 @@
+--- content/renderer/render_thread_impl.cc.orig 2019-04-06 12:09:25 UTC
++++ content/renderer/render_thread_impl.cc
+@@ -198,12 +198,21 @@
+ #include "mojo/public/cpp/bindings/message_dumper.h"
+ #endif
+
++#if !defined(OS_BSD)
+ #if defined(OS_MACOSX)
+ #include <malloc/malloc.h>
+ #else
+ #include <malloc.h>
+ #endif
++#endif
+
++#if defined(OS_BSD)
++#include <stddef.h>
++#include <stdint.h>
++#include <sys/param.h>
++#include <sys/sysctl.h>
++#endif
++
+ using base::ThreadRestrictions;
+ using blink::WebDocument;
+ using blink::WebFrame;
+@@ -977,7 +986,7 @@ void RenderThreadImpl::Init(
+ DCHECK(parsed_num_raster_threads) << string_value;
+ DCHECK_GT(num_raster_threads, 0);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ categorized_worker_pool_->SetBackgroundingCallback(
+ main_thread_scheduler_->DefaultTaskRunner(),
+ base::BindOnce(
+@@ -1018,7 +1027,7 @@ void RenderThreadImpl::Init(
+ GetConnector()->BindInterface(mojom::kBrowserServiceName,
+ mojo::MakeRequest(&storage_partition_service_));
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ render_message_filter()->SetThreadPriority(
+ ChildProcess::current()->io_thread_id(), base::ThreadPriority::DISPLAY);
+ #endif
+@@ -1448,11 +1457,11 @@ media::GpuVideoAcceleratorFactories* RenderThreadImpl:
+ gpu::kGpuFeatureStatusEnabled);
+ const bool enable_gpu_memory_buffers =
+ !is_gpu_compositing_disabled_ &&
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ !cmd_line->HasSwitch(switches::kDisableGpuMemoryBufferVideoFrames);
+ #else
+ cmd_line->HasSwitch(switches::kEnableGpuMemoryBufferVideoFrames);
+-#endif // defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_WIN)
++#endif // defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ const bool enable_media_stream_gpu_memory_buffers =
+ enable_gpu_memory_buffers &&
+ base::FeatureList::IsEnabled(
diff --git a/devel/electron4/files/patch-content_renderer_renderer__blink__platform__impl.cc b/devel/electron4/files/patch-content_renderer_renderer__blink__platform__impl.cc
new file mode 100644
index 000000000000..b570c50dd10a
--- /dev/null
+++ b/devel/electron4/files/patch-content_renderer_renderer__blink__platform__impl.cc
@@ -0,0 +1,56 @@
+--- content/renderer/renderer_blink_platform_impl.cc.orig 2019-03-16 09:15:21 UTC
++++ content/renderer/renderer_blink_platform_impl.cc
+@@ -123,7 +123,7 @@
+
+ #if defined(OS_POSIX)
+ #include "base/file_descriptor_posix.h"
+-#if !defined(OS_MACOSX) && !defined(OS_ANDROID)
++#if !defined(OS_MACOSX) && !defined(OS_ANDROID) && !defined(OS_BSD)
+ #include <map>
+ #include <string>
+
+@@ -201,7 +201,7 @@ gpu::ContextType ToGpuContextType(blink::Platform::Con
+
+ //------------------------------------------------------------------------------
+
+-#if !defined(OS_ANDROID) && !defined(OS_WIN) && !defined(OS_FUCHSIA)
++#if !defined(OS_ANDROID) && !defined(OS_WIN) && !defined(OS_FUCHSIA) && !defined(OS_BSD)
+ class RendererBlinkPlatformImpl::SandboxSupport
+ : public blink::WebSandboxSupport {
+ public:
+@@ -274,7 +274,7 @@ RendererBlinkPlatformImpl::RendererBlinkPlatformImpl(
+ connector_ = service_manager::Connector::Create(&request);
+ }
+
+-#if !defined(OS_ANDROID) && !defined(OS_WIN) && !defined(OS_FUCHSIA)
++#if !defined(OS_ANDROID) && !defined(OS_WIN) && !defined(OS_FUCHSIA) && !defined(OS_BSD)
+ if (g_sandbox_enabled && sandboxEnabled()) {
+ #if defined(OS_MACOSX)
+ sandbox_support_.reset(new RendererBlinkPlatformImpl::SandboxSupport());
+@@ -302,7 +302,7 @@ RendererBlinkPlatformImpl::~RendererBlinkPlatformImpl(
+ }
+
+ void RendererBlinkPlatformImpl::Shutdown() {
+-#if !defined(OS_ANDROID) && !defined(OS_WIN) && !defined(OS_FUCHSIA)
++#if !defined(OS_ANDROID) && !defined(OS_WIN) && !defined(OS_FUCHSIA) && !defined(OS_BSD)
+ // SandboxSupport contains a map of WebFallbackFont objects, which hold
+ // WebStrings and WebVectors, which become invalidated when blink is shut
+ // down. Hence, we need to clear that map now, just before blink::shutdown()
+@@ -394,7 +394,7 @@ blink::BlameContext* RendererBlinkPlatformImpl::GetTop
+ }
+
+ blink::WebSandboxSupport* RendererBlinkPlatformImpl::GetSandboxSupport() {
+-#if defined(OS_ANDROID) || defined(OS_WIN) || defined(OS_FUCHSIA)
++#if defined(OS_ANDROID) || defined(OS_WIN) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ // These platforms do not require sandbox support.
+ return NULL;
+ #else
+@@ -587,7 +587,7 @@ bool RendererBlinkPlatformImpl::SandboxSupport::LoadFo
+ return content::LoadFont(src_font, out, font_id);
+ }
+
+-#elif defined(OS_POSIX) && !defined(OS_ANDROID)
++#elif defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_BSD)
+
+ void RendererBlinkPlatformImpl::SandboxSupport::GetFallbackFontForCharacter(
+ blink::WebUChar32 character,
diff --git a/devel/electron4/files/patch-content_renderer_renderer__blink__platform__impl.h b/devel/electron4/files/patch-content_renderer_renderer__blink__platform__impl.h
new file mode 100644
index 000000000000..648bb8d3fc54
--- /dev/null
+++ b/devel/electron4/files/patch-content_renderer_renderer__blink__platform__impl.h
@@ -0,0 +1,11 @@
+--- content/renderer/renderer_blink_platform_impl.h.orig 2019-03-16 09:15:21 UTC
++++ content/renderer/renderer_blink_platform_impl.h
+@@ -266,7 +266,7 @@ class CONTENT_EXPORT RendererBlinkPlatformImpl : publi
+ std::unique_ptr<blink::WebThread> main_thread_;
+ std::unique_ptr<service_manager::Connector> connector_;
+
+-#if !defined(OS_ANDROID) && !defined(OS_WIN) && !defined(OS_FUCHSIA)
++#if !defined(OS_ANDROID) && !defined(OS_WIN) && !defined(OS_FUCHSIA) && !defined(OS_BSD)
+ class SandboxSupport;
+ std::unique_ptr<SandboxSupport> sandbox_support_;
+ #endif
diff --git a/devel/electron4/files/patch-content_renderer_renderer__main__platform__delegate__linux.cc b/devel/electron4/files/patch-content_renderer_renderer__main__platform__delegate__linux.cc
new file mode 100644
index 000000000000..6e1e13b0e85b
--- /dev/null
+++ b/devel/electron4/files/patch-content_renderer_renderer__main__platform__delegate__linux.cc
@@ -0,0 +1,19 @@
+--- content/renderer/renderer_main_platform_delegate_linux.cc.orig 2019-03-15 06:25:44 UTC
++++ content/renderer/renderer_main_platform_delegate_linux.cc
+@@ -30,6 +30,7 @@ void RendererMainPlatformDelegate::PlatformUninitializ
+ }
+
+ bool RendererMainPlatformDelegate::EnableSandbox() {
++#if !defined(OS_BSD)
+ // The setuid sandbox is started in the zygote process: zygote_main_linux.cc
+ // https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_sandbox.md
+ //
+@@ -65,7 +66,7 @@ bool RendererMainPlatformDelegate::EnableSandbox() {
+ CHECK_EQ(errno, EPERM);
+ }
+ #endif // __x86_64__
+-
++#endif // ! OS_BSD
+ return true;
+ }
+
diff --git a/devel/electron4/files/patch-content_shell_browser_shell__browser__context.cc b/devel/electron4/files/patch-content_shell_browser_shell__browser__context.cc
new file mode 100644
index 000000000000..bc31130dfe74
--- /dev/null
+++ b/devel/electron4/files/patch-content_shell_browser_shell__browser__context.cc
@@ -0,0 +1,20 @@
+--- content/shell/browser/shell_browser_context.cc.orig 2019-03-15 06:37:23 UTC
++++ content/shell/browser/shell_browser_context.cc
+@@ -26,7 +26,7 @@
+
+ #if defined(OS_WIN)
+ #include "base/base_paths_win.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/nix/xdg_util.h"
+ #elif defined(OS_MACOSX)
+ #include "base/base_paths_mac.h"
+@@ -108,7 +108,7 @@ void ShellBrowserContext::InitWhileIOAllowed() {
+ #if defined(OS_WIN)
+ CHECK(base::PathService::Get(base::DIR_LOCAL_APP_DATA, &path_));
+ path_ = path_.Append(std::wstring(L"content_shell"));
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ std::unique_ptr<base::Environment> env(base::Environment::Create());
+ base::FilePath config_dir(
+ base::nix::GetXDGDirectory(env.get(),
diff --git a/devel/electron4/files/patch-content_shell_browser_shell__browser__main__parts.cc b/devel/electron4/files/patch-content_shell_browser_shell__browser__main__parts.cc
new file mode 100644
index 000000000000..89666f2f6cfd
--- /dev/null
+++ b/devel/electron4/files/patch-content_shell_browser_shell__browser__main__parts.cc
@@ -0,0 +1,20 @@
+--- content/shell/browser/shell_browser_main_parts.cc.orig 2019-03-15 06:37:23 UTC
++++ content/shell/browser/shell_browser_main_parts.cc
+@@ -48,7 +48,7 @@
+ #if defined(USE_AURA) && defined(USE_X11)
+ #include "ui/events/devices/x11/touch_factory_x11.h" // nogncheck
+ #endif
+-#if !defined(OS_CHROMEOS) && defined(USE_AURA) && defined(OS_LINUX)
++#if !defined(OS_CHROMEOS) && defined(USE_AURA) && (defined(OS_BSD) || defined(OS_LINUX))
+ #include "ui/base/ime/input_method_initializer.h"
+ #endif
+ #if defined(OS_CHROMEOS)
+@@ -128,7 +128,7 @@ int ShellBrowserMainParts::PreEarlyInitialization() {
+ #if defined(USE_X11)
+ ui::SetDefaultX11ErrorHandlers();
+ #endif
+-#if !defined(OS_CHROMEOS) && defined(USE_AURA) && defined(OS_LINUX)
++#if !defined(OS_CHROMEOS) && defined(USE_AURA) && (defined(OS_BSD) || defined(OS_LINUX))
+ ui::InitializeInputMethodForTesting();
+ #endif
+ #if defined(OS_ANDROID)
diff --git a/devel/electron4/files/patch-content_test_content__test__suite.cc b/devel/electron4/files/patch-content_test_content__test__suite.cc
new file mode 100644
index 000000000000..5648c37d3b44
--- /dev/null
+++ b/devel/electron4/files/patch-content_test_content__test__suite.cc
@@ -0,0 +1,18 @@
+--- content/test/content_test_suite.cc.orig 2019-03-15 06:37:23 UTC
++++ content/test/content_test_suite.cc
+@@ -87,6 +87,7 @@ void ContentTestSuite::Initialize() {
+ // to initialize GL, so don't do it here.
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ bool is_child_process = command_line->HasSwitch(switches::kTestChildProcess);
++#if !defined(OS_BSD)
+ if (!is_child_process) {
+ gl::GLSurfaceTestSupport::InitializeNoExtensionsOneOff();
+ gpu::GPUInfo gpu_info;
+@@ -99,6 +100,7 @@ void ContentTestSuite::Initialize() {
+ gpu_feature_info.disabled_extensions);
+ gl::init::InitializeExtensionSettingsOneOffPlatform();
+ }
++#endif
+ testing::TestEventListeners& listeners =
+ testing::UnitTest::GetInstance()->listeners();
+ listeners.Append(new TestInitializationListener);
diff --git a/devel/electron4/files/patch-content_utility_utility__main.cc b/devel/electron4/files/patch-content_utility_utility__main.cc
new file mode 100644
index 000000000000..fd2c6b5a998e
--- /dev/null
+++ b/devel/electron4/files/patch-content_utility_utility__main.cc
@@ -0,0 +1,11 @@
+--- content/utility/utility_main.cc.orig 2019-03-15 06:37:23 UTC
++++ content/utility/utility_main.cc
+@@ -64,7 +64,7 @@ int UtilityMain(const MainFunctionParams& parameters)
+ if (parameters.command_line.HasSwitch(switches::kUtilityStartupDialog))
+ WaitForDebugger("Utility");
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) && !defined(OS_BSD)
+ // Initializes the sandbox before any threads are created.
+ // TODO(jorgelo): move this after GTK initialization when we enable a strict
+ // Seccomp-BPF policy.
diff --git a/devel/electron4/files/patch-device_bluetooth_BUILD.gn b/devel/electron4/files/patch-device_bluetooth_BUILD.gn
new file mode 100644
index 000000000000..7f3e235feac2
--- /dev/null
+++ b/devel/electron4/files/patch-device_bluetooth_BUILD.gn
@@ -0,0 +1,11 @@
+--- device/bluetooth/BUILD.gn.orig 2019-03-15 06:37:23 UTC
++++ device/bluetooth/BUILD.gn
+@@ -266,7 +266,7 @@ component("bluetooth") {
+ ]
+ }
+
+- if (is_chromeos || is_linux) {
++ if (is_chromeos || (is_linux && !is_bsd)) {
+ if (use_dbus) {
+ sources += [
+ "bluez/bluetooth_adapter_bluez.cc",
diff --git a/devel/electron4/files/patch-device_gamepad_gamepad__provider.cc b/devel/electron4/files/patch-device_gamepad_gamepad__provider.cc
new file mode 100644
index 000000000000..b31701d306a9
--- /dev/null
+++ b/devel/electron4/files/patch-device_gamepad_gamepad__provider.cc
@@ -0,0 +1,11 @@
+--- device/gamepad/gamepad_provider.cc.orig 2019-03-15 06:37:23 UTC
++++ device/gamepad/gamepad_provider.cc
+@@ -187,7 +187,7 @@ void GamepadProvider::Initialize(std::unique_ptr<Gamep
+ monitor->AddDevicesChangedObserver(this);
+
+ polling_thread_.reset(new base::Thread("Gamepad polling thread"));
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // On Linux, the data fetcher needs to watch file descriptors, so the message
+ // loop needs to be a libevent loop.
+ const base::MessageLoop::Type kMessageLoopType = base::MessageLoop::TYPE_IO;
diff --git a/devel/electron4/files/patch-device_serial_BUILD.gn b/devel/electron4/files/patch-device_serial_BUILD.gn
new file mode 100644
index 000000000000..954438b1132c
--- /dev/null
+++ b/devel/electron4/files/patch-device_serial_BUILD.gn
@@ -0,0 +1,25 @@
+--- device/serial/BUILD.gn.orig 2019-03-15 06:37:23 UTC
++++ device/serial/BUILD.gn
+@@ -6,7 +6,7 @@ import("//build/config/features.gni")
+ import("//mojo/public/tools/bindings/mojom.gni")
+
+ # Library works only on desktop platforms.
+-if (is_win || is_linux || is_mac) {
++if (is_win || is_linux || is_mac || is_bsd) {
+ config("platform_support") {
+ visibility = [ ":serial" ]
+ if (is_win) {
+@@ -55,6 +55,13 @@ if (is_win || is_linux || is_mac) {
+ "//net",
+ "//third_party/re2",
+ ]
++
++ if (is_bsd) {
++ sources -= [
++ "serial_device_enumerator_linux.cc",
++ "serial_device_enumerator_linux.h",
++ ]
++ }
+
+ if (is_posix) {
+ sources += [
diff --git a/devel/electron4/files/patch-device_serial_serial__io__handler__posix.cc b/devel/electron4/files/patch-device_serial_serial__io__handler__posix.cc
new file mode 100644
index 000000000000..cef9cec9b84a
--- /dev/null
+++ b/devel/electron4/files/patch-device_serial_serial__io__handler__posix.cc
@@ -0,0 +1,11 @@
+--- device/serial/serial_io_handler_posix.cc.orig 2019-03-15 06:37:23 UTC
++++ device/serial/serial_io_handler_posix.cc
+@@ -62,7 +62,7 @@ bool BitrateToSpeedConstant(int bitrate, speed_t* spee
+ BITRATE_TO_SPEED_CASE(9600)
+ BITRATE_TO_SPEED_CASE(19200)
+ BITRATE_TO_SPEED_CASE(38400)
+-#if !defined(OS_MACOSX)
++#if !defined(OS_MACOSX) && !defined(OS_BSD)
+ BITRATE_TO_SPEED_CASE(57600)
+ BITRATE_TO_SPEED_CASE(115200)
+ BITRATE_TO_SPEED_CASE(230400)
diff --git a/devel/electron4/files/patch-device_usb_BUILD.gn b/devel/electron4/files/patch-device_usb_BUILD.gn
new file mode 100644
index 000000000000..24d4008019c9
--- /dev/null
+++ b/devel/electron4/files/patch-device_usb_BUILD.gn
@@ -0,0 +1,21 @@
+--- device/usb/BUILD.gn.orig 2019-03-15 06:37:23 UTC
++++ device/usb/BUILD.gn
+@@ -109,10 +109,17 @@ static_library("usb") {
+ ]
+ }
+
+- if (is_android || is_chromeos || is_linux) {
++ if (is_android || is_chromeos || (is_linux && !is_bsd)) {
+ sources += [
+ "usb_device_handle_usbfs.cc",
+ "usb_device_handle_usbfs.h",
++ ]
++ }
++
++ if (is_bsd) {
++ sources -= [
++ "usb_device_linux.cc",
++ "usb_device_linux.h",
+ ]
+ }
+
diff --git a/devel/electron4/files/patch-device_usb_usb__context.cc b/devel/electron4/files/patch-device_usb_usb__context.cc
new file mode 100644
index 000000000000..a9d67671042d
--- /dev/null
+++ b/devel/electron4/files/patch-device_usb_usb__context.cc
@@ -0,0 +1,12 @@
+--- device/usb/usb_context.cc.orig 2019-03-15 06:25:44 UTC
++++ device/usb/usb_context.cc
+@@ -58,7 +58,9 @@ void UsbContext::UsbEventHandler::Run() {
+
+ void UsbContext::UsbEventHandler::Stop() {
+ base::subtle::Release_Store(&running_, 0);
++#if !defined(OS_FREEBSD) // XXX(rene) not available in base version
+ libusb_interrupt_handle_event(context_);
++#endif
+ }
+
+ UsbContext::UsbContext(PlatformUsbContext context) : context_(context) {
diff --git a/devel/electron4/files/patch-device_usb_usb__error.cc b/devel/electron4/files/patch-device_usb_usb__error.cc
new file mode 100644
index 000000000000..9b069de570af
--- /dev/null
+++ b/devel/electron4/files/patch-device_usb_usb__error.cc
@@ -0,0 +1,11 @@
+--- device/usb/usb_error.cc.orig 2019-03-15 06:25:44 UTC
++++ device/usb/usb_error.cc
+@@ -9,7 +9,7 @@
+ namespace device {
+
+ std::string ConvertPlatformUsbErrorToString(int errcode) {
+- return libusb_strerror(static_cast<libusb_error>(errcode));
++ return "";
+ }
+
+ } // namespace device
diff --git a/devel/electron4/files/patch-device_usb_usb__service__impl.cc b/devel/electron4/files/patch-device_usb_usb__service__impl.cc
new file mode 100644
index 000000000000..0b50e818ff23
--- /dev/null
+++ b/devel/electron4/files/patch-device_usb_usb__service__impl.cc
@@ -0,0 +1,45 @@
+--- device/usb/usb_service_impl.cc.orig 2019-03-15 06:37:23 UTC
++++ device/usb/usb_service_impl.cc
+@@ -239,8 +239,10 @@ UsbServiceImpl::UsbServiceImpl()
+ }
+
+ UsbServiceImpl::~UsbServiceImpl() {
++#if !defined(OS_FREEBSD)
+ if (hotplug_enabled_)
+ libusb_hotplug_deregister_callback(context_->context(), hotplug_handle_);
++#endif // !defined(OS_FREEBSD)
+ }
+
+ void UsbServiceImpl::GetDevices(const GetDevicesCallback& callback) {
+@@ -295,6 +297,7 @@ void UsbServiceImpl::OnUsbContext(scoped_refptr<UsbCon
+
+ context_ = std::move(context);
+
++#if !defined(OS_FREEBSD)
+ int rv = libusb_hotplug_register_callback(
+ context_->context(),
+ static_cast<libusb_hotplug_event>(LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED |
+@@ -307,6 +310,7 @@ void UsbServiceImpl::OnUsbContext(scoped_refptr<UsbCon
+
+ // This will call any enumeration callbacks queued while initializing.
+ RefreshDevices();
++#endif // !defined(OS_FREEBSD)
+
+ #if defined(OS_WIN)
+ DeviceMonitorWin* device_monitor = DeviceMonitorWin::GetForAllInterfaces();
+@@ -503,6 +507,7 @@ void UsbServiceImpl::RemoveDevice(scoped_refptr<UsbDev
+ device->OnDisconnect();
+ }
+
++#if !defined(OS_FREEBSD)
+ // static
+ int LIBUSB_CALL UsbServiceImpl::HotplugCallback(libusb_context* context,
+ libusb_device* device_raw,
+@@ -537,6 +542,7 @@ int LIBUSB_CALL UsbServiceImpl::HotplugCallback(libusb
+
+ return 0;
+ }
++#endif // !defined(OS_FREEBSD)
+
+ void UsbServiceImpl::OnPlatformDeviceAdded(
+ ScopedLibusbDeviceRef platform_device) {
diff --git a/devel/electron4/files/patch-device_usb_usb__service__impl.h b/devel/electron4/files/patch-device_usb_usb__service__impl.h
new file mode 100644
index 000000000000..27890e5e3869
--- /dev/null
+++ b/devel/electron4/files/patch-device_usb_usb__service__impl.h
@@ -0,0 +1,26 @@
+--- device/usb/usb_service_impl.h.orig 2019-03-15 06:37:23 UTC
++++ device/usb/usb_service_impl.h
+@@ -73,11 +73,13 @@ class UsbServiceImpl :
+ scoped_refptr<UsbDeviceImpl> device);
+ void RemoveDevice(scoped_refptr<UsbDeviceImpl> device);
+
++#if !defined(OS_FREEBSD)
+ // Handle hotplug events from libusb.
+ static int LIBUSB_CALL HotplugCallback(libusb_context* context,
+ libusb_device* device,
+ libusb_hotplug_event event,
+ void* user_data);
++#endif
+ // These functions release a reference to the provided platform device.
+ void OnPlatformDeviceAdded(ScopedLibusbDeviceRef platform_device);
+ void OnPlatformDeviceRemoved(ScopedLibusbDeviceRef platform_device);
+@@ -95,7 +97,9 @@ class UsbServiceImpl :
+ // connected instead of only when a full enumeration is requested.
+ // TODO(reillyg): Support this on all platforms. crbug.com/411715
+ bool hotplug_enabled_ = false;
++#if !defined(OS_FREEBSD)
+ libusb_hotplug_callback_handle hotplug_handle_;
++#endif
+
+ // Enumeration callbacks are queued until an enumeration completes.
+ bool enumeration_ready_ = false;
diff --git a/devel/electron4/files/patch-electron_BUILD.gn b/devel/electron4/files/patch-electron_BUILD.gn
new file mode 100644
index 000000000000..8d76effab375
--- /dev/null
+++ b/devel/electron4/files/patch-electron_BUILD.gn
@@ -0,0 +1,27 @@
+--- electron/BUILD.gn.orig 2019-03-16 09:51:23 UTC
++++ electron/BUILD.gn
+@@ -307,6 +307,15 @@ static_library("electron_lib") {
+ "//extensions/common/url_pattern.h",
+ ]
+
++ if (is_bsd) {
++ sources -= [
++ "atom/common/crash_reporter/crash_reporter_linux.cc",
++ "atom/common/crash_reporter/crash_reporter_linux.h",
++ "atom/common/crash_reporter/linux/crash_dump_handler.cc",
++ "atom/common/crash_reporter/linux/crash_dump_handler.h",
++ ]
++ }
++
+ if (is_component_build) {
+ defines += [ "NODE_SHARED_MODE" ]
+ }
+@@ -376,7 +385,7 @@ static_library("electron_lib") {
+ sources += filenames.lib_sources_win
+ libs += [ "dwmapi.lib" ]
+ }
+- if (is_linux || is_win) {
++ if ((is_linux && !is_bsd) || is_win) {
+ deps += [ "//third_party/breakpad:client" ]
+ include_dirs += [ "//third_party/breakpad" ]
+ }
diff --git a/devel/electron4/files/patch-electron_atom_app_atom__main.cc b/devel/electron4/files/patch-electron_atom_app_atom__main.cc
new file mode 100644
index 000000000000..61e4f08d0d12
--- /dev/null
+++ b/devel/electron4/files/patch-electron_atom_app_atom__main.cc
@@ -0,0 +1,35 @@
+--- electron/atom/app/atom_main.cc.orig 2019-03-16 12:31:37 UTC
++++ electron/atom/app/atom_main.cc
+@@ -24,12 +24,12 @@
+ #include "base/win/windows_version.h"
+ #include "content/public/app/sandbox_helper_win.h"
+ #include "sandbox/win/src/sandbox_types.h"
+-#elif defined(OS_LINUX) // defined(OS_WIN)
++#elif defined(OS_LINUX) || defined(OS_BSD) // defined(OS_WIN)
+ #include <unistd.h>
+ #include <cstdio>
+ #include "atom/app/atom_main_delegate.h" // NOLINT
+ #include "content/public/app/content_main.h"
+-#else // defined(OS_LINUX)
++#else // defined(OS_LINUX) || defined(OS_BSD)
+ #include <unistd.h>
+ #include <cstdio>
+ #include "atom/app/atom_library_main.h"
+@@ -175,7 +175,7 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, w
+ return content::ContentMain(params);
+ }
+
+-#elif defined(OS_LINUX) // defined(OS_WIN)
++#elif defined(OS_LINUX) || defined(OS_BSD) // defined(OS_WIN)
+
+ int main(int argc, char* argv[]) {
+ FixStdioStreams();
+@@ -196,7 +196,7 @@ int main(int argc, char* argv[]) {
+ return content::ContentMain(params);
+ }
+
+-#else // defined(OS_LINUX)
++#else // defined(OS_LINUX) || defined(OS_BSD)
+
+ int main(int argc, char* argv[]) {
+ FixStdioStreams();
diff --git a/devel/electron4/files/patch-electron_atom_app_atom__main__delegate.cc b/devel/electron4/files/patch-electron_atom_app_atom__main__delegate.cc
new file mode 100644
index 000000000000..116e78d607c9
--- /dev/null
+++ b/devel/electron4/files/patch-electron_atom_app_atom__main__delegate.cc
@@ -0,0 +1,11 @@
+--- electron/atom/app/atom_main_delegate.cc.orig 2019-03-16 12:34:08 UTC
++++ electron/atom/app/atom_main_delegate.cc
+@@ -102,7 +102,7 @@ bool AtomMainDelegate::BasicStartupComplete(int* exit_
+ logging::SetLogItems(true, false, true, false);
+
+ // Enable convient stack printing.
+-#if defined(DEBUG) && defined(OS_LINUX)
++#if defined(DEBUG) && (defined(OS_LINUX) || defined(OS_BSD))
+ bool enable_stack_dumping = true;
+ #else
+ bool enable_stack_dumping = env->HasVar("ELECTRON_ENABLE_STACK_DUMPING");
diff --git a/devel/electron4/files/patch-electron_atom_browser_api_atom__api__app.cc b/devel/electron4/files/patch-electron_atom_browser_api_atom__api__app.cc
new file mode 100644
index 000000000000..388f309c9413
--- /dev/null
+++ b/devel/electron4/files/patch-electron_atom_browser_api_atom__api__app.cc
@@ -0,0 +1,29 @@
+--- electron/atom/browser/api/atom_api_app.cc.orig 2019-05-02 21:34:52 UTC
++++ electron/atom/browser/api/atom_api_app.cc
+@@ -619,7 +619,7 @@ void App::OnWillFinishLaunching() {
+ }
+
+ void App::OnFinishLaunching(const base::DictionaryValue& launch_info) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Set the application name for audio streams shown in external
+ // applications. Only affects pulseaudio currently.
+ media::AudioManager::SetGlobalAppName(Browser::Get()->GetName());
+@@ -871,7 +871,7 @@ void App::SetPath(mate::Arguments* args,
+ }
+
+ void App::SetDesktopName(const std::string& desktop_name) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ std::unique_ptr<base::Environment> env(base::Environment::Create());
+ env->SetVar("CHROME_DESKTOP", desktop_name);
+ #endif
+@@ -1318,7 +1318,7 @@ void App::BuildPrototype(v8::Isolate* isolate,
+ .SetMethod("getJumpListSettings", &App::GetJumpListSettings)
+ .SetMethod("setJumpList", &App::SetJumpList)
+ #endif
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ .SetMethod("isUnityRunning",
+ base::Bind(&Browser::IsUnityRunning, browser))
+ #endif
diff --git a/devel/electron4/files/patch-electron_atom_browser_api_atom__api__web__contents.cc b/devel/electron4/files/patch-electron_atom_browser_api_atom__api__web__contents.cc
new file mode 100644
index 000000000000..dcc7820ba5d7
--- /dev/null
+++ b/devel/electron4/files/patch-electron_atom_browser_api_atom__api__web__contents.cc
@@ -0,0 +1,20 @@
+--- electron/atom/browser/api/atom_api_web_contents.cc.orig 2019-05-23 00:41:30 UTC
++++ electron/atom/browser/api/atom_api_web_contents.cc
+@@ -95,7 +95,7 @@
+ #include "ui/aura/window.h"
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ #include "content/public/common/renderer_preferences.h"
+ #include "ui/gfx/font_render_params.h"
+ #endif
+@@ -411,7 +411,7 @@ void WebContents::InitWithSessionAndOptions(v8::Isolat
+ auto* prefs = web_contents->GetMutableRendererPrefs();
+ prefs->accept_languages = g_browser_process->GetApplicationLocale();
+
+-#if defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ // Update font settings.
+ CR_DEFINE_STATIC_LOCAL(
+ const gfx::FontRenderParams, params,
diff --git a/devel/electron4/files/patch-electron_atom_browser_atom__browser__main__parts__posix.cc b/devel/electron4/files/patch-electron_atom_browser_atom__browser__main__parts__posix.cc
new file mode 100644
index 000000000000..32f4e34676dd
--- /dev/null
+++ b/devel/electron4/files/patch-electron_atom_browser_atom__browser__main__parts__posix.cc
@@ -0,0 +1,20 @@
+--- electron/atom/browser/atom_browser_main_parts_posix.cc.orig 2019-03-16 12:41:31 UTC
++++ electron/atom/browser/atom_browser_main_parts_posix.cc
+@@ -180,6 +180,9 @@ void AtomBrowserMainParts::HandleShutdownSignals() {
+ g_pipe_pid = getpid();
+ g_shutdown_pipe_read_fd = pipefd[0];
+ g_shutdown_pipe_write_fd = pipefd[1];
++#if defined(OS_BSD)
++ const size_t kShutdownDetectorThreadStackSize = 0;
++#else
+ #if !defined(ADDRESS_SANITIZER) && !defined(KEEP_SHADOW_STACKS)
+ const size_t kShutdownDetectorThreadStackSize = PTHREAD_STACK_MIN * 2;
+ #else
+@@ -187,6 +190,7 @@ void AtomBrowserMainParts::HandleShutdownSignals() {
+ // shadow stacks) bloat the stack frames, so we need to increase the stack
+ // size to avoid hitting the guard page.
+ const size_t kShutdownDetectorThreadStackSize = PTHREAD_STACK_MIN * 4;
++#endif
+ #endif
+ // TODO(viettrungluu,willchan): crbug.com/29675 - This currently leaks, so
+ // if you change this, you'll probably need to change the suppression.
diff --git a/devel/electron4/files/patch-electron_atom_browser_browser.h b/devel/electron4/files/patch-electron_atom_browser_browser.h
new file mode 100644
index 000000000000..ebb0cab1cf7e
--- /dev/null
+++ b/devel/electron4/files/patch-electron_atom_browser_browser.h
@@ -0,0 +1,15 @@
+--- electron/atom/browser/browser.h.orig 2019-03-16 12:10:27 UTC
++++ electron/atom/browser/browser.h
+@@ -207,10 +207,10 @@ class Browser : public WindowListObserver {
+ PCWSTR GetAppUserModelID();
+ #endif // defined(OS_WIN)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Whether Unity launcher is running.
+ bool IsUnityRunning();
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ // Tell the application to open a file.
+ bool OpenFile(const std::string& file_path);
diff --git a/devel/electron4/files/patch-electron_atom_browser_io__thread.cc b/devel/electron4/files/patch-electron_atom_browser_io__thread.cc
new file mode 100644
index 000000000000..e218e38a2bee
--- /dev/null
+++ b/devel/electron4/files/patch-electron_atom_browser_io__thread.cc
@@ -0,0 +1,29 @@
+--- electron/atom/browser/io_thread.cc.orig 2019-05-23 00:43:26 UTC
++++ electron/atom/browser/io_thread.cc
+@@ -18,7 +18,7 @@
+ #include "net/cert_net/nss_ocsp.h"
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ #include "net/cert/cert_net_fetcher.h"
+ #include "net/cert_net/cert_net_fetcher_impl.h"
+ #endif
+@@ -96,7 +96,7 @@ void IOThread::Init() {
+ #if defined(USE_NSS_CERTS)
+ net::SetURLRequestContextForNSSHttpIO(url_request_context_.get());
+ #endif
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ net::SetGlobalCertNetFetcher(
+ net::CreateCertNetFetcher(url_request_context_.get()));
+ #endif
+@@ -106,7 +106,7 @@ void IOThread::CleanUp() {
+ #if defined(USE_NSS_CERTS)
+ net::SetURLRequestContextForNSSHttpIO(nullptr);
+ #endif
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ net::ShutdownGlobalCertNetFetcher();
+ #endif
+ // Explicitly release before the IO thread gets destroyed.
diff --git a/devel/electron4/files/patch-electron_atom_browser_relauncher__linux.cc b/devel/electron4/files/patch-electron_atom_browser_relauncher__linux.cc
new file mode 100644
index 000000000000..e94367e89b14
--- /dev/null
+++ b/devel/electron4/files/patch-electron_atom_browser_relauncher__linux.cc
@@ -0,0 +1,32 @@
+--- electron/atom/browser/relauncher_linux.cc.orig 2019-03-16 12:14:15 UTC
++++ electron/atom/browser/relauncher_linux.cc
+@@ -6,8 +6,10 @@
+
+ #include <fcntl.h>
+ #include <signal.h>
++#if !defined(__FreeBSD__)
+ #include <sys/prctl.h>
+ #include <sys/signalfd.h>
++#endif
+
+ #include "base/files/file_util.h"
+ #include "base/files/scoped_file.h"
+@@ -26,6 +28,10 @@ void RelauncherSynchronizeWithParent() {
+ base::ScopedFD relauncher_sync_fd(kRelauncherSyncFD);
+ static const auto signum = SIGUSR2;
+
++#if defined(__FreeBSD__)
++ PLOG(ERROR) << "signalfd & prctl";
++ fprintf(stderr, "Not Implemented signalfd & prctl in atom/browser/relauncher_linux.cc");
++#else
+ // send signum to current process when parent process ends.
+ if (HANDLE_EINTR(prctl(PR_SET_PDEATHSIG, signum)) != 0) {
+ PLOG(ERROR) << "prctl";
+@@ -50,6 +56,7 @@ void RelauncherSynchronizeWithParent() {
+
+ // Wait for the parent to exit
+ parentWaiter.Wait();
++#endif
+ }
+
+ int LaunchProgram(const StringVector& relauncher_args,
diff --git a/devel/electron4/files/patch-electron_atom_browser_ui_views_submenu__button.cc b/devel/electron4/files/patch-electron_atom_browser_ui_views_submenu__button.cc
new file mode 100644
index 000000000000..f58585c31795
--- /dev/null
+++ b/devel/electron4/files/patch-electron_atom_browser_ui_views_submenu__button.cc
@@ -0,0 +1,11 @@
+--- electron/atom/browser/ui/views/submenu_button.cc.orig 2019-03-16 12:44:12 UTC
++++ electron/atom/browser/ui/views/submenu_button.cc
+@@ -26,7 +26,7 @@ SubmenuButton::SubmenuButton(const base::string16& tit
+ menu_button_listener,
+ false),
+ background_color_(background_color) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Dont' use native style border.
+ SetBorder(CreateDefaultBorder());
+ #endif
diff --git a/devel/electron4/files/patch-electron_atom_common_api_atom__api__crash__reporter.cc b/devel/electron4/files/patch-electron_atom_common_api_atom__api__crash__reporter.cc
new file mode 100644
index 000000000000..d001f3b004b1
--- /dev/null
+++ b/devel/electron4/files/patch-electron_atom_common_api_atom__api__crash__reporter.cc
@@ -0,0 +1,42 @@
+--- electron/atom/common/api/atom_api_crash_reporter.cc.orig 2019-03-16 12:35:09 UTC
++++ electron/atom/common/api/atom_api_crash_reporter.cc
+@@ -33,15 +33,23 @@ struct Converter<CrashReporter::UploadReportResult> {
+ namespace {
+
+ void AddExtraParameter(const std::string& key, const std::string& value) {
++#if !defined(OS_BSD)
+ CrashReporter::GetInstance()->AddExtraParameter(key, value);
++#endif
+ }
+
+ void RemoveExtraParameter(const std::string& key) {
++#if !defined(OS_BSD)
+ CrashReporter::GetInstance()->RemoveExtraParameter(key);
++#endif
+ }
+
+ std::map<std::string, std::string> GetParameters() {
++#if !defined(OS_BSD)
+ return CrashReporter::GetInstance()->GetParameters();
++#else
++ return std::map<std::string, std::string>();
++#endif
+ }
+
+ void Initialize(v8::Local<v8::Object> exports,
+@@ -49,6 +57,7 @@ void Initialize(v8::Local<v8::Object> exports,
+ v8::Local<v8::Context> context,
+ void* priv) {
+ mate::Dictionary dict(context->GetIsolate(), exports);
++#if !defined(OS_BSD)
+ auto reporter = base::Unretained(CrashReporter::GetInstance());
+ dict.SetMethod("start", base::Bind(&CrashReporter::Start, reporter));
+ dict.SetMethod("addExtraParameter", &AddExtraParameter);
+@@ -60,6 +69,7 @@ void Initialize(v8::Local<v8::Object> exports,
+ base::Bind(&CrashReporter::SetUploadToServer, reporter));
+ dict.SetMethod("getUploadToServer",
+ base::Bind(&CrashReporter::GetUploadToServer, reporter));
++#endif
+ }
+
+ } // namespace
diff --git a/devel/electron4/files/patch-electron_atom_common_atom__command__line.cc b/devel/electron4/files/patch-electron_atom_common_atom__command__line.cc
new file mode 100644
index 000000000000..b3f3947e2171
--- /dev/null
+++ b/devel/electron4/files/patch-electron_atom_common_atom__command__line.cc
@@ -0,0 +1,11 @@
+--- electron/atom/common/atom_command_line.cc.orig 2019-03-16 12:50:29 UTC
++++ electron/atom/common/atom_command_line.cc
+@@ -26,7 +26,7 @@ void AtomCommandLine::Init(int argc, base::CommandLine
+ argv_.assign(argv, argv + argc);
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // static
+ void AtomCommandLine::InitializeFromCommandLine() {
+ argv_ = base::CommandLine::ForCurrentProcess()->argv();
diff --git a/devel/electron4/files/patch-electron_atom_common_atom__command__line.h b/devel/electron4/files/patch-electron_atom_common_atom__command__line.h
new file mode 100644
index 000000000000..5895823c85b0
--- /dev/null
+++ b/devel/electron4/files/patch-electron_atom_common_atom__command__line.h
@@ -0,0 +1,11 @@
+--- electron/atom/common/atom_command_line.h.orig 2019-03-16 12:51:16 UTC
++++ electron/atom/common/atom_command_line.h
+@@ -21,7 +21,7 @@ class AtomCommandLine {
+
+ static void Init(int argc, base::CommandLine::CharType** argv);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // On Linux the command line has to be read from base::CommandLine since
+ // it is using zygote.
+ static void InitializeFromCommandLine();
diff --git a/devel/electron4/files/patch-electron_atom_common_crash__reporter_crash__reporter.cc b/devel/electron4/files/patch-electron_atom_common_crash__reporter_crash__reporter.cc
new file mode 100644
index 000000000000..23bf573a5f6f
--- /dev/null
+++ b/devel/electron4/files/patch-electron_atom_common_crash__reporter_crash__reporter.cc
@@ -0,0 +1,14 @@
+--- electron/atom/common/crash_reporter/crash_reporter.cc.orig 2019-03-16 13:12:45 UTC
++++ electron/atom/common/crash_reporter/crash_reporter.cc
+@@ -102,7 +102,11 @@ CrashReporter* CrashReporter::GetInstance() {
+ #endif
+
+ void CrashReporter::StartInstance(const mate::Dictionary& options) {
++#if !defined(OS_BSD)
+ auto* reporter = GetInstance();
++#else
++ CrashReporter *reporter = NULL;
++#endif
+ if (!reporter)
+ return;
+
diff --git a/devel/electron4/files/patch-electron_atom_common_node__bindings.cc b/devel/electron4/files/patch-electron_atom_common_node__bindings.cc
new file mode 100644
index 000000000000..344906b653f4
--- /dev/null
+++ b/devel/electron4/files/patch-electron_atom_common_node__bindings.cc
@@ -0,0 +1,11 @@
+--- electron/atom/common/node_bindings.cc.orig 2019-03-16 12:52:04 UTC
++++ electron/atom/common/node_bindings.cc
+@@ -207,7 +207,7 @@ void NodeBindings::Initialize() {
+ node::g_standalone_mode = browser_env_ == BROWSER;
+ node::g_upstream_node_mode = false;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Get real command line in renderer process forked by zygote.
+ if (browser_env_ != BROWSER)
+ AtomCommandLine::InitializeFromCommandLine();
diff --git a/devel/electron4/files/patch-electron_atom_common_node__bindings__linux.cc b/devel/electron4/files/patch-electron_atom_common_node__bindings__linux.cc
new file mode 100644
index 000000000000..3d45d650eafb
--- /dev/null
+++ b/devel/electron4/files/patch-electron_atom_common_node__bindings__linux.cc
@@ -0,0 +1,69 @@
+--- electron/atom/common/node_bindings_linux.cc.orig 2019-03-16 12:52:40 UTC
++++ electron/atom/common/node_bindings_linux.cc
+@@ -4,17 +4,31 @@
+
+ #include "atom/common/node_bindings_linux.h"
+
++#if !defined(OS_BSD)
+ #include <sys/epoll.h>
++#else
++#include <errno.h>
++#include <sys/select.h>
++#include <sys/sysctl.h>
++#include <sys/time.h>
++#include <sys/types.h>
++#endif
+
+ namespace atom {
+
+ NodeBindingsLinux::NodeBindingsLinux(BrowserEnvironment browser_env)
++#if !defined(OS_BSD)
+ : NodeBindings(browser_env), epoll_(epoll_create(1)) {
++#else
++ : NodeBindings(browser_env) {
++#endif
++#if !defined(OS_BSD)
+ int backend_fd = uv_backend_fd(uv_loop_);
+ struct epoll_event ev = {0};
+ ev.events = EPOLLIN;
+ ev.data.fd = backend_fd;
+ epoll_ctl(epoll_, EPOLL_CTL_ADD, backend_fd, &ev);
++#endif
+ }
+
+ NodeBindingsLinux::~NodeBindingsLinux() {}
+@@ -37,6 +51,7 @@ void NodeBindingsLinux::OnWatcherQueueChanged(uv_loop_
+ }
+
+ void NodeBindingsLinux::PollEvents() {
++#if !defined(OS_BSD)
+ int timeout = uv_backend_timeout(uv_loop_);
+
+ // Wait for new libuv events.
+@@ -45,6 +60,26 @@ void NodeBindingsLinux::PollEvents() {
+ struct epoll_event ev;
+ r = epoll_wait(epoll_, &ev, 1, timeout);
+ } while (r == -1 && errno == EINTR);
++#else
++ struct timeval tv;
++ int timeout = uv_backend_timeout(uv_loop_);
++ if (timeout != -1) {
++ tv.tv_sec = timeout / 1000;
++ tv.tv_usec = (timeout % 1000) * 1000;
++ }
++
++ fd_set readset;
++ int fd = uv_backend_fd(uv_loop_);
++ FD_ZERO(&readset);
++ FD_SET(fd, &readset);
++
++ // Wait for new libuv events.
++ int r;
++ do {
++ r = select(fd + 1, &readset, nullptr, nullptr,
++ timeout == -1 ? nullptr : &tv);
++ } while (r == -1 && errno == EINTR);
++#endif
+ }
+
+ // static
diff --git a/devel/electron4/files/patch-electron_brightray_browser_brightray__paths.h b/devel/electron4/files/patch-electron_brightray_browser_brightray__paths.h
new file mode 100644
index 000000000000..d7961f9e1a34
--- /dev/null
+++ b/devel/electron4/files/patch-electron_brightray_browser_brightray__paths.h
@@ -0,0 +1,11 @@
+--- electron/brightray/browser/brightray_paths.h.orig 2019-03-16 11:54:53 UTC
++++ electron/brightray/browser/brightray_paths.h
+@@ -24,7 +24,7 @@ enum {
+ DIR_USER_CACHE, // Directory where user cache can be written.
+ DIR_APP_LOGS, // Directory where app logs live
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ DIR_APP_DATA, // Application Data directory under the user profile.
+ #else
+ DIR_APP_DATA = base::DIR_APP_DATA,
diff --git a/devel/electron4/files/patch-electron_brightray_browser_browser__main__parts.cc b/devel/electron4/files/patch-electron_brightray_browser_browser__main__parts.cc
new file mode 100644
index 000000000000..403b28a1440c
--- /dev/null
+++ b/devel/electron4/files/patch-electron_brightray_browser_browser__main__parts.cc
@@ -0,0 +1,29 @@
+--- electron/brightray/browser/browser_main_parts.cc.orig 2019-03-16 13:00:11 UTC
++++ electron/brightray/browser/browser_main_parts.cc
+@@ -12,7 +12,7 @@
+ #include <string>
+ #include <utility>
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <glib.h> // for g_setenv()
+ #endif
+
+@@ -169,7 +169,7 @@ BrowserMainParts::BrowserMainParts() {}
+
+ BrowserMainParts::~BrowserMainParts() {}
+
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ void OverrideAppLogsPath() {
+ base::FilePath path;
+ if (base::PathService::Get(brightray::DIR_APP_DATA, &path)) {
+@@ -256,7 +256,7 @@ void BrowserMainParts::PreMainMessageLoopStart() {
+ ui::ResourceBundle::GetSharedInstance().GetLocaleFilePath(locale, true);
+ if (!locale_file_path.empty()) {
+ custom_locale_ = locale;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ /* When built with USE_GLIB, libcc's GetApplicationLocaleInternal() uses
+ * glib's g_get_language_names(), which keys off of getenv("LC_ALL") */
+ g_setenv("LC_ALL", custom_locale_.c_str(), TRUE);
diff --git a/devel/electron4/files/patch-electron_brightray_browser_views_views__delegate.cc b/devel/electron4/files/patch-electron_brightray_browser_views_views__delegate.cc
new file mode 100644
index 000000000000..1fbe1f86745b
--- /dev/null
+++ b/devel/electron4/files/patch-electron_brightray_browser_views_views__delegate.cc
@@ -0,0 +1,38 @@
+--- electron/brightray/browser/views/views_delegate.cc.orig 2019-03-16 11:59:52 UTC
++++ electron/brightray/browser/views/views_delegate.cc
+@@ -9,7 +9,7 @@
+ #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
+ #include "ui/views/widget/native_widget_aura.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/environment.h"
+ #include "base/nix/xdg_util.h"
+ #include "ui/views/linux_ui/linux_ui.h"
+@@ -17,7 +17,7 @@
+
+ namespace {
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ bool IsDesktopEnvironmentUnity() {
+ std::unique_ptr<base::Environment> env(base::Environment::Create());
+ base::nix::DesktopEnvironment desktop_env =
+@@ -71,7 +71,7 @@ bool ViewsDelegate::IsWindowInMetro(gfx::NativeWindow
+ return false;
+ }
+
+-#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#elif (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ gfx::ImageSkia* ViewsDelegate::GetDefaultWindowIcon() const {
+ return NULL;
+ }
+@@ -103,7 +103,7 @@ void ViewsDelegate::OnBeforeWidgetInit(
+ }
+
+ bool ViewsDelegate::WindowManagerProvidesTitleBar(bool maximized) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // On Ubuntu Unity, the system always provides a title bar for maximized
+ // windows.
+ if (!maximized)
diff --git a/devel/electron4/files/patch-electron_brightray_browser_views_views__delegate.h b/devel/electron4/files/patch-electron_brightray_browser_views_views__delegate.h
new file mode 100644
index 000000000000..ce81fd5e17dc
--- /dev/null
+++ b/devel/electron4/files/patch-electron_brightray_browser_views_views__delegate.h
@@ -0,0 +1,11 @@
+--- electron/brightray/browser/views/views_delegate.h.orig 2019-03-16 12:06:26 UTC
++++ electron/brightray/browser/views/views_delegate.h
+@@ -39,7 +39,7 @@ class ViewsDelegate : public views::ViewsDelegate {
+ HICON GetDefaultWindowIcon() const override;
+ HICON GetSmallWindowIcon() const override;
+ bool IsWindowInMetro(gfx::NativeWindow window) const override;
+-#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#elif (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ gfx::ImageSkia* GetDefaultWindowIcon() const override;
+ #endif
+ views::NonClientFrameView* CreateDefaultNonClientFrameView(
diff --git a/devel/electron4/files/patch-electron_brightray_common_platform__util.h b/devel/electron4/files/patch-electron_brightray_common_platform__util.h
new file mode 100644
index 000000000000..2e852b889619
--- /dev/null
+++ b/devel/electron4/files/patch-electron_brightray_common_platform__util.h
@@ -0,0 +1,11 @@
+--- electron/brightray/common/platform_util.h.orig 2019-03-16 12:07:20 UTC
++++ electron/brightray/common/platform_util.h
+@@ -11,7 +11,7 @@ namespace brightray {
+
+ namespace platform_util {
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Returns a success flag.
+ // Unlike libgtkui, does *not* use "chromium-browser.desktop" as a fallback.
+ bool GetDesktopName(std::string* setme);
diff --git a/devel/electron4/files/patch-electron_chromium__src_chrome_browser_process__singleton__posix.cc b/devel/electron4/files/patch-electron_chromium__src_chrome_browser_process__singleton__posix.cc
new file mode 100644
index 000000000000..9c0731ca31ac
--- /dev/null
+++ b/devel/electron4/files/patch-electron_chromium__src_chrome_browser_process__singleton__posix.cc
@@ -0,0 +1,20 @@
+--- electron/chromium_src/chrome/browser/process_singleton_posix.cc.orig 2019-03-16 13:07:45 UTC
++++ electron/chromium_src/chrome/browser/process_singleton_posix.cc
+@@ -92,7 +92,7 @@
+ #include "net/base/network_interfaces.h"
+ #include "ui/base/l10n/l10n_util.h"
+
+-#if defined(TOOLKIT_VIEWS) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(TOOLKIT_VIEWS) && (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #include "ui/views/linux_ui/linux_ui.h"
+ #endif
+
+@@ -859,7 +859,7 @@ ProcessSingleton::NotifyResult ProcessSingleton::Notif
+ // The other process is shutting down, it's safe to start a new process.
+ return PROCESS_NONE;
+ } else if (strncmp(buf, kACKToken, arraysize(kACKToken) - 1) == 0) {
+-#if defined(TOOLKIT_VIEWS) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(TOOLKIT_VIEWS) && (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // Likely NULL in unit tests.
+ views::LinuxUI* linux_ui = views::LinuxUI::instance();
+ if (linux_ui)
diff --git a/devel/electron4/files/patch-electron_chromium__src_chrome_renderer_spellchecker_spellcheck__worditerator.cc b/devel/electron4/files/patch-electron_chromium__src_chrome_renderer_spellchecker_spellcheck__worditerator.cc
new file mode 100644
index 000000000000..4497310d7b14
--- /dev/null
+++ b/devel/electron4/files/patch-electron_chromium__src_chrome_renderer_spellchecker_spellcheck__worditerator.cc
@@ -0,0 +1,17 @@
+--- electron/chromium_src/chrome/renderer/spellchecker/spellcheck_worditerator.cc.orig 2019-03-16 13:10:56 UTC
++++ electron/chromium_src/chrome/renderer/spellchecker/spellcheck_worditerator.cc
+@@ -16,10 +16,10 @@
+ #include "base/macros.h"
+ #include "base/strings/stringprintf.h"
+ #include "base/strings/utf_string_conversions.h"
+-#include "third_party/icu/source/common/unicode/normlzr.h"
+-#include "third_party/icu/source/common/unicode/schriter.h"
+-#include "third_party/icu/source/common/unicode/uscript.h"
+-#include "third_party/icu/source/i18n/unicode/ulocdata.h"
++#include "unicode/normlzr.h"
++#include "unicode/schriter.h"
++#include "unicode/uscript.h"
++#include "unicode/ulocdata.h"
+
+ // SpellcheckCharAttribute implementation:
+
diff --git a/devel/electron4/files/patch-electron_chromium__src_chrome_renderer_spellchecker_spellcheck__worditerator.h b/devel/electron4/files/patch-electron_chromium__src_chrome_renderer_spellchecker_spellcheck__worditerator.h
new file mode 100644
index 000000000000..2509a8a3f2e3
--- /dev/null
+++ b/devel/electron4/files/patch-electron_chromium__src_chrome_renderer_spellchecker_spellcheck__worditerator.h
@@ -0,0 +1,11 @@
+--- electron/chromium_src/chrome/renderer/spellchecker/spellcheck_worditerator.h.orig 2019-03-16 13:11:46 UTC
++++ electron/chromium_src/chrome/renderer/spellchecker/spellcheck_worditerator.h
+@@ -16,7 +16,7 @@
+
+ #include "base/macros.h"
+ #include "base/strings/string16.h"
+-#include "third_party/icu/source/common/unicode/uscript.h"
++#include "unicode/uscript.h"
+
+ namespace base {
+ namespace i18n {
diff --git a/devel/electron4/files/patch-electron_lib_browser_api_app.js b/devel/electron4/files/patch-electron_lib_browser_api_app.js
new file mode 100644
index 000000000000..61269c058fb9
--- /dev/null
+++ b/devel/electron4/files/patch-electron_lib_browser_api_app.js
@@ -0,0 +1,11 @@
+--- electron/lib/browser/api/app.js.orig 2019-05-23 00:26:57 UTC
++++ electron/lib/browser/api/app.js
+@@ -83,7 +83,7 @@ if (process.platform === 'darwin') {
+ }
+ }
+
+-if (process.platform === 'linux') {
++if (process.platform === 'linux' || process.platform === 'freebsd') {
+ app.launcher = {
+ setBadgeCount: bindings.unityLauncherSetBadgeCount,
+ getBadgeCount: bindings.unityLauncherGetBadgeCount,
diff --git a/devel/electron4/files/patch-electron_lib_browser_api_dialog.js b/devel/electron4/files/patch-electron_lib_browser_api_dialog.js
new file mode 100644
index 000000000000..f4950b8d7fe3
--- /dev/null
+++ b/devel/electron4/files/patch-electron_lib_browser_api_dialog.js
@@ -0,0 +1,11 @@
+--- electron/lib/browser/api/dialog.js.orig 2019-05-23 00:28:36 UTC
++++ electron/lib/browser/api/dialog.js
+@@ -54,7 +54,7 @@ const normalizeAccessKey = (text) => {
+ // existing single underscores with a second underscore, replace double
+ // ampersands with a single ampersand, and replace a single ampersand with
+ // a single underscore
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ return text.replace(/_/g, '__').replace(/&(.?)/g, (match, after) => {
+ if (after === '&') return after
+ return `_${after}`
diff --git a/devel/electron4/files/patch-electron_lib_browser_api_menu-item-roles.js b/devel/electron4/files/patch-electron_lib_browser_api_menu-item-roles.js
new file mode 100644
index 000000000000..330d782cbef6
--- /dev/null
+++ b/devel/electron4/files/patch-electron_lib_browser_api_menu-item-roles.js
@@ -0,0 +1,11 @@
+--- electron/lib/browser/api/menu-item-roles.js.orig 2019-05-23 00:29:28 UTC
++++ electron/lib/browser/api/menu-item-roles.js
+@@ -5,7 +5,7 @@ const { app } = require('electron')
+ const roles = {
+ about: {
+ get label () {
+- return process.platform === 'linux' ? 'About' : `About ${app.getName()}`
++ return (process.platform === 'linux' || process.platform === 'freebsd') ? 'About' : `About ${app.getName()}`
+ }
+ },
+ close: {
diff --git a/devel/electron4/files/patch-electron_lib_browser_api_power-monitor.js b/devel/electron4/files/patch-electron_lib_browser_api_power-monitor.js
new file mode 100644
index 000000000000..8d03fa3ce00c
--- /dev/null
+++ b/devel/electron4/files/patch-electron_lib_browser_api_power-monitor.js
@@ -0,0 +1,11 @@
+--- electron/lib/browser/api/power-monitor.js.orig 2019-05-23 00:30:29 UTC
++++ electron/lib/browser/api/power-monitor.js
+@@ -8,7 +8,7 @@ Object.setPrototypeOf(PowerMonitor.prototype, EventEmi
+ EventEmitter.call(powerMonitor)
+
+ // On Linux we need to call blockShutdown() to subscribe to shutdown event.
+-if (process.platform === 'linux') {
++if (process.platform === 'linux' || process.platform === 'freebsd') {
+ powerMonitor.on('newListener', (event) => {
+ if (event === 'shutdown' && powerMonitor.listenerCount('shutdown') === 0) {
+ powerMonitor.blockShutdown()
diff --git a/devel/electron4/files/patch-electron_lib_browser_init.js b/devel/electron4/files/patch-electron_lib_browser_init.js
new file mode 100644
index 000000000000..c2eab57f2267
--- /dev/null
+++ b/devel/electron4/files/patch-electron_lib_browser_init.js
@@ -0,0 +1,11 @@
+--- electron/lib/browser/init.js.orig 2019-05-23 00:31:34 UTC
++++ electron/lib/browser/init.js
+@@ -167,7 +167,7 @@ const mainStartupScript = packageJson.main || 'index.j
+ const KNOWN_XDG_DESKTOP_VALUES = ['Pantheon', 'Unity:Unity7', 'pop:GNOME']
+
+ function currentPlatformSupportsAppIndicator () {
+- if (process.platform !== 'linux') return false
++ if (process.platform !== 'linux' && process.platform !== 'freebsd') return false
+ const currentDesktop = process.env.XDG_CURRENT_DESKTOP
+
+ if (!currentDesktop) return false
diff --git a/devel/electron4/files/patch-electron_lib_common_api_clipboard.js b/devel/electron4/files/patch-electron_lib_common_api_clipboard.js
new file mode 100644
index 000000000000..6f7283729a46
--- /dev/null
+++ b/devel/electron4/files/patch-electron_lib_common_api_clipboard.js
@@ -0,0 +1,10 @@
+--- electron/lib/common/api/clipboard.js.orig 2019-05-23 00:33:16 UTC
++++ electron/lib/common/api/clipboard.js
+@@ -1,6 +1,6 @@
+ 'use strict'
+
+-if (process.platform === 'linux' && process.type === 'renderer') {
++if ((process.platform === 'linux' || process.platform === 'freebsd') && process.type === 'renderer') {
+ // On Linux we could not access clipboard in renderer process.
+ const { getRemoteForUsage } = require('@electron/internal/renderer/remote')
+ module.exports = getRemoteForUsage('clipboard').clipboard
diff --git a/devel/electron4/files/patch-electron_script_lib_utils.js b/devel/electron4/files/patch-electron_script_lib_utils.js
new file mode 100644
index 000000000000..7d61ca45e529
--- /dev/null
+++ b/devel/electron4/files/patch-electron_script_lib_utils.js
@@ -0,0 +1,10 @@
+--- electron/script/lib/utils.js.orig 2019-05-14 01:53:42 UTC
++++ electron/script/lib/utils.js
+@@ -9,6 +9,7 @@ function getElectronExec () {
+ case 'win32':
+ return `out/${OUT_DIR}/electron.exe`
+ case 'linux':
++ case 'freebsd':
+ return `out/${OUT_DIR}/electron`
+ default:
+ throw new Error('Unknown platform')
diff --git a/devel/electron4/files/patch-electron_spec_api-app-spec.js b/devel/electron4/files/patch-electron_spec_api-app-spec.js
new file mode 100644
index 000000000000..6e84a9b08ed4
--- /dev/null
+++ b/devel/electron4/files/patch-electron_spec_api-app-spec.js
@@ -0,0 +1,75 @@
+--- electron/spec/api-app-spec.js.orig 2019-05-02 21:34:52 UTC
++++ electron/spec/api-app-spec.js
+@@ -174,7 +174,7 @@ describe('app module', () => {
+ })
+
+ it('exits gracefully', async function () {
+- if (!['darwin', 'linux'].includes(process.platform)) {
++ if (!['darwin', 'linux', 'freebsd'].includes(process.platform)) {
+ this.skip()
+ return
+ }
+@@ -274,7 +274,7 @@ describe('app module', () => {
+ let w = null
+
+ before(function () {
+- if (process.platform !== 'linux') {
++ if (process.platform !== 'linux' && process.platform !== 'freebsd') {
+ this.skip()
+ }
+ })
+@@ -421,7 +421,8 @@ describe('app module', () => {
+ describe('app.setBadgeCount', () => {
+ const platformIsNotSupported =
+ (process.platform === 'win32') ||
+- (process.platform === 'linux' && !app.isUnityRunning())
++ (process.platform === 'linux' && !app.isUnityRunning()) ||
++ (process.platform === 'freebsd')
+ const platformIsSupported = !platformIsNotSupported
+
+ const expectedBadgeCount = 42
+@@ -475,7 +476,7 @@ describe('app module', () => {
+ ]
+
+ before(function () {
+- if (process.platform === 'linux' || process.mas) this.skip()
++ if (process.platform === 'linux' || process.platform === 'freebsd' || process.mas) this.skip()
+ })
+
+ beforeEach(() => {
+@@ -582,7 +583,7 @@ describe('app module', () => {
+ let w = null
+
+ before(function () {
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ this.skip()
+ }
+ })
+@@ -775,7 +776,7 @@ describe('app module', () => {
+ // doesn't affect nested `describe`s.
+ beforeEach(function () {
+ // FIXME Get these specs running on Linux CI
+- if (process.platform === 'linux' && isCI) {
++ if ((process.platform === 'linux' || process.platform === 'freebsd') && isCI) {
+ this.skip()
+ }
+ })
+@@ -913,7 +914,7 @@ describe('app module', () => {
+
+ it('succeeds with complete GPUInfo', async () => {
+ const completeInfo = await getGPUInfo('complete')
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ // For linux and macOS complete info is same as basic info
+ await verifyBasicGPUInfo(completeInfo)
+ const basicInfo = await getGPUInfo('basic')
+@@ -944,7 +945,7 @@ describe('app module', () => {
+ // XXX(alexeykuzmin): Calling `.skip()` inside a `before` hook
+ // doesn't affect nested `describe`s.
+ // FIXME Get these specs running on Linux
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ this.skip()
+ }
+
diff --git a/devel/electron4/files/patch-electron_spec_api-auto-updater-spec.js b/devel/electron4/files/patch-electron_spec_api-auto-updater-spec.js
new file mode 100644
index 000000000000..a45ed722738e
--- /dev/null
+++ b/devel/electron4/files/patch-electron_spec_api-auto-updater-spec.js
@@ -0,0 +1,11 @@
+--- electron/spec/api-auto-updater-spec.js.orig 2019-05-14 02:12:26 UTC
++++ electron/spec/api-auto-updater-spec.js
+@@ -140,7 +140,7 @@ describe('autoUpdater module', function () {
+
+ describe('error event', () => {
+ it('serializes correctly over the remote module', function (done) {
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ // FIXME(alexeykuzmin): Skip the test.
+ // this.skip()
+ return done()
diff --git a/devel/electron4/files/patch-electron_spec_api-browser-window-spec.js b/devel/electron4/files/patch-electron_spec_api-browser-window-spec.js
new file mode 100644
index 000000000000..782143881c42
--- /dev/null
+++ b/devel/electron4/files/patch-electron_spec_api-browser-window-spec.js
@@ -0,0 +1,38 @@
+--- electron/spec/api-browser-window-spec.js.orig 2019-05-14 02:19:04 UTC
++++ electron/spec/api-browser-window-spec.js
+@@ -1208,7 +1208,7 @@ describe('BrowserWindow module', () => {
+
+ describe('enableLargerThanScreen" option', () => {
+ before(function () {
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ this.skip()
+ }
+ })
+@@ -2198,7 +2198,7 @@ describe('BrowserWindow module', () => {
+ w.loadFile(path.join(fixtures, 'pages', 'visibilitychange.html'))
+ })
+ it('visibilityState changes when window is minimized', function (done) {
+- if (isCI && process.platform === 'linux') {
++ if (isCI && (process.platform === 'linux' || process.platform === 'freebsd')) {
+ // FIXME(alexeykuzmin): Skip the test instead of marking it as passed.
+ // afterEach hook won't be run if a test is skipped dynamically.
+ // If afterEach isn't run current window won't be destroyed
+@@ -2388,7 +2388,7 @@ describe('BrowserWindow module', () => {
+ }
+
+ // FIXME These specs crash on Linux when run in a docker container
+- if (isCI && process.platform === 'linux') {
++ if (isCI && (process.platform === 'linux' || process.platform === 'freebsd')) {
+ this.skip()
+ }
+ })
+@@ -2620,7 +2620,7 @@ describe('BrowserWindow module', () => {
+ // - `.skip()` called in the 'beforeEach' hook prevents 'afterEach'
+ // hook from being called.
+ // Not implemented on Linux.
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ return
+ }
+
diff --git a/devel/electron4/files/patch-electron_spec_api-clipboard-spec.js b/devel/electron4/files/patch-electron_spec_api-clipboard-spec.js
new file mode 100644
index 000000000000..a306ba12ccf1
--- /dev/null
+++ b/devel/electron4/files/patch-electron_spec_api-clipboard-spec.js
@@ -0,0 +1,38 @@
+--- electron/spec/api-clipboard-spec.js.orig 2019-05-16 05:23:55 UTC
++++ electron/spec/api-clipboard-spec.js
+@@ -27,7 +27,7 @@ describe('clipboard module', () => {
+ describe('clipboard.readHTML()', () => {
+ it('returns markup correctly', () => {
+ const text = '<string>Hi</string>'
+- const markup = process.platform === 'darwin' ? "<meta charset='utf-8'><string>Hi</string>" : process.platform === 'linux' ? '<meta http-equiv="content-type" ' + 'content="text/html; charset=utf-8"><string>Hi</string>' : '<string>Hi</string>'
++ const markup = process.platform === 'darwin' ? "<meta charset='utf-8'><string>Hi</string>" : (process.platform === 'linux' || process.platform === 'freebsd') ? '<meta http-equiv="content-type" ' + 'content="text/html; charset=utf-8"><string>Hi</string>' : '<string>Hi</string>'
+ clipboard.writeHTML(text)
+ expect(clipboard.readHTML()).to.equal(markup)
+ })
+@@ -43,7 +43,7 @@ describe('clipboard module', () => {
+
+ describe('clipboard.readBookmark', () => {
+ before(function () {
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ this.skip()
+ }
+ })
+@@ -69,7 +69,7 @@ describe('clipboard module', () => {
+ const rtf = '{\\rtf1\\utf8 text}'
+ const p = path.join(fixtures, 'assets', 'logo.png')
+ const i = nativeImage.createFromPath(p)
+- const markup = process.platform === 'darwin' ? "<meta charset='utf-8'><b>Hi</b>" : process.platform === 'linux' ? '<meta http-equiv="content-type" ' + 'content="text/html; charset=utf-8"><b>Hi</b>' : '<b>Hi</b>'
++ const markup = process.platform === 'darwin' ? "<meta charset='utf-8'><b>Hi</b>" : (process.platform === 'linux' || process.platform === 'freebsd') ? '<meta http-equiv="content-type" ' + 'content="text/html; charset=utf-8"><b>Hi</b>' : '<b>Hi</b>'
+ const bookmark = { title: 'a title', url: 'test' }
+ clipboard.write({
+ text: 'test',
+@@ -84,7 +84,7 @@ describe('clipboard module', () => {
+ expect(clipboard.readRTF()).to.equal(rtf)
+ expect(clipboard.readImage().toDataURL()).to.equal(i.toDataURL())
+
+- if (process.platform !== 'linux') {
++ if (process.platform !== 'linux' && process.platform !== 'freebsd') {
+ expect(clipboard.readBookmark()).to.deep.equal(bookmark)
+ }
+ })
diff --git a/devel/electron4/files/patch-electron_spec_api-crash-reporter-spec.js b/devel/electron4/files/patch-electron_spec_api-crash-reporter-spec.js
new file mode 100644
index 000000000000..b2dcb6fe5ffe
--- /dev/null
+++ b/devel/electron4/files/patch-electron_spec_api-crash-reporter-spec.js
@@ -0,0 +1,11 @@
+--- electron/spec/api-crash-reporter-spec.js.orig 2019-05-14 03:49:42 UTC
++++ electron/spec/api-crash-reporter-spec.js
+@@ -16,7 +16,7 @@ describe('crashReporter module', () => {
+ if (process.mas || process.env.DISABLE_CRASH_REPORTER_TESTS) return
+
+ // TODO(alexeykuzmin): [Ch66] Fails. Fix it and enable back.
+- if (process.platform === 'linux') return
++ if (process.platform === 'linux' || process.platform === 'freebsd') return
+
+ let originalTempDirectory = null
+ let tempDirectory = null
diff --git a/devel/electron4/files/patch-electron_spec_api-net-log-spec.js b/devel/electron4/files/patch-electron_spec_api-net-log-spec.js
new file mode 100644
index 000000000000..b1efc629f2e1
--- /dev/null
+++ b/devel/electron4/files/patch-electron_spec_api-net-log-spec.js
@@ -0,0 +1,29 @@
+--- electron/spec/api-net-log-spec.js.orig 2019-05-14 02:57:56 UTC
++++ electron/spec/api-net-log-spec.js
+@@ -95,7 +95,7 @@ describe('netLog module', () => {
+ })
+
+ it('should begin and end logging automatically when --log-net-log is passed', done => {
+- if (isCI && process.platform === 'linux') {
++ if (isCI && (process.platform === 'linux' || process.platform === 'freebsd')) {
+ done()
+ return
+ }
+@@ -116,7 +116,7 @@ describe('netLog module', () => {
+
+ // FIXME(deepak1556): Ch69 follow up.
+ xit('should begin and end logging automtically when --log-net-log is passed, and behave correctly when .startLogging() and .stopLogging() is called', done => {
+- if (isCI && process.platform === 'linux') {
++ if (isCI && (process.platform === 'linux' || process.platform === 'freebsd')) {
+ done()
+ return
+ }
+@@ -139,7 +139,7 @@ describe('netLog module', () => {
+ })
+
+ it('should end logging automatically when only .startLogging() is called', done => {
+- if (isCI && process.platform === 'linux') {
++ if (isCI && (process.platform === 'linux' || process.platform === 'freebsd')) {
+ done()
+ return
+ }
diff --git a/devel/electron4/files/patch-electron_spec_api-notification-dbus-spec.js b/devel/electron4/files/patch-electron_spec_api-notification-dbus-spec.js
new file mode 100644
index 000000000000..3e646826ff3d
--- /dev/null
+++ b/devel/electron4/files/patch-electron_spec_api-notification-dbus-spec.js
@@ -0,0 +1,11 @@
+--- electron/spec/api-notification-dbus-spec.js.orig 2019-05-14 03:03:26 UTC
++++ electron/spec/api-notification-dbus-spec.js
+@@ -13,7 +13,7 @@ const Promise = require('bluebird')
+ const { remote } = require('electron')
+ const { app } = remote.require('electron')
+
+-const skip = process.platform !== 'linux' ||
++const skip = (process.platform !== 'linux' && process.platform === 'freebsd') ||
+ process.arch === 'ia32' ||
+ process.arch.indexOf('arm') === 0 ||
+ !process.env.DBUS_SESSION_BUS_ADDRESS;
diff --git a/devel/electron4/files/patch-electron_spec_api-power-monitor-spec.js b/devel/electron4/files/patch-electron_spec_api-power-monitor-spec.js
new file mode 100644
index 000000000000..c1a50a05a72e
--- /dev/null
+++ b/devel/electron4/files/patch-electron_spec_api-power-monitor-spec.js
@@ -0,0 +1,11 @@
+--- electron/spec/api-power-monitor-spec.js.orig 2019-05-14 03:07:38 UTC
++++ electron/spec/api-power-monitor-spec.js
+@@ -14,7 +14,7 @@ const Promise = require('bluebird')
+ const { expect } = chai
+ chai.use(dirtyChai)
+
+-const skip = process.platform !== 'linux' || !process.env.DBUS_SYSTEM_BUS_ADDRESS
++const skip = (process.platform !== 'linux' && process.platform === 'freebsd') || !process.env.DBUS_SYSTEM_BUS_ADDRESS
+
+ describe('powerMonitor', () => {
+ let logindMock, dbusMockPowerMonitor, getCalls, emitSignal, reset
diff --git a/devel/electron4/files/patch-electron_spec_chromium-spec.js b/devel/electron4/files/patch-electron_spec_chromium-spec.js
new file mode 100644
index 000000000000..63f2250dfcd7
--- /dev/null
+++ b/devel/electron4/files/patch-electron_spec_chromium-spec.js
@@ -0,0 +1,11 @@
+--- electron/spec/chromium-spec.js.orig 2019-05-14 03:32:31 UTC
++++ electron/spec/chromium-spec.js
+@@ -861,7 +861,7 @@ describe('chromium feature', () => {
+ })
+
+ it('can be get as context in canvas', () => {
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ // FIXME(alexeykuzmin): Skip the test.
+ // this.skip()
+ return
diff --git a/devel/electron4/files/patch-extensions_browser_api_declarative__webrequest_webrequest__action.cc b/devel/electron4/files/patch-extensions_browser_api_declarative__webrequest_webrequest__action.cc
new file mode 100644
index 000000000000..df60e8f6c52f
--- /dev/null
+++ b/devel/electron4/files/patch-extensions_browser_api_declarative__webrequest_webrequest__action.cc
@@ -0,0 +1,14 @@
+--- extensions/browser/api/declarative_webrequest/webrequest_action.cc.orig 2019-03-15 06:37:23 UTC
++++ extensions/browser/api/declarative_webrequest/webrequest_action.cc
+@@ -28,7 +28,11 @@
+ #include "extensions/common/extension.h"
+ #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
+ #include "net/http/http_util.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ using content::ResourceRequestInfo;
+
diff --git a/devel/electron4/files/patch-extensions_browser_api_messaging_message__service.cc b/devel/electron4/files/patch-extensions_browser_api_messaging_message__service.cc
new file mode 100644
index 000000000000..fb2d08c3a4ad
--- /dev/null
+++ b/devel/electron4/files/patch-extensions_browser_api_messaging_message__service.cc
@@ -0,0 +1,20 @@
+--- extensions/browser/api/messaging/message_service.cc.orig 2019-03-15 06:37:23 UTC
++++ extensions/browser/api/messaging/message_service.cc
+@@ -60,7 +60,7 @@ namespace {
+
+ const char kReceivingEndDoesntExistError[] =
+ "Could not establish connection. Receiving end does not exist.";
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ const char kMissingPermissionError[] =
+ "Access to native messaging requires nativeMessaging permission.";
+ const char kProhibitedByPoliciesError[] =
+@@ -362,7 +362,7 @@ void MessageService::OpenChannelToNativeApp(
+ if (!source)
+ return;
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ content::WebContents* web_contents =
+ content::WebContents::FromRenderFrameHost(source);
+ ExtensionWebContentsObserver* extension_web_contents_observer =
diff --git a/devel/electron4/files/patch-extensions_browser_api_networking__private_networking__private__delegate__factory.cc b/devel/electron4/files/patch-extensions_browser_api_networking__private_networking__private__delegate__factory.cc
new file mode 100644
index 000000000000..e21835ecd731
--- /dev/null
+++ b/devel/electron4/files/patch-extensions_browser_api_networking__private_networking__private__delegate__factory.cc
@@ -0,0 +1,20 @@
+--- extensions/browser/api/networking_private/networking_private_delegate_factory.cc.orig 2019-03-15 06:25:45 UTC
++++ extensions/browser/api/networking_private/networking_private_delegate_factory.cc
+@@ -11,7 +11,7 @@
+
+ #if defined(OS_CHROMEOS)
+ #include "extensions/browser/api/networking_private/networking_private_chromeos.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "extensions/browser/api/networking_private/networking_private_linux.h"
+ #elif defined(OS_WIN) || defined(OS_MACOSX)
+ #include "components/wifi/wifi_service.h"
+@@ -61,7 +61,7 @@ KeyedService* NetworkingPrivateDelegateFactory::BuildS
+ NetworkingPrivateDelegate* delegate;
+ #if defined(OS_CHROMEOS)
+ delegate = new NetworkingPrivateChromeOS(browser_context);
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ delegate = new NetworkingPrivateLinux();
+ #elif defined(OS_WIN) || defined(OS_MACOSX)
+ std::unique_ptr<wifi::WiFiService> wifi_service(wifi::WiFiService::Create());
diff --git a/devel/electron4/files/patch-extensions_browser_api_web__request_form__data__parser.cc b/devel/electron4/files/patch-extensions_browser_api_web__request_form__data__parser.cc
new file mode 100644
index 000000000000..084c0f161635
--- /dev/null
+++ b/devel/electron4/files/patch-extensions_browser_api_web__request_form__data__parser.cc
@@ -0,0 +1,14 @@
+--- extensions/browser/api/web_request/form_data_parser.cc.orig 2019-03-15 06:37:23 UTC
++++ extensions/browser/api/web_request/form_data_parser.cc
+@@ -15,7 +15,11 @@
+ #include "base/values.h"
+ #include "net/base/escape.h"
+ #include "net/http/http_request_headers.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ using base::DictionaryValue;
+ using base::ListValue;
diff --git a/devel/electron4/files/patch-extensions_browser_browser__context__keyed__service__factories.cc b/devel/electron4/files/patch-extensions_browser_browser__context__keyed__service__factories.cc
new file mode 100644
index 000000000000..c84d0f5e2ebd
--- /dev/null
+++ b/devel/electron4/files/patch-extensions_browser_browser__context__keyed__service__factories.cc
@@ -0,0 +1,11 @@
+--- extensions/browser/browser_context_keyed_service_factories.cc.orig 2019-03-15 06:37:23 UTC
++++ extensions/browser/browser_context_keyed_service_factories.cc
+@@ -85,7 +85,7 @@ void EnsureBrowserContextKeyedServiceFactoriesBuilt()
+ #if defined(OS_CHROMEOS)
+ NetworkingConfigServiceFactory::GetInstance();
+ #endif
+-#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_BSD)
+ NetworkingPrivateEventRouterFactory::GetInstance();
+ #endif
+ PowerAPI::GetFactoryInstance();
diff --git a/devel/electron4/files/patch-extensions_common_api___permission__features.json b/devel/electron4/files/patch-extensions_common_api___permission__features.json
new file mode 100644
index 000000000000..538c32e5ab89
--- /dev/null
+++ b/devel/electron4/files/patch-extensions_common_api___permission__features.json
@@ -0,0 +1,29 @@
+--- extensions/common/api/_permission_features.json.orig 2019-03-15 06:37:23 UTC
++++ extensions/common/api/_permission_features.json
+@@ -126,7 +126,7 @@
+ "bluetoothPrivate": {
+ "channel": "stable",
+ "extension_types": ["platform_app"],
+- "platforms": ["chromeos", "win", "mac", "linux"],
++ "platforms": ["chromeos", "win", "mac", "linux", "bsd"],
+ "whitelist": [
+ "1C93BD3CF875F4A73C0B2A163BB8FBDA8B8B3D80", // http://crbug.com/387169
+ "A3BC37E2148AC4E99BE4B16AF9D42DD1E592BBBE", // http://crbug.com/387169
+@@ -453,7 +453,7 @@
+ }, {
+ "channel": "stable",
+ "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
+- "platforms": ["chromeos", "mac", "win", "linux"],
++ "platforms": ["chromeos", "mac", "win", "linux", "bsd"],
+ "whitelist": [
+ "0DE0F05680A4A056BCEC864ED8DDA84296F82B40", // http://crbug.com/434651
+ "1C93BD3CF875F4A73C0B2A163BB8FBDA8B8B3D80", // http://crbug.com/293683
+@@ -484,7 +484,7 @@
+ "networkingPrivate": {
+ "channel": "stable",
+ "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
+- "platforms": ["chromeos", "mac", "win", "linux"],
++ "platforms": ["chromeos", "mac", "win", "linux", "bsd"],
+ "whitelist": [
+ // DO NOT ADD ANY MORE ENTRIES HERE.
+ // networkingPrivate is being migrated to networking.onc.
diff --git a/devel/electron4/files/patch-extensions_common_api_runtime.json b/devel/electron4/files/patch-extensions_common_api_runtime.json
new file mode 100644
index 000000000000..eb6185b7dff7
--- /dev/null
+++ b/devel/electron4/files/patch-extensions_common_api_runtime.json
@@ -0,0 +1,11 @@
+--- extensions/common/api/runtime.json.orig 2019-03-15 06:37:23 UTC
++++ extensions/common/api/runtime.json
+@@ -66,7 +66,7 @@
+ "id": "PlatformOs",
+ "type": "string",
+ "description": "The operating system chrome is running on.",
+- "enum": ["mac", "win", "android", "cros", "linux", "openbsd"]
++ "enum": ["mac", "win", "android", "cros", "linux", "freebsd", "openbsd"]
+ },
+ {
+ "id": "PlatformArch",
diff --git a/devel/electron4/files/patch-extensions_common_feature__switch.cc b/devel/electron4/files/patch-extensions_common_feature__switch.cc
new file mode 100644
index 000000000000..82b570a21883
--- /dev/null
+++ b/devel/electron4/files/patch-extensions_common_feature__switch.cc
@@ -0,0 +1,14 @@
+--- extensions/common/feature_switch.cc.orig 2019-03-15 06:25:45 UTC
++++ extensions/common/feature_switch.cc
+@@ -44,11 +44,7 @@ class CommonSwitches {
+ FeatureSwitch::DEFAULT_ENABLED),
+ load_media_router_component_extension(
+ kLoadMediaRouterComponentExtensionFlag,
+-#if defined(GOOGLE_CHROME_BUILD)
+ FeatureSwitch::DEFAULT_ENABLED)
+-#else
+- FeatureSwitch::DEFAULT_DISABLED)
+-#endif // defined(GOOGLE_CHROME_BUILD)
+ {
+ }
+
diff --git a/devel/electron4/files/patch-extensions_common_features_feature.cc b/devel/electron4/files/patch-extensions_common_features_feature.cc
new file mode 100644
index 000000000000..c2917f159f35
--- /dev/null
+++ b/devel/electron4/files/patch-extensions_common_features_feature.cc
@@ -0,0 +1,11 @@
+--- extensions/common/features/feature.cc.orig 2019-03-15 06:25:45 UTC
++++ extensions/common/features/feature.cc
+@@ -26,6 +26,8 @@ Feature::Platform Feature::GetCurrentPlatform() {
+ return MACOSX_PLATFORM;
+ #elif defined(OS_WIN)
+ return WIN_PLATFORM;
++#elif defined(OS_BSD)
++ return LINUX_PLATFORM;
+ #else
+ return UNSPECIFIED_PLATFORM;
+ #endif
diff --git a/devel/electron4/files/patch-extensions_common_image__util.cc b/devel/electron4/files/patch-extensions_common_image__util.cc
new file mode 100644
index 000000000000..1206faa8183b
--- /dev/null
+++ b/devel/electron4/files/patch-extensions_common_image__util.cc
@@ -0,0 +1,14 @@
+--- extensions/common/image_util.cc.orig 2019-03-15 06:37:23 UTC
++++ extensions/common/image_util.cc
+@@ -11,7 +11,11 @@
+ #include "base/strings/string_number_conversions.h"
+ #include "base/strings/string_util.h"
+ #include "base/strings/stringprintf.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+ #include "third_party/skia/include/core/SkColor.h"
+ #include "third_party/skia/include/utils/SkParse.h"
+ #include "ui/gfx/color_utils.h"
diff --git a/devel/electron4/files/patch-extensions_common_stack__frame.cc b/devel/electron4/files/patch-extensions_common_stack__frame.cc
new file mode 100644
index 000000000000..97ebbfafdd89
--- /dev/null
+++ b/devel/electron4/files/patch-extensions_common_stack__frame.cc
@@ -0,0 +1,14 @@
+--- extensions/common/stack_frame.cc.orig 2019-03-15 06:25:45 UTC
++++ extensions/common/stack_frame.cc
+@@ -7,7 +7,11 @@
+ #include <string>
+
+ #include "base/strings/utf_string_conversions.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ namespace extensions {
+
diff --git a/devel/electron4/files/patch-extensions_renderer_bindings_api__binding__util.cc b/devel/electron4/files/patch-extensions_renderer_bindings_api__binding__util.cc
new file mode 100644
index 000000000000..1280525d1431
--- /dev/null
+++ b/devel/electron4/files/patch-extensions_renderer_bindings_api__binding__util.cc
@@ -0,0 +1,11 @@
+--- extensions/renderer/bindings/api_binding_util.cc.orig 2019-03-15 06:37:23 UTC
++++ extensions/renderer/bindings/api_binding_util.cc
+@@ -128,6 +128,8 @@ std::string GetPlatformString() {
+ return "mac";
+ #elif defined(OS_WIN)
+ return "win";
++#elif defined(OS_BSD)
++ return "bsd";
+ #else
+ NOTREACHED();
+ return std::string();
diff --git a/devel/electron4/files/patch-extensions_shell_app_shell__main__delegate.cc b/devel/electron4/files/patch-extensions_shell_app_shell__main__delegate.cc
new file mode 100644
index 000000000000..94704d15a9b1
--- /dev/null
+++ b/devel/electron4/files/patch-extensions_shell_app_shell__main__delegate.cc
@@ -0,0 +1,29 @@
+--- extensions/shell/app/shell_main_delegate.cc.orig 2019-03-15 06:37:23 UTC
++++ extensions/shell/app/shell_main_delegate.cc
+@@ -39,7 +39,7 @@
+
+ #if defined(OS_WIN)
+ #include "base/base_paths_win.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/nix/xdg_util.h"
+ #elif defined(OS_MACOSX)
+ #include "base/base_paths_mac.h"
+@@ -53,7 +53,7 @@
+
+ namespace {
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ extensions::ShellCrashReporterClient* GetCrashReporterClient() {
+ static base::NoDestructor<extensions::ShellCrashReporterClient> instance;
+ return instance.get();
+@@ -71,7 +71,7 @@ base::FilePath GetDataPath() {
+ return cmd_line->GetSwitchValuePath(switches::kContentShellDataPath);
+
+ base::FilePath data_dir;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ std::unique_ptr<base::Environment> env(base::Environment::Create());
+ data_dir = base::nix::GetXDGDirectory(
+ env.get(), base::nix::kXdgConfigHomeEnvVar, base::nix::kDotConfigDir);
diff --git a/devel/electron4/files/patch-gpu_command__buffer_service_program__manager.cc b/devel/electron4/files/patch-gpu_command__buffer_service_program__manager.cc
new file mode 100644
index 000000000000..648837eeaddd
--- /dev/null
+++ b/devel/electron4/files/patch-gpu_command__buffer_service_program__manager.cc
@@ -0,0 +1,14 @@
+--- gpu/command_buffer/service/program_manager.cc.orig 2019-03-15 06:37:24 UTC
++++ gpu/command_buffer/service/program_manager.cc
+@@ -31,7 +31,11 @@
+ #include "gpu/command_buffer/service/progress_reporter.h"
+ #include "gpu/command_buffer/service/shader_manager.h"
+ #include "gpu/config/gpu_preferences.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+ #include "ui/gl/gl_version_info.h"
+
+ using base::TimeDelta;
diff --git a/devel/electron4/files/patch-gpu_config_gpu__control__list.cc b/devel/electron4/files/patch-gpu_config_gpu__control__list.cc
new file mode 100644
index 000000000000..f623bbb427cd
--- /dev/null
+++ b/devel/electron4/files/patch-gpu_config_gpu__control__list.cc
@@ -0,0 +1,32 @@
+--- gpu/config/gpu_control_list.cc.orig 2019-03-15 06:37:24 UTC
++++ gpu/config/gpu_control_list.cc
+@@ -16,7 +16,11 @@
+ #include "base/values.h"
+ #include "build/build_config.h"
+ #include "gpu/config/gpu_info.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ namespace gpu {
+ namespace {
+@@ -213,7 +217,7 @@ bool GpuControlList::More::GLVersionInfoMismatch(
+ GpuControlList::GLType GpuControlList::More::GetDefaultGLType() {
+ #if defined(OS_CHROMEOS)
+ return kGLTypeGL;
+-#elif defined(OS_LINUX) || defined(OS_OPENBSD)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return kGLTypeGL;
+ #elif defined(OS_MACOSX)
+ return kGLTypeGL;
+@@ -681,7 +685,7 @@ GpuControlList::OsType GpuControlList::GetOsType() {
+ return kOsAndroid;
+ #elif defined(OS_FUCHSIA)
+ return kOsFuchsia;
+-#elif defined(OS_LINUX) || defined(OS_OPENBSD)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return kOsLinux;
+ #elif defined(OS_MACOSX)
+ return kOsMacosx;
diff --git a/devel/electron4/files/patch-gpu_config_gpu__test__config.cc b/devel/electron4/files/patch-gpu_config_gpu__test__config.cc
new file mode 100644
index 000000000000..cdc5f74b96ef
--- /dev/null
+++ b/devel/electron4/files/patch-gpu_config_gpu__test__config.cc
@@ -0,0 +1,11 @@
+--- gpu/config/gpu_test_config.cc.orig 2019-03-15 06:37:24 UTC
++++ gpu/config/gpu_test_config.cc
+@@ -25,7 +25,7 @@ namespace {
+ GPUTestConfig::OS GetCurrentOS() {
+ #if defined(OS_CHROMEOS)
+ return GPUTestConfig::kOsChromeOS;
+-#elif defined(OS_LINUX) || defined(OS_OPENBSD)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return GPUTestConfig::kOsLinux;
+ #elif defined(OS_WIN)
+ int32_t major_version = 0;
diff --git a/devel/electron4/files/patch-gpu_ipc_common_gpu__memory__buffer__support.cc b/devel/electron4/files/patch-gpu_ipc_common_gpu__memory__buffer__support.cc
new file mode 100644
index 000000000000..1546fce8af82
--- /dev/null
+++ b/devel/electron4/files/patch-gpu_ipc_common_gpu__memory__buffer__support.cc
@@ -0,0 +1,54 @@
+--- gpu/ipc/common/gpu_memory_buffer_support.cc.orig 2019-03-15 06:37:24 UTC
++++ gpu/ipc/common/gpu_memory_buffer_support.cc
+@@ -12,7 +12,7 @@
+ #include "gpu/ipc/common/gpu_memory_buffer_impl_io_surface.h"
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "gpu/ipc/common/gpu_memory_buffer_impl_native_pixmap.h"
+ #include "ui/gfx/client_native_pixmap_factory.h"
+ #include "ui/gfx/linux/client_native_pixmap_factory_dmabuf.h"
+@@ -36,13 +36,13 @@ namespace gpu {
+ GpuMemoryBufferSupport::GpuMemoryBufferSupport() {
+ #if defined(USE_OZONE)
+ client_native_pixmap_factory_ = ui::CreateClientNativePixmapFactoryOzone();
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ client_native_pixmap_factory_.reset(
+ gfx::CreateClientNativePixmapFactoryDmabuf());
+ #endif
+ }
+
+-#if defined(OS_LINUX) || defined(USE_OZONE)
++#if defined(OS_LINUX) || defined(USE_OZONE) || defined(OS_BSD)
+ GpuMemoryBufferSupport::GpuMemoryBufferSupport(
+ std::unique_ptr<gfx::ClientNativePixmapFactory>
+ client_native_pixmap_factory)
+@@ -57,7 +57,7 @@ GpuMemoryBufferSupport::GetNativeGpuMemoryBufferType()
+ return gfx::IO_SURFACE_BUFFER;
+ #elif defined(OS_ANDROID)
+ return gfx::ANDROID_HARDWARE_BUFFER;
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return gfx::NATIVE_PIXMAP;
+ #elif defined(OS_WIN)
+ return gfx::DXGI_SHARED_HANDLE;
+@@ -114,7 +114,7 @@ bool GpuMemoryBufferSupport::IsNativeGpuMemoryBufferCo
+ return false;
+ #elif defined(USE_OZONE)
+ return client_native_pixmap_factory_->IsConfigurationSupported(format, usage);
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return false; // TODO(julian.isorce): Add linux support.
+ #elif defined(OS_WIN)
+ switch (usage) {
+@@ -171,7 +171,7 @@ GpuMemoryBufferSupport::CreateGpuMemoryBufferImplFromH
+ return GpuMemoryBufferImplIOSurface::CreateFromHandle(
+ std::move(handle), size, format, usage, callback);
+ #endif
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ case gfx::NATIVE_PIXMAP:
+ return GpuMemoryBufferImplNativePixmap::CreateFromHandle(
+ client_native_pixmap_factory(), std::move(handle), size, format,
diff --git a/devel/electron4/files/patch-gpu_ipc_common_gpu__memory__buffer__support.h b/devel/electron4/files/patch-gpu_ipc_common_gpu__memory__buffer__support.h
new file mode 100644
index 000000000000..fb78dd3809fa
--- /dev/null
+++ b/devel/electron4/files/patch-gpu_ipc_common_gpu__memory__buffer__support.h
@@ -0,0 +1,38 @@
+--- gpu/ipc/common/gpu_memory_buffer_support.h.orig 2019-03-15 06:37:24 UTC
++++ gpu/ipc/common/gpu_memory_buffer_support.h
+@@ -16,7 +16,7 @@
+ #include "ui/gfx/geometry/size.h"
+ #include "ui/gfx/gpu_memory_buffer.h"
+
+-#if defined(OS_LINUX) || defined(USE_OZONE)
++#if defined(OS_LINUX) || defined(OS_BSD) || defined(USE_OZONE)
+ namespace gfx {
+ class ClientNativePixmapFactory;
+ }
+@@ -28,7 +28,7 @@ namespace gpu {
+ class GPU_EXPORT GpuMemoryBufferSupport {
+ public:
+ GpuMemoryBufferSupport();
+-#if defined(OS_LINUX) || defined(USE_OZONE)
++#if defined(OS_LINUX) || defined(OS_BSD) || defined(USE_OZONE)
+ GpuMemoryBufferSupport(std::unique_ptr<gfx::ClientNativePixmapFactory>
+ client_native_pixmap_factory);
+ #endif
+@@ -42,7 +42,7 @@ class GPU_EXPORT GpuMemoryBufferSupport {
+ bool IsNativeGpuMemoryBufferConfigurationSupported(gfx::BufferFormat format,
+ gfx::BufferUsage usage);
+
+-#if defined(OS_LINUX) || defined(USE_OZONE)
++#if defined(OS_LINUX) || defined(OS_BSD) || defined(USE_OZONE)
+ gfx::ClientNativePixmapFactory* client_native_pixmap_factory() {
+ return client_native_pixmap_factory_.get();
+ }
+@@ -65,7 +65,7 @@ class GPU_EXPORT GpuMemoryBufferSupport {
+ const GpuMemoryBufferImpl::DestructionCallback& callback);
+
+ private:
+-#if defined(OS_LINUX) || defined(USE_OZONE)
++#if defined(OS_LINUX) || defined(OS_BSD) || defined(USE_OZONE)
+ std::unique_ptr<gfx::ClientNativePixmapFactory> client_native_pixmap_factory_;
+ #endif
+
diff --git a/devel/electron4/files/patch-gpu_ipc_service_gpu__init.cc b/devel/electron4/files/patch-gpu_ipc_service_gpu__init.cc
new file mode 100644
index 000000000000..0438e76e1daa
--- /dev/null
+++ b/devel/electron4/files/patch-gpu_ipc_service_gpu__init.cc
@@ -0,0 +1,29 @@
+--- gpu/ipc/service/gpu_init.cc.orig 2019-03-15 06:37:24 UTC
++++ gpu/ipc/service/gpu_init.cc
+@@ -74,7 +74,7 @@ bool CollectGraphicsInfo(GPUInfo* gpu_info,
+ return success;
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(IS_CHROMECAST)
++#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(IS_CHROMECAST) && !defined(OS_BSD)
+ bool CanAccessNvidiaDeviceFile() {
+ bool res = true;
+ base::AssertBlockingAllowed();
+@@ -110,7 +110,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+ // crash during feature collection.
+ gpu::SetKeysForCrashLogging(gpu_info_);
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_BSD)
+ if (gpu_info_.gpu.vendor_id == 0x10de && // NVIDIA
+ gpu_info_.gpu.driver_vendor == "NVIDIA" && !CanAccessNvidiaDeviceFile())
+ return false;
+@@ -194,7 +194,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+ sandbox_helper_->PreSandboxStartup();
+
+ bool attempted_startsandbox = false;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) && !defined(OS_BSD)
+ // On Chrome OS ARM Mali, GPU driver userspace creates threads when
+ // initializing a GL context, so start the sandbox early.
+ // TODO(zmo): Need to collect OS version before this.
diff --git a/devel/electron4/files/patch-gpu_ipc_service_gpu__memory__buffer__factory.cc b/devel/electron4/files/patch-gpu_ipc_service_gpu__memory__buffer__factory.cc
new file mode 100644
index 000000000000..e647902f5efc
--- /dev/null
+++ b/devel/electron4/files/patch-gpu_ipc_service_gpu__memory__buffer__factory.cc
@@ -0,0 +1,20 @@
+--- gpu/ipc/service/gpu_memory_buffer_factory.cc.orig 2019-03-15 06:25:45 UTC
++++ gpu/ipc/service/gpu_memory_buffer_factory.cc
+@@ -12,7 +12,7 @@
+ #include "gpu/ipc/service/gpu_memory_buffer_factory_io_surface.h"
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "gpu/ipc/service/gpu_memory_buffer_factory_native_pixmap.h"
+ #endif
+
+@@ -33,7 +33,7 @@ GpuMemoryBufferFactory::CreateNativeType() {
+ return base::WrapUnique(new GpuMemoryBufferFactoryIOSurface);
+ #elif defined(OS_ANDROID)
+ return base::WrapUnique(new GpuMemoryBufferFactoryAndroidHardwareBuffer);
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return base::WrapUnique(new GpuMemoryBufferFactoryNativePixmap);
+ #elif defined(OS_WIN)
+ return base::WrapUnique(new GpuMemoryBufferFactoryDXGI);
diff --git a/devel/electron4/files/patch-headless_lib_browser_headless__content__browser__client.cc b/devel/electron4/files/patch-headless_lib_browser_headless__content__browser__client.cc
new file mode 100644
index 000000000000..3d3632b1e2c6
--- /dev/null
+++ b/devel/electron4/files/patch-headless_lib_browser_headless__content__browser__client.cc
@@ -0,0 +1,20 @@
+--- headless/lib/browser/headless_content_browser_client.cc.orig 2019-03-15 06:37:24 UTC
++++ headless/lib/browser/headless_content_browser_client.cc
+@@ -205,7 +205,7 @@ void HeadlessContentBrowserClient::GetQuotaSettings(
+ partition->GetPath(), context->IsOffTheRecord(), std::move(callback));
+ }
+
+-#if defined(OS_POSIX) && !defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ void HeadlessContentBrowserClient::GetAdditionalMappedFilesForChildProcess(
+ const base::CommandLine& command_line,
+ int child_process_id,
+@@ -216,7 +216,7 @@ void HeadlessContentBrowserClient::GetAdditionalMapped
+ mappings->Share(service_manager::kCrashDumpSignal, crash_signal_fd);
+ #endif // defined(HEADLESS_USE_BREAKPAD)
+ }
+-#endif // defined(OS_POSIX) && !defined(OS_MACOSX)
++#endif // defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+
+ void HeadlessContentBrowserClient::AppendExtraCommandLineSwitches(
+ base::CommandLine* command_line,
diff --git a/devel/electron4/files/patch-headless_lib_browser_headless__content__browser__client.h b/devel/electron4/files/patch-headless_lib_browser_headless__content__browser__client.h
new file mode 100644
index 000000000000..16bab148f46b
--- /dev/null
+++ b/devel/electron4/files/patch-headless_lib_browser_headless__content__browser__client.h
@@ -0,0 +1,11 @@
+--- headless/lib/browser/headless_content_browser_client.h.orig 2019-03-15 06:37:24 UTC
++++ headless/lib/browser/headless_content_browser_client.h
+@@ -32,7 +32,7 @@ class HeadlessContentBrowserClient : public content::C
+ content::BrowserContext* context,
+ content::StoragePartition* partition,
+ storage::OptionalQuotaSettingsCallback callback) override;
+-#if defined(OS_POSIX) && !defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ void GetAdditionalMappedFilesForChildProcess(
+ const base::CommandLine& command_line,
+ int child_process_id,
diff --git a/devel/electron4/files/patch-headless_lib_headless__macros.h b/devel/electron4/files/patch-headless_lib_headless__macros.h
new file mode 100644
index 000000000000..3b38b0ab2e88
--- /dev/null
+++ b/devel/electron4/files/patch-headless_lib_headless__macros.h
@@ -0,0 +1,13 @@
+--- headless/lib/headless_macros.h.orig 2019-03-15 06:25:45 UTC
++++ headless/lib/headless_macros.h
+@@ -7,8 +7,8 @@
+
+ #include "build/build_config.h"
+
+-#if defined(OS_POSIX) && !defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ #define HEADLESS_USE_BREAKPAD
+-#endif // defined(OS_POSIX) && !defined(OS_MACOSX)
++#endif // defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+
+ #endif // HEADLESS_LIB_HEADLESS_MACROS_H_
diff --git a/devel/electron4/files/patch-ipc_ipc__channel.h b/devel/electron4/files/patch-ipc_ipc__channel.h
new file mode 100644
index 000000000000..5fc27a0bcdbe
--- /dev/null
+++ b/devel/electron4/files/patch-ipc_ipc__channel.h
@@ -0,0 +1,11 @@
+--- ipc/ipc_channel.h.orig 2019-03-15 06:37:27 UTC
++++ ipc/ipc_channel.h
+@@ -244,7 +244,7 @@ class COMPONENT_EXPORT(IPC) Channel : public Sender {
+ static std::string GenerateUniqueRandomChannelID();
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Sandboxed processes live in a PID namespace, so when sending the IPC hello
+ // message from client to server we need to send the PID from the global
+ // PID namespace.
diff --git a/devel/electron4/files/patch-ipc_ipc__channel__common.cc b/devel/electron4/files/patch-ipc_ipc__channel__common.cc
new file mode 100644
index 000000000000..f7472986d975
--- /dev/null
+++ b/devel/electron4/files/patch-ipc_ipc__channel__common.cc
@@ -0,0 +1,11 @@
+--- ipc/ipc_channel_common.cc.orig 2019-03-15 06:25:46 UTC
++++ ipc/ipc_channel_common.cc
+@@ -9,7 +9,7 @@
+
+ namespace IPC {
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+
+ namespace {
+ int g_global_pid = 0;
diff --git a/devel/electron4/files/patch-ipc_ipc__channel__mojo.cc b/devel/electron4/files/patch-ipc_ipc__channel__mojo.cc
new file mode 100644
index 000000000000..bc05846fe751
--- /dev/null
+++ b/devel/electron4/files/patch-ipc_ipc__channel__mojo.cc
@@ -0,0 +1,11 @@
+--- ipc/ipc_channel_mojo.cc.orig 2019-03-15 06:37:27 UTC
++++ ipc/ipc_channel_mojo.cc
+@@ -64,7 +64,7 @@ class MojoChannelFactory : public ChannelFactory {
+ };
+
+ base::ProcessId GetSelfPID() {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (int global_pid = Channel::GetGlobalPid())
+ return global_pid;
+ #endif // OS_LINUX
diff --git a/devel/electron4/files/patch-ipc_ipc__message__utils.cc b/devel/electron4/files/patch-ipc_ipc__message__utils.cc
new file mode 100644
index 000000000000..162808f7f70f
--- /dev/null
+++ b/devel/electron4/files/patch-ipc_ipc__message__utils.cc
@@ -0,0 +1,11 @@
+--- ipc/ipc_message_utils.cc.orig 2019-03-15 06:37:27 UTC
++++ ipc/ipc_message_utils.cc
+@@ -349,7 +349,7 @@ void ParamTraits<unsigned int>::Log(const param_type&
+ }
+
+ #if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_FUCHSIA) || \
+- (defined(OS_ANDROID) && defined(ARCH_CPU_64_BITS))
++ defined(OS_BSD) || (defined(OS_ANDROID) && defined(ARCH_CPU_64_BITS))
+ void ParamTraits<long>::Log(const param_type& p, std::string* l) {
+ l->append(base::NumberToString(p));
+ }
diff --git a/devel/electron4/files/patch-ipc_ipc__message__utils.h b/devel/electron4/files/patch-ipc_ipc__message__utils.h
new file mode 100644
index 000000000000..9ffa09f142ae
--- /dev/null
+++ b/devel/electron4/files/patch-ipc_ipc__message__utils.h
@@ -0,0 +1,11 @@
+--- ipc/ipc_message_utils.h.orig 2019-03-15 06:37:27 UTC
++++ ipc/ipc_message_utils.h
+@@ -204,7 +204,7 @@ struct ParamTraits<unsigned int> {
+ // Since we want to support Android 32<>64 bit IPC, as long as we don't have
+ // these traits for 32 bit ARM then that'll catch any errors.
+ #if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_FUCHSIA) || \
+- (defined(OS_ANDROID) && defined(ARCH_CPU_64_BITS))
++ defined(OS_BSD) || (defined(OS_ANDROID) && defined(ARCH_CPU_64_BITS))
+ template <>
+ struct ParamTraits<long> {
+ typedef long param_type;
diff --git a/devel/electron4/files/patch-media_BUILD.gn b/devel/electron4/files/patch-media_BUILD.gn
new file mode 100644
index 000000000000..178c37a15f21
--- /dev/null
+++ b/devel/electron4/files/patch-media_BUILD.gn
@@ -0,0 +1,12 @@
+--- media/BUILD.gn.orig 2019-03-15 06:37:27 UTC
++++ media/BUILD.gn
+@@ -58,6 +58,9 @@ config("media_config") {
+ defines += [ "DLOPEN_PULSEAUDIO" ]
+ }
+ }
++ if (use_sndio) {
++ defines += [ "USE_SNDIO" ]
++ }
+ if (use_cras) {
+ defines += [ "USE_CRAS" ]
+ }
diff --git a/devel/electron4/files/patch-media_audio_BUILD.gn b/devel/electron4/files/patch-media_audio_BUILD.gn
new file mode 100644
index 000000000000..8f4616eaeb18
--- /dev/null
+++ b/devel/electron4/files/patch-media_audio_BUILD.gn
@@ -0,0 +1,31 @@
+--- media/audio/BUILD.gn.orig 2019-03-16 09:15:21 UTC
++++ media/audio/BUILD.gn
+@@ -262,9 +262,19 @@ source_set("audio") {
+ deps += [ "//media/base/android:media_jni_headers" ]
+ }
+
+- if (is_linux) {
++ if (is_linux && !use_sndio) {
+ sources += [ "linux/audio_manager_linux.cc" ]
+ }
++ if (use_sndio) {
++ libs += [ "sndio" ]
++ sources += [
++ "openbsd/audio_manager_openbsd.cc",
++ "sndio/sndio_input.cc",
++ "sndio/sndio_input.h",
++ "sndio/sndio_output.cc",
++ "sndio/sndio_output.h"
++ ]
++ }
+
+ if (use_alsa) {
+ libs += [ "asound" ]
+@@ -310,7 +320,6 @@ source_set("audio") {
+ if (link_pulseaudio) {
+ configs += [ ":libpulse" ]
+ } else {
+- libs += [ "dl" ]
+ deps += [ ":pulse_generate_stubs" ]
+ sources += get_target_outputs(":pulse_generate_stubs")
+ }
diff --git a/devel/electron4/files/patch-media_audio_alsa_audio__manager__alsa.cc b/devel/electron4/files/patch-media_audio_alsa_audio__manager__alsa.cc
new file mode 100644
index 000000000000..6f385e736930
--- /dev/null
+++ b/devel/electron4/files/patch-media_audio_alsa_audio__manager__alsa.cc
@@ -0,0 +1,54 @@
+--- media/audio/alsa/audio_manager_alsa.cc.orig 2019-03-15 06:37:27 UTC
++++ media/audio/alsa/audio_manager_alsa.cc
+@@ -93,7 +93,9 @@ void AudioManagerAlsa::GetAlsaAudioDevices(StreamType
+ int card = -1;
+
+ // Loop through the sound cards to get ALSA device hints.
++#ifdef OS_LINUX
+ while (!wrapper_->CardNext(&card) && card >= 0) {
++#endif
+ void** hints = NULL;
+ int error = wrapper_->DeviceNameHint(card, kPcmInterfaceName, &hints);
+ if (!error) {
+@@ -105,7 +107,9 @@ void AudioManagerAlsa::GetAlsaAudioDevices(StreamType
+ DLOG(WARNING) << "GetAlsaAudioDevices: unable to get device hints: "
+ << wrapper_->StrError(error);
+ }
++#ifdef OS_LINUX
+ }
++#endif
+ }
+
+ void AudioManagerAlsa::GetAlsaDevicesInfo(AudioManagerAlsa::StreamType type,
+@@ -188,7 +192,11 @@ bool AudioManagerAlsa::IsAlsaDeviceAvailable(
+ // goes through software conversion if needed (e.g. incompatible
+ // sample rate).
+ // TODO(joi): Should we prefer "hw" instead?
++#ifdef OS_LINUX
+ static const char kDeviceTypeDesired[] = "plughw";
++#else
++ static const char kDeviceTypeDesired[] = "plug";
++#endif
+ return strncmp(kDeviceTypeDesired, device_name,
+ arraysize(kDeviceTypeDesired) - 1) == 0;
+ }
+@@ -210,7 +218,9 @@ bool AudioManagerAlsa::HasAnyAlsaAudioDevice(
+ // Loop through the sound cards.
+ // Don't use snd_device_name_hint(-1,..) since there is a access violation
+ // inside this ALSA API with libasound.so.2.0.0.
++#ifdef OS_LINUX
+ while (!wrapper_->CardNext(&card) && (card >= 0) && !has_device) {
++#endif
+ int error = wrapper_->DeviceNameHint(card, kPcmInterfaceName, &hints);
+ if (!error) {
+ for (void** hint_iter = hints; *hint_iter != NULL; hint_iter++) {
+@@ -234,7 +244,9 @@ bool AudioManagerAlsa::HasAnyAlsaAudioDevice(
+ DLOG(WARNING) << "HasAnyAudioDevice: unable to get device hints: "
+ << wrapper_->StrError(error);
+ }
++#ifdef OS_LINUX
+ }
++#endif
+
+ return has_device;
+ }
diff --git a/devel/electron4/files/patch-media_audio_audio__manager.cc b/devel/electron4/files/patch-media_audio_audio__manager.cc
new file mode 100644
index 000000000000..cef0e18f3fc3
--- /dev/null
+++ b/devel/electron4/files/patch-media_audio_audio__manager.cc
@@ -0,0 +1,29 @@
+--- media/audio/audio_manager.cc.orig 2019-03-15 06:37:27 UTC
++++ media/audio/audio_manager.cc
+@@ -94,7 +94,7 @@ class AudioManagerHelper : public base::PowerObserver
+ }
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void set_app_name(const std::string& app_name) { app_name_ = app_name; }
+ const std::string& app_name() const { return app_name_; }
+ #endif
+@@ -229,7 +229,7 @@ class AudioManagerHelper : public base::PowerObserver
+ std::unique_ptr<base::win::ScopedCOMInitializer> com_initializer_for_testing_;
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ std::string app_name_;
+ #endif
+
+@@ -311,7 +311,7 @@ void AudioManager::StartHangMonitorIfNeeded(
+ GetHelper()->StartHangTimer(std::move(task_runner));
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // static
+ void AudioManager::SetGlobalAppName(const std::string& app_name) {
+ GetHelper()->set_app_name(app_name);
diff --git a/devel/electron4/files/patch-media_audio_audio__manager.h b/devel/electron4/files/patch-media_audio_audio__manager.h
new file mode 100644
index 000000000000..97bcaaf04d84
--- /dev/null
+++ b/devel/electron4/files/patch-media_audio_audio__manager.h
@@ -0,0 +1,11 @@
+--- media/audio/audio_manager.h.orig 2019-03-15 06:37:27 UTC
++++ media/audio/audio_manager.h
+@@ -70,7 +70,7 @@ class MEDIA_EXPORT AudioManager {
+ static void StartHangMonitorIfNeeded(
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Sets the name of the audio source as seen by external apps. Only actually
+ // used with PulseAudio as of this writing.
+ static void SetGlobalAppName(const std::string& app_name);
diff --git a/devel/electron4/files/patch-media_audio_audio__output__proxy__unittest.cc b/devel/electron4/files/patch-media_audio_audio__output__proxy__unittest.cc
new file mode 100644
index 000000000000..08d56b08d925
--- /dev/null
+++ b/devel/electron4/files/patch-media_audio_audio__output__proxy__unittest.cc
@@ -0,0 +1,11 @@
+--- media/audio/audio_output_proxy_unittest.cc.orig 2019-03-15 06:37:27 UTC
++++ media/audio/audio_output_proxy_unittest.cc
+@@ -410,7 +410,7 @@ class AudioOutputProxyTest : public testing::Test {
+ // |stream| is closed at this point. Start() should reopen it again.
+ EXPECT_CALL(manager(), MakeAudioOutputStream(_, _, _))
+ .Times(2)
+- .WillRepeatedly(Return(reinterpret_cast<AudioOutputStream*>(NULL)));
++ .WillRepeatedly(Return(static_cast<AudioOutputStream*>(NULL)));
+
+ EXPECT_CALL(callback_, OnError()).Times(2);
+
diff --git a/devel/electron4/files/patch-media_base_audio__latency.cc b/devel/electron4/files/patch-media_base_audio__latency.cc
new file mode 100644
index 000000000000..ad03178a688d
--- /dev/null
+++ b/devel/electron4/files/patch-media_base_audio__latency.cc
@@ -0,0 +1,11 @@
+--- media/base/audio_latency.cc.orig 2019-03-15 06:37:27 UTC
++++ media/base/audio_latency.cc
+@@ -106,7 +106,7 @@ int AudioLatency::GetRtcBufferSize(int sample_rate, in
+ return frames_per_buffer;
+ }
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ // On Linux, MacOS and Fuchsia, the low level IO implementations on the
+ // browser side supports all buffer size the clients want. We use the native
+ // peer connection buffer size (10ms) to achieve best possible performance.
diff --git a/devel/electron4/files/patch-media_base_scopedfd__helper.h b/devel/electron4/files/patch-media_base_scopedfd__helper.h
new file mode 100644
index 000000000000..572bdac61a67
--- /dev/null
+++ b/devel/electron4/files/patch-media_base_scopedfd__helper.h
@@ -0,0 +1,19 @@
+--- media/base/scopedfd_helper.h.orig 2019-03-15 06:25:46 UTC
++++ media/base/scopedfd_helper.h
+@@ -14,14 +14,14 @@ namespace media {
+ // since the only current user is V4L2 we are limiting the scope to OS_LINUX so
+ // the binary size does not inflate on non-using systems. Feel free to adapt
+ // this and BUILD.gn as our needs evolve.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+
+ // Return a new vector containing duplicates of |fds|, or an empty vector in
+ // case of error.
+ MEDIA_EXPORT std::vector<base::ScopedFD> DuplicateFDs(
+ const std::vector<base::ScopedFD>& fds);
+
+-#endif // OS_LINUX
++#endif // OS_LINUX || OS_BSD
+
+ } // namespace media
+
diff --git a/devel/electron4/files/patch-media_base_video__frame.cc b/devel/electron4/files/patch-media_base_video__frame.cc
new file mode 100644
index 000000000000..d5e12a46ab7a
--- /dev/null
+++ b/devel/electron4/files/patch-media_base_video__frame.cc
@@ -0,0 +1,47 @@
+--- media/base/video_frame.cc.orig 2019-03-15 06:37:27 UTC
++++ media/base/video_frame.cc
+@@ -64,7 +64,7 @@ static std::string StorageTypeToString(
+ return "OWNED_MEMORY";
+ case VideoFrame::STORAGE_SHMEM:
+ return "SHMEM";
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ case VideoFrame::STORAGE_DMABUFS:
+ return "DMABUFS";
+ #endif
+@@ -80,7 +80,7 @@ static std::string StorageTypeToString(
+ // static
+ static bool IsStorageTypeMappable(VideoFrame::StorageType storage_type) {
+ return
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // This is not strictly needed but makes explicit that, at VideoFrame
+ // level, DmaBufs are not mappable from userspace.
+ storage_type != VideoFrame::STORAGE_DMABUFS &&
+@@ -367,7 +367,7 @@ scoped_refptr<VideoFrame> VideoFrame::WrapExternalYuva
+ return frame;
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // static
+ scoped_refptr<VideoFrame> VideoFrame::WrapExternalDmabufs(
+ VideoPixelFormat format,
+@@ -488,7 +488,7 @@ scoped_refptr<VideoFrame> VideoFrame::WrapVideoFrame(
+ wrapping_frame->data_[i] = frame->data(i);
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // If there are any |dmabuf_fds_| plugged in, we should duplicate them.
+ if (frame->storage_type() == STORAGE_DMABUFS) {
+ wrapping_frame->dmabuf_fds_ = DuplicateFDs(frame->dmabuf_fds_);
+@@ -860,7 +860,7 @@ size_t VideoFrame::shared_memory_offset() const {
+ return shared_memory_offset_;
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ std::vector<int> VideoFrame::DmabufFds() const {
+ DCHECK_EQ(storage_type_, STORAGE_DMABUFS);
+ std::vector<int> ret;
diff --git a/devel/electron4/files/patch-media_base_video__frame.h b/devel/electron4/files/patch-media_base_video__frame.h
new file mode 100644
index 000000000000..0e6d3d867fb0
--- /dev/null
+++ b/devel/electron4/files/patch-media_base_video__frame.h
@@ -0,0 +1,38 @@
+--- media/base/video_frame.h.orig 2019-03-15 06:37:27 UTC
++++ media/base/video_frame.h
+@@ -69,7 +69,7 @@ class MEDIA_EXPORT VideoFrame : public base::RefCounte
+ STORAGE_UNOWNED_MEMORY = 2, // External, non owned data pointers.
+ STORAGE_OWNED_MEMORY = 3, // VideoFrame has allocated its own data buffer.
+ STORAGE_SHMEM = 4, // Pixels are backed by Shared Memory.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // TODO(mcasas): Consider turning this type into STORAGE_NATIVE
+ // based on the idea of using this same enum value for both DMA
+ // buffers on Linux and CVPixelBuffers on Mac (which currently use
+@@ -225,7 +225,7 @@ class MEDIA_EXPORT VideoFrame : public base::RefCounte
+ uint8_t* a_data,
+ base::TimeDelta timestamp);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Wraps provided dmabufs
+ // (https://www.kernel.org/doc/html/latest/driver-api/dma-buf.html) with a
+ // VideoFrame. The frame will take ownership of |dmabuf_fds|, and will
+@@ -387,7 +387,7 @@ class MEDIA_EXPORT VideoFrame : public base::RefCounte
+ // Returns the offset into the shared memory where the frame data begins.
+ size_t shared_memory_offset() const;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Return a vector containing the backing DmaBufs for this frame. The number
+ // of returned DmaBufs will be equal or less than the number of planes of
+ // the frame. If there are less, this means that the last FD contains the
+@@ -606,7 +606,7 @@ class MEDIA_EXPORT VideoFrame : public base::RefCounte
+ // memory.
+ size_t shared_memory_offset_;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Dmabufs for the frame, used when storage is STORAGE_DMABUFS. Size is either
+ // equal or less than the number of planes of the frame. If it is less, then
+ // the memory area represented by the last FD contains the remaining planes.
diff --git a/devel/electron4/files/patch-media_capture_video_create__video__capture__device__factory.cc b/devel/electron4/files/patch-media_capture_video_create__video__capture__device__factory.cc
new file mode 100644
index 000000000000..ae34c228f9d4
--- /dev/null
+++ b/devel/electron4/files/patch-media_capture_video_create__video__capture__device__factory.cc
@@ -0,0 +1,20 @@
+--- media/capture/video/create_video_capture_device_factory.cc.orig 2019-03-15 06:37:27 UTC
++++ media/capture/video/create_video_capture_device_factory.cc
+@@ -10,7 +10,7 @@
+ #include "media/capture/video/fake_video_capture_device_factory.h"
+ #include "media/capture/video/file_video_capture_device_factory.h"
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #include "media/capture/video/linux/video_capture_device_factory_linux.h"
+ #elif defined(OS_CHROMEOS)
+ #include "media/capture/video/chromeos/public/cros_features.h"
+@@ -31,7 +31,7 @@ namespace {
+ std::unique_ptr<VideoCaptureDeviceFactory>
+ CreatePlatformSpecificVideoCaptureDeviceFactory(
+ scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ return std::make_unique<VideoCaptureDeviceFactoryLinux>(ui_task_runner);
+ #elif defined(OS_CHROMEOS)
+ // On Chrome OS we have to support two use cases:
diff --git a/devel/electron4/files/patch-media_capture_video_fake__video__capture__device__factory.cc b/devel/electron4/files/patch-media_capture_video_fake__video__capture__device__factory.cc
new file mode 100644
index 000000000000..3da701b7b4c4
--- /dev/null
+++ b/devel/electron4/files/patch-media_capture_video_fake__video__capture__device__factory.cc
@@ -0,0 +1,11 @@
+--- media/capture/video/fake_video_capture_device_factory.cc.orig 2019-03-15 06:37:27 UTC
++++ media/capture/video/fake_video_capture_device_factory.cc
+@@ -200,7 +200,7 @@ void FakeVideoCaptureDeviceFactory::GetDeviceDescripto
+ for (const auto& entry : devices_config_) {
+ device_descriptors->emplace_back(
+ base::StringPrintf("fake_device_%d", entry_index), entry.device_id,
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ VideoCaptureApi::LINUX_V4L2_SINGLE_PLANE
+ #elif defined(OS_MACOSX)
+ VideoCaptureApi::MACOSX_AVFOUNDATION
diff --git a/devel/electron4/files/patch-media_capture_video_file__video__capture__device__factory.cc b/devel/electron4/files/patch-media_capture_video_file__video__capture__device__factory.cc
new file mode 100644
index 000000000000..ce193c4482a9
--- /dev/null
+++ b/devel/electron4/files/patch-media_capture_video_file__video__capture__device__factory.cc
@@ -0,0 +1,11 @@
+--- media/capture/video/file_video_capture_device_factory.cc.orig 2019-03-15 06:37:27 UTC
++++ media/capture/video/file_video_capture_device_factory.cc
+@@ -53,7 +53,7 @@ void FileVideoCaptureDeviceFactory::GetDeviceDescripto
+ #elif defined(OS_MACOSX)
+ command_line_file_path.value(), kFileVideoCaptureDeviceName,
+ VideoCaptureApi::MACOSX_AVFOUNDATION
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ command_line_file_path.value(), kFileVideoCaptureDeviceName,
+ VideoCaptureApi::LINUX_V4L2_SINGLE_PLANE
+ #else
diff --git a/devel/electron4/files/patch-media_capture_video_linux_v4l2__capture__delegate.cc b/devel/electron4/files/patch-media_capture_video_linux_v4l2__capture__delegate.cc
new file mode 100644
index 000000000000..c08711a0da21
--- /dev/null
+++ b/devel/electron4/files/patch-media_capture_video_linux_v4l2__capture__delegate.cc
@@ -0,0 +1,26 @@
+--- media/capture/video/linux/v4l2_capture_delegate.cc.orig 2019-03-15 06:37:27 UTC
++++ media/capture/video/linux/v4l2_capture_delegate.cc
+@@ -4,8 +4,10 @@
+
+ #include "media/capture/video/linux/v4l2_capture_delegate.h"
+
++#if !defined(OS_BSD)
+ #include <linux/version.h>
+ #include <linux/videodev2.h>
++#endif
+ #include <poll.h>
+ #include <sys/fcntl.h>
+ #include <sys/ioctl.h>
+@@ -23,10 +25,10 @@
+
+ using media::mojom::MeteringMode;
+
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
++// #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
+ // 16 bit depth, Realsense F200.
+ #define V4L2_PIX_FMT_Z16 v4l2_fourcc('Z', '1', '6', ' ')
+-#endif
++// #endif
+
+ // TODO(aleksandar.stojiljkovic): Wrap this with kernel version check once the
+ // format is introduced to kernel.
diff --git a/devel/electron4/files/patch-media_capture_video_linux_video__capture__device__factory__linux.cc b/devel/electron4/files/patch-media_capture_video_linux_video__capture__device__factory__linux.cc
new file mode 100644
index 000000000000..82dad4046dec
--- /dev/null
+++ b/devel/electron4/files/patch-media_capture_video_linux_video__capture__device__factory__linux.cc
@@ -0,0 +1,32 @@
+--- media/capture/video/linux/video_capture_device_factory_linux.cc.orig 2019-03-15 06:37:27 UTC
++++ media/capture/video/linux/video_capture_device_factory_linux.cc
+@@ -253,6 +253,7 @@ bool VideoCaptureDeviceFactoryLinux::HasUsableFormats(
+ if (!(capabilities & V4L2_CAP_VIDEO_CAPTURE))
+ return false;
+
++#if !defined(OS_BSD)
+ const std::list<uint32_t>& usable_fourccs =
+ VideoCaptureDeviceLinux::GetListOfUsableFourCCs(false);
+ v4l2_fmtdesc fmtdesc = {};
+@@ -264,6 +265,7 @@ bool VideoCaptureDeviceFactoryLinux::HasUsableFormats(
+ return true;
+ }
+ }
++#endif
+
+ DLOG(ERROR) << "No usable formats found";
+ return false;
+@@ -311,9 +313,13 @@ void VideoCaptureDeviceFactoryLinux::GetSupportedForma
+ for (; HANDLE_EINTR(v4l2_->ioctl(fd, VIDIOC_ENUM_FMT, &v4l2_format)) == 0;
+ ++v4l2_format.index) {
+ VideoCaptureFormat supported_format;
++#if !defined(OS_FREEBSD)
+ supported_format.pixel_format =
+ VideoCaptureDeviceLinux::V4l2FourCcToChromiumPixelFormat(
+ v4l2_format.pixelformat);
++#else
++ supported_format.pixel_format = PIXEL_FORMAT_UNKNOWN;
++#endif
+
+ if (supported_format.pixel_format == PIXEL_FORMAT_UNKNOWN)
+ continue;
diff --git a/devel/electron4/files/patch-media_capture_video_linux_video__capture__device__linux.cc b/devel/electron4/files/patch-media_capture_video_linux_video__capture__device__linux.cc
new file mode 100644
index 000000000000..36312c3f962a
--- /dev/null
+++ b/devel/electron4/files/patch-media_capture_video_linux_video__capture__device__linux.cc
@@ -0,0 +1,60 @@
+--- media/capture/video/linux/video_capture_device_linux.cc.orig 2019-03-15 06:37:27 UTC
++++ media/capture/video/linux/video_capture_device_linux.cc
+@@ -22,6 +22,7 @@
+
+ namespace media {
+
++#if !defined(OS_FREEBSD)
+ // Translates Video4Linux pixel formats to Chromium pixel formats.
+ // static
+ VideoPixelFormat VideoCaptureDeviceLinux::V4l2FourCcToChromiumPixelFormat(
+@@ -35,6 +36,7 @@ std::list<uint32_t> VideoCaptureDeviceLinux::GetListOf
+ bool favour_mjpeg) {
+ return V4L2CaptureDelegate::GetListOfUsableFourCcs(favour_mjpeg);
+ }
++#endif // !defined(OS_FREEBSD)
+
+ VideoCaptureDeviceLinux::VideoCaptureDeviceLinux(
+ scoped_refptr<V4L2CaptureDevice> v4l2,
+@@ -53,6 +55,7 @@ VideoCaptureDeviceLinux::~VideoCaptureDeviceLinux() {
+ void VideoCaptureDeviceLinux::AllocateAndStart(
+ const VideoCaptureParams& params,
+ std::unique_ptr<VideoCaptureDevice::Client> client) {
++#if !defined(OS_FREEBSD)
+ DCHECK(!capture_impl_);
+ if (v4l2_thread_.IsRunning())
+ return; // Wrong state.
+@@ -78,9 +81,11 @@ void VideoCaptureDeviceLinux::AllocateAndStart(
+ for (const auto& request : photo_requests_queue_)
+ v4l2_thread_.task_runner()->PostTask(FROM_HERE, request);
+ photo_requests_queue_.clear();
++#endif // !defined(OS_FREEBSD)
+ }
+
+ void VideoCaptureDeviceLinux::StopAndDeAllocate() {
++#if !defined(OS_FREEBSD)
+ if (!v4l2_thread_.IsRunning())
+ return; // Wrong state.
+ v4l2_thread_.task_runner()->PostTask(
+@@ -90,6 +95,7 @@ void VideoCaptureDeviceLinux::StopAndDeAllocate() {
+ v4l2_thread_.Stop();
+
+ capture_impl_ = nullptr;
++#endif // !defined(OS_FREEBSD)
+ }
+
+ void VideoCaptureDeviceLinux::TakePhoto(TakePhotoCallback callback) {
+@@ -132,11 +138,13 @@ void VideoCaptureDeviceLinux::SetPhotoOptions(
+ }
+
+ void VideoCaptureDeviceLinux::SetRotation(int rotation) {
++#if !defined(OS_BSD)
+ if (v4l2_thread_.IsRunning()) {
+ v4l2_thread_.task_runner()->PostTask(
+ FROM_HERE, base::Bind(&V4L2CaptureDelegate::SetRotation,
+ capture_impl_->GetWeakPtr(), rotation));
+ }
++#endif
+ }
+
+ // static
diff --git a/devel/electron4/files/patch-media_capture_video_video__capture__device__client.cc b/devel/electron4/files/patch-media_capture_video_video__capture__device__client.cc
new file mode 100644
index 000000000000..3b4ffd12d553
--- /dev/null
+++ b/devel/electron4/files/patch-media_capture_video_video__capture__device__client.cc
@@ -0,0 +1,11 @@
+--- media/capture/video/video_capture_device_client.cc.orig 2019-03-15 06:37:27 UTC
++++ media/capture/video/video_capture_device_client.cc
+@@ -238,7 +238,7 @@ void VideoCaptureDeviceClient::OnIncomingCapturedData(
+ // see http://linuxtv.org/downloads/v4l-dvb-apis/packed-rgb.html.
+ // Windows RGB24 defines blue at lowest byte,
+ // see https://msdn.microsoft.com/en-us/library/windows/desktop/dd407253
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ origin_colorspace = libyuv::FOURCC_RAW;
+ #elif defined(OS_WIN)
+ origin_colorspace = libyuv::FOURCC_24BG;
diff --git a/devel/electron4/files/patch-media_filters_vp9__parser.h b/devel/electron4/files/patch-media_filters_vp9__parser.h
new file mode 100644
index 000000000000..e3284c9e7e4e
--- /dev/null
+++ b/devel/electron4/files/patch-media_filters_vp9__parser.h
@@ -0,0 +1,10 @@
+--- media/filters/vp9_parser.h.orig 2019-03-15 06:37:27 UTC
++++ media/filters/vp9_parser.h
+@@ -14,6 +14,7 @@
+
+ #include <stddef.h>
+ #include <stdint.h>
++#include <unistd.h>
+ #include <sys/types.h>
+
+ #include <memory>
diff --git a/devel/electron4/files/patch-media_formats_common_offset__byte__queue.cc b/devel/electron4/files/patch-media_formats_common_offset__byte__queue.cc
new file mode 100644
index 000000000000..68b778cceb57
--- /dev/null
+++ b/devel/electron4/files/patch-media_formats_common_offset__byte__queue.cc
@@ -0,0 +1,20 @@
+--- media/formats/common/offset_byte_queue.cc.orig 2019-03-15 06:25:46 UTC
++++ media/formats/common/offset_byte_queue.cc
+@@ -46,13 +46,13 @@ void OffsetByteQueue::PeekAt(int64_t offset, const uin
+ *size = tail() - offset;
+ }
+
+-bool OffsetByteQueue::Trim(int64_t max_offset) {
+- if (max_offset < head_) return true;
+- if (max_offset > tail()) {
++bool OffsetByteQueue::Trim(int64_t _max_offset) {
++ if (_max_offset < head_) return true;
++ if (_max_offset > tail()) {
+ Pop(size_);
+ return false;
+ }
+- Pop(max_offset - head_);
++ Pop(_max_offset - head_);
+ return true;
+ }
+
diff --git a/devel/electron4/files/patch-media_formats_common_offset__byte__queue.h b/devel/electron4/files/patch-media_formats_common_offset__byte__queue.h
new file mode 100644
index 000000000000..1e4451e8bd12
--- /dev/null
+++ b/devel/electron4/files/patch-media_formats_common_offset__byte__queue.h
@@ -0,0 +1,22 @@
+--- media/formats/common/offset_byte_queue.h.orig 2019-03-15 06:25:46 UTC
++++ media/formats/common/offset_byte_queue.h
+@@ -36,15 +36,15 @@ class MEDIA_EXPORT OffsetByteQueue {
+ // a null |buf| and a |size| of zero.
+ void PeekAt(int64_t offset, const uint8_t** buf, int* size);
+
+- // Marks the bytes up to (but not including) |max_offset| as ready for
++ // Marks the bytes up to (but not including) |_max_offset| as ready for
+ // deletion. This is relatively inexpensive, but will not necessarily reduce
+ // the resident buffer size right away (or ever).
+ //
+ // Returns true if the full range of bytes were successfully trimmed,
+- // including the case where |max_offset| is less than the current head.
+- // Returns false if |max_offset| > tail() (although all bytes currently
++ // including the case where |_max_offset| is less than the current head.
++ // Returns false if |_max_offset| > tail() (although all bytes currently
+ // buffered are still cleared).
+- bool Trim(int64_t max_offset);
++ bool Trim(int64_t _max_offset);
+
+ // The head and tail positions, in terms of the file's absolute offsets.
+ // tail() is an exclusive bound.
diff --git a/devel/electron4/files/patch-media_formats_mp2t_es__parser__adts.cc b/devel/electron4/files/patch-media_formats_mp2t_es__parser__adts.cc
new file mode 100644
index 000000000000..e30d14eafbf9
--- /dev/null
+++ b/devel/electron4/files/patch-media_formats_mp2t_es__parser__adts.cc
@@ -0,0 +1,26 @@
+--- media/formats/mp2t/es_parser_adts.cc.orig 2019-03-15 06:37:27 UTC
++++ media/formats/mp2t/es_parser_adts.cc
+@@ -63,11 +63,11 @@ bool EsParserAdts::LookForAdtsFrame(AdtsFrame* adts_fr
+ const uint8_t* es;
+ es_queue_->Peek(&es, &es_size);
+
+- int max_offset = es_size - kADTSHeaderMinSize;
+- if (max_offset <= 0)
++ int _max_offset = es_size - kADTSHeaderMinSize;
++ if (_max_offset <= 0)
+ return false;
+
+- for (int offset = 0; offset < max_offset; offset++) {
++ for (int offset = 0; offset < _max_offset; offset++) {
+ const uint8_t* cur_buf = &es[offset];
+ if (!isAdtsSyncWord(cur_buf))
+ continue;
+@@ -107,7 +107,7 @@ bool EsParserAdts::LookForAdtsFrame(AdtsFrame* adts_fr
+ return true;
+ }
+
+- es_queue_->Pop(max_offset);
++ es_queue_->Pop(_max_offset);
+ return false;
+ }
+
diff --git a/devel/electron4/files/patch-media_formats_mp2t_es__parser__mpeg1audio.cc b/devel/electron4/files/patch-media_formats_mp2t_es__parser__mpeg1audio.cc
new file mode 100644
index 000000000000..eb089c53752f
--- /dev/null
+++ b/devel/electron4/files/patch-media_formats_mp2t_es__parser__mpeg1audio.cc
@@ -0,0 +1,26 @@
+--- media/formats/mp2t/es_parser_mpeg1audio.cc.orig 2019-03-15 06:25:46 UTC
++++ media/formats/mp2t/es_parser_mpeg1audio.cc
+@@ -108,11 +108,11 @@ bool EsParserMpeg1Audio::LookForMpeg1AudioFrame(
+ const uint8_t* es;
+ es_queue_->Peek(&es, &es_size);
+
+- int max_offset = es_size - MPEG1AudioStreamParser::kHeaderSize;
+- if (max_offset <= 0)
++ int _max_offset = es_size - MPEG1AudioStreamParser::kHeaderSize;
++ if (_max_offset <= 0)
+ return false;
+
+- for (int offset = 0; offset < max_offset; offset++) {
++ for (int offset = 0; offset < _max_offset; offset++) {
+ const uint8_t* cur_buf = &es[offset];
+ if (cur_buf[0] != 0xff)
+ continue;
+@@ -153,7 +153,7 @@ bool EsParserMpeg1Audio::LookForMpeg1AudioFrame(
+ return true;
+ }
+
+- es_queue_->Pop(max_offset);
++ es_queue_->Pop(_max_offset);
+ return false;
+ }
+
diff --git a/devel/electron4/files/patch-media_media__options.gni b/devel/electron4/files/patch-media_media__options.gni
new file mode 100644
index 000000000000..97a12684127d
--- /dev/null
+++ b/devel/electron4/files/patch-media_media__options.gni
@@ -0,0 +1,12 @@
+--- media/media_options.gni.orig 2019-03-15 06:37:28 UTC
++++ media/media_options.gni
+@@ -95,6 +95,9 @@ declare_args() {
+ # Enables runtime selection of ALSA library for audio.
+ use_alsa = false
+
++ # Enable runtime selection of sndio(7)
++ use_sndio = false
++
+ # Alsa should be used on non-Android, non-Mac POSIX systems.
+ # Alsa should be used on desktop Chromecast and audio-only Chromecast builds.
+ if (is_posix && !is_android && !is_mac &&
diff --git a/devel/electron4/files/patch-mojo_public_c_system_thunks.cc b/devel/electron4/files/patch-mojo_public_c_system_thunks.cc
new file mode 100644
index 000000000000..18e6e1243369
--- /dev/null
+++ b/devel/electron4/files/patch-mojo_public_c_system_thunks.cc
@@ -0,0 +1,47 @@
+--- mojo/public/c/system/thunks.cc.orig 2019-03-15 06:37:28 UTC
++++ mojo/public/c/system/thunks.cc
+@@ -16,7 +16,7 @@
+ #include "build/build_config.h"
+ #include "mojo/public/c/system/core.h"
+
+-#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ #include "base/environment.h"
+ #include "base/files/file_path.h"
+ #include "base/optional.h"
+@@ -28,7 +28,7 @@ namespace {
+
+ typedef void (*MojoGetSystemThunksFunction)(MojoSystemThunks* thunks);
+
+-#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ PROTECTED_MEMORY_SECTION
+ base::ProtectedMemory<MojoGetSystemThunksFunction> g_get_thunks;
+ #endif
+@@ -63,7 +63,7 @@ namespace mojo {
+ class CoreLibraryInitializer {
+ public:
+ CoreLibraryInitializer(const MojoInitializeOptions* options) {
+-#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ bool application_provided_path = false;
+ base::Optional<base::FilePath> library_path;
+ if (options && options->struct_size >= sizeof(*options) &&
+@@ -82,7 +82,7 @@ class CoreLibraryInitializer {
+
+ if (!library_path) {
+ // Default to looking for the library in the current working directory.
+-#if defined(OS_CHROMEOS) || defined(OS_LINUX)
++#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_BSD)
+ const base::FilePath::CharType kDefaultLibraryPathValue[] =
+ FILE_PATH_LITERAL("./libmojo_core.so");
+ #elif defined(OS_WIN)
+@@ -132,7 +132,7 @@ class CoreLibraryInitializer {
+ ~CoreLibraryInitializer() = default;
+
+ private:
+-#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ base::Optional<base::ScopedNativeLibrary> library_;
+ #endif
+
diff --git a/devel/electron4/files/patch-net_BUILD.gn b/devel/electron4/files/patch-net_BUILD.gn
new file mode 100644
index 000000000000..e04bc46d50f4
--- /dev/null
+++ b/devel/electron4/files/patch-net_BUILD.gn
@@ -0,0 +1,29 @@
+--- net/BUILD.gn.orig 2019-03-15 06:37:29 UTC
++++ net/BUILD.gn
+@@ -95,7 +95,7 @@ net_configs = [
+ "//build/config/compiler:wexit_time_destructors",
+ ]
+
+-if (is_linux) {
++if (is_linux && !is_bsd) {
+ net_configs += [ "//build/config/linux:libresolv" ]
+ }
+
+@@ -1904,6 +1904,17 @@ component("net") {
+ ]
+
+ sources -= [ "disk_cache/blockfile/file_posix.cc" ]
++ }
++
++ if (is_bsd) {
++ sources -= [
++ "base/address_tracker_linux.cc",
++ "base/address_tracker_linux.h",
++ "base/network_change_notifier_linux.cc",
++ "base/network_change_notifier_linux.h",
++ "base/network_interfaces_linux.cc",
++ ]
++ sources += [ "base/network_interfaces_freebsd.cc" ]
+ }
+
+ if (is_ios || is_mac) {
diff --git a/devel/electron4/files/patch-net_base_address__tracker__linux.cc b/devel/electron4/files/patch-net_base_address__tracker__linux.cc
new file mode 100644
index 000000000000..24159f1234e9
--- /dev/null
+++ b/devel/electron4/files/patch-net_base_address__tracker__linux.cc
@@ -0,0 +1,259 @@
+--- net/base/address_tracker_linux.cc.orig 2019-03-15 06:37:29 UTC
++++ net/base/address_tracker_linux.cc
+@@ -21,96 +21,10 @@
+ namespace net {
+ namespace internal {
+
+-namespace {
+-
+-// Some kernel functions such as wireless_send_event and rtnetlink_ifinfo_prep
+-// may send spurious messages over rtnetlink. RTM_NEWLINK messages where
+-// ifi_change == 0 and rta_type == IFLA_WIRELESS should be ignored.
+-bool IgnoreWirelessChange(const struct nlmsghdr* header,
+- const struct ifinfomsg* msg) {
+- size_t length = IFLA_PAYLOAD(header);
+- for (const struct rtattr* attr = IFLA_RTA(msg); RTA_OK(attr, length);
+- attr = RTA_NEXT(attr, length)) {
+- if (attr->rta_type == IFLA_WIRELESS && msg->ifi_change == 0)
+- return true;
+- }
+- return false;
+-}
+-
+-// Retrieves address from NETLINK address message.
+-// Sets |really_deprecated| for IPv6 addresses with preferred lifetimes of 0.
+-bool GetAddress(const struct nlmsghdr* header,
+- IPAddress* out,
+- bool* really_deprecated) {
+- if (really_deprecated)
+- *really_deprecated = false;
+- const struct ifaddrmsg* msg =
+- reinterpret_cast<struct ifaddrmsg*>(NLMSG_DATA(header));
+- size_t address_length = 0;
+- switch (msg->ifa_family) {
+- case AF_INET:
+- address_length = IPAddress::kIPv4AddressSize;
+- break;
+- case AF_INET6:
+- address_length = IPAddress::kIPv6AddressSize;
+- break;
+- default:
+- // Unknown family.
+- return false;
+- }
+- // Use IFA_ADDRESS unless IFA_LOCAL is present. This behavior here is based on
+- // getaddrinfo in glibc (check_pf.c). Judging from kernel implementation of
+- // NETLINK, IPv4 addresses have only the IFA_ADDRESS attribute, while IPv6
+- // have the IFA_LOCAL attribute.
+- uint8_t* address = NULL;
+- uint8_t* local = NULL;
+- size_t length = IFA_PAYLOAD(header);
+- for (const struct rtattr* attr =
+- reinterpret_cast<const struct rtattr*>(IFA_RTA(msg));
+- RTA_OK(attr, length);
+- attr = RTA_NEXT(attr, length)) {
+- switch (attr->rta_type) {
+- case IFA_ADDRESS:
+- DCHECK_GE(RTA_PAYLOAD(attr), address_length);
+- address = reinterpret_cast<uint8_t*>(RTA_DATA(attr));
+- break;
+- case IFA_LOCAL:
+- DCHECK_GE(RTA_PAYLOAD(attr), address_length);
+- local = reinterpret_cast<uint8_t*>(RTA_DATA(attr));
+- break;
+- case IFA_CACHEINFO: {
+- const struct ifa_cacheinfo *cache_info =
+- reinterpret_cast<const struct ifa_cacheinfo*>(RTA_DATA(attr));
+- if (really_deprecated)
+- *really_deprecated = (cache_info->ifa_prefered == 0);
+- } break;
+- default:
+- break;
+- }
+- }
+- if (local)
+- address = local;
+- if (!address)
+- return false;
+- *out = IPAddress(address, address_length);
+- return true;
+-}
+-
+-} // namespace
+-
+ // static
+ char* AddressTrackerLinux::GetInterfaceName(int interface_index, char* buf) {
+- memset(buf, 0, IFNAMSIZ);
+- base::ScopedFD ioctl_socket = GetSocketForIoctl();
+- if (!ioctl_socket.is_valid())
+- return buf;
+-
+- struct ifreq ifr = {};
+- ifr.ifr_ifindex = interface_index;
+-
+- if (ioctl(ioctl_socket.get(), SIOCGIFNAME, &ifr) == 0)
+- strncpy(buf, ifr.ifr_name, IFNAMSIZ - 1);
+- return buf;
++ NOTIMPLEMENTED();
++ return NULL;
+ }
+
+ AddressTrackerLinux::AddressTrackerLinux()
+@@ -153,93 +67,8 @@ AddressTrackerLinux::~AddressTrackerLinux() {
+ }
+
+ void AddressTrackerLinux::Init() {
+- netlink_fd_ = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
+- if (netlink_fd_ < 0) {
+- PLOG(ERROR) << "Could not create NETLINK socket";
+- AbortAndForceOnline();
+- return;
+- }
+-
+- int rv;
+-
+- if (tracking_) {
+- // Request notifications.
+- struct sockaddr_nl addr = {};
+- addr.nl_family = AF_NETLINK;
+- addr.nl_pid = getpid();
+- // TODO(szym): Track RTMGRP_LINK as well for ifi_type,
+- // http://crbug.com/113993
+- addr.nl_groups =
+- RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR | RTMGRP_NOTIFY | RTMGRP_LINK;
+- rv = bind(
+- netlink_fd_, reinterpret_cast<struct sockaddr*>(&addr), sizeof(addr));
+- if (rv < 0) {
+- PLOG(ERROR) << "Could not bind NETLINK socket";
+- AbortAndForceOnline();
+- return;
+- }
+- }
+-
+- // Request dump of addresses.
+- struct sockaddr_nl peer = {};
+- peer.nl_family = AF_NETLINK;
+-
+- struct {
+- struct nlmsghdr header;
+- struct rtgenmsg msg;
+- } request = {};
+-
+- request.header.nlmsg_len = NLMSG_LENGTH(sizeof(request.msg));
+- request.header.nlmsg_type = RTM_GETADDR;
+- request.header.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
+- request.header.nlmsg_pid = getpid();
+- request.msg.rtgen_family = AF_UNSPEC;
+-
+- rv = HANDLE_EINTR(sendto(netlink_fd_, &request, request.header.nlmsg_len,
+- 0, reinterpret_cast<struct sockaddr*>(&peer),
+- sizeof(peer)));
+- if (rv < 0) {
+- PLOG(ERROR) << "Could not send NETLINK request";
+- AbortAndForceOnline();
+- return;
+- }
+-
+- // Consume pending message to populate the AddressMap, but don't notify.
+- // Sending another request without first reading responses results in EBUSY.
+- bool address_changed;
+- bool link_changed;
+- bool tunnel_changed;
+- ReadMessages(&address_changed, &link_changed, &tunnel_changed);
+-
+- // Request dump of link state
+- request.header.nlmsg_type = RTM_GETLINK;
+-
+- rv = HANDLE_EINTR(sendto(netlink_fd_, &request, request.header.nlmsg_len, 0,
+- reinterpret_cast<struct sockaddr*>(&peer),
+- sizeof(peer)));
+- if (rv < 0) {
+- PLOG(ERROR) << "Could not send NETLINK request";
+- AbortAndForceOnline();
+- return;
+- }
+-
+- // Consume pending message to populate links_online_, but don't notify.
+- ReadMessages(&address_changed, &link_changed, &tunnel_changed);
+- {
+- AddressTrackerAutoLock lock(*this, connection_type_lock_);
+- connection_type_initialized_ = true;
+- connection_type_initialized_cv_.Broadcast();
+- }
+-
+- if (tracking_) {
+- rv = base::MessageLoopCurrentForIO::Get()->WatchFileDescriptor(
+- netlink_fd_, true, base::MessagePumpForIO::WATCH_READ, &watcher_, this);
+- if (rv < 0) {
+- PLOG(ERROR) << "Could not watch NETLINK socket";
+- AbortAndForceOnline();
+- return;
+- }
+- }
++NOTIMPLEMENTED();
++AbortAndForceOnline();
+ }
+
+ void AddressTrackerLinux::AbortAndForceOnline() {
+@@ -250,25 +79,6 @@ void AddressTrackerLinux::AbortAndForceOnline() {
+ connection_type_initialized_cv_.Broadcast();
+ }
+
+-AddressTrackerLinux::AddressMap AddressTrackerLinux::GetAddressMap() const {
+- AddressTrackerAutoLock lock(*this, address_map_lock_);
+- return address_map_;
+-}
+-
+-std::unordered_set<int> AddressTrackerLinux::GetOnlineLinks() const {
+- AddressTrackerAutoLock lock(*this, online_links_lock_);
+- return online_links_;
+-}
+-
+-bool AddressTrackerLinux::IsInterfaceIgnored(int interface_index) const {
+- if (ignored_interfaces_.empty())
+- return false;
+-
+- char buf[IFNAMSIZ] = {0};
+- const char* interface_name = get_interface_name_(interface_index, buf);
+- return ignored_interfaces_.find(interface_name) != ignored_interfaces_.end();
+-}
+-
+ NetworkChangeNotifier::ConnectionType
+ AddressTrackerLinux::GetCurrentConnectionType() {
+ // http://crbug.com/125097
+@@ -323,6 +133,7 @@ void AddressTrackerLinux::HandleMessage(char* buffer,
+ bool* address_changed,
+ bool* link_changed,
+ bool* tunnel_changed) {
++#if !defined(OS_BSD)
+ DCHECK(buffer);
+ for (struct nlmsghdr* header = reinterpret_cast<struct nlmsghdr*>(buffer);
+ NLMSG_OK(header, length);
+@@ -419,6 +230,9 @@ void AddressTrackerLinux::HandleMessage(char* buffer,
+ break;
+ }
+ }
++#else
++ NOTIMPLEMENTED();
++#endif
+ }
+
+ void AddressTrackerLinux::OnFileCanReadWithoutBlocking(int fd) {
+@@ -455,6 +269,7 @@ bool AddressTrackerLinux::IsTunnelInterfaceName(const
+ }
+
+ void AddressTrackerLinux::UpdateCurrentConnectionType() {
++#if !defined(OS_BSD)
+ AddressTrackerLinux::AddressMap address_map = GetAddressMap();
+ std::unordered_set<int> online_links = GetOnlineLinks();
+
+@@ -483,6 +298,9 @@ void AddressTrackerLinux::UpdateCurrentConnectionType(
+
+ AddressTrackerAutoLock lock(*this, connection_type_lock_);
+ current_connection_type_ = type;
++#else
++ NOTIMPLEMENTED();
++#endif
+ }
+
+ int AddressTrackerLinux::GetThreadsWaitingForConnectionTypeInitForTesting()
diff --git a/devel/electron4/files/patch-net_base_address__tracker__linux.h b/devel/electron4/files/patch-net_base_address__tracker__linux.h
new file mode 100644
index 000000000000..4f80a354ba35
--- /dev/null
+++ b/devel/electron4/files/patch-net_base_address__tracker__linux.h
@@ -0,0 +1,12 @@
+--- net/base/address_tracker_linux.h.orig 2019-03-15 06:37:29 UTC
++++ net/base/address_tracker_linux.h
+@@ -7,9 +7,6 @@
+
+ #include <sys/socket.h> // Needed to include netlink.
+ // Mask superfluous definition of |struct net|. This is fixed in Linux 2.6.38.
+-#define net net_kernel
+-#include <linux/rtnetlink.h>
+-#undef net
+ #include <stddef.h>
+
+ #include <map>
diff --git a/devel/electron4/files/patch-net_base_address__tracker__linux__unittest.cc b/devel/electron4/files/patch-net_base_address__tracker__linux__unittest.cc
new file mode 100644
index 000000000000..47dc7694bd17
--- /dev/null
+++ b/devel/electron4/files/patch-net_base_address__tracker__linux__unittest.cc
@@ -0,0 +1,14 @@
+--- net/base/address_tracker_linux_unittest.cc.orig 2019-03-15 06:25:49 UTC
++++ net/base/address_tracker_linux_unittest.cc
+@@ -4,7 +4,11 @@
+
+ #include "net/base/address_tracker_linux.h"
+
++#if defined(__linux__)
+ #include <linux/if.h>
++#else
++#include <net/if.h>
++#endif
+
+ #include <memory>
+ #include <unordered_set>
diff --git a/devel/electron4/files/patch-net_base_network__change__notifier.cc b/devel/electron4/files/patch-net_base_network__change__notifier.cc
new file mode 100644
index 000000000000..5e9c2a40df23
--- /dev/null
+++ b/devel/electron4/files/patch-net_base_network__change__notifier.cc
@@ -0,0 +1,10 @@
+--- net/base/network_change_notifier.cc.orig 2019-03-15 06:37:29 UTC
++++ net/base/network_change_notifier.cc
+@@ -217,7 +217,6 @@ NetworkChangeNotifier* NetworkChangeNotifier::Create()
+ #elif defined(OS_MACOSX)
+ return new NetworkChangeNotifierMac();
+ #else
+- NOTIMPLEMENTED();
+ return NULL;
+ #endif
+ }
diff --git a/devel/electron4/files/patch-net_base_network__interfaces__freebsd.cc b/devel/electron4/files/patch-net_base_network__interfaces__freebsd.cc
new file mode 100644
index 000000000000..15d1229d84ed
--- /dev/null
+++ b/devel/electron4/files/patch-net_base_network__interfaces__freebsd.cc
@@ -0,0 +1,243 @@
+--- net/base/network_interfaces_freebsd.cc.orig 2019-03-16 09:17:06 UTC
++++ net/base/network_interfaces_freebsd.cc
+@@ -0,0 +1,240 @@
++// Copyright (c) 2014 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "net/base/network_interfaces_freebsd.h"
++
++#include <ifaddrs.h>
++#include <net/if.h>
++#include <netinet/in.h>
++#include <sys/types.h>
++#include <net/if_media.h>
++#include <net/if_var.h>
++#include <netinet/in_var.h>
++#include <netinet6/in6_var.h>
++#include <sys/ioctl.h>
++
++#include <memory>
++#include <set>
++
++#include "base/files/file_path.h"
++#include "base/logging.h"
++#include "base/strings/string_number_conversions.h"
++#include "base/strings/string_tokenizer.h"
++#include "base/strings/string_util.h"
++#include "base/threading/thread_restrictions.h"
++#include "net/base/escape.h"
++#include "net/base/ip_endpoint.h"
++#include "net/base/net_errors.h"
++#include "net/base/network_interfaces_posix.h"
++#include "url/gurl.h"
++
++namespace net {
++
++namespace {
++
++// FreeBSD implementation of IPAttributesGetterFreeBSD which calls ioctl on socket to
++// retrieve IP attributes.
++class IPAttributesGetterFreeBSDImpl : public internal::IPAttributesGetterFreeBSD {
++ public:
++ IPAttributesGetterFreeBSDImpl();
++ ~IPAttributesGetterFreeBSDImpl() override;
++ bool IsInitialized() const override;
++ bool GetIPAttributes(const char* ifname,
++ const sockaddr* sock_addr,
++ int* native_attributes) override;
++
++ private:
++ int ioctl_socket_;
++};
++
++IPAttributesGetterFreeBSDImpl::IPAttributesGetterFreeBSDImpl()
++ : ioctl_socket_(socket(AF_INET6, SOCK_DGRAM, 0)) {
++ DCHECK_GE(ioctl_socket_, 0);
++}
++
++bool IPAttributesGetterFreeBSDImpl::IsInitialized() const {
++ return ioctl_socket_ >= 0;
++}
++
++IPAttributesGetterFreeBSDImpl::~IPAttributesGetterFreeBSDImpl() {
++ if (ioctl_socket_ >= 0) {
++ close(ioctl_socket_);
++ }
++}
++
++bool IPAttributesGetterFreeBSDImpl::GetIPAttributes(const char* ifname,
++ const sockaddr* sock_addr,
++ int* native_attributes) {
++ struct in6_ifreq ifr = {};
++ strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1);
++ memcpy(&ifr.ifr_ifru.ifru_addr, sock_addr, sock_addr->sa_len);
++ int rv = ioctl(ioctl_socket_, SIOCGIFAFLAG_IN6, &ifr);
++ if (rv >= 0) {
++ *native_attributes = ifr.ifr_ifru.ifru_flags;
++ }
++ return (rv >= 0);
++}
++
++// When returning true, the platform native IPv6 address attributes were
++// successfully converted to net IP address attributes. Otherwise, returning
++// false and the caller should drop the IP address which can't be used by the
++// application layer.
++bool TryConvertNativeToNetIPAttributes(int native_attributes,
++ int* net_attributes) {
++ // For FreeBSD, we disallow addresses with attributes IN6_IFF_ANYCASE,
++ // IN6_IFF_DUPLICATED, IN6_IFF_TENTATIVE, and IN6_IFF_DETACHED as these are
++ // still progressing through duplicated address detection (DAD) or are not
++ // suitable to be used in an one-to-one communication and shouldn't be used
++ // by the application layer.
++ if (native_attributes & (IN6_IFF_ANYCAST | IN6_IFF_DUPLICATED |
++ IN6_IFF_TENTATIVE | IN6_IFF_DETACHED)) {
++ return false;
++ }
++
++ if (native_attributes & IN6_IFF_DEPRECATED) {
++ *net_attributes |= IP_ADDRESS_ATTRIBUTE_DEPRECATED;
++ }
++
++ return true;
++}
++
++NetworkChangeNotifier::ConnectionType GetNetworkInterfaceType(
++ int addr_family,
++ const std::string& interface_name) {
++ NetworkChangeNotifier::ConnectionType type =
++ NetworkChangeNotifier::CONNECTION_UNKNOWN;
++
++ struct ifmediareq ifmr = {};
++ strncpy(ifmr.ifm_name, interface_name.c_str(), sizeof(ifmr.ifm_name) - 1);
++
++ int s = socket(addr_family, SOCK_DGRAM, 0);
++ if (s == -1) {
++ return type;
++ }
++
++ if (ioctl(s, SIOCGIFMEDIA, &ifmr) != -1) {
++ if (ifmr.ifm_current & IFM_IEEE80211) {
++ type = NetworkChangeNotifier::CONNECTION_WIFI;
++ } else if (ifmr.ifm_current & IFM_ETHER) {
++ type = NetworkChangeNotifier::CONNECTION_ETHERNET;
++ }
++ }
++ close(s);
++ return type;
++}
++
++} // namespace
++
++namespace internal {
++
++bool GetNetworkListImpl(NetworkInterfaceList* networks,
++ int policy,
++ const ifaddrs* interfaces,
++ IPAttributesGetterFreeBSD* ip_attributes_getter) {
++ // Enumerate the addresses assigned to network interfaces which are up.
++ for (const ifaddrs* interface = interfaces; interface != NULL;
++ interface = interface->ifa_next) {
++ // Skip loopback interfaces, and ones which are down.
++ if (!(IFF_RUNNING & interface->ifa_flags))
++ continue;
++ if (IFF_LOOPBACK & interface->ifa_flags)
++ continue;
++ // Skip interfaces with no address configured.
++ struct sockaddr* addr = interface->ifa_addr;
++ if (!addr)
++ continue;
++
++ // Skip unspecified addresses (i.e. made of zeroes) and loopback addresses
++ // configured on non-loopback interfaces.
++ if (IsLoopbackOrUnspecifiedAddress(addr))
++ continue;
++
++ const std::string& name = interface->ifa_name;
++ // Filter out VMware interfaces, typically named vmnet1 and vmnet8.
++ if (ShouldIgnoreInterface(name, policy)) {
++ continue;
++ }
++
++ NetworkChangeNotifier::ConnectionType connection_type =
++ NetworkChangeNotifier::CONNECTION_UNKNOWN;
++
++ int ip_attributes = IP_ADDRESS_ATTRIBUTE_NONE;
++
++ // Retrieve native ip attributes and convert to net version if a getter is
++ // given.
++ if (ip_attributes_getter && ip_attributes_getter->IsInitialized()) {
++ int native_attributes = 0;
++ if (addr->sa_family == AF_INET6 &&
++ ip_attributes_getter->GetIPAttributes(
++ interface->ifa_name, interface->ifa_addr, &native_attributes)) {
++ if (!TryConvertNativeToNetIPAttributes(native_attributes,
++ &ip_attributes)) {
++ continue;
++ }
++ }
++ }
++
++ connection_type = GetNetworkInterfaceType(addr->sa_family, name);
++
++ IPEndPoint address;
++
++ int addr_size = 0;
++ if (addr->sa_family == AF_INET6) {
++ addr_size = sizeof(sockaddr_in6);
++ } else if (addr->sa_family == AF_INET) {
++ addr_size = sizeof(sockaddr_in);
++ }
++
++ if (address.FromSockAddr(addr, addr_size)) {
++ uint8_t prefix_length = 0;
++ if (interface->ifa_netmask) {
++ // If not otherwise set, assume the same sa_family as ifa_addr.
++ if (interface->ifa_netmask->sa_family == 0) {
++ interface->ifa_netmask->sa_family = addr->sa_family;
++ }
++ IPEndPoint netmask;
++ if (netmask.FromSockAddr(interface->ifa_netmask, addr_size)) {
++ prefix_length = MaskPrefixLength(netmask.address());
++ }
++ }
++ networks->push_back(NetworkInterface(
++ name, name, if_nametoindex(name.c_str()), connection_type,
++ address.address(), prefix_length, ip_attributes));
++ }
++ }
++
++ return true;
++}
++
++} // namespace internal
++
++bool GetNetworkList(NetworkInterfaceList* networks, int policy) {
++ if (networks == NULL)
++ return false;
++
++ // getifaddrs() may require IO operations.
++ base::AssertBlockingAllowed();
++
++ ifaddrs* interfaces;
++ if (getifaddrs(&interfaces) < 0) {
++ PLOG(ERROR) << "getifaddrs";
++ return false;
++ }
++
++ std::unique_ptr<internal::IPAttributesGetterFreeBSD> ip_attributes_getter;
++
++ ip_attributes_getter.reset(new IPAttributesGetterFreeBSDImpl());
++
++ bool result = internal::GetNetworkListImpl(networks, policy, interfaces,
++ ip_attributes_getter.get());
++ freeifaddrs(interfaces);
++ return result;
++}
++
++std::string GetWifiSSID() {
++ NOTIMPLEMENTED();
++ return "";
++}
++
++} // namespace net
diff --git a/devel/electron4/files/patch-net_base_network__interfaces__freebsd.h b/devel/electron4/files/patch-net_base_network__interfaces__freebsd.h
new file mode 100644
index 000000000000..13dd41c9939f
--- /dev/null
+++ b/devel/electron4/files/patch-net_base_network__interfaces__freebsd.h
@@ -0,0 +1,47 @@
+--- net/base/network_interfaces_freebsd.h.orig 2019-03-16 09:17:06 UTC
++++ net/base/network_interfaces_freebsd.h
+@@ -0,0 +1,44 @@
++// Copyright (c) 2014 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#ifndef NET_BASE_NETWORK_INTERFACES_FREEBSD_H_
++#define NET_BASE_NETWORK_INTERFACES_FREEBSD_H_
++
++// This file is only used to expose some of the internals
++// of network_interfaces_mac.cc to tests.
++
++#include <sys/socket.h>
++
++#include "base/macros.h"
++#include "net/base/net_export.h"
++#include "net/base/network_interfaces.h"
++
++struct ifaddrs;
++struct sockaddr;
++
++namespace net {
++namespace internal {
++
++class NET_EXPORT IPAttributesGetterFreeBSD {
++ public:
++ IPAttributesGetterFreeBSD() {}
++ virtual ~IPAttributesGetterFreeBSD() {}
++ virtual bool IsInitialized() const = 0;
++ virtual bool GetIPAttributes(const char* ifname,
++ const sockaddr* sock_addr,
++ int* native_attributes) = 0;
++
++ private:
++ DISALLOW_COPY_AND_ASSIGN(IPAttributesGetterFreeBSD);
++};
++
++NET_EXPORT bool GetNetworkListImpl(NetworkInterfaceList* networks,
++ int policy,
++ const ifaddrs* interfaces,
++ IPAttributesGetterFreeBSD* ip_attributes_getter);
++
++} // namespace internal
++} // namespace net
++
++#endif // NET_BASE_NETWORK_INTERFACES_FREEBSD_H_
diff --git a/devel/electron4/files/patch-net_base_network__interfaces__posix.h b/devel/electron4/files/patch-net_base_network__interfaces__posix.h
new file mode 100644
index 000000000000..ee53c3184d9c
--- /dev/null
+++ b/devel/electron4/files/patch-net_base_network__interfaces__posix.h
@@ -0,0 +1,11 @@
+--- net/base/network_interfaces_posix.h.orig 2019-03-15 06:25:49 UTC
++++ net/base/network_interfaces_posix.h
+@@ -8,6 +8,8 @@
+ // This file provides some basic functionality shared between
+ // network_interfaces_linux.cc and network_interfaces_getifaddrs.cc.
+
++#include <sys/socket.h>
++
+ #include <string>
+
+ struct sockaddr;
diff --git a/devel/electron4/files/patch-net_disk__cache_blockfile_disk__format.h b/devel/electron4/files/patch-net_disk__cache_blockfile_disk__format.h
new file mode 100644
index 000000000000..64aa3a21344f
--- /dev/null
+++ b/devel/electron4/files/patch-net_disk__cache_blockfile_disk__format.h
@@ -0,0 +1,12 @@
+--- net/disk_cache/blockfile/disk_format.h.orig 2019-03-15 06:25:50 UTC
++++ net/disk_cache/blockfile/disk_format.h
+@@ -149,7 +149,9 @@ struct RankingsNode {
+ };
+ #pragma pack(pop)
+
++#if !defined(OS_BSD)
+ static_assert(sizeof(RankingsNode) == 36, "bad RankingsNode");
++#endif
+
+ } // namespace disk_cache
+
diff --git a/devel/electron4/files/patch-net_dns_address__sorter__posix.cc b/devel/electron4/files/patch-net_dns_address__sorter__posix.cc
new file mode 100644
index 000000000000..633e23199777
--- /dev/null
+++ b/devel/electron4/files/patch-net_dns_address__sorter__posix.cc
@@ -0,0 +1,12 @@
+--- net/dns/address_sorter_posix.cc.orig 2019-03-15 06:37:29 UTC
++++ net/dns/address_sorter_posix.cc
+@@ -13,7 +13,9 @@
+ #include <sys/socket.h> // Must be included before ifaddrs.h.
+ #include <ifaddrs.h>
+ #include <net/if.h>
++#include <net/if_var.h>
+ #include <netinet/in_var.h>
++#include <netinet6/in6_var.h>
+ #include <string.h>
+ #include <sys/ioctl.h>
+ #endif
diff --git a/devel/electron4/files/patch-net_dns_dns__config__service__posix__unittest.cc b/devel/electron4/files/patch-net_dns_dns__config__service__posix__unittest.cc
new file mode 100644
index 000000000000..a30082d24219
--- /dev/null
+++ b/devel/electron4/files/patch-net_dns_dns__config__service__posix__unittest.cc
@@ -0,0 +1,11 @@
+--- net/dns/dns_config_service_posix_unittest.cc.orig 2019-03-15 06:37:29 UTC
++++ net/dns/dns_config_service_posix_unittest.cc
+@@ -2,8 +2,6 @@
+ // Use of this source code is governed by a BSD-style license that can be
+ // found in the LICENSE file.
+
+-#include <resolv.h>
+-
+ #include <memory>
+
+ #include "base/cancelable_callback.h"
diff --git a/devel/electron4/files/patch-net_dns_dns__reloader.cc b/devel/electron4/files/patch-net_dns_dns__reloader.cc
new file mode 100644
index 000000000000..9c42c4673de3
--- /dev/null
+++ b/devel/electron4/files/patch-net_dns_dns__reloader.cc
@@ -0,0 +1,13 @@
+--- net/dns/dns_reloader.cc.orig 2019-03-15 06:37:29 UTC
++++ net/dns/dns_reloader.cc
+@@ -7,6 +7,10 @@
+ #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD) && \
+ !defined(OS_ANDROID) && !defined(OS_FUCHSIA)
+
++#if defined(OS_FREEBSD)
++#include <netinet/in.h>
++#endif
++
+ #include <resolv.h>
+
+ #include "base/lazy_instance.h"
diff --git a/devel/electron4/files/patch-net_dns_dns__util.cc b/devel/electron4/files/patch-net_dns_dns__util.cc
new file mode 100644
index 000000000000..d103df1b6103
--- /dev/null
+++ b/devel/electron4/files/patch-net_dns_dns__util.cc
@@ -0,0 +1,11 @@
+--- net/dns/dns_util.cc.orig 2019-03-15 06:37:29 UTC
++++ net/dns/dns_util.cc
+@@ -28,6 +28,8 @@ const int kMaxLabelLength = 63;
+
+ } // namespace
+
++#include <sys/socket.h>
++
+ #if defined(OS_POSIX)
+ #include <netinet/in.h>
+ #if !defined(OS_NACL)
diff --git a/devel/electron4/files/patch-net_dns_host__resolver__proc.cc b/devel/electron4/files/patch-net_dns_host__resolver__proc.cc
new file mode 100644
index 000000000000..b68aa21d5c7d
--- /dev/null
+++ b/devel/electron4/files/patch-net_dns_host__resolver__proc.cc
@@ -0,0 +1,11 @@
+--- net/dns/host_resolver_proc.cc.orig 2019-03-15 06:37:29 UTC
++++ net/dns/host_resolver_proc.cc
+@@ -195,7 +195,7 @@ int SystemHostResolverCall(const std::string& host,
+ // current process during that time.
+ base::ScopedBlockingCall scoped_blocking_call(base::BlockingType::WILL_BLOCK);
+
+-#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD) && \
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD) && \
+ !defined(OS_ANDROID) && !defined(OS_FUCHSIA)
+ DnsReloaderMaybeReload();
+ #endif
diff --git a/devel/electron4/files/patch-net_features.gni b/devel/electron4/files/patch-net_features.gni
new file mode 100644
index 000000000000..8e2cbcaa53a0
--- /dev/null
+++ b/devel/electron4/files/patch-net_features.gni
@@ -0,0 +1,11 @@
+--- net/features.gni.orig 2019-03-15 06:37:29 UTC
++++ net/features.gni
+@@ -27,7 +27,7 @@ declare_args() {
+ disable_brotli_filter = false
+
+ # Multicast DNS.
+- enable_mdns = is_win || is_linux || is_fuchsia
++ enable_mdns = is_win || is_linux || is_fuchsia || is_bsd
+
+ # Reporting not used on iOS.
+ enable_reporting = !is_ios
diff --git a/devel/electron4/files/patch-net_http_http__auth__gssapi__posix.cc b/devel/electron4/files/patch-net_http_http__auth__gssapi__posix.cc
new file mode 100644
index 000000000000..384ff069ccb2
--- /dev/null
+++ b/devel/electron4/files/patch-net_http_http__auth__gssapi__posix.cc
@@ -0,0 +1,14 @@
+--- net/http/http_auth_gssapi_posix.cc.orig 2019-03-15 06:37:29 UTC
++++ net/http/http_auth_gssapi_posix.cc
+@@ -431,8 +431,9 @@ base::NativeLibrary GSSAPISharedLibrary::LoadSharedLib
+ static const char* const kDefaultLibraryNames[] = {
+ #if defined(OS_MACOSX)
+ "/System/Library/Frameworks/GSS.framework/GSS"
+-#elif defined(OS_OPENBSD)
+- "libgssapi.so" // Heimdal - OpenBSD
++#elif defined(OS_BSD)
++ "libgssapi_krb5.so.2", // MIT Kerberos - FreeBSD
++ "libgssapi.so" // Heimdal - OpenBSD, FreeBSD
+ #else
+ "libgssapi_krb5.so.2", // MIT Kerberos - FC, Suse10, Debian
+ "libgssapi.so.4", // Heimdal - Suse10, MDK
diff --git a/devel/electron4/files/patch-net_http_http__network__session.cc b/devel/electron4/files/patch-net_http_http__network__session.cc
new file mode 100644
index 000000000000..646fcbd66fd2
--- /dev/null
+++ b/devel/electron4/files/patch-net_http_http__network__session.cc
@@ -0,0 +1,12 @@
+--- net/http/http_network_session.cc.orig 2019-03-15 06:37:30 UTC
++++ net/http/http_network_session.cc
+@@ -20,7 +20,9 @@
+ #include "base/trace_event/memory_dump_request_args.h"
+ #include "base/trace_event/process_memory_dump.h"
+ #include "base/values.h"
++#if defined(USE_KERBEROS)
+ #include "net/http/http_auth_handler_factory.h"
++#endif
+ #include "net/http/http_response_body_drainer.h"
+ #include "net/http/http_stream_factory.h"
+ #include "net/http/url_security_manager.h"
diff --git a/devel/electron4/files/patch-net_proxy__resolution_proxy__config__service__linux.cc b/devel/electron4/files/patch-net_proxy__resolution_proxy__config__service__linux.cc
new file mode 100644
index 000000000000..ea1d68c5e140
--- /dev/null
+++ b/devel/electron4/files/patch-net_proxy__resolution_proxy__config__service__linux.cc
@@ -0,0 +1,39 @@
+--- net/proxy_resolution/proxy_config_service_linux.cc.orig 2019-03-15 06:37:30 UTC
++++ net/proxy_resolution/proxy_config_service_linux.cc
+@@ -6,7 +6,9 @@
+
+ #include <errno.h>
+ #include <limits.h>
++#if !defined(OS_BSD)
+ #include <sys/inotify.h>
++#endif
+ #include <unistd.h>
+
+ #include <map>
+@@ -493,6 +495,7 @@ int StringToIntOrDefault(base::StringPiece value, int
+ return default_value;
+ }
+
++#if !defined(OS_BSD)
+ // This is the KDE version that reads kioslaverc and simulates gsettings.
+ // Doing this allows the main Delegate code, as well as the unit tests
+ // for it, to stay the same - and the settings map fairly well besides.
+@@ -982,6 +985,7 @@ class SettingGetterImplKDE : public ProxyConfigService
+
+ DISALLOW_COPY_AND_ASSIGN(SettingGetterImplKDE);
+ };
++#endif
+
+ } // namespace
+
+@@ -1197,8 +1201,10 @@ ProxyConfigServiceLinux::Delegate::Delegate(
+ case base::nix::DESKTOP_ENVIRONMENT_KDE3:
+ case base::nix::DESKTOP_ENVIRONMENT_KDE4:
+ case base::nix::DESKTOP_ENVIRONMENT_KDE5:
++#if !defined(OS_BSD)
+ setting_getter_.reset(new SettingGetterImplKDE(env_var_getter_.get()));
+ break;
++#endif
+ case base::nix::DESKTOP_ENVIRONMENT_XFCE:
+ case base::nix::DESKTOP_ENVIRONMENT_OTHER:
+ break;
diff --git a/devel/electron4/files/patch-net_proxy__resolution_proxy__resolution__service.cc b/devel/electron4/files/patch-net_proxy__resolution_proxy__resolution__service.cc
new file mode 100644
index 000000000000..8bda87ff59d5
--- /dev/null
+++ b/devel/electron4/files/patch-net_proxy__resolution_proxy__resolution__service.cc
@@ -0,0 +1,29 @@
+--- net/proxy_resolution/proxy_resolution_service.cc.orig 2019-03-15 06:37:30 UTC
++++ net/proxy_resolution/proxy_resolution_service.cc
+@@ -47,7 +47,7 @@
+ #elif defined(OS_MACOSX)
+ #include "net/proxy_resolution/proxy_config_service_mac.h"
+ #include "net/proxy_resolution/proxy_resolver_mac.h"
+-#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#elif (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ #include "net/proxy_resolution/proxy_config_service_linux.h"
+ #elif defined(OS_ANDROID)
+ #include "net/proxy_resolution/proxy_config_service_android.h"
+@@ -61,7 +61,7 @@ namespace net {
+ namespace {
+
+ #if defined(OS_WIN) || defined(OS_IOS) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ ((defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS))
+ constexpr net::NetworkTrafficAnnotationTag kSystemProxyConfigTrafficAnnotation =
+ net::DefineNetworkTrafficAnnotation("proxy_config_system", R"(
+ semantics {
+@@ -1529,7 +1529,7 @@ ProxyResolutionService::CreateSystemProxyConfigService
+ << "profile_io_data.cc::CreateProxyConfigService and this should "
+ << "be used only for examples.";
+ return std::make_unique<UnsetProxyConfigService>();
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ std::unique_ptr<ProxyConfigServiceLinux> linux_config_service(
+ new ProxyConfigServiceLinux());
+
diff --git a/devel/electron4/files/patch-net_socket_socks5__client__socket.cc b/devel/electron4/files/patch-net_socket_socks5__client__socket.cc
new file mode 100644
index 000000000000..4580e23332e6
--- /dev/null
+++ b/devel/electron4/files/patch-net_socket_socks5__client__socket.cc
@@ -0,0 +1,13 @@
+--- net/socket/socks5_client_socket.cc.orig 2019-03-15 06:37:30 UTC
++++ net/socket/socks5_client_socket.cc
+@@ -4,6 +4,10 @@
+
+ #include "net/socket/socks5_client_socket.h"
+
++#if defined(OS_BSD)
++#include <netinet/in.h>
++#endif
++
+ #include <utility>
+
+ #include "base/callback_helpers.h"
diff --git a/devel/electron4/files/patch-net_socket_udp__socket__posix.cc b/devel/electron4/files/patch-net_socket_udp__socket__posix.cc
new file mode 100644
index 000000000000..0cd590ef675b
--- /dev/null
+++ b/devel/electron4/files/patch-net_socket_udp__socket__posix.cc
@@ -0,0 +1,96 @@
+--- net/socket/udp_socket_posix.cc.orig 2019-03-15 06:37:30 UTC
++++ net/socket/udp_socket_posix.cc
+@@ -68,7 +68,7 @@ const int kActivityMonitorMinimumSamplesForThroughputE
+ const base::TimeDelta kActivityMonitorMsThreshold =
+ base::TimeDelta::FromMilliseconds(100);
+
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ // When enabling multicast using setsockopt(IP_MULTICAST_IF) MacOS
+ // requires passing IPv4 address instead of interface index. This function
+ // resolves IPv4 address by interface index. The |address| is returned in
+@@ -97,7 +97,7 @@ int GetIPv4AddressFromIndex(int socket, uint32_t index
+ return OK;
+ }
+
+-#endif // OS_MACOSX
++#endif // OS_MACOSX || OS_BSD
+
+ #if defined(OS_MACOSX) && !defined(OS_IOS)
+
+@@ -632,13 +632,13 @@ int UDPSocketPosix::SetDoNotFragment() {
+ }
+
+ void UDPSocketPosix::SetMsgConfirm(bool confirm) {
+-#if !defined(OS_MACOSX) && !defined(OS_IOS)
++#if !defined(OS_MACOSX) && !defined(OS_IOS) && !defined(OS_BSD)
+ if (confirm) {
+ sendto_flags_ |= MSG_CONFIRM;
+ } else {
+ sendto_flags_ &= ~MSG_CONFIRM;
+ }
+-#endif // !defined(OS_MACOSX) && !defined(OS_IOS)
++#endif // !defined(OS_MACOSX) && !defined(OS_IOS) && !defined(OS_BSD)
+ }
+
+ int UDPSocketPosix::AllowAddressReuse() {
+@@ -653,17 +653,20 @@ int UDPSocketPosix::SetBroadcast(bool broadcast) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ int value = broadcast ? 1 : 0;
+ int rv;
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ // SO_REUSEPORT on OSX permits multiple processes to each receive
+ // UDP multicast or broadcast datagrams destined for the bound
+ // port.
+ // This is only being set on OSX because its behavior is platform dependent
+ // and we are playing it safe by only setting it on platforms where things
+ // break.
++ rv = setsockopt(socket_, SOL_SOCKET, SO_REUSEADDR, &value, sizeof(value));
++ if (rv != 0)
++ return MapSystemError(errno);
+ rv = setsockopt(socket_, SOL_SOCKET, SO_REUSEPORT, &value, sizeof(value));
+ if (rv != 0)
+ return MapSystemError(errno);
+-#endif // defined(OS_MACOSX)
++#endif // defined(OS_MACOSX) || defined(OS_BSD)
+ rv = setsockopt(socket_, SOL_SOCKET, SO_BROADCAST, &value, sizeof(value));
+
+ return rv == 0 ? OK : MapSystemError(errno);
+@@ -901,19 +904,24 @@ int UDPSocketPosix::SetMulticastOptions() {
+ if (multicast_interface_ != 0) {
+ switch (addr_family_) {
+ case AF_INET: {
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ ip_mreq mreq = {};
+ int error = GetIPv4AddressFromIndex(socket_, multicast_interface_,
+ &mreq.imr_interface.s_addr);
+ if (error != OK)
+ return error;
+-#else // defined(OS_MACOSX)
++#else // defined(OS_MACOSX) || defined(OS_BSD)
+ ip_mreqn mreq = {};
+ mreq.imr_ifindex = multicast_interface_;
+ mreq.imr_address.s_addr = htonl(INADDR_ANY);
+-#endif // !defined(OS_MACOSX)
++#endif // !defined(OS_MACOSX) || defined(OS_BSD)
+ int rv = setsockopt(socket_, IPPROTO_IP, IP_MULTICAST_IF,
++#ifdef defined(OS_BSD)
++ reinterpret_cast<const char*>(&mreq.imr_interface.s_addr),
++ sizeof(mreq.imr_interface.s_addr));
++#else
+ reinterpret_cast<const char*>(&mreq), sizeof(mreq));
++#endif
+ if (rv)
+ return MapSystemError(errno);
+ break;
+@@ -975,7 +983,7 @@ int UDPSocketPosix::JoinGroup(const IPAddress& group_a
+ if (addr_family_ != AF_INET)
+ return ERR_ADDRESS_INVALID;
+
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ ip_mreq mreq = {};
+ int error = GetIPv4AddressFromIndex(socket_, multicast_interface_,
+ &mreq.imr_interface.s_addr);
diff --git a/devel/electron4/files/patch-net_third__party_quic_platform_impl_quic__ip__address__impl.cc b/devel/electron4/files/patch-net_third__party_quic_platform_impl_quic__ip__address__impl.cc
new file mode 100644
index 000000000000..c7e4935f7e13
--- /dev/null
+++ b/devel/electron4/files/patch-net_third__party_quic_platform_impl_quic__ip__address__impl.cc
@@ -0,0 +1,10 @@
+--- net/third_party/quic/platform/impl/quic_ip_address_impl.cc.orig 2019-03-15 06:37:31 UTC
++++ net/third_party/quic/platform/impl/quic_ip_address_impl.cc
+@@ -13,6 +13,7 @@
+ #include <ws2bth.h>
+ #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
+ #include <netinet/in.h>
++#include <sys/socket.h>
+ #endif
+
+ using std::string;
diff --git a/devel/electron4/files/patch-net_tools_cert__verify__tool_cert__verify__tool.cc b/devel/electron4/files/patch-net_tools_cert__verify__tool_cert__verify__tool.cc
new file mode 100644
index 000000000000..63c1a6931fd5
--- /dev/null
+++ b/devel/electron4/files/patch-net_tools_cert__verify__tool_cert__verify__tool.cc
@@ -0,0 +1,20 @@
+--- net/tools/cert_verify_tool/cert_verify_tool.cc.orig 2019-03-15 06:37:31 UTC
++++ net/tools/cert_verify_tool/cert_verify_tool.cc
+@@ -26,7 +26,7 @@
+ #include "net/url_request/url_request_context_builder.h"
+ #include "net/url_request/url_request_context_getter.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "net/proxy_resolution/proxy_config.h"
+ #include "net/proxy_resolution/proxy_config_service_fixed.h"
+ #endif
+@@ -45,7 +45,7 @@ void SetUpOnNetworkThread(std::unique_ptr<net::URLRequ
+ base::WaitableEvent* initialization_complete_event) {
+ net::URLRequestContextBuilder url_request_context_builder;
+ url_request_context_builder.set_user_agent(GetUserAgent());
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // On Linux, use a fixed ProxyConfigService, since the default one
+ // depends on glib.
+ //
diff --git a/devel/electron4/files/patch-net_url__request_url__request__context__builder.cc b/devel/electron4/files/patch-net_url__request_url__request__context__builder.cc
new file mode 100644
index 000000000000..5597b5c230e3
--- /dev/null
+++ b/devel/electron4/files/patch-net_url__request_url__request__context__builder.cc
@@ -0,0 +1,11 @@
+--- net/url_request/url_request_context_builder.cc.orig 2019-03-15 06:37:31 UTC
++++ net/url_request/url_request_context_builder.cc
+@@ -512,7 +512,7 @@ std::unique_ptr<URLRequestContext> URLRequestContextBu
+ }
+
+ if (!proxy_resolution_service_) {
+-#if !defined(OS_LINUX) && !defined(OS_ANDROID)
++#if !defined(OS_LINUX) && !defined(OS_ANDROID) && !defined(OS_BSD)
+ // TODO(willchan): Switch to using this code when
+ // ProxyResolutionService::CreateSystemProxyConfigService()'s signature
+ // doesn't suck.
diff --git a/devel/electron4/files/patch-pdf_pdfium_pdfium__engine.cc b/devel/electron4/files/patch-pdf_pdfium_pdfium__engine.cc
new file mode 100644
index 000000000000..c26af92bc3da
--- /dev/null
+++ b/devel/electron4/files/patch-pdf_pdfium_pdfium__engine.cc
@@ -0,0 +1,65 @@
+--- pdf/pdfium/pdfium_engine.cc.orig 2019-03-15 06:37:31 UTC
++++ pdf/pdfium/pdfium_engine.cc
+@@ -137,7 +137,7 @@ constexpr bool kIsEditModeTracked = false;
+
+ PDFiumEngine* g_engine_for_fontmapper = nullptr;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+
+ PP_Instance g_last_instance_id;
+
+@@ -641,7 +641,7 @@ bool InitializeSDK() {
+ config.m_v8EmbedderSlot = gin::kEmbedderPDFium;
+ FPDF_InitLibraryWithConfig(&config);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Font loading doesn't work in the renderer sandbox in Linux.
+ FPDF_SetSystemFontInfo(&g_font_info);
+ #else
+@@ -666,7 +666,7 @@ bool InitializeSDK() {
+
+ void ShutdownSDK() {
+ FPDF_DestroyLibrary();
+-#if !defined(OS_LINUX)
++#if !defined(OS_LINUX) && !defined(OS_BSD)
+ delete g_font_info;
+ #endif
+ TearDownV8();
+@@ -690,7 +690,7 @@ PDFiumEngine::PDFiumEngine(PDFEngine::Client* client,
+ IFSDK_PAUSE::user = nullptr;
+ IFSDK_PAUSE::NeedToPauseNow = Pause_NeedToPauseNow;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // PreviewModeClient does not know its pp::Instance.
+ pp::Instance* instance = client_->GetPluginInstance();
+ if (instance)
+@@ -1147,7 +1147,7 @@ pp::Buffer_Dev PDFiumEngine::PrintPagesAsRasterPDF(
+
+ KillFormFocus();
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ g_last_instance_id = client_->GetPluginInstance()->pp_instance();
+ #endif
+
+@@ -2842,7 +2842,7 @@ bool PDFiumEngine::ContinuePaint(int progressive_index
+ DCHECK(image_data);
+
+ last_progressive_start_time_ = base::Time::Now();
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ g_last_instance_id = client_->GetPluginInstance()->pp_instance();
+ #endif
+
+@@ -3320,7 +3320,7 @@ void PDFiumEngine::SetCurrentPage(int index) {
+ FORM_DoPageAAction(old_page, form(), FPDFPAGE_AACTION_CLOSE);
+ }
+ most_visible_page_ = index;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ g_last_instance_id = client_->GetPluginInstance()->pp_instance();
+ #endif
+ if (most_visible_page_ != -1 && called_do_document_action_) {
diff --git a/devel/electron4/files/patch-ppapi_proxy_file__io__resource.cc b/devel/electron4/files/patch-ppapi_proxy_file__io__resource.cc
new file mode 100644
index 000000000000..7442b5b43732
--- /dev/null
+++ b/devel/electron4/files/patch-ppapi_proxy_file__io__resource.cc
@@ -0,0 +1,48 @@
+--- ppapi/proxy/file_io_resource.cc.orig 2019-03-15 06:37:31 UTC
++++ ppapi/proxy/file_io_resource.cc
+@@ -285,17 +285,19 @@ int32_t FileIOResource::Write(int64_t offset,
+
+ if (check_quota_) {
+ int64_t increase = 0;
+- uint64_t max_offset = 0;
++ uint64_t _max_offset = 0;
++ // (rene) avoid name collission with /usr/include/vm/vm_map.h on FreeBSD
++ // which also defines max_offset
+ bool append = (open_flags_ & PP_FILEOPENFLAG_APPEND) != 0;
+ if (append) {
+ increase = bytes_to_write;
+ } else {
+- uint64_t max_offset = offset + bytes_to_write;
+- if (max_offset >
++ uint64_t _max_offset = offset + bytes_to_write;
++ if (_max_offset >
+ static_cast<uint64_t>(std::numeric_limits<int64_t>::max())) {
+ return PP_ERROR_FAILED; // amount calculation would overflow.
+ }
+- increase = static_cast<int64_t>(max_offset) - max_written_offset_;
++ increase = static_cast<int64_t>(_max_offset) - max_written_offset_;
+ }
+
+ if (increase > 0) {
+@@ -319,7 +321,7 @@ int32_t FileIOResource::Write(int64_t offset,
+ if (append)
+ append_mode_write_amount_ += bytes_to_write;
+ else
+- max_written_offset_ = max_offset;
++ max_written_offset_ = _max_offset;
+ }
+ }
+ return WriteValidated(offset, buffer, bytes_to_write, callback);
+@@ -597,9 +599,9 @@ void FileIOResource::OnRequestWriteQuotaComplete(
+ } else {
+ DCHECK_LE(offset + bytes_to_write - max_written_offset_, granted);
+
+- int64_t max_offset = offset + bytes_to_write;
+- if (max_written_offset_ < max_offset)
+- max_written_offset_ = max_offset;
++ int64_t _max_offset = offset + bytes_to_write;
++ if (max_written_offset_ < _max_offset)
++ max_written_offset_ = _max_offset;
+ }
+
+ if (callback->is_blocking()) {
diff --git a/devel/electron4/files/patch-printing_backend_print__backend__cups.h b/devel/electron4/files/patch-printing_backend_print__backend__cups.h
new file mode 100644
index 000000000000..be0915942f15
--- /dev/null
+++ b/devel/electron4/files/patch-printing_backend_print__backend__cups.h
@@ -0,0 +1,11 @@
+--- printing/backend/print_backend_cups.h.orig 2019-03-15 06:25:50 UTC
++++ printing/backend/print_backend_cups.h
+@@ -5,6 +5,8 @@
+ #ifndef PRINTING_BACKEND_PRINT_BACKEND_CUPS_H_
+ #define PRINTING_BACKEND_PRINT_BACKEND_CUPS_H_
+
++#include <cups/ppd.h>
++
+ #include <string>
+
+ #include "base/files/file_util.h"
diff --git a/devel/electron4/files/patch-printing_cups__config__helper.py b/devel/electron4/files/patch-printing_cups__config__helper.py
new file mode 100644
index 000000000000..d61bd564c8c5
--- /dev/null
+++ b/devel/electron4/files/patch-printing_cups__config__helper.py
@@ -0,0 +1,11 @@
+--- printing/cups_config_helper.py.orig 2019-03-15 06:25:50 UTC
++++ printing/cups_config_helper.py
+@@ -65,7 +65,7 @@ def main():
+ mode = sys.argv[1]
+ if len(sys.argv) > 2 and sys.argv[2]:
+ sysroot = sys.argv[2]
+- cups_config = os.path.join(sysroot, 'usr', 'bin', 'cups-config')
++ cups_config = os.path.join(sysroot, 'bin', 'cups-config')
+ if not os.path.exists(cups_config):
+ print 'cups-config not found: %s' % cups_config
+ return 1
diff --git a/devel/electron4/files/patch-remoting_base_chromoting__event.cc b/devel/electron4/files/patch-remoting_base_chromoting__event.cc
new file mode 100644
index 000000000000..43335fb522d0
--- /dev/null
+++ b/devel/electron4/files/patch-remoting_base_chromoting__event.cc
@@ -0,0 +1,11 @@
+--- remoting/base/chromoting_event.cc.orig 2019-03-15 06:37:31 UTC
++++ remoting/base/chromoting_event.cc
+@@ -186,7 +186,7 @@ void ChromotingEvent::AddSystemInfo() {
+ SetString(kCpuKey, base::SysInfo::OperatingSystemArchitecture());
+ SetString(kOsVersionKey, base::SysInfo::OperatingSystemVersion());
+ SetString(kWebAppVersionKey, STRINGIZE(VERSION));
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ Os os = Os::CHROMOTING_LINUX;
+ #elif defined(OS_CHROMEOS)
+ Os os = Os::CHROMOTING_CHROMEOS;
diff --git a/devel/electron4/files/patch-remoting_client_display_sys__opengl.h b/devel/electron4/files/patch-remoting_client_display_sys__opengl.h
new file mode 100644
index 000000000000..67ed67bfe772
--- /dev/null
+++ b/devel/electron4/files/patch-remoting_client_display_sys__opengl.h
@@ -0,0 +1,11 @@
+--- remoting/client/display/sys_opengl.h.orig 2019-03-15 06:25:51 UTC
++++ remoting/client/display/sys_opengl.h
+@@ -9,7 +9,7 @@
+
+ #if defined(OS_IOS)
+ #include <OpenGLES/ES3/gl.h>
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #define GL_GLEXT_PROTOTYPES
+ #include <GL/gl.h>
+ #include <GL/glext.h>
diff --git a/devel/electron4/files/patch-remoting_host_evaluate__capability.cc b/devel/electron4/files/patch-remoting_host_evaluate__capability.cc
new file mode 100644
index 000000000000..c453e132d9cb
--- /dev/null
+++ b/devel/electron4/files/patch-remoting_host_evaluate__capability.cc
@@ -0,0 +1,11 @@
+--- remoting/host/evaluate_capability.cc.orig 2019-03-15 06:37:31 UTC
++++ remoting/host/evaluate_capability.cc
+@@ -49,7 +49,7 @@ base::FilePath BuildHostBinaryPath() {
+ }
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (path.BaseName().value() ==
+ FILE_PATH_LITERAL("chrome-remote-desktop-host")) {
+ return path;
diff --git a/devel/electron4/files/patch-remoting_host_host__attributes.cc b/devel/electron4/files/patch-remoting_host_host__attributes.cc
new file mode 100644
index 000000000000..7be44d3feae4
--- /dev/null
+++ b/devel/electron4/files/patch-remoting_host_host__attributes.cc
@@ -0,0 +1,11 @@
+--- remoting/host/host_attributes.cc.orig 2019-03-15 06:37:31 UTC
++++ remoting/host/host_attributes.cc
+@@ -122,7 +122,7 @@ std::string GetHostAttributes() {
+ media::InitializeMediaFoundation()) {
+ result.push_back("HWEncoder");
+ }
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ result.push_back("HWEncoder");
+ #endif
+
diff --git a/devel/electron4/files/patch-remoting_host_host__details.cc b/devel/electron4/files/patch-remoting_host_host__details.cc
new file mode 100644
index 000000000000..afb07dcd85c3
--- /dev/null
+++ b/devel/electron4/files/patch-remoting_host_host__details.cc
@@ -0,0 +1,11 @@
+--- remoting/host/host_details.cc.orig 2019-03-15 06:37:31 UTC
++++ remoting/host/host_details.cc
+@@ -22,7 +22,7 @@ std::string GetHostOperatingSystemName() {
+ return "Mac";
+ #elif defined(OS_CHROMEOS)
+ return "ChromeOS";
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return "Linux";
+ #elif defined(OS_ANDROID)
+ return "Android";
diff --git a/devel/electron4/files/patch-remoting_host_it2me_it2me__native__messaging__host__main.cc b/devel/electron4/files/patch-remoting_host_it2me_it2me__native__messaging__host__main.cc
new file mode 100644
index 000000000000..2527b89ff95a
--- /dev/null
+++ b/devel/electron4/files/patch-remoting_host_it2me_it2me__native__messaging__host__main.cc
@@ -0,0 +1,20 @@
+--- remoting/host/it2me/it2me_native_messaging_host_main.cc.orig 2019-03-15 06:37:31 UTC
++++ remoting/host/it2me/it2me_native_messaging_host_main.cc
+@@ -25,7 +25,7 @@
+ #include "remoting/host/resources.h"
+ #include "remoting/host/usage_stats_consent.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <gtk/gtk.h>
+
+ #include "base/linux_util.h"
+@@ -102,7 +102,7 @@ int It2MeNativeMessagingHostMain(int argc, char** argv
+
+ remoting::LoadResources("");
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Required in order for us to run multiple X11 threads.
+ XInitThreads();
+
diff --git a/devel/electron4/files/patch-remoting_host_me2me__desktop__environment.cc b/devel/electron4/files/patch-remoting_host_me2me__desktop__environment.cc
new file mode 100644
index 000000000000..453bf3b9fdfb
--- /dev/null
+++ b/devel/electron4/files/patch-remoting_host_me2me__desktop__environment.cc
@@ -0,0 +1,11 @@
+--- remoting/host/me2me_desktop_environment.cc.orig 2019-03-15 06:37:31 UTC
++++ remoting/host/me2me_desktop_environment.cc
+@@ -107,7 +107,7 @@ bool Me2MeDesktopEnvironment::InitializeSecurity(
+
+ // Otherwise, if the session is shared with the local user start monitoring
+ // the local input and create the in-session UI.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ bool want_user_interface = false;
+ #elif defined(OS_MACOSX)
+ // Don't try to display any UI on top of the system's login screen as this
diff --git a/devel/electron4/files/patch-remoting_host_remoting__me2me__host.cc b/devel/electron4/files/patch-remoting_host_remoting__me2me__host.cc
new file mode 100644
index 000000000000..c6ed900d12d7
--- /dev/null
+++ b/devel/electron4/files/patch-remoting_host_remoting__me2me__host.cc
@@ -0,0 +1,108 @@
+--- remoting/host/remoting_me2me_host.cc.orig 2019-03-15 06:37:31 UTC
++++ remoting/host/remoting_me2me_host.cc
+@@ -114,13 +114,13 @@
+ #include "base/mac/scoped_cftyperef.h"
+ #endif // defined(OS_MACOSX)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <gtk/gtk.h>
+ #include "base/linux_util.h"
+ #include "remoting/host/audio_capturer_linux.h"
+ #include "remoting/host/linux/certificate_watcher.h"
+ #include "ui/gfx/x/x11.h"
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_WIN)
+ #include <commctrl.h>
+@@ -155,11 +155,11 @@ const char kApplicationName[] = "chromoting";
+ const char kStdinConfigPath[] = "-";
+ #endif // !defined(REMOTING_MULTI_PROCESS)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // The command line switch used to pass name of the pipe to capture audio on
+ // linux.
+ const char kAudioPipeSwitchName[] = "audio-pipe-name";
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_POSIX)
+ // The command line switch used to pass name of the unix domain socket used to
+@@ -350,7 +350,7 @@ class HostProcess : public ConfigWatcher::Delegate,
+
+ std::unique_ptr<ChromotingHostContext> context_;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Watch for certificate changes and kill the host when changes occur
+ std::unique_ptr<CertificateWatcher> cert_watcher_;
+ #endif
+@@ -564,10 +564,10 @@ bool HostProcess::InitWithCommandLine(const base::Comm
+ enable_window_capture_ = cmd_line->HasSwitch(kWindowIdSwitchName);
+ if (enable_window_capture_) {
+
+-#if defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ LOG(WARNING) << "Window capturing is not fully supported on Linux or "
+ "Windows.";
+-#endif // defined(OS_LINUX) || defined(OS_WIN)
++#endif // defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+
+ // uint32_t is large enough to hold window IDs on all platforms.
+ uint32_t window_id;
+@@ -760,7 +760,7 @@ void HostProcess::CreateAuthenticatorFactory() {
+ DCHECK(third_party_auth_config_.token_url.is_valid());
+ DCHECK(third_party_auth_config_.token_validation_url.is_valid());
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (!cert_watcher_) {
+ cert_watcher_.reset(new CertificateWatcher(
+ base::Bind(&HostProcess::ShutdownHost, this, kSuccessExitCode),
+@@ -846,7 +846,7 @@ void HostProcess::StartOnUiThread() {
+ base::Bind(&HostProcess::OnPolicyUpdate, base::Unretained(this)),
+ base::Bind(&HostProcess::OnPolicyError, base::Unretained(this)));
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // If an audio pipe is specific on the command-line then initialize
+ // AudioCapturerLinux to capture from it.
+ base::FilePath audio_pipe_name = base::CommandLine::ForCurrentProcess()->
+@@ -855,7 +855,7 @@ void HostProcess::StartOnUiThread() {
+ remoting::AudioCapturerLinux::InitializePipeReader(
+ context_->audio_task_runner(), audio_pipe_name);
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_POSIX)
+ base::FilePath security_key_socket_name =
+@@ -913,7 +913,7 @@ void HostProcess::ShutdownOnUiThread() {
+ // It is now safe for the HostProcess to be deleted.
+ self_ = nullptr;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Cause the global AudioPipeReader to be freed, otherwise the audio
+ // thread will remain in-use and prevent the process from exiting.
+ // TODO(wez): DesktopEnvironmentFactory should own the pipe reader.
+@@ -1545,7 +1545,7 @@ void HostProcess::StartHost() {
+ host_->AddExtension(std::make_unique<TestEchoExtension>());
+
+ // TODO(simonmorris): Get the maximum session duration from a policy.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ host_->SetMaximumSessionDuration(base::TimeDelta::FromHours(20));
+ #endif
+
+@@ -1704,7 +1704,7 @@ void HostProcess::OnCrash(const std::string& function_
+ int HostProcessMain() {
+ HOST_LOG << "Starting host process: version " << STRINGIZE(VERSION);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
+ kReportOfflineReasonSwitchName)) {
+ // Required in order for us to run multiple X11 threads.
diff --git a/devel/electron4/files/patch-remoting_webapp_base_js_platform.js b/devel/electron4/files/patch-remoting_webapp_base_js_platform.js
new file mode 100644
index 000000000000..ea446671b504
--- /dev/null
+++ b/devel/electron4/files/patch-remoting_webapp_base_js_platform.js
@@ -0,0 +1,17 @@
+--- remoting/webapp/base/js/platform.js.orig 2019-03-15 06:25:51 UTC
++++ remoting/webapp/base/js/platform.js
+@@ -107,6 +107,14 @@ remoting.getSystemInfo = function() {
+ return result;
+ }
+
++ match = new RegExp('FreeBSD ([a-zA-Z0-9_]*)').exec(userAgent);
++ if (match && (match.length >= 2)) {
++ result.osName = remoting.Os.LINUX;
++ result.osVersion = '';
++ result.cpu = match[1];
++ return result;
++ }
++
+ match = new RegExp('([a-zA-Z]*) Mac OS X ([0-9_]*)').exec(userAgent);
+ if (match && (match.length >= 3)) {
+ result.osName = remoting.Os.MAC;
diff --git a/devel/electron4/files/patch-sandbox_features.gni b/devel/electron4/files/patch-sandbox_features.gni
new file mode 100644
index 000000000000..eca97e586a70
--- /dev/null
+++ b/devel/electron4/files/patch-sandbox_features.gni
@@ -0,0 +1,10 @@
+--- sandbox/features.gni.orig 2019-03-15 06:25:51 UTC
++++ sandbox/features.gni
+@@ -12,6 +12,6 @@ use_seccomp_bpf =
+ (is_linux || is_android) &&
+ (current_cpu == "x86" || current_cpu == "x64" || current_cpu == "arm" ||
+ current_cpu == "arm64" || current_cpu == "mipsel" ||
+- current_cpu == "mips64el")
++ current_cpu == "mips64el") && !is_bsd
+
+ use_seccomp_bpf = use_seccomp_bpf || is_nacl_nonsfi
diff --git a/devel/electron4/files/patch-sandbox_linux_BUILD.gn b/devel/electron4/files/patch-sandbox_linux_BUILD.gn
new file mode 100644
index 000000000000..ab1ebd1b77aa
--- /dev/null
+++ b/devel/electron4/files/patch-sandbox_linux_BUILD.gn
@@ -0,0 +1,47 @@
+--- sandbox/linux/BUILD.gn.orig 2019-03-15 06:37:31 UTC
++++ sandbox/linux/BUILD.gn
+@@ -12,12 +12,12 @@ if (is_android) {
+ }
+
+ declare_args() {
+- compile_suid_client = is_linux
++ compile_suid_client = is_linux && !is_bsd
+
+- compile_credentials = is_linux
++ compile_credentials = is_linux && !is_bsd
+
+ # On Android, use plain GTest.
+- use_base_test_suite = is_linux
++ use_base_test_suite = is_linux && !is_bsd
+ }
+
+ if (is_nacl_nonsfi) {
+@@ -398,7 +398,7 @@ component("sandbox_services") {
+ public_deps += [ ":sandbox_services_headers" ]
+ }
+
+- if (is_nacl_nonsfi) {
++ if (is_nacl_nonsfi || is_bsd) {
+ cflags = [ "-fgnu-inline-asm" ]
+
+ sources -= [
+@@ -406,6 +406,8 @@ component("sandbox_services") {
+ "services/init_process_reaper.h",
+ "services/scoped_process.cc",
+ "services/scoped_process.h",
++ "services/syscall_wrappers.cc",
++ "services/syscall_wrappers.h",
+ "services/yama.cc",
+ "services/yama.h",
+ "syscall_broker/broker_channel.cc",
+@@ -424,6 +426,10 @@ component("sandbox_services") {
+ "syscall_broker/broker_process.h",
+ "syscall_broker/broker_simple_message.cc",
+ "syscall_broker/broker_simple_message.h",
++ ]
++ sources += [
++ "services/libc_interceptor.cc",
++ "services/libc_interceptor.h",
+ ]
+ } else if (!is_android) {
+ sources += [
diff --git a/devel/electron4/files/patch-sandbox_linux_services_init__process__reaper.cc b/devel/electron4/files/patch-sandbox_linux_services_init__process__reaper.cc
new file mode 100644
index 000000000000..c225a30573d7
--- /dev/null
+++ b/devel/electron4/files/patch-sandbox_linux_services_init__process__reaper.cc
@@ -0,0 +1,15 @@
+--- sandbox/linux/services/init_process_reaper.cc.orig 2019-03-15 06:25:51 UTC
++++ sandbox/linux/services/init_process_reaper.cc
+@@ -1,6 +1,7 @@
+ // Copyright 2013 The Chromium Authors. All rights reserved.
+ // Use of this source code is governed by a BSD-style license that can be
+ // found in the LICENSE file.
++#if 0
+
+ #include "sandbox/linux/services/init_process_reaper.h"
+
+@@ -100,3 +101,4 @@ bool CreateInitProcessReaper(base::OnceClosure post_fo
+ }
+
+ } // namespace sandbox.
++#endif
diff --git a/devel/electron4/files/patch-sandbox_linux_services_libc__interceptor.cc b/devel/electron4/files/patch-sandbox_linux_services_libc__interceptor.cc
new file mode 100644
index 000000000000..b915db8f9a6f
--- /dev/null
+++ b/devel/electron4/files/patch-sandbox_linux_services_libc__interceptor.cc
@@ -0,0 +1,21 @@
+--- sandbox/linux/services/libc_interceptor.cc.orig 2019-03-15 06:25:51 UTC
++++ sandbox/linux/services/libc_interceptor.cc
+@@ -11,7 +11,9 @@
+ #include <stddef.h>
+ #include <stdint.h>
+ #include <string.h>
++#if !defined(OS_BSD)
+ #include <sys/prctl.h>
++#endif
+ #include <sys/socket.h>
+ #include <sys/types.h>
+ #include <time.h>
+@@ -94,7 +96,7 @@ bool ReadTimeStruct(base::PickleIterator* iter,
+ } else {
+ base::AutoLock lock(g_timezones_lock.Get());
+ auto ret_pair = g_timezones.Get().insert(timezone);
+- output->tm_zone = ret_pair.first->c_str();
++ output->tm_zone = (char *)ret_pair.first->c_str();
+ }
+
+ return true;
diff --git a/devel/electron4/files/patch-services_catalog_public_cpp_manifest__parsing__util.cc b/devel/electron4/files/patch-services_catalog_public_cpp_manifest__parsing__util.cc
new file mode 100644
index 000000000000..6ee7f592d83e
--- /dev/null
+++ b/devel/electron4/files/patch-services_catalog_public_cpp_manifest__parsing__util.cc
@@ -0,0 +1,21 @@
+--- services/catalog/public/cpp/manifest_parsing_util.cc.orig 2019-03-15 06:37:32 UTC
++++ services/catalog/public/cpp/manifest_parsing_util.cc
+@@ -17,7 +17,8 @@ bool IsValidPlatformName(const std::string& name) {
+ name == Store::kRequiredFilesKey_PlatformValue_Linux ||
+ name == Store::kRequiredFilesKey_PlatformValue_MacOSX ||
+ name == Store::kRequiredFilesKey_PlatformValue_Android ||
+- name == Store::kRequiredFilesKey_PlatformValue_Fuchsia;
++ name == Store::kRequiredFilesKey_PlatformValue_Fuchsia ||
++ name == Store::kRequiredFilesKey_PlatformValue_FreeBSD;
+ }
+
+ bool IsCurrentPlatform(const std::string& name) {
+@@ -31,6 +32,8 @@ bool IsCurrentPlatform(const std::string& name) {
+ return name == Store::kRequiredFilesKey_PlatformValue_Android;
+ #elif defined(OS_FUCHSIA)
+ return name == Store::kRequiredFilesKey_PlatformValue_Fuchsia;
++#elif defined(OS_BSD)
++ return name == Store::kRequiredFilesKey_PlatformValue_FreeBSD;
+ #else
+ #error This architecture is not supported.
+ #endif
diff --git a/devel/electron4/files/patch-services_catalog_store.cc b/devel/electron4/files/patch-services_catalog_store.cc
new file mode 100644
index 000000000000..72eb735ee0f9
--- /dev/null
+++ b/devel/electron4/files/patch-services_catalog_store.cc
@@ -0,0 +1,10 @@
+--- services/catalog/store.cc.orig 2019-03-15 06:37:32 UTC
++++ services/catalog/store.cc
+@@ -36,5 +36,7 @@ const char Store::kRequiredFilesKey_PlatformValue_MacO
+ const char Store::kRequiredFilesKey_PlatformValue_Android[] = "android";
+ // static
+ const char Store::kRequiredFilesKey_PlatformValue_Fuchsia[] = "fuchsia";
++// static
++const char Store::kRequiredFilesKey_PlatformValue_FreeBSD[] = "freebsd";
+
+ } // namespace catalog
diff --git a/devel/electron4/files/patch-services_catalog_store.h b/devel/electron4/files/patch-services_catalog_store.h
new file mode 100644
index 000000000000..3a9db1c2e069
--- /dev/null
+++ b/devel/electron4/files/patch-services_catalog_store.h
@@ -0,0 +1,10 @@
+--- services/catalog/store.h.orig 2019-03-15 06:37:32 UTC
++++ services/catalog/store.h
+@@ -36,6 +36,7 @@ class Store {
+ static const char kRequiredFilesKey_PlatformValue_MacOSX[];
+ static const char kRequiredFilesKey_PlatformValue_Android[];
+ static const char kRequiredFilesKey_PlatformValue_Fuchsia[];
++ static const char kRequiredFilesKey_PlatformValue_FreeBSD[];
+ };
+
+ } // namespace catalog
diff --git a/devel/electron4/files/patch-services_content_simple__browser_simple__browser__service.h b/devel/electron4/files/patch-services_content_simple__browser_simple__browser__service.h
new file mode 100644
index 000000000000..a6d5fcca324d
--- /dev/null
+++ b/devel/electron4/files/patch-services_content_simple__browser_simple__browser__service.h
@@ -0,0 +1,20 @@
+--- services/content/simple_browser/simple_browser_service.h.orig 2019-03-15 06:37:32 UTC
++++ services/content/simple_browser/simple_browser_service.h
+@@ -13,7 +13,7 @@
+ #include "build/build_config.h"
+ #include "services/service_manager/public/cpp/service.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "components/services/font/public/cpp/font_loader.h"
+ #endif
+
+@@ -35,7 +35,7 @@ class COMPONENT_EXPORT(SIMPLE_BROWSER) SimpleBrowserSe
+ // service_manager::Service:
+ void OnStart() override;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ sk_sp<font_service::FontLoader> font_loader_;
+ #endif
+
diff --git a/devel/electron4/files/patch-services_device_geolocation_location__arbitrator.cc b/devel/electron4/files/patch-services_device_geolocation_location__arbitrator.cc
new file mode 100644
index 000000000000..71875b09d3d8
--- /dev/null
+++ b/devel/electron4/files/patch-services_device_geolocation_location__arbitrator.cc
@@ -0,0 +1,11 @@
+--- services/device/geolocation/location_arbitrator.cc.orig 2019-03-15 06:37:32 UTC
++++ services/device/geolocation/location_arbitrator.cc
+@@ -164,7 +164,7 @@ LocationArbitrator::NewNetworkLocationProvider(
+ std::unique_ptr<LocationProvider>
+ LocationArbitrator::NewSystemLocationProvider() {
+ #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
+- defined(OS_FUCHSIA)
++ defined(OS_FUCHSIA) || defined(OS_BSD)
+ return nullptr;
+ #else
+ return device::NewSystemLocationProvider();
diff --git a/devel/electron4/files/patch-services_device_hid_BUILD.gn b/devel/electron4/files/patch-services_device_hid_BUILD.gn
new file mode 100644
index 000000000000..00b65127952d
--- /dev/null
+++ b/devel/electron4/files/patch-services_device_hid_BUILD.gn
@@ -0,0 +1,22 @@
+--- services/device/hid/BUILD.gn.orig 2019-03-15 06:37:32 UTC
++++ services/device/hid/BUILD.gn
+@@ -51,6 +51,19 @@ source_set("hid") {
+ deps += [ "//device/udev_linux" ]
+ }
+
++ if (is_bsd) {
++ sources -= [
++ "hid_connection_linux.cc",
++ "hid_connection_linux.h",
++ ]
++ sources += [
++ "hid_connection_freebsd.cc",
++ "hid_connection_freebsd.h",
++ "hid_service_freebsd.cc",
++ "hid_service_freebsd.h",
++ ]
++ }
++
+ if (is_chromeos) {
+ deps += [ "//chromeos" ]
+ }
diff --git a/devel/electron4/files/patch-services_device_hid_hid__connection__freebsd.cc b/devel/electron4/files/patch-services_device_hid_hid__connection__freebsd.cc
new file mode 100644
index 000000000000..42a19950b1b0
--- /dev/null
+++ b/devel/electron4/files/patch-services_device_hid_hid__connection__freebsd.cc
@@ -0,0 +1,194 @@
+--- services/device/hid/hid_connection_freebsd.cc.orig 2019-03-16 09:17:07 UTC
++++ services/device/hid/hid_connection_freebsd.cc
+@@ -0,0 +1,191 @@
++// Copyright (c) 2014 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "services/device/hid/hid_connection_freebsd.h"
++
++#include <dev/usb/usbhid.h>
++#include <dev/usb/usb_ioctl.h>
++
++#include "base/bind.h"
++#include "base/files/file_descriptor_watcher_posix.h"
++#include "base/location.h"
++#include "base/numerics/safe_math.h"
++#include "base/posix/eintr_wrapper.h"
++#include "base/single_thread_task_runner.h"
++#include "base/strings/stringprintf.h"
++#include "base/task_scheduler/post_task.h"
++#include "base/threading/thread_restrictions.h"
++#include "base/threading/thread_task_runner_handle.h"
++#include "components/device_event_log/device_event_log.h"
++#include "services/device/hid/hid_service.h"
++
++namespace device {
++
++class HidConnectionFreeBSD::BlockingTaskHelper {
++ public:
++ BlockingTaskHelper(base::ScopedFD fd,
++ scoped_refptr<HidDeviceInfo> device_info,
++ base::WeakPtr<HidConnectionFreeBSD> connection)
++ : fd_(std::move(fd)),
++ connection_(connection),
++ origin_task_runner_(base::ThreadTaskRunnerHandle::Get()) {
++ DETACH_FROM_SEQUENCE(sequence_checker_);
++ // Report buffers must always have room for the report ID.
++ report_buffer_size_ = device_info->max_input_report_size() + 1;
++ has_report_id_ = device_info->has_report_id();
++ }
++
++ ~BlockingTaskHelper() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); }
++
++ // Starts the FileDescriptorWatcher that reads input events from the device.
++ // Must be called on a thread that has a base::MessageLoopForIO.
++ void Start() {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ base::AssertBlockingAllowed();
++ }
++
++ void Write(scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ auto data = buffer->front();
++ size_t size = buffer->size();
++ // if report id is 0, it shouldn't be included
++ if (data[0] == 0) {
++ data++;
++ size--;
++ }
++
++ ssize_t result = HANDLE_EINTR(write(fd_.get(), data, size));
++ if (result < 0) {
++ HID_PLOG(EVENT) << "Write failed";
++ origin_task_runner_->PostTask(FROM_HERE, base::BindOnce(std::move(callback), false));
++ } else {
++ if (static_cast<size_t>(result) != size)
++ HID_LOG(EVENT) << "Incomplete HID write: " << result << " != " << size;
++ origin_task_runner_->PostTask(FROM_HERE, base::BindOnce(std::move(callback), true));
++ }
++ }
++
++ void GetFeatureReport(uint8_t report_id,
++ scoped_refptr<base::RefCountedBytes> buffer,
++ ReadCallback callback) {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ struct usb_gen_descriptor ugd;
++ ugd.ugd_report_type = UHID_FEATURE_REPORT;
++ ugd.ugd_data = buffer->front();
++ ugd.ugd_maxlen = buffer->size();
++ int result = HANDLE_EINTR(
++ ioctl(fd_.get(), USB_GET_REPORT, &ugd));
++ if (result < 0) {
++ HID_PLOG(EVENT) << "Failed to get feature report";
++ origin_task_runner_->PostTask(FROM_HERE,
++ base::BindOnce(std::move(callback), false, nullptr, 0));
++ } else if (result == 0) {
++ HID_LOG(EVENT) << "Get feature result too short.";
++ origin_task_runner_->PostTask(FROM_HERE,
++ base::BindOnce(std::move(callback), false, nullptr, 0));
++ } else {
++ origin_task_runner_->PostTask(FROM_HERE,
++ base::BindOnce(std::move(callback), true, buffer, result));
++ }
++ }
++
++ void SendFeatureReport(scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ struct usb_gen_descriptor ugd;
++ ugd.ugd_report_type = UHID_FEATURE_REPORT;
++ ugd.ugd_data = buffer->front();
++ ugd.ugd_maxlen = buffer->size();
++ // FreeBSD does not require report id if it's not used
++ if (buffer->front()[0] == 0) {
++ ugd.ugd_data = buffer->front() + 1;
++ ugd.ugd_maxlen = buffer->size() - 1;
++ } else {
++ ugd.ugd_data = buffer->front();
++ ugd.ugd_maxlen = buffer->size();
++ }
++ int result = HANDLE_EINTR(
++ ioctl(fd_.get(), USB_SET_REPORT, &ugd));
++ if (result < 0) {
++ HID_PLOG(EVENT) << "Failed to send feature report";
++ origin_task_runner_->PostTask(FROM_HERE,
++ base::BindOnce(std::move(callback), false));
++ } else {
++ origin_task_runner_->PostTask(FROM_HERE,
++ base::BindOnce(std::move(callback), true));
++ }
++ }
++
++ private:
++ SEQUENCE_CHECKER(sequence_checker_);
++ base::ScopedFD fd_;
++ size_t report_buffer_size_;
++ bool has_report_id_;
++ base::WeakPtr<HidConnectionFreeBSD> connection_;
++ const scoped_refptr<base::SequencedTaskRunner> origin_task_runner_;
++
++ DISALLOW_COPY_AND_ASSIGN(BlockingTaskHelper);
++};
++
++HidConnectionFreeBSD::HidConnectionFreeBSD(
++ scoped_refptr<HidDeviceInfo> device_info,
++ base::ScopedFD fd,
++ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner)
++ : HidConnection(device_info),
++ blocking_task_runner_(std::move(blocking_task_runner)),
++ weak_factory_(this) {
++ helper_ = std::make_unique<BlockingTaskHelper>(std::move(fd), device_info,
++ weak_factory_.GetWeakPtr());
++ blocking_task_runner_->PostTask(
++ FROM_HERE, base::BindOnce(&BlockingTaskHelper::Start,
++ base::Unretained(helper_.get())));
++}
++
++HidConnectionFreeBSD::~HidConnectionFreeBSD() {}
++
++void HidConnectionFreeBSD::PlatformClose() {
++ // By closing the device on the blocking task runner 1) the requirement that
++ // base::ScopedFD is destroyed on a thread where I/O is allowed is satisfied
++ // and 2) any tasks posted to this task runner that refer to this file will
++ // complete before it is closed.
++ blocking_task_runner_->DeleteSoon(FROM_HERE, helper_.release());
++}
++
++void HidConnectionFreeBSD::PlatformWrite(scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) {
++
++ blocking_task_runner_->PostTask(
++ FROM_HERE,
++ base::BindOnce(&BlockingTaskHelper::Write, base::Unretained(helper_.get()),
++ buffer, std::move(callback)));
++}
++
++void HidConnectionFreeBSD::PlatformGetFeatureReport(uint8_t report_id,
++ ReadCallback callback) {
++ // The first byte of the destination buffer is the report ID being requested
++ // and is overwritten by the feature report.
++ DCHECK_GT(device_info()->max_feature_report_size(), 0u);
++ scoped_refptr<base::RefCountedBytes> buffer(
++ new base::RefCountedBytes(device_info()->max_feature_report_size() + 1));
++ if (report_id != 0)
++ buffer->data()[0] = report_id;
++
++ blocking_task_runner_->PostTask(
++ FROM_HERE,
++ base::BindOnce(&BlockingTaskHelper::GetFeatureReport,
++ base::Unretained(helper_.get()), report_id,
++ buffer, std::move(callback)));
++}
++
++void HidConnectionFreeBSD::PlatformSendFeatureReport(
++ scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) {
++ blocking_task_runner_->PostTask(
++ FROM_HERE,
++ base::BindOnce(&BlockingTaskHelper::SendFeatureReport,
++ base::Unretained(helper_.get()), buffer, std::move(callback)));
++}
++
++} // namespace device
diff --git a/devel/electron4/files/patch-services_device_hid_hid__connection__freebsd.h b/devel/electron4/files/patch-services_device_hid_hid__connection__freebsd.h
new file mode 100644
index 000000000000..1cd62fcd1372
--- /dev/null
+++ b/devel/electron4/files/patch-services_device_hid_hid__connection__freebsd.h
@@ -0,0 +1,73 @@
+--- services/device/hid/hid_connection_freebsd.h.orig 2019-03-16 09:17:07 UTC
++++ services/device/hid/hid_connection_freebsd.h
+@@ -0,0 +1,70 @@
++// Copyright (c) 2014 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#ifndef DEVICE_HID_HID_CONNECTION_FREEBSD_H_
++#define DEVICE_HID_HID_CONNECTION_FREEBSD_H_
++
++#include <stddef.h>
++#include <stdint.h>
++
++#include "base/files/scoped_file.h"
++#include "base/macros.h"
++#include "base/memory/ptr_util.h"
++#include "base/memory/ref_counted_memory.h"
++#include "base/memory/weak_ptr.h"
++#include "base/sequence_checker.h"
++#include "services/device/hid/hid_connection.h"
++
++namespace base {
++class SequencedTaskRunner;
++}
++
++namespace net {
++class IOBuffer;
++}
++
++namespace device {
++
++class HidConnectionFreeBSD : public HidConnection {
++ public:
++ HidConnectionFreeBSD(
++ scoped_refptr<HidDeviceInfo> device_info,
++ base::ScopedFD fd,
++ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner);
++
++ private:
++ friend class base::RefCountedThreadSafe<HidConnectionFreeBSD>;
++ class BlockingTaskHelper;
++
++ ~HidConnectionFreeBSD() override;
++
++ // HidConnection implementation.
++ void PlatformClose() override;
++ void PlatformWrite(scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) override;
++ void PlatformGetFeatureReport(uint8_t report_id,
++ ReadCallback callback) override;
++ void PlatformSendFeatureReport(scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) override;
++ void ProcessInputReport(scoped_refptr<base::RefCountedBytes> buffer,
++ size_t size);
++
++ // |helper_| lives on the sequence to which |blocking_task_runner_| posts
++ // tasks so all calls must be posted there including this object's
++ // destruction.
++ std::unique_ptr<BlockingTaskHelper> helper_;
++
++ const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
++ const scoped_refptr<base::SequencedTaskRunner> task_runner_;
++
++ SEQUENCE_CHECKER(sequence_checker_);
++
++ base::WeakPtrFactory<HidConnectionFreeBSD> weak_factory_;
++
++ DISALLOW_COPY_AND_ASSIGN(HidConnectionFreeBSD);
++};
++
++} // namespace device
++
++#endif // DEVICE_HID_HID_CONNECTION_FREEBSD_H_
diff --git a/devel/electron4/files/patch-services_device_hid_hid__service.cc b/devel/electron4/files/patch-services_device_hid_hid__service.cc
new file mode 100644
index 000000000000..9a2e71d86fc8
--- /dev/null
+++ b/devel/electron4/files/patch-services_device_hid_hid__service.cc
@@ -0,0 +1,20 @@
+--- services/device/hid/hid_service.cc.orig 2019-03-15 06:37:32 UTC
++++ services/device/hid/hid_service.cc
+@@ -16,6 +16,8 @@
+
+ #if defined(OS_LINUX) && defined(USE_UDEV)
+ #include "services/device/hid/hid_service_linux.h"
++#elif defined(OS_BSD)
++#include "services/device/hid/hid_service_freebsd.h"
+ #elif defined(OS_MACOSX)
+ #include "services/device/hid/hid_service_mac.h"
+ #elif defined(OS_WIN)
+@@ -36,6 +38,8 @@ constexpr base::TaskTraits HidService::kBlockingTaskTr
+ std::unique_ptr<HidService> HidService::Create() {
+ #if defined(OS_LINUX) && defined(USE_UDEV)
+ return base::WrapUnique(new HidServiceLinux());
++#elif defined(OS_BSD)
++ return base::WrapUnique(new HidServiceFreeBSD());
+ #elif defined(OS_MACOSX)
+ return base::WrapUnique(new HidServiceMac());
+ #elif defined(OS_WIN)
diff --git a/devel/electron4/files/patch-services_device_hid_hid__service__freebsd.cc b/devel/electron4/files/patch-services_device_hid_hid__service__freebsd.cc
new file mode 100644
index 000000000000..263ca29adb81
--- /dev/null
+++ b/devel/electron4/files/patch-services_device_hid_hid__service__freebsd.cc
@@ -0,0 +1,374 @@
+--- services/device/hid/hid_service_freebsd.cc.orig 2019-03-16 09:17:07 UTC
++++ services/device/hid/hid_service_freebsd.cc
+@@ -0,0 +1,371 @@
++// Copyright 2014 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "services/device/hid/hid_service_freebsd.h"
++
++#include <dev/usb/usb_ioctl.h>
++#include <stdint.h>
++#include <sys/socket.h>
++#include <sys/un.h>
++
++#include <set>
++#include <string>
++#include <vector>
++
++#include "base/bind.h"
++#include "base/files/file_descriptor_watcher_posix.h"
++#include "base/files/file_enumerator.h"
++#include "base/location.h"
++#include "base/logging.h"
++#include "base/posix/eintr_wrapper.h"
++#include "base/single_thread_task_runner.h"
++#include "base/stl_util.h"
++#include "base/strings/pattern.h"
++#include "base/strings/stringprintf.h"
++#include "base/strings/sys_string_conversions.h"
++#include "base/strings/string_util.h"
++#include "base/strings/string_split.h"
++#include "base/task_scheduler/post_task.h"
++#include "base/threading/thread_restrictions.h"
++#include "base/threading/thread_task_runner_handle.h"
++#include "components/device_event_log/device_event_log.h"
++#include "services/device/hid/hid_connection_freebsd.h"
++
++const int kMaxPermissionChecks = 5;
++
++namespace device {
++
++struct HidServiceFreeBSD::ConnectParams {
++ ConnectParams(scoped_refptr<HidDeviceInfo> device_info,
++ const ConnectCallback& callback)
++ : device_info(std::move(device_info)),
++ callback(callback),
++ task_runner(base::ThreadTaskRunnerHandle::Get()),
++ blocking_task_runner(
++ base::CreateSequencedTaskRunnerWithTraits(kBlockingTaskTraits)) {}
++ ~ConnectParams() {}
++
++ scoped_refptr<HidDeviceInfo> device_info;
++ ConnectCallback callback;
++ scoped_refptr<base::SequencedTaskRunner> task_runner;
++ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner;
++ base::ScopedFD fd;
++};
++
++class HidServiceFreeBSD::BlockingTaskHelper {
++ public:
++ BlockingTaskHelper(base::WeakPtr<HidServiceFreeBSD> service)
++ : service_(std::move(service)),
++ task_runner_(base::ThreadTaskRunnerHandle::Get()) {
++ DETACH_FROM_SEQUENCE(sequence_checker_);
++
++ timer_.reset(new base::RepeatingTimer());
++ devd_buffer_ = new net::IOBufferWithSize(1024);
++ }
++
++ ~BlockingTaskHelper() {
++ }
++
++ void Start() {
++ base::AssertBlockingAllowed();
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++
++ const base::FilePath kDevRoot("/dev");
++ const std::string kUHIDPattern("/dev/uhid*");
++
++ base::FileEnumerator enumerator(kDevRoot, false, base::FileEnumerator::FILES);
++ do {
++ const base::FilePath next_device_path(enumerator.Next());
++ const std::string next_device = next_device_path.value();
++ if (next_device.empty())
++ break;
++
++ if (base::MatchPattern(next_device, kUHIDPattern))
++ OnDeviceAdded(next_device.substr(5));
++ } while (true);
++
++ SetupDevdMonitor();
++
++ task_runner_->PostTask(
++ FROM_HERE,
++ base::Bind(&HidServiceFreeBSD::FirstEnumerationComplete, service_));
++ }
++
++ bool HaveReadWritePermissions(std::string device_id) {
++ std::string device_node = "/dev/" + device_id;
++ base::AssertBlockingAllowed();
++
++ base::FilePath device_path(device_node);
++ base::File device_file;
++ int flags =
++ base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE;
++ device_file.Initialize(device_path, flags);
++ if (!device_file.IsValid())
++ return false;
++
++ return true;
++ }
++
++ void OnDeviceAdded(std::string device_id) {
++ std::string device_node = "/dev/" + device_id;
++ uint16_t vendor_id = 0xffff;
++ uint16_t product_id = 0xffff;
++ std::string product_name = "";
++ std::string serial_number = "";
++
++ std::vector<uint8_t> report_descriptor;
++
++ base::AssertBlockingAllowed();
++
++ base::FilePath device_path(device_node);
++ base::File device_file;
++ int flags =
++ base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE;
++ device_file.Initialize(device_path, flags);
++ if (!device_file.IsValid()) {
++ HID_LOG(ERROR) << "Failed to open '" << device_node
++ << "': "
++ << base::File::ErrorToString(device_file.error_details());
++ return;
++ }
++
++ base::ScopedFD fd;
++ fd.reset(device_file.TakePlatformFile());
++
++ struct usb_gen_descriptor ugd;
++ ugd.ugd_data = NULL;
++ ugd.ugd_maxlen = 0xffff;
++ int result = HANDLE_EINTR(
++ ioctl(fd.get(), USB_GET_REPORT_DESC, &ugd));
++
++ if (result < 0) {
++ HID_LOG(ERROR) << "Failed to get report descriptor size";
++ return;
++ }
++
++ report_descriptor.resize(ugd.ugd_actlen);
++
++ ugd.ugd_data = report_descriptor.data();
++ ugd.ugd_maxlen = ugd.ugd_actlen;
++ result = HANDLE_EINTR(
++ ioctl(fd.get(), USB_GET_REPORT_DESC, &ugd));
++
++ if (result < 0) {
++ HID_LOG(ERROR) << "Failed to get report descriptor";
++ return;
++ }
++
++ scoped_refptr<HidDeviceInfo> device_info(new HidDeviceInfo(
++ device_id, vendor_id, product_id, product_name, serial_number,
++ device::mojom::HidBusType::kHIDBusTypeUSB,
++ report_descriptor, device_node));
++
++ task_runner_->PostTask(FROM_HERE, base::Bind(&HidServiceFreeBSD::AddDevice,
++ service_, device_info));
++ }
++
++ void OnDeviceRemoved(std::string device_id) {
++ task_runner_->PostTask(
++ FROM_HERE, base::Bind(&HidServiceFreeBSD::RemoveDevice, service_,
++ device_id));
++ }
++
++ private:
++
++ void CheckPendingPermissionChange() {
++ base::AssertBlockingAllowed();
++ std::map<std::string, int>::iterator it;
++ for (it = permissions_checks_attempts_.begin(); it != permissions_checks_attempts_.end();) {
++ std::string device_name = it->first;
++ bool keep = true;
++ if (HaveReadWritePermissions(device_name)) {
++ OnDeviceAdded(device_name);
++ keep = false;
++ }
++ else if (it->second-- <= 0) {
++ HID_LOG(ERROR) << "Still don't have write permissions to '" << device_name
++ << "' after " << kMaxPermissionChecks << " attempts";
++ keep = false;
++ }
++
++ if (keep)
++ ++it;
++ else
++ permissions_checks_attempts_.erase(it++);
++ }
++
++ if (permissions_checks_attempts_.empty())
++ timer_->Stop();
++ }
++
++ void SetupDevdMonitor() {
++ base::AssertBlockingAllowed();
++
++ int devd_fd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
++ if (devd_fd < 0)
++ return;
++
++ struct sockaddr_un sa;
++
++ sa.sun_family = AF_UNIX;
++ strlcpy(sa.sun_path, "/var/run/devd.seqpacket.pipe", sizeof(sa.sun_path));
++ if (connect(devd_fd, (struct sockaddr *) &sa, sizeof(sa)) < 0) {
++ close(devd_fd);
++ return;
++ }
++
++ devd_fd_.reset(devd_fd);
++ file_watcher_ = base::FileDescriptorWatcher::WatchReadable(
++ devd_fd_.get(), base::Bind(&BlockingTaskHelper::OnDevdMessageCanBeRead,
++ base::Unretained(this)));
++ }
++
++ void OnDevdMessageCanBeRead() {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ ssize_t bytes_read = HANDLE_EINTR(recv(devd_fd_.get(), devd_buffer_->data(),
++ devd_buffer_->size() - 1, MSG_WAITALL));
++ if (bytes_read < 0) {
++ if (errno != EAGAIN) {
++ HID_LOG(ERROR) << "Read failed";
++ file_watcher_.reset();
++ }
++ return;
++ }
++
++ devd_buffer_->data()[bytes_read] = 0;
++ char *data = devd_buffer_->data();
++ // It may take some time for devd to change permissions
++ // on /dev/uhidX node. So do not fail immediately if
++ // open fail. Retry each second for kMaxPermissionChecks
++ // times before giving up entirely
++ if (base::StartsWith(data, "+uhid", base::CompareCase::SENSITIVE)) {
++ std::vector<std::string> parts = base::SplitString(
++ data, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
++ if (!parts.empty()) {
++ std::string device_name = parts[0].substr(1); // skip '+'
++ if (HaveReadWritePermissions(device_name))
++ OnDeviceAdded(parts[0].substr(1));
++ else {
++ // Do not re-add to checks
++ if (permissions_checks_attempts_.find(device_name) == permissions_checks_attempts_.end()) {
++ permissions_checks_attempts_.insert(std::pair<std::string, int>(device_name, kMaxPermissionChecks));
++ timer_->Start(FROM_HERE, base::TimeDelta::FromSeconds(1),
++ this, &BlockingTaskHelper::CheckPendingPermissionChange);
++ }
++ }
++ }
++ }
++
++ if (base::StartsWith(data, "-uhid", base::CompareCase::SENSITIVE)) {
++ std::vector<std::string> parts = base::SplitString(
++ data, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
++ if (!parts.empty()) {
++ std::string device_name = parts[0].substr(1); // skip '-'
++ auto it = permissions_checks_attempts_.find(device_name);
++ if (it != permissions_checks_attempts_.end()) {
++ permissions_checks_attempts_.erase(it);
++ if (permissions_checks_attempts_.empty())
++ timer_->Stop();
++ }
++ OnDeviceRemoved(parts[0].substr(1));
++ }
++ }
++ }
++
++ SEQUENCE_CHECKER(sequence_checker_);
++
++ // This weak pointer is only valid when checked on this task runner.
++ base::WeakPtr<HidServiceFreeBSD> service_;
++ scoped_refptr<base::SequencedTaskRunner> task_runner_;
++ std::unique_ptr<base::FileDescriptorWatcher::Controller> file_watcher_;
++ std::unique_ptr<base::RepeatingTimer> timer_;
++ base::ScopedFD devd_fd_;
++ scoped_refptr<net::IOBufferWithSize> devd_buffer_;
++ std::map<std::string, int> permissions_checks_attempts_;
++
++ DISALLOW_COPY_AND_ASSIGN(BlockingTaskHelper);
++};
++
++HidServiceFreeBSD::HidServiceFreeBSD()
++ : task_runner_(base::ThreadTaskRunnerHandle::Get()),
++ blocking_task_runner_(
++ base::CreateSequencedTaskRunnerWithTraits(kBlockingTaskTraits)),
++ weak_factory_(this) {
++ helper_ = std::make_unique<BlockingTaskHelper>(weak_factory_.GetWeakPtr());
++ blocking_task_runner_->PostTask(
++ FROM_HERE,
++ base::Bind(&BlockingTaskHelper::Start, base::Unretained(helper_.get())));
++}
++
++HidServiceFreeBSD::~HidServiceFreeBSD() {
++ blocking_task_runner_->DeleteSoon(FROM_HERE, helper_.release());
++}
++
++base::WeakPtr<HidService> HidServiceFreeBSD::GetWeakPtr() {
++ return weak_factory_.GetWeakPtr();
++}
++
++// static
++void HidServiceFreeBSD::OpenOnBlockingThread(
++ std::unique_ptr<ConnectParams> params) {
++ base::AssertBlockingAllowed();
++ scoped_refptr<base::SequencedTaskRunner> task_runner = params->task_runner;
++
++ base::FilePath device_path(params->device_info->device_node());
++ base::File device_file;
++ int flags =
++ base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE;
++ device_file.Initialize(device_path, flags);
++ if (!device_file.IsValid()) {
++ HID_LOG(EVENT) << "Failed to open '" << params->device_info->device_node()
++ << "': "
++ << base::File::ErrorToString(device_file.error_details());
++ task_runner->PostTask(FROM_HERE, base::Bind(params->callback, nullptr));
++ return;
++ }
++ params->fd.reset(device_file.TakePlatformFile());
++ FinishOpen(std::move(params));
++}
++
++void HidServiceFreeBSD::Connect(const std::string& device_guid,
++ const ConnectCallback& callback) {
++ DCHECK(thread_checker_.CalledOnValidThread());
++
++ const auto& map_entry = devices().find(device_guid);
++ if (map_entry == devices().end()) {
++ base::ThreadTaskRunnerHandle::Get()->PostTask(
++ FROM_HERE, base::Bind(callback, nullptr));
++ return;
++ }
++
++ scoped_refptr<HidDeviceInfo> device_info = map_entry->second;
++
++ auto params = std::make_unique<ConnectParams>(device_info, callback);
++
++ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner =
++ params->blocking_task_runner;
++ blocking_task_runner->PostTask(
++ FROM_HERE, base::Bind(&HidServiceFreeBSD::OpenOnBlockingThread,
++ base::Passed(&params)));
++}
++
++// static
++void HidServiceFreeBSD::FinishOpen(std::unique_ptr<ConnectParams> params) {
++ base::AssertBlockingAllowed();
++ scoped_refptr<base::SequencedTaskRunner> task_runner = params->task_runner;
++
++ task_runner->PostTask(
++ FROM_HERE,
++ base::Bind(&HidServiceFreeBSD::CreateConnection, base::Passed(&params)));
++}
++
++// static
++void HidServiceFreeBSD::CreateConnection(std::unique_ptr<ConnectParams> params) {
++ DCHECK(params->fd.is_valid());
++ params->callback.Run(base::MakeRefCounted<HidConnectionFreeBSD>(
++ std::move(params->device_info), std::move(params->fd),
++ std::move(params->blocking_task_runner)));
++}
++
++} // namespace device
diff --git a/devel/electron4/files/patch-services_device_hid_hid__service__freebsd.h b/devel/electron4/files/patch-services_device_hid_hid__service__freebsd.h
new file mode 100644
index 000000000000..e0571be765e7
--- /dev/null
+++ b/devel/electron4/files/patch-services_device_hid_hid__service__freebsd.h
@@ -0,0 +1,51 @@
+--- services/device/hid/hid_service_freebsd.h.orig 2019-03-16 09:17:07 UTC
++++ services/device/hid/hid_service_freebsd.h
+@@ -0,0 +1,48 @@
++// Copyright 2014 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#ifndef DEVICE_HID_HID_SERVICE_FREEBSD_H_
++#define DEVICE_HID_HID_SERVICE_FREEBSD_H_
++
++#include <string>
++
++#include "base/macros.h"
++#include "base/memory/ref_counted.h"
++#include "base/memory/weak_ptr.h"
++#include "base/timer/timer.h"
++#include "services/device/hid/hid_service.h"
++#include "net/base/io_buffer.h"
++
++namespace device {
++
++class HidServiceFreeBSD : public HidService {
++ public:
++ HidServiceFreeBSD();
++ ~HidServiceFreeBSD() override;
++
++ void Connect(const std::string& device_guid,
++ const ConnectCallback& connect) override;
++ base::WeakPtr<HidService> GetWeakPtr() override;
++
++ private:
++ struct ConnectParams;
++ class BlockingTaskHelper;
++
++ static void OpenOnBlockingThread(std::unique_ptr<ConnectParams> params);
++ static void FinishOpen(std::unique_ptr<ConnectParams> params);
++ static void CreateConnection(std::unique_ptr<ConnectParams> params);
++
++ const scoped_refptr<base::SequencedTaskRunner> task_runner_;
++ const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
++ // |helper_| lives on the sequence |blocking_task_runner_| posts to and holds
++ // a weak reference back to the service that owns it.
++ std::unique_ptr<BlockingTaskHelper> helper_;
++ base::WeakPtrFactory<HidServiceFreeBSD> weak_factory_;
++
++ DISALLOW_COPY_AND_ASSIGN(HidServiceFreeBSD);
++};
++
++} // namespace device
++
++#endif // DEVICE_HID_HID_SERVICE_FREEBSD_H_
diff --git a/devel/electron4/files/patch-services_device_time__zone__monitor_time__zone__monitor.cc b/devel/electron4/files/patch-services_device_time__zone__monitor_time__zone__monitor.cc
new file mode 100644
index 000000000000..55aeb6029ea4
--- /dev/null
+++ b/devel/electron4/files/patch-services_device_time__zone__monitor_time__zone__monitor.cc
@@ -0,0 +1,11 @@
+--- services/device/time_zone_monitor/time_zone_monitor.cc.orig 2019-03-15 06:37:32 UTC
++++ services/device/time_zone_monitor/time_zone_monitor.cc
+@@ -41,7 +41,7 @@ void TimeZoneMonitor::NotifyClients() {
+ #else
+ std::unique_ptr<icu::TimeZone> new_zone(icu::TimeZone::detectHostTimeZone());
+ #endif
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // We get here multiple times on Linux per a single tz change, but
+ // want to update the ICU default zone and notify renderer only once.
+ std::unique_ptr<icu::TimeZone> current_zone(icu::TimeZone::createDefault());
diff --git a/devel/electron4/files/patch-services_device_time__zone__monitor_time__zone__monitor__linux.cc b/devel/electron4/files/patch-services_device_time__zone__monitor_time__zone__monitor__linux.cc
new file mode 100644
index 000000000000..601d3deda732
--- /dev/null
+++ b/devel/electron4/files/patch-services_device_time__zone__monitor_time__zone__monitor__linux.cc
@@ -0,0 +1,14 @@
+--- services/device/time_zone_monitor/time_zone_monitor_linux.cc.orig 2019-03-15 06:37:32 UTC
++++ services/device/time_zone_monitor/time_zone_monitor_linux.cc
+@@ -89,7 +89,11 @@ class TimeZoneMonitorLinuxImpl
+ // false positives are harmless, assuming the false positive rate is
+ // reasonable.
+ const char* const kFilesToWatch[] = {
++#if defined(OS_BSD)
++ "/etc/localtime",
++#else
+ "/etc/localtime", "/etc/timezone", "/etc/TZ",
++#endif
+ };
+
+ for (size_t index = 0; index < arraysize(kFilesToWatch); ++index) {
diff --git a/devel/electron4/files/patch-services_network_BUILD.gn b/devel/electron4/files/patch-services_network_BUILD.gn
new file mode 100644
index 000000000000..1913237a8c1f
--- /dev/null
+++ b/devel/electron4/files/patch-services_network_BUILD.gn
@@ -0,0 +1,10 @@
+--- services/network/BUILD.gn.orig 2019-03-15 06:37:32 UTC
++++ services/network/BUILD.gn
+@@ -160,7 +160,6 @@ component("network_service") {
+
+ if (is_linux) {
+ deps += [
+- "//sandbox/linux:sandbox_services",
+ "//services/service_manager/sandbox:sandbox",
+ ]
+ }
diff --git a/devel/electron4/files/patch-services_network_network__context.cc b/devel/electron4/files/patch-services_network_network__context.cc
new file mode 100644
index 000000000000..3e1ff9add3cc
--- /dev/null
+++ b/devel/electron4/files/patch-services_network_network__context.cc
@@ -0,0 +1,38 @@
+--- services/network/network_context.cc.orig 2019-03-16 09:15:20 UTC
++++ services/network/network_context.cc
+@@ -103,7 +103,7 @@
+ #endif // defined(USE_NSS_CERTS)
+
+ #if defined(OS_ANDROID) || defined(OS_FUCHSIA) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_MACOSX)
++ ((defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)) || defined(OS_MACOSX)
+ #include "net/cert/cert_net_fetcher.h"
+ #include "net/cert_net/cert_net_fetcher_impl.h"
+ #endif
+@@ -380,7 +380,7 @@ NetworkContext::~NetworkContext() {
+ #endif
+
+ #if defined(OS_ANDROID) || defined(OS_FUCHSIA) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_MACOSX)
++ ((defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)) || defined(OS_MACOSX)
+ net::ShutdownGlobalCertNetFetcher();
+ #endif
+ }
+@@ -833,7 +833,7 @@ URLRequestContextOwner NetworkContext::ApplyContextPar
+
+ net::CookieCryptoDelegate* crypto_delegate = nullptr;
+ if (params_->enable_encrypted_cookies) {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(IS_CHROMECAST)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS) && !defined(IS_CHROMECAST)
+ DCHECK(network_service_->os_crypt_config_set())
+ << "NetworkService::SetCryptConfig must be called before creating a "
+ "NetworkContext with encrypted cookies.";
+@@ -1105,7 +1105,7 @@ URLRequestContextOwner NetworkContext::ApplyContextPar
+ net::SetURLRequestContextForNSSHttpIO(result.url_request_context.get());
+ #endif
+ #if defined(OS_ANDROID) || defined(OS_FUCHSIA) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_MACOSX)
++ ((defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)) || defined(OS_MACOSX)
+ net::SetGlobalCertNetFetcher(
+ net::CreateCertNetFetcher(result.url_request_context.get()));
+ #endif
diff --git a/devel/electron4/files/patch-services_network_network__sandbox__hook__linux.cc b/devel/electron4/files/patch-services_network_network__sandbox__hook__linux.cc
new file mode 100644
index 000000000000..1c1ca125bbdc
--- /dev/null
+++ b/devel/electron4/files/patch-services_network_network__sandbox__hook__linux.cc
@@ -0,0 +1,18 @@
+--- services/network/network_sandbox_hook_linux.cc.orig 2019-03-15 06:37:32 UTC
++++ services/network/network_sandbox_hook_linux.cc
+@@ -14,6 +14,7 @@ using sandbox::syscall_broker::MakeBrokerCommandSet;
+ namespace network {
+
+ bool NetworkPreSandboxHook(service_manager::SandboxLinux::Options options) {
++#if !defined(OS_BSD)
+ auto* instance = service_manager::SandboxLinux::GetInstance();
+
+ // TODO(tsepez): remove universal permission under filesytem root.
+@@ -32,6 +33,7 @@ bool NetworkPreSandboxHook(service_manager::SandboxLin
+ service_manager::SandboxLinux::PreSandboxHook(), options);
+
+ instance->EngageNamespaceSandbox(false /* from_zygote */);
++#endif
+ return true;
+ }
+
diff --git a/devel/electron4/files/patch-services_network_network__service.cc b/devel/electron4/files/patch-services_network_network__service.cc
new file mode 100644
index 000000000000..d0336da449ca
--- /dev/null
+++ b/devel/electron4/files/patch-services_network_network__service.cc
@@ -0,0 +1,20 @@
+--- services/network/network_service.cc.orig 2019-04-06 12:09:25 UTC
++++ services/network/network_service.cc
+@@ -39,7 +39,7 @@
+ #include "third_party/boringssl/src/include/openssl/cpu.h"
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(IS_CHROMECAST)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(IS_CHROMECAST)) || defined(OS_BSD)
+ #include "components/os_crypt/key_storage_config_linux.h"
+ #include "components/os_crypt/os_crypt.h"
+ #endif
+@@ -379,7 +379,7 @@ void NetworkService::UpdateSignedTreeHead(const net::c
+ sth_distributor_->NewSTHObserved(sth);
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ void NetworkService::SetCryptConfig(mojom::CryptConfigPtr crypt_config) {
+ #if !defined(IS_CHROMECAST)
+ DCHECK(!os_crypt_config_set_);
diff --git a/devel/electron4/files/patch-services_network_network__service.h b/devel/electron4/files/patch-services_network_network__service.h
new file mode 100644
index 000000000000..e7a89927de5d
--- /dev/null
+++ b/devel/electron4/files/patch-services_network_network__service.h
@@ -0,0 +1,11 @@
+--- services/network/network_service.h.orig 2019-03-16 09:15:20 UTC
++++ services/network/network_service.h
+@@ -138,7 +138,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkService
+ void GetTotalNetworkUsages(
+ mojom::NetworkService::GetTotalNetworkUsagesCallback callback) override;
+ void UpdateSignedTreeHead(const net::ct::SignedTreeHead& sth) override;
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ void SetCryptConfig(mojom::CryptConfigPtr crypt_config) override;
+ #endif
+
diff --git a/devel/electron4/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics.h b/devel/electron4/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics.h
new file mode 100644
index 000000000000..08fdffc56724
--- /dev/null
+++ b/devel/electron4/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics.h
@@ -0,0 +1,11 @@
+--- services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h.orig 2019-03-15 06:37:32 UTC
++++ services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h
+@@ -36,7 +36,7 @@ class SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_EXPORT
+ static std::vector<mojom::VmRegionPtr> GetProcessModules(base::ProcessId);
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ static void SetProcSmapsForTesting(FILE*);
+ #endif // defined(OS_LINUX)
+ };
diff --git a/devel/electron4/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__linux.cc b/devel/electron4/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__linux.cc
new file mode 100644
index 000000000000..25b030d1bc5f
--- /dev/null
+++ b/devel/electron4/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__linux.cc
@@ -0,0 +1,40 @@
+--- services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics_linux.cc.orig 2019-03-15 06:37:32 UTC
++++ services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics_linux.cc
+@@ -16,8 +16,10 @@
+ #include "build/build_config.h"
+ #include "services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h"
+
++#if !defined(OS_BSD)
+ // Symbol with virtual address of the start of ELF header of the current binary.
+ extern char __ehdr_start;
++#endif
+
+ namespace memory_instrumentation {
+
+@@ -101,7 +103,7 @@ bool ParseSmapsHeader(const char* header_line, VmRegio
+ // Build ID is needed to symbolize heap profiles, and is generated only on
+ // official builds. Build ID is only added for the current library (chrome)
+ // since it is racy to read other libraries which can be unmapped any time.
+-#if defined(OFFICIAL_BUILD)
++#if defined(OFFICIAL_BUILD) && !defined(OS_BSD)
+ uintptr_t addr = reinterpret_cast<uintptr_t>(&ParseSmapsHeader);
+ if (addr >= region->start_address && addr < end_addr) {
+ base::Optional<std::string> buildid =
+@@ -196,6 +198,9 @@ void OSMetrics::SetProcSmapsForTesting(FILE* f) {
+ // static
+ bool OSMetrics::FillOSMemoryDump(base::ProcessId pid,
+ mojom::RawOSMemDump* dump) {
++#if defined(OS_BSD)
++ return false;
++#else
+ base::ScopedFD autoclose = OpenStatm(pid);
+ int statm_fd = autoclose.get();
+
+@@ -221,6 +226,7 @@ bool OSMetrics::FillOSMemoryDump(base::ProcessId pid,
+ dump->resident_set_kb = process_metrics->GetResidentSetSize() / 1024;
+
+ return true;
++#endif
+ }
+
+ // static
diff --git a/devel/electron4/files/patch-services_service__manager_embedder_main.cc b/devel/electron4/files/patch-services_service__manager_embedder_main.cc
new file mode 100644
index 000000000000..b4f14c9b8078
--- /dev/null
+++ b/devel/electron4/files/patch-services_service__manager_embedder_main.cc
@@ -0,0 +1,11 @@
+--- services/service_manager/embedder/main.cc.orig 2019-03-15 06:37:32 UTC
++++ services/service_manager/embedder/main.cc
+@@ -331,7 +331,7 @@ int Main(const MainParams& params) {
+ #endif
+ base::EnableTerminationOnOutOfMemory();
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // The various desktop environments set this environment variable that
+ // allows the dbus client library to connect directly to the bus. When this
+ // variable is not set (test environments like xvfb-run), the dbus client
diff --git a/devel/electron4/files/patch-services_service__manager_embedder_set__process__title__linux.cc b/devel/electron4/files/patch-services_service__manager_embedder_set__process__title__linux.cc
new file mode 100644
index 000000000000..6f52967eb2c1
--- /dev/null
+++ b/devel/electron4/files/patch-services_service__manager_embedder_set__process__title__linux.cc
@@ -0,0 +1,19 @@
+--- services/service_manager/embedder/set_process_title_linux.cc.orig 2019-03-15 06:25:51 UTC
++++ services/service_manager/embedder/set_process_title_linux.cc
+@@ -49,6 +49,8 @@
+ extern char** environ;
+
+ static char** g_main_argv = NULL;
++
++#if !defined(OS_FREEBSD)
+ static char* g_orig_argv0 = NULL;
+
+ void setproctitle(const char* fmt, ...) {
+@@ -101,6 +103,7 @@ void setproctitle(const char* fmt, ...) {
+ va_end(ap);
+ g_main_argv[1] = NULL;
+ }
++#endif
+
+ // A version of this built into glibc would not need this function, since
+ // it could stash the argv pointer in __libc_start_main(). But we need it.
diff --git a/devel/electron4/files/patch-services_service__manager_embedder_set__process__title__linux.h b/devel/electron4/files/patch-services_service__manager_embedder_set__process__title__linux.h
new file mode 100644
index 000000000000..04f03d041f15
--- /dev/null
+++ b/devel/electron4/files/patch-services_service__manager_embedder_set__process__title__linux.h
@@ -0,0 +1,20 @@
+--- services/service_manager/embedder/set_process_title_linux.h.orig 2019-03-15 06:25:51 UTC
++++ services/service_manager/embedder/set_process_title_linux.h
+@@ -5,6 +5,9 @@
+ #ifndef SERVICES_SERVICE_MANAGER_EMBEDDER_SET_PROCESS_TITLE_LINUX_H_
+ #define SERVICES_SERVICE_MANAGER_EMBEDDER_SET_PROCESS_TITLE_LINUX_H_
+
++#include "build/build_config.h"
++
++#if !defined(OS_FREEBSD)
+ // Set the process title that will show in "ps" and similar tools. Takes
+ // printf-style format string and arguments. After calling setproctitle()
+ // the original main() argv[] array should not be used. By default, the
+@@ -14,6 +17,7 @@
+ // This signature and naming is to be compatible with most other Unix
+ // implementations of setproctitle().
+ void setproctitle(const char* fmt, ...);
++#endif
+
+ // Initialize state needed for setproctitle() on Linux. Pass the argv pointer
+ // from main() to setproctitle_init() before calling setproctitle().
diff --git a/devel/electron4/files/patch-services_service__manager_public_cpp_standalone__service_BUILD.gn b/devel/electron4/files/patch-services_service__manager_public_cpp_standalone__service_BUILD.gn
new file mode 100644
index 000000000000..3d83a650f700
--- /dev/null
+++ b/devel/electron4/files/patch-services_service__manager_public_cpp_standalone__service_BUILD.gn
@@ -0,0 +1,11 @@
+--- services/service_manager/public/cpp/standalone_service/BUILD.gn.orig 2019-03-15 06:37:32 UTC
++++ services/service_manager/public/cpp/standalone_service/BUILD.gn
+@@ -25,7 +25,7 @@ source_set("standalone_service") {
+ "//services/service_manager/public/mojom",
+ ]
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ deps += [
+ "//sandbox/linux:sandbox",
+ "//sandbox/linux:sandbox_services",
diff --git a/devel/electron4/files/patch-services_service__manager_public_cpp_standalone__service_standalone__service.cc b/devel/electron4/files/patch-services_service__manager_public_cpp_standalone__service_standalone__service.cc
new file mode 100644
index 000000000000..30966c441c7e
--- /dev/null
+++ b/devel/electron4/files/patch-services_service__manager_public_cpp_standalone__service_standalone__service.cc
@@ -0,0 +1,11 @@
+--- services/service_manager/public/cpp/standalone_service/standalone_service.cc.orig 2019-03-15 06:37:32 UTC
++++ services/service_manager/public/cpp/standalone_service/standalone_service.cc
+@@ -62,6 +62,8 @@ void RunStandaloneService(const StandaloneServiceCallb
+ command_line.GetSwitchValueASCII(switches::kServiceSandboxType)),
+ SandboxLinux::PreSandboxHook(), sandbox_options);
+ }
++#elif defined(OS_BSD)
++ NOTIMPLEMENTED();
+ #endif
+
+ mojo::core::Init();
diff --git a/devel/electron4/files/patch-services_service__manager_runner_host_BUILD.gn b/devel/electron4/files/patch-services_service__manager_runner_host_BUILD.gn
new file mode 100644
index 000000000000..33b6a6ab1695
--- /dev/null
+++ b/devel/electron4/files/patch-services_service__manager_runner_host_BUILD.gn
@@ -0,0 +1,11 @@
+--- services/service_manager/runner/host/BUILD.gn.orig 2019-03-15 06:37:32 UTC
++++ services/service_manager/runner/host/BUILD.gn
+@@ -31,7 +31,7 @@ source_set("lib") {
+ "//mojo/public/cpp/system",
+ ]
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ deps += [ "//sandbox/linux:sandbox_services" ]
+ }
+
diff --git a/devel/electron4/files/patch-services_service__manager_sandbox_BUILD.gn b/devel/electron4/files/patch-services_service__manager_sandbox_BUILD.gn
new file mode 100644
index 000000000000..a98944b9589a
--- /dev/null
+++ b/devel/electron4/files/patch-services_service__manager_sandbox_BUILD.gn
@@ -0,0 +1,11 @@
+--- services/service_manager/sandbox/BUILD.gn.orig 2019-03-15 06:37:32 UTC
++++ services/service_manager/sandbox/BUILD.gn
+@@ -28,7 +28,7 @@ component("sandbox") {
+ "//base",
+ "//sandbox:common",
+ ]
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ sources += [
+ "linux/bpf_base_policy_linux.cc",
+ "linux/bpf_base_policy_linux.h",
diff --git a/devel/electron4/files/patch-services_service__manager_zygote_common_zygote__features.gni b/devel/electron4/files/patch-services_service__manager_zygote_common_zygote__features.gni
new file mode 100644
index 000000000000..e1c157dde249
--- /dev/null
+++ b/devel/electron4/files/patch-services_service__manager_zygote_common_zygote__features.gni
@@ -0,0 +1,8 @@
+--- services/service_manager/zygote/common/zygote_features.gni.orig 2019-03-15 06:25:51 UTC
++++ services/service_manager/zygote/common/zygote_features.gni
+@@ -2,4 +2,4 @@
+ # Use of this source code is governed by a BSD-style license that can be
+ # found in the LICENSE file.
+
+-use_zygote_handle = is_posix && !is_android && !is_mac
++use_zygote_handle = is_posix && !is_android && !is_mac && !is_bsd
diff --git a/devel/electron4/files/patch-services_service__manager_zygote_host_zygote__host__impl__linux.cc b/devel/electron4/files/patch-services_service__manager_zygote_host_zygote__host__impl__linux.cc
new file mode 100644
index 000000000000..ba7c5d496f74
--- /dev/null
+++ b/devel/electron4/files/patch-services_service__manager_zygote_host_zygote__host__impl__linux.cc
@@ -0,0 +1,40 @@
+--- services/service_manager/zygote/host/zygote_host_impl_linux.cc.orig 2019-03-15 06:37:32 UTC
++++ services/service_manager/zygote/host/zygote_host_impl_linux.cc
+@@ -72,6 +72,7 @@ ZygoteHostImpl* ZygoteHostImpl::GetInstance() {
+ }
+
+ void ZygoteHostImpl::Init(const base::CommandLine& command_line) {
++#if !defined(OS_BSD)
+ if (command_line.HasSwitch(service_manager::switches::kNoSandbox)) {
+ return;
+ }
+@@ -122,6 +123,7 @@ void ZygoteHostImpl::Init(const base::CommandLine& com
+ "you can try using --"
+ << service_manager::switches::kNoSandbox << ".";
+ }
++#endif
+ }
+
+ void ZygoteHostImpl::AddZygotePid(pid_t pid) {
+@@ -146,6 +148,7 @@ pid_t ZygoteHostImpl::LaunchZygote(
+ base::CommandLine* cmd_line,
+ base::ScopedFD* control_fd,
+ base::FileHandleMappingVector additional_remapped_fds) {
++#if !defined(OS_BSD)
+ int fds[2];
+ CHECK_EQ(0, socketpair(AF_UNIX, SOCK_SEQPACKET, 0, fds));
+ CHECK(base::UnixDomainSocket::EnableReceiveProcessId(fds[0]));
+@@ -210,9 +213,12 @@ pid_t ZygoteHostImpl::LaunchZygote(
+
+ AddZygotePid(pid);
+ return pid;
++#else
++ return 0;
++#endif
+ }
+
+-#if !defined(OS_OPENBSD)
++#if !defined(OS_BSD)
+ void ZygoteHostImpl::AdjustRendererOOMScore(base::ProcessHandle pid,
+ int score) {
+ // 1) You can't change the oom_score_adj of a non-dumpable process
diff --git a/devel/electron4/files/patch-services_service__manager_zygote_host_zygote__host__impl__linux.h b/devel/electron4/files/patch-services_service__manager_zygote_host_zygote__host__impl__linux.h
new file mode 100644
index 000000000000..31944c53348f
--- /dev/null
+++ b/devel/electron4/files/patch-services_service__manager_zygote_host_zygote__host__impl__linux.h
@@ -0,0 +1,13 @@
+--- services/service_manager/zygote/host/zygote_host_impl_linux.h.orig 2019-03-15 06:37:32 UTC
++++ services/service_manager/zygote/host/zygote_host_impl_linux.h
+@@ -44,8 +44,10 @@ class COMPONENT_EXPORT(SERVICE_MANAGER_ZYGOTE) ZygoteH
+ base::ScopedFD* control_fd,
+ base::FileHandleMappingVector additional_remapped_fds);
+
++#if !defined(OS_BSD)
+ void AdjustRendererOOMScore(base::ProcessHandle process_handle,
+ int score) override;
++#endif
+
+ private:
+ friend struct base::DefaultSingletonTraits<ZygoteHostImpl>;
diff --git a/devel/electron4/files/patch-services_service__manager_zygote_zygote__host__linux.h b/devel/electron4/files/patch-services_service__manager_zygote_zygote__host__linux.h
new file mode 100644
index 000000000000..d97c707f66f3
--- /dev/null
+++ b/devel/electron4/files/patch-services_service__manager_zygote_zygote__host__linux.h
@@ -0,0 +1,16 @@
+--- services/service_manager/zygote/zygote_host_linux.h.orig 2019-03-15 06:25:51 UTC
++++ services/service_manager/zygote/zygote_host_linux.h
+@@ -30,11 +30,13 @@ class ZygoteHost {
+ // after the first render has been forked.
+ virtual int GetRendererSandboxStatus() const = 0;
+
++#if !defined(OS_BSD)
+ // Adjust the OOM score of the given renderer's PID. The allowed
+ // range for the score is [0, 1000], where higher values are more
+ // likely to be killed by the OOM killer.
+ virtual void AdjustRendererOOMScore(base::ProcessHandle process_handle,
+ int score) = 0;
++#endif
+ };
+
+ } // namespace service_manager
diff --git a/devel/electron4/files/patch-services_service__manager_zygote_zygote__linux.cc b/devel/electron4/files/patch-services_service__manager_zygote_zygote__linux.cc
new file mode 100644
index 000000000000..54925c175d6e
--- /dev/null
+++ b/devel/electron4/files/patch-services_service__manager_zygote_zygote__linux.cc
@@ -0,0 +1,15 @@
+--- services/service_manager/zygote/zygote_linux.cc.orig 2019-03-15 06:25:51 UTC
++++ services/service_manager/zygote/zygote_linux.cc
+@@ -1,6 +1,7 @@
+ // Copyright (c) 2012 The Chromium Authors. All rights reserved.
+ // Use of this source code is governed by a BSD-style license that can be
+ // found in the LICENSE file.
++#if 0
+
+ #include "services/service_manager/zygote/zygote_linux.h"
+
+@@ -664,3 +665,4 @@ bool Zygote::HandleGetSandboxStatus(int fd, base::Pick
+ }
+
+ } // namespace service_manager
++#endif
diff --git a/devel/electron4/files/patch-services_service__manager_zygote_zygote__main__linux.cc b/devel/electron4/files/patch-services_service__manager_zygote_zygote__main__linux.cc
new file mode 100644
index 000000000000..d1ed79c1c352
--- /dev/null
+++ b/devel/electron4/files/patch-services_service__manager_zygote_zygote__main__linux.cc
@@ -0,0 +1,48 @@
+--- services/service_manager/zygote/zygote_main_linux.cc.orig 2019-03-15 06:37:32 UTC
++++ services/service_manager/zygote/zygote_main_linux.cc
+@@ -11,7 +11,9 @@
+ #include <stddef.h>
+ #include <stdint.h>
+ #include <string.h>
++#if !defined(OS_BSD)
+ #include <sys/prctl.h>
++#endif
+ #include <sys/socket.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+@@ -101,6 +103,7 @@ static bool CreateInitProcessReaper(
+ // created through the setuid sandbox.
+ static bool EnterSuidSandbox(sandbox::SetuidSandboxClient* setuid_sandbox,
+ base::OnceClosure post_fork_parent_callback) {
++#if !defined(OS_BSD)
+ DCHECK(setuid_sandbox);
+ DCHECK(setuid_sandbox->IsSuidSandboxChild());
+
+@@ -133,6 +136,9 @@ static bool EnterSuidSandbox(sandbox::SetuidSandboxCli
+
+ CHECK(service_manager::SandboxDebugHandling::SetDumpableStatusAndHandlers());
+ return true;
++#else
++ return false;
++#endif
+ }
+
+ static void DropAllCapabilities(int proc_fd) {
+@@ -178,6 +184,7 @@ static void EnterLayerOneSandbox(service_manager::Sand
+
+ bool ZygoteMain(
+ std::vector<std::unique_ptr<ZygoteForkDelegate>> fork_delegates) {
++#if !defined(OS_BSD)
+ sandbox::SetAmZygoteOrRenderer(true, GetSandboxFD());
+
+ auto* linux_sandbox = service_manager::SandboxLinux::GetInstance();
+@@ -240,6 +247,9 @@ bool ZygoteMain(
+
+ // This function call can return multiple times, once per fork().
+ return zygote.ProcessRequests();
++#else
++ return false;
++#endif
+ }
+
+ } // namespace service_manager
diff --git a/devel/electron4/files/patch-services_tracing_public_cpp_trace__event__agent.cc b/devel/electron4/files/patch-services_tracing_public_cpp_trace__event__agent.cc
new file mode 100644
index 000000000000..6301a89a6a75
--- /dev/null
+++ b/devel/electron4/files/patch-services_tracing_public_cpp_trace__event__agent.cc
@@ -0,0 +1,11 @@
+--- services/tracing/public/cpp/trace_event_agent.cc.orig 2019-03-15 06:37:32 UTC
++++ services/tracing/public/cpp/trace_event_agent.cc
+@@ -23,7 +23,7 @@
+ #include "services/tracing/public/mojom/constants.mojom.h"
+
+ #if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_MACOSX) || \
+- defined(OS_WIN)
++ defined(OS_WIN) || defined(OS_BSD)
+ #define PERFETTO_AVAILABLE
+ #include "services/tracing/public/cpp/perfetto/producer_client.h"
+ #endif
diff --git a/devel/electron4/files/patch-services_tracing_tracing__service.h b/devel/electron4/files/patch-services_tracing_tracing__service.h
new file mode 100644
index 000000000000..65df59fb98dc
--- /dev/null
+++ b/devel/electron4/files/patch-services_tracing_tracing__service.h
@@ -0,0 +1,11 @@
+--- services/tracing/tracing_service.h.orig 2019-03-15 06:37:32 UTC
++++ services/tracing/tracing_service.h
+@@ -18,7 +18,7 @@
+ #include "services/tracing/coordinator.h"
+
+ #if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_MACOSX) || \
+- defined(OS_WIN)
++ defined(OS_WIN) || defined(OS_BSD)
+ #define PERFETTO_SERVICE_AVAILABLE
+ #endif
+
diff --git a/devel/electron4/files/patch-skia_ext_SkMemory__new__handler.cpp b/devel/electron4/files/patch-skia_ext_SkMemory__new__handler.cpp
new file mode 100644
index 000000000000..335dbf8417c3
--- /dev/null
+++ b/devel/electron4/files/patch-skia_ext_SkMemory__new__handler.cpp
@@ -0,0 +1,20 @@
+--- skia/ext/SkMemory_new_handler.cpp.orig 2019-03-15 06:25:51 UTC
++++ skia/ext/SkMemory_new_handler.cpp
+@@ -77,7 +77,7 @@ static void* malloc_nothrow(size_t size) {
+ // TODO(b.kelemen): we should always use UncheckedMalloc but currently it
+ // doesn't work as intended everywhere.
+ void* result;
+-#if defined(OS_IOS)
++#if defined(OS_IOS) || defined(OS_BSD)
+ result = malloc(size);
+ #else
+ // It's the responsibility of the caller to check the return value.
+@@ -97,7 +97,7 @@ static void* calloc_nothrow(size_t size) {
+ // TODO(b.kelemen): we should always use UncheckedCalloc but currently it
+ // doesn't work as intended everywhere.
+ void* result;
+-#if defined(OS_IOS)
++#if defined(OS_IOS) || defined(OS_BSD)
+ result = calloc(1, size);
+ #else
+ // It's the responsibility of the caller to check the return value.
diff --git a/devel/electron4/files/patch-third__party_angle_BUILD.gn b/devel/electron4/files/patch-third__party_angle_BUILD.gn
new file mode 100644
index 000000000000..a2105804f1a5
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_angle_BUILD.gn
@@ -0,0 +1,21 @@
+--- third_party/angle/BUILD.gn.orig 2019-03-15 06:40:08 UTC
++++ third_party/angle/BUILD.gn
+@@ -275,6 +275,7 @@ static_library("angle_gpu_info_util") {
+ "X11",
+ "Xi",
+ "Xext",
++ "GL",
+ ]
+ }
+ }
+@@ -842,10 +843,6 @@ foreach(is_shared_library,
+ libs = []
+ if (is_linux) {
+ sources += rebase_path(util_gypi.util_linux_sources, ".", "util")
+- libs += [
+- "rt",
+- "dl",
+- ]
+ }
+
+ if (is_mac) {
diff --git a/devel/electron4/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__internal.h b/devel/electron4/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__internal.h
new file mode 100644
index 000000000000..8d9df6d18f7b
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__internal.h
@@ -0,0 +1,16 @@
+--- third_party/angle/src/gpu_info_util/SystemInfo_internal.h.orig 2019-03-15 06:27:28 UTC
++++ third_party/angle/src/gpu_info_util/SystemInfo_internal.h
+@@ -14,8 +14,13 @@
+ namespace angle
+ {
+
++bool CollectMesaCardInfo(std::vector<GPUDeviceInfo> *devices);
++
+ // Defined in SystemInfo_libpci when GPU_INFO_USE_LIBPCI is defined.
+ bool GetPCIDevicesWithLibPCI(std::vector<GPUDeviceInfo> *devices);
++#if defined(__FreeBSD__)
++bool GetPCIDevicesFreeBSD(std::vector<GPUDeviceInfo> *devices);
++#endif
+ // Defined in SystemInfo_x11 when GPU_INFO_USE_X11 is defined.
+ bool GetNvidiaDriverVersionWithXNVCtrl(std::string *version);
+
diff --git a/devel/electron4/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__libpci.cpp b/devel/electron4/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__libpci.cpp
new file mode 100644
index 000000000000..58de65fda60a
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__libpci.cpp
@@ -0,0 +1,90 @@
+--- third_party/angle/src/gpu_info_util/SystemInfo_libpci.cpp.orig 2019-03-15 06:40:10 UTC
++++ third_party/angle/src/gpu_info_util/SystemInfo_libpci.cpp
+@@ -12,6 +12,11 @@
+ #include <pci/pci.h>
+ #include <unistd.h>
+
++#if defined(__FreeBSD__)
++#include <fcntl.h>
++#include <sys/pciio.h>
++#endif
++
+ #include "common/angleutils.h"
+ #include "common/debug.h"
+
+@@ -82,6 +87,75 @@ struct LibPCI : private angle::NonCopyable
+ };
+
+ } // anonymous namespace
++
++#if defined(__FreeBSD__)
++// Adds an entry per PCI GPU found and fills the device and vendor ID.
++bool GetPCIDevicesFreeBSD(std::vector<GPUDeviceInfo> *devices)
++{
++ int fd;
++ struct pci_conf_io conf;
++ struct pci_conf *matches;
++ uint32_t offset = 0;
++
++ fd = open("/dev/pci", O_RDONLY);
++ if (fd < 0)
++ return false;
++
++ matches = new struct pci_conf[32];
++ conf.generation = 0;
++ do {
++ conf.pat_buf_len = 0;
++ conf.num_patterns = 0;
++ conf.patterns = NULL;
++ conf.match_buf_len = 32 * sizeof(struct pci_conf);
++ conf.num_matches = 32;
++ conf.matches = matches;
++ conf.offset = offset;
++ conf.status = PCI_GETCONF_ERROR;
++ if (ioctl(fd, PCIOCGETCONF, &conf) < 0) {
++ if (errno == ENODEV)
++ break;
++ }
++ /* PCI_GETCONF_LIST_CHANGED would require us to start over. */
++ if (conf.status == PCI_GETCONF_ERROR || conf.status == PCI_GETCONF_LIST_CHANGED) {
++ break;
++ }
++
++ for (unsigned int i = 0; i < conf.num_matches; i++) {
++ uint16_t device_class = (matches[i].pc_class << 8) | matches[i].pc_subclass;
++
++ // Skip non-GPU devices
++ switch (device_class)
++ {
++ case PCI_CLASS_DISPLAY_VGA:
++ case PCI_CLASS_DISPLAY_XGA:
++ case PCI_CLASS_DISPLAY_3D:
++ break;
++ default:
++ continue;
++ }
++
++ // Skip unknown devices
++ if (matches[i].pc_vendor == 0 || matches[i].pc_device == 0) {
++ continue;
++ }
++
++ GPUDeviceInfo info;
++ info.vendorId = matches[i].pc_vendor;
++ info.deviceId = matches[i].pc_device;
++
++ devices->push_back(info);
++ }
++ offset += conf.num_matches;
++ } while (conf.status == PCI_GETCONF_MORE_DEVS);
++
++ delete[] matches;
++
++ close(fd);
++
++ return true;
++}
++#endif
+
+ // Adds an entry per PCI GPU found and fills the device and vendor ID.
+ bool GetPCIDevicesWithLibPCI(std::vector<GPUDeviceInfo> *devices)
diff --git a/devel/electron4/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__linux.cpp b/devel/electron4/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__linux.cpp
new file mode 100644
index 000000000000..d44e4f488ca6
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__linux.cpp
@@ -0,0 +1,21 @@
+--- third_party/angle/src/gpu_info_util/SystemInfo_linux.cpp.orig 2019-03-15 06:27:28 UTC
++++ third_party/angle/src/gpu_info_util/SystemInfo_linux.cpp
+@@ -71,10 +71,18 @@ bool GetPCIDevicesWithLibPCI(std::vector<GPUDeviceInfo
+
+ bool GetSystemInfo(SystemInfo *info)
+ {
++#if defined(__FreeBSD__)
++ if (!CollectMesaCardInfo(&(info->gpus)))
++ {
++ if (!GetPCIDevicesFreeBSD(&(info->gpus)))
++ return false;
++ }
++#else
+ if (!GetPCIDevicesWithLibPCI(&(info->gpus)))
+ {
+ return false;
+ }
++#endif
+
+ if (info->gpus.size() == 0)
+ {
diff --git a/devel/electron4/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__x11.cpp b/devel/electron4/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__x11.cpp
new file mode 100644
index 000000000000..1fcd6b8b7fd0
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__x11.cpp
@@ -0,0 +1,55 @@
+--- third_party/angle/src/gpu_info_util/SystemInfo_x11.cpp.orig 2019-03-15 06:40:10 UTC
++++ third_party/angle/src/gpu_info_util/SystemInfo_x11.cpp
+@@ -8,6 +8,8 @@
+
+ #include "gpu_info_util/SystemInfo_internal.h"
+
++#include <GL/glx.h>
++#include <GL/glxext.h>
+ #include <X11/Xlib.h>
+
+ #include "common/debug.h"
+@@ -18,8 +20,43 @@
+ #error SystemInfo_x11.cpp compiled without GPU_INFO_USE_X11
+ #endif
+
++#define GLX_RENDERER_VENDOR_ID_MESA 0x8183
++#define GLX_RENDERER_DEVICE_ID_MESA 0x8184
++
+ namespace angle
+ {
++
++bool CollectMesaCardInfo(std::vector<GPUDeviceInfo> *devices)
++{
++
++ unsigned int vid[3], did[3];
++
++ Display *display = XOpenDisplay(NULL);
++ if (!display) {
++ return false;
++ }
++
++ PFNGLXQUERYRENDERERINTEGERMESAPROC queryInteger =
++ (PFNGLXQUERYRENDERERINTEGERMESAPROC) glXGetProcAddressARB((const GLubyte *)
++ "glXQueryRendererIntegerMESA");
++
++ if (!queryInteger)
++ return false;
++
++ bool vendor_ret =
++ queryInteger(display, 0, 0, GLX_RENDERER_VENDOR_ID_MESA, vid);
++ bool device_ret =
++ queryInteger(display, 0, 0, GLX_RENDERER_DEVICE_ID_MESA, did);
++
++ if (vendor_ret && device_ret) {
++ GPUDeviceInfo info;
++ info.vendorId = vid[0];
++ info.deviceId = did[0];
++ devices->push_back(info);
++ }
++
++ return true;
++}
+
+ bool GetNvidiaDriverVersionWithXNVCtrl(std::string *version)
+ {
diff --git a/devel/electron4/files/patch-third__party_angle_src_libANGLE_Display.cpp b/devel/electron4/files/patch-third__party_angle_src_libANGLE_Display.cpp
new file mode 100644
index 000000000000..bf8a3fed2aa1
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_angle_src_libANGLE_Display.cpp
@@ -0,0 +1,20 @@
+--- third_party/angle/src/libANGLE/Display.cpp.orig 2019-03-15 06:40:10 UTC
++++ third_party/angle/src/libANGLE/Display.cpp
+@@ -63,7 +63,7 @@
+ #if defined(ANGLE_ENABLE_VULKAN)
+ #if defined(ANGLE_PLATFORM_WINDOWS)
+ #include "libANGLE/renderer/vulkan/win32/DisplayVkWin32.h"
+-#elif defined(ANGLE_PLATFORM_LINUX)
++#elif defined(ANGLE_PLATFORM_POSIX)
+ #include "libANGLE/renderer/vulkan/xcb/DisplayVkXcb.h"
+ #elif defined(ANGLE_PLATFORM_ANDROID)
+ #include "libANGLE/renderer/vulkan/android/DisplayVkAndroid.h"
+@@ -211,7 +211,7 @@ rx::DisplayImpl *CreateDisplayFromAttribs(const Attrib
+ #if defined(ANGLE_ENABLE_VULKAN)
+ #if defined(ANGLE_PLATFORM_WINDOWS)
+ impl = new rx::DisplayVkWin32(state);
+-#elif defined(ANGLE_PLATFORM_LINUX)
++#elif defined(ANGLE_PLATFORM_POSIX)
+ impl = new rx::DisplayVkXcb(state);
+ #elif defined(ANGLE_PLATFORM_ANDROID)
+ impl = new rx::DisplayVkAndroid(state);
diff --git a/devel/electron4/files/patch-third__party_angle_src_libANGLE_renderer_gl_renderergl__utils.cpp b/devel/electron4/files/patch-third__party_angle_src_libANGLE_renderer_gl_renderergl__utils.cpp
new file mode 100644
index 000000000000..404c0be2d10d
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_angle_src_libANGLE_renderer_gl_renderergl__utils.cpp
@@ -0,0 +1,11 @@
+--- third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp.orig 2019-03-15 06:40:12 UTC
++++ third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp
+@@ -1127,7 +1127,7 @@ void GenerateWorkarounds(const FunctionsGL *functions,
+ workarounds->doesSRGBClearsOnLinearFramebufferAttachments =
+ functions->standard == STANDARD_GL_DESKTOP && (IsIntel(vendor) || IsAMD(vendor));
+
+-#if defined(ANGLE_PLATFORM_LINUX)
++#if defined(ANGLE_PLATFORM_POSIX)
+ workarounds->emulateMaxVertexAttribStride =
+ functions->standard == STANDARD_GL_DESKTOP && IsAMD(vendor);
+ workarounds->useUnusedBlocksWithStandardOrSharedLayout = IsAMD(vendor);
diff --git a/devel/electron4/files/patch-third__party_angle_third__party_vulkan-loader_src_loader_loader.c b/devel/electron4/files/patch-third__party_angle_third__party_vulkan-loader_src_loader_loader.c
new file mode 100644
index 000000000000..a96a60c3e8f3
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_angle_third__party_vulkan-loader_src_loader_loader.c
@@ -0,0 +1,11 @@
+--- third_party/angle/third_party/vulkan-loader/src/loader/loader.c.orig 2019-03-15 06:41:41 UTC
++++ third_party/angle/third_party/vulkan-loader/src/loader/loader.c
+@@ -213,7 +213,7 @@ void *loader_device_heap_realloc(const struct loader_d
+ }
+
+ // Environment variables
+-#if defined(__linux__) || defined(__APPLE__)
++#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+
+ static inline char *loader_getenv(const char *name, const struct loader_instance *inst) {
+ // No allocation of memory necessary for Linux, but we should at least touch
diff --git a/devel/electron4/files/patch-third__party_angle_third__party_vulkan-loader_src_loader_vk__loader__platform.h b/devel/electron4/files/patch-third__party_angle_third__party_vulkan-loader_src_loader_vk__loader__platform.h
new file mode 100644
index 000000000000..de24aa2e2351
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_angle_third__party_vulkan-loader_src_loader_vk__loader__platform.h
@@ -0,0 +1,11 @@
+--- third_party/angle/third_party/vulkan-loader/src/loader/vk_loader_platform.h.orig 2019-03-15 06:41:41 UTC
++++ third_party/angle/third_party/vulkan-loader/src/loader/vk_loader_platform.h
+@@ -31,7 +31,7 @@
+ #include "vulkan/vk_platform.h"
+ #include "vulkan/vk_sdk_platform.h"
+
+-#if defined(__linux__) || defined(__APPLE__)
++#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+ /* Linux-specific common code: */
+
+ // Headers:
diff --git a/devel/electron4/files/patch-third__party_angle_third__party_vulkan-validation-layers_src_layers_vk__loader__platform.h b/devel/electron4/files/patch-third__party_angle_third__party_vulkan-validation-layers_src_layers_vk__loader__platform.h
new file mode 100644
index 000000000000..67596e4dcfba
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_angle_third__party_vulkan-validation-layers_src_layers_vk__loader__platform.h
@@ -0,0 +1,11 @@
+--- third_party/angle/third_party/vulkan-validation-layers/src/layers/vk_loader_platform.h.orig 2019-03-15 06:30:51 UTC
++++ third_party/angle/third_party/vulkan-validation-layers/src/layers/vk_loader_platform.h
+@@ -31,7 +31,7 @@
+ #include "vulkan/vk_platform.h"
+ #include "vulkan/vk_sdk_platform.h"
+
+-#if defined(__linux__) || defined(__APPLE__)
++#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+ /* Linux-specific common code: */
+
+ // Headers:
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_core_editing_editing__behavior.cc b/devel/electron4/files/patch-third__party_blink_renderer_core_editing_editing__behavior.cc
new file mode 100644
index 000000000000..56a5c42eba05
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_core_editing_editing__behavior.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/core/editing/editing_behavior.cc.orig 2019-03-15 06:38:12 UTC
++++ third_party/blink/renderer/core/editing/editing_behavior.cc
+@@ -270,7 +270,7 @@ bool EditingBehavior::ShouldInsertCharacter(const Keyb
+ // unexpected behaviour
+ if (ch < ' ')
+ return false;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // According to XKB map no keyboard combinations with ctrl key are mapped to
+ // printable characters, however we need the filter as the DomKey/text could
+ // contain printable characters.
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_core_html_canvas_canvas__async__blob__creator.cc b/devel/electron4/files/patch-third__party_blink_renderer_core_html_canvas_canvas__async__blob__creator.cc
new file mode 100644
index 000000000000..fc23e3e24784
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_core_html_canvas_canvas__async__blob__creator.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc.orig 2019-03-15 06:38:13 UTC
++++ third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc
+@@ -34,7 +34,7 @@ namespace {
+ constexpr TimeDelta kSlackBeforeDeadline = TimeDelta::FromMilliseconds(1);
+
+ /* The value is based on user statistics on Nov 2017. */
+-#if (defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN))
++#if (defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)) || defined(OS_BSD)
+ const double kIdleTaskStartTimeoutDelayMs = 1000.0;
+ #else
+ const double kIdleTaskStartTimeoutDelayMs = 4000.0; // For ChromeOS, Mobile
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_core_html_forms_internal__popup__menu.cc b/devel/electron4/files/patch-third__party_blink_renderer_core_html_forms_internal__popup__menu.cc
new file mode 100644
index 000000000000..24d452072379
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_core_html_forms_internal__popup__menu.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/core/html/forms/internal_popup_menu.cc.orig 2019-03-15 06:38:14 UTC
++++ third_party/blink/renderer/core/html/forms/internal_popup_menu.cc
+@@ -126,7 +126,7 @@ class InternalPopupMenu::ItemIterationContext {
+ is_in_group_(false),
+ buffer_(buffer) {
+ DCHECK(buffer_);
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // On other platforms, the <option> background color is the same as the
+ // <select> background color. On Linux, that makes the <option>
+ // background color very dark, so by default, try to use a lighter
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_core_inspector_inspector__memory__agent.cc b/devel/electron4/files/patch-third__party_blink_renderer_core_inspector_inspector__memory__agent.cc
new file mode 100644
index 000000000000..b45d31a34693
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_core_inspector_inspector__memory__agent.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/core/inspector/inspector_memory_agent.cc.orig 2019-03-15 06:38:14 UTC
++++ third_party/blink/renderer/core/inspector/inspector_memory_agent.cc
+@@ -162,7 +162,7 @@ InspectorMemoryAgent::GetSamplingProfileById(uint32_t
+
+ std::vector<std::string> InspectorMemoryAgent::Symbolize(
+ const std::vector<void*>& addresses) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // TODO(alph): Move symbolization to the client.
+ std::vector<void*> addresses_to_symbolize;
+ for (void* address : addresses) {
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_platform_BUILD.gn b/devel/electron4/files/patch-third__party_blink_renderer_platform_BUILD.gn
new file mode 100644
index 000000000000..b0446bbbb974
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_platform_BUILD.gn
@@ -0,0 +1,10 @@
+--- third_party/blink/renderer/platform/BUILD.gn.orig 2019-03-16 09:15:20 UTC
++++ third_party/blink/renderer/platform/BUILD.gn
+@@ -144,6 +144,7 @@ executable("character_data_generator") {
+ "//build/win:default_exe_manifest",
+ "//third_party/icu",
+ ]
++ libs = [ "cxxrt" ]
+ }
+
+ # This isn't strictly necessary since we can just add the deps to "platform",
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_font__cache.cc b/devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_font__cache.cc
new file mode 100644
index 000000000000..7ecfd18174c4
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_font__cache.cc
@@ -0,0 +1,20 @@
+--- third_party/blink/renderer/platform/fonts/font_cache.cc.orig 2019-03-15 06:38:17 UTC
++++ third_party/blink/renderer/platform/fonts/font_cache.cc
+@@ -65,7 +65,7 @@ namespace blink {
+
+ SkFontMgr* FontCache::static_font_manager_ = nullptr;
+
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ float FontCache::device_scale_factor_ = 1.0;
+ #endif
+
+@@ -88,7 +88,7 @@ FontCache::FontCache()
+ FontPlatformData* FontCache::SystemFontPlatformData(
+ const FontDescription& font_description) {
+ const AtomicString& family = FontCache::SystemFontFamily();
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (family.IsEmpty() || family == FontFamilyNames::system_ui)
+ return nullptr;
+ #else
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_font__cache.h b/devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_font__cache.h
new file mode 100644
index 000000000000..d8c3a76cffc3
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_font__cache.h
@@ -0,0 +1,38 @@
+--- third_party/blink/renderer/platform/fonts/font_cache.h.orig 2019-03-15 06:38:17 UTC
++++ third_party/blink/renderer/platform/fonts/font_cache.h
+@@ -156,7 +156,7 @@ class PLATFORM_EXPORT FontCache {
+ sk_sp<SkFontMgr> FontManager() { return font_manager_; }
+ static void SetFontManager(sk_sp<SkFontMgr>);
+
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ // These are needed for calling QueryRenderStyleForStrike, since
+ // gfx::GetFontRenderParams makes distinctions based on DSF.
+ static float DeviceScaleFactor() { return device_scale_factor_; }
+@@ -217,7 +217,7 @@ class PLATFORM_EXPORT FontCache {
+ const FontDescription&);
+ #endif // defined(OS_ANDROID)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ struct PlatformFallbackFont {
+ String name;
+ CString filename;
+@@ -291,7 +291,7 @@ class PLATFORM_EXPORT FontCache {
+ const FontFaceCreationParams&,
+ CString& name);
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ static AtomicString GetFamilyNameForCharacter(SkFontMgr*,
+ UChar32,
+ const FontDescription&,
+@@ -327,7 +327,7 @@ class PLATFORM_EXPORT FontCache {
+ bool is_test_font_mgr_ = false;
+ #endif // defined(OS_WIN)
+
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ static float device_scale_factor_;
+ #endif
+
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_font__description.cc b/devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_font__description.cc
new file mode 100644
index 000000000000..ce7e8a74bc0f
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_font__description.cc
@@ -0,0 +1,20 @@
+--- third_party/blink/renderer/platform/fonts/font_description.cc.orig 2019-03-15 06:38:17 UTC
++++ third_party/blink/renderer/platform/fonts/font_description.cc
+@@ -38,7 +38,7 @@
+ #include "third_party/blink/renderer/platform/wtf/text/atomic_string_hash.h"
+ #include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
+
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ #include "third_party/blink/renderer/platform/fonts/font_cache.h"
+ #endif
+
+@@ -222,7 +222,7 @@ FontCacheKey FontDescription::CacheKey(
+ static_cast<unsigned>(fields_.orientation_) << 1 | // bit 2-3
+ static_cast<unsigned>(fields_.subpixel_text_position_); // bit 1
+
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ float device_scale_factor_for_key = FontCache::DeviceScaleFactor();
+ #else
+ float device_scale_factor_for_key = 1.0f;
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_font__metrics.cc b/devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_font__metrics.cc
new file mode 100644
index 000000000000..6bfdd523e0df
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_font__metrics.cc
@@ -0,0 +1,29 @@
+--- third_party/blink/renderer/platform/fonts/font_metrics.cc.orig 2019-03-15 06:38:17 UTC
++++ third_party/blink/renderer/platform/fonts/font_metrics.cc
+@@ -38,7 +38,7 @@
+
+ namespace blink {
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ // This is the largest VDMX table which we'll try to load and parse.
+ static const size_t kMaxVDMXTableSize = 1024 * 1024; // 1 MB
+ #endif
+@@ -60,7 +60,7 @@ void FontMetrics::AscentDescentWithHacks(
+ int vdmx_ascent = 0, vdmx_descent = 0;
+ bool is_vdmx_valid = false;
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ // Manually digging up VDMX metrics is only applicable when bytecode hinting
+ // using FreeType. With DirectWrite or CoreText, no bytecode hinting is ever
+ // done. This code should be pushed into FreeType (hinted font metrics).
+@@ -106,7 +106,7 @@ void FontMetrics::AscentDescentWithHacks(
+ visual_overflow_inflation_for_ascent = 1;
+ if (descent < metrics.fDescent) {
+ visual_overflow_inflation_for_descent = 1;
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ // When subpixel positioning is enabled, if the descent is rounded down,
+ // the descent part of the glyph may be truncated when displayed in a
+ // 'overflow: hidden' container. To avoid that, borrow 1 unit from the
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_skia_font__cache__skia.cc b/devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_skia_font__cache__skia.cc
new file mode 100644
index 000000000000..ea4249c38945
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_platform_fonts_skia_font__cache__skia.cc
@@ -0,0 +1,20 @@
+--- third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc.orig 2019-03-15 06:38:17 UTC
++++ third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc
+@@ -59,7 +59,7 @@ AtomicString ToAtomicString(const SkString& str) {
+ return AtomicString::FromUTF8(str.c_str(), str.size());
+ }
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ // Android special locale for retrieving the color emoji font
+ // based on the proposed changes in UTR #51 for introducing
+ // an Emoji script code:
+@@ -248,7 +248,7 @@ PaintTypeface FontCache::CreateTypeface(
+ }
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ // On linux if the fontManager has been overridden then we should be calling
+ // the embedder provided font Manager rather than calling
+ // SkTypeface::CreateFromName which may redirect the call to the default font
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_platform_heap_stack__frame__depth.cc b/devel/electron4/files/patch-third__party_blink_renderer_platform_heap_stack__frame__depth.cc
new file mode 100644
index 000000000000..89618de1b132
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_platform_heap_stack__frame__depth.cc
@@ -0,0 +1,14 @@
+--- third_party/blink/renderer/platform/heap/stack_frame_depth.cc.orig 2019-03-15 06:26:13 UTC
++++ third_party/blink/renderer/platform/heap/stack_frame_depth.cc
+@@ -15,6 +15,11 @@
+ extern "C" void* __libc_stack_end; // NOLINT
+ #endif
+
++#if defined(OS_FREEBSD)
++#include <sys/signal.h>
++#include <pthread_np.h>
++#endif
++
+ namespace blink {
+
+ static const char* g_avoid_optimization = nullptr;
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_BUILD.gn b/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_BUILD.gn
new file mode 100644
index 000000000000..1e1c236a6e74
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_BUILD.gn
@@ -0,0 +1,16 @@
+--- third_party/blink/renderer/platform/wtf/BUILD.gn.orig 2019-03-15 06:38:18 UTC
++++ third_party/blink/renderer/platform/wtf/BUILD.gn
+@@ -276,8 +276,12 @@ jumbo_component("wtf") {
+ if (is_android) {
+ libs = [ "log" ]
+ }
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ libs = [ "dl" ]
++ }
++
++ if (is_bsd) {
++ libs = [ "execinfo" ]
+ }
+
+ if (is_mac) {
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_assertions.cc b/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_assertions.cc
new file mode 100644
index 000000000000..564ccc6a0af6
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_assertions.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/platform/wtf/assertions.cc.orig 2019-03-15 06:38:18 UTC
++++ third_party/blink/renderer/platform/wtf/assertions.cc
+@@ -48,7 +48,7 @@
+ #include <windows.h>
+ #endif
+
+-#if defined(OS_MACOSX) || (defined(OS_LINUX) && !defined(__UCLIBC__))
++#if defined(OS_MACOSX) || ((defined(OS_LINUX) || defined(OS_BSD)) && !defined(__UCLIBC__))
+ #include <cxxabi.h>
+ #include <dlfcn.h>
+ #include <execinfo.h>
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_atomics.h b/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_atomics.h
new file mode 100644
index 000000000000..596f595c9707
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_atomics.h
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/platform/wtf/atomics.h.orig 2019-03-15 06:38:18 UTC
++++ third_party/blink/renderer/platform/wtf/atomics.h
+@@ -176,7 +176,7 @@ ALWAYS_INLINE void AtomicSetOneToZero(int volatile* pt
+ #if defined(THREAD_SANITIZER)
+ // The definitions below assume an LP64 data model. This is fine because
+ // TSan is only supported on x86_64 Linux.
+-#if defined(ARCH_CPU_64_BITS) && defined(OS_LINUX)
++#if defined(ARCH_CPU_64_BITS) && defined(OS_LINUX) || defined(OS_BSD)
+ ALWAYS_INLINE void ReleaseStore(volatile int* ptr, int value) {
+ __tsan_atomic32_store(ptr, value, __tsan_memory_order_release);
+ }
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_container__annotations.h b/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_container__annotations.h
new file mode 100644
index 000000000000..80946c3226d0
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_container__annotations.h
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/platform/wtf/container_annotations.h.orig 2019-03-15 06:38:18 UTC
++++ third_party/blink/renderer/platform/wtf/container_annotations.h
+@@ -10,7 +10,7 @@
+
+ // TODO(ochang): Remove the ARCH_CPU_X86_64 condition to enable this for X86
+ // once the crashes there have been fixed: http://crbug.com/461406
+-#if defined(ADDRESS_SANITIZER) && defined(OS_LINUX) && defined(ARCH_CPU_X86_64)
++#if defined(ADDRESS_SANITIZER) && (defined(OS_LINUX) || defined(OS_BSD)) && defined(ARCH_CPU_X86_64)
+ #define ANNOTATE_CONTIGUOUS_CONTAINER
+ #define ANNOTATE_NEW_BUFFER(buffer, capacity, newSize) \
+ if (buffer) { \
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_stack__util.cc b/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_stack__util.cc
new file mode 100644
index 000000000000..a30eb25333c9
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_stack__util.cc
@@ -0,0 +1,14 @@
+--- third_party/blink/renderer/platform/wtf/stack_util.cc.orig 2019-03-15 06:38:18 UTC
++++ third_party/blink/renderer/platform/wtf/stack_util.cc
+@@ -16,6 +16,11 @@
+ extern "C" void* __libc_stack_end; // NOLINT
+ #endif
+
++#if defined(OS_FREEBSD)
++#include <sys/signal.h>
++#include <pthread_np.h>
++#endif
++
+ namespace WTF {
+
+ size_t GetUnderestimatedStackSize() {
diff --git a/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_threading__pthreads.cc b/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_threading__pthreads.cc
new file mode 100644
index 000000000000..adceb86714c7
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_blink_renderer_platform_wtf_threading__pthreads.cc
@@ -0,0 +1,22 @@
+--- third_party/blink/renderer/platform/wtf/threading_pthreads.cc.orig 2019-03-15 06:38:18 UTC
++++ third_party/blink/renderer/platform/wtf/threading_pthreads.cc
+@@ -51,12 +51,17 @@
+ #include <objc/objc-auto.h>
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <sys/syscall.h>
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ #include <unistd.h>
++#endif
++
++#if defined(OS_BSD)
++#include <sys/signal.h>
++#include <pthread_np.h>
+ #endif
+
+ namespace WTF {
diff --git a/devel/electron4/files/patch-third__party_boringssl_BUILD.gn b/devel/electron4/files/patch-third__party_boringssl_BUILD.gn
new file mode 100644
index 000000000000..f1c1ff79cfc3
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_boringssl_BUILD.gn
@@ -0,0 +1,36 @@
+--- third_party/boringssl/BUILD.gn.orig 2019-03-16 09:15:20 UTC
++++ third_party/boringssl/BUILD.gn
+@@ -85,7 +85,7 @@ if (is_win && !is_msan) {
+ } else if (current_cpu == "x64") {
+ if (is_mac) {
+ sources += crypto_sources_mac_x86_64
+- } else if (is_linux || is_android) {
++ } else if (is_linux || is_bsd || is_android) {
+ sources += crypto_sources_linux_x86_64
+ } else {
+ public_configs = [ ":no_asm_config" ]
+@@ -93,13 +93,13 @@ if (is_win && !is_msan) {
+ } else if (current_cpu == "x86") {
+ if (is_mac) {
+ sources += crypto_sources_mac_x86
+- } else if (is_linux || is_android) {
++ } else if (is_linux || is_bsd || is_android) {
+ sources += crypto_sources_linux_x86
+ } else {
+ public_configs = [ ":no_asm_config" ]
+ }
+ } else if (current_cpu == "arm") {
+- if (is_linux || is_android) {
++ if (is_linux || is_bsd || is_android) {
+ sources += crypto_sources_linux_arm
+ } else if (is_ios) {
+ sources += crypto_sources_ios_arm
+@@ -107,7 +107,7 @@ if (is_win && !is_msan) {
+ public_configs = [ ":no_asm_config" ]
+ }
+ } else if (current_cpu == "arm64") {
+- if (is_linux || is_android) {
++ if (is_linux || is_bsd || is_android) {
+ sources += crypto_sources_linux_aarch64
+ } else if (is_ios) {
+ sources += crypto_sources_ios_aarch64
diff --git a/devel/electron4/files/patch-third__party_boringssl_src_crypto_cpu-aarch64-linux.c b/devel/electron4/files/patch-third__party_boringssl_src_crypto_cpu-aarch64-linux.c
new file mode 100644
index 000000000000..c8951969bf3c
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_boringssl_src_crypto_cpu-aarch64-linux.c
@@ -0,0 +1,54 @@
+--- third_party/boringssl/src/crypto/cpu-aarch64-linux.c.orig 2019-03-15 06:27:31 UTC
++++ third_party/boringssl/src/crypto/cpu-aarch64-linux.c
+@@ -14,49 +14,7 @@
+
+ #include <openssl/cpu.h>
+
+-#if defined(OPENSSL_AARCH64) && defined(OPENSSL_LINUX) && \
+- !defined(OPENSSL_STATIC_ARMCAP)
+-
+-#include <sys/auxv.h>
+-
+-#include <openssl/arm_arch.h>
+-
+-#include "internal.h"
+-
+-
+-extern uint32_t OPENSSL_armcap_P;
+-
++#ifdef __FreeBSD__
+ void OPENSSL_cpuid_setup(void) {
+- unsigned long hwcap = getauxval(AT_HWCAP);
+-
+- // See /usr/include/asm/hwcap.h on an aarch64 installation for the source of
+- // these values.
+- static const unsigned long kNEON = 1 << 1;
+- static const unsigned long kAES = 1 << 3;
+- static const unsigned long kPMULL = 1 << 4;
+- static const unsigned long kSHA1 = 1 << 5;
+- static const unsigned long kSHA256 = 1 << 6;
+-
+- if ((hwcap & kNEON) == 0) {
+- // Matching OpenSSL, if NEON is missing, don't report other features
+- // either.
+- return;
+- }
+-
+- OPENSSL_armcap_P |= ARMV7_NEON;
+-
+- if (hwcap & kAES) {
+- OPENSSL_armcap_P |= ARMV8_AES;
+- }
+- if (hwcap & kPMULL) {
+- OPENSSL_armcap_P |= ARMV8_PMULL;
+- }
+- if (hwcap & kSHA1) {
+- OPENSSL_armcap_P |= ARMV8_SHA1;
+- }
+- if (hwcap & kSHA256) {
+- OPENSSL_armcap_P |= ARMV8_SHA256;
+- }
+ }
+-
+-#endif // OPENSSL_AARCH64 && !OPENSSL_STATIC_ARMCAP
++#endif
diff --git a/devel/electron4/files/patch-third__party_boringssl_src_crypto_ex__data.c b/devel/electron4/files/patch-third__party_boringssl_src_crypto_ex__data.c
new file mode 100644
index 000000000000..e4b0317f6f49
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_boringssl_src_crypto_ex__data.c
@@ -0,0 +1,13 @@
+--- third_party/boringssl/src/crypto/ex_data.c.orig 2019-03-15 06:27:31 UTC
++++ third_party/boringssl/src/crypto/ex_data.c
+@@ -186,7 +186,9 @@ int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int index,
+ }
+ }
+
+- sk_void_set(ad->sk, index, val);
++ // expression result unused; should this cast be to 'void'?
++ // seems it should, feel free to investigate those #def
++ (void) sk_void_set(ad->sk, index, val);
+ return 1;
+ }
+
diff --git a/devel/electron4/files/patch-third__party_breakpad_breakpad_src_common_simple__string__dictionary.h b/devel/electron4/files/patch-third__party_breakpad_breakpad_src_common_simple__string__dictionary.h
new file mode 100644
index 000000000000..af2179917fc5
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_breakpad_breakpad_src_common_simple__string__dictionary.h
@@ -0,0 +1,11 @@
+--- third_party/breakpad/breakpad/src/common/simple_string_dictionary.h.orig 2019-03-15 06:27:08 UTC
++++ third_party/breakpad/breakpad/src/common/simple_string_dictionary.h
+@@ -33,7 +33,7 @@
+ #include <assert.h>
+ #include <string.h>
+
+-#include "common/basictypes.h"
++#include "third_party/breakpad/breakpad/src/common/basictypes.h"
+
+ namespace google_breakpad {
+
diff --git a/devel/electron4/files/patch-third__party_cacheinvalidation_src_google_cacheinvalidation_include_types.h b/devel/electron4/files/patch-third__party_cacheinvalidation_src_google_cacheinvalidation_include_types.h
new file mode 100644
index 000000000000..57d9efb86307
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_cacheinvalidation_src_google_cacheinvalidation_include_types.h
@@ -0,0 +1,11 @@
+--- third_party/cacheinvalidation/src/google/cacheinvalidation/include/types.h.orig 2019-03-15 06:26:35 UTC
++++ third_party/cacheinvalidation/src/google/cacheinvalidation/include/types.h
+@@ -334,6 +334,8 @@ class Status {
+ */
+ PERMANENT_FAILURE
+ };
++
++ Status() : code_(SUCCESS), message_() {}
+
+ /* Creates a new Status object given the code and message. */
+ Status(Code code, const string& message) : code_(code), message_(message) {}
diff --git a/devel/electron4/files/patch-third__party_crashpad_crashpad_build_crashpad__buildconfig.gni b/devel/electron4/files/patch-third__party_crashpad_crashpad_build_crashpad__buildconfig.gni
new file mode 100644
index 000000000000..d8bd15d49570
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_crashpad_crashpad_build_crashpad__buildconfig.gni
@@ -0,0 +1,11 @@
+--- third_party/crashpad/crashpad/build/crashpad_buildconfig.gni.orig 2019-03-15 06:38:19 UTC
++++ third_party/crashpad/crashpad/build/crashpad_buildconfig.gni
+@@ -38,7 +38,7 @@ crashpad_is_standalone = crashpad_dependencies == "sta
+ if (crashpad_is_in_chromium) {
+ crashpad_is_mac = is_mac
+ crashpad_is_win = is_win
+- crashpad_is_linux = is_linux
++ crashpad_is_linux = is_linux && !is_bsd
+ crashpad_is_android = is_android
+ crashpad_is_fuchsia = is_fuchsia
+
diff --git a/devel/electron4/files/patch-third__party_crashpad_crashpad_util_misc_address__types.h b/devel/electron4/files/patch-third__party_crashpad_crashpad_util_misc_address__types.h
new file mode 100644
index 000000000000..d174f8d828f5
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_crashpad_crashpad_util_misc_address__types.h
@@ -0,0 +1,20 @@
+--- third_party/crashpad/crashpad/util/misc/address_types.h.orig 2019-03-15 06:26:36 UTC
++++ third_party/crashpad/crashpad/util/misc/address_types.h
+@@ -25,7 +25,7 @@
+ #include <mach/mach_types.h>
+ #elif defined(OS_WIN)
+ #include "util/win/address_types.h"
+-#elif defined(OS_LINUX) || defined(OS_ANDROID)
++#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ #include "util/linux/address_types.h"
+ #elif defined(OS_FUCHSIA)
+ #include <zircon/types.h>
+@@ -55,7 +55,7 @@ using VMSize = mach_vm_size_t;
+ using VMAddress = WinVMAddress;
+ using VMSize = WinVMSize;
+
+-#elif defined(OS_LINUX) || defined(OS_ANDROID)
++#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+
+ using VMAddress = LinuxVMAddress;
+ using VMSize = LinuxVMSize;
diff --git a/devel/electron4/files/patch-third__party_crashpad_crashpad_util_misc_capture__context.h b/devel/electron4/files/patch-third__party_crashpad_crashpad_util_misc_capture__context.h
new file mode 100644
index 000000000000..7e68da3c498a
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_crashpad_crashpad_util_misc_capture__context.h
@@ -0,0 +1,20 @@
+--- third_party/crashpad/crashpad/util/misc/capture_context.h.orig 2019-03-15 06:26:36 UTC
++++ third_party/crashpad/crashpad/util/misc/capture_context.h
+@@ -21,7 +21,7 @@
+ #include <mach/mach.h>
+ #elif defined(OS_WIN)
+ #include <windows.h>
+-#elif defined(OS_LINUX) || defined(OS_ANDROID)
++#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ #include <ucontext.h>
+ #elif defined(OS_FUCHSIA)
+ #include <signal.h>
+@@ -35,7 +35,7 @@ using NativeCPUContext = x86_thread_state;
+ #endif
+ #elif defined(OS_WIN)
+ using NativeCPUContext = CONTEXT;
+-#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA)
++#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ using NativeCPUContext = ucontext_t;
+ #endif // OS_MACOSX
+
diff --git a/devel/electron4/files/patch-third__party_crashpad_crashpad_util_misc_metrics.cc b/devel/electron4/files/patch-third__party_crashpad_crashpad_util_misc_metrics.cc
new file mode 100644
index 000000000000..7d86d9babc7b
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_crashpad_crashpad_util_misc_metrics.cc
@@ -0,0 +1,11 @@
+--- third_party/crashpad/crashpad/util/misc/metrics.cc.orig 2019-03-15 06:38:19 UTC
++++ third_party/crashpad/crashpad/util/misc/metrics.cc
+@@ -24,7 +24,7 @@
+ #define METRICS_OS_NAME "Win"
+ #elif defined(OS_ANDROID)
+ #define METRICS_OS_NAME "Android"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #define METRICS_OS_NAME "Linux"
+ #elif defined(OS_FUCHSIA)
+ #define METRICS_OS_NAME "Fuchsia"
diff --git a/devel/electron4/files/patch-third__party_crashpad_crashpad_util_misc_uuid.cc b/devel/electron4/files/patch-third__party_crashpad_crashpad_util_misc_uuid.cc
new file mode 100644
index 000000000000..6ce7a52e55f4
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_crashpad_crashpad_util_misc_uuid.cc
@@ -0,0 +1,11 @@
+--- third_party/crashpad/crashpad/util/misc/uuid.cc.orig 2019-03-15 06:26:36 UTC
++++ third_party/crashpad/crashpad/util/misc/uuid.cc
+@@ -95,7 +95,7 @@ bool UUID::InitializeWithNew() {
+ InitializeFromBytes(uuid);
+ return true;
+ #elif defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID) || \
+- defined(OS_FUCHSIA)
++ defined(OS_FUCHSIA) || defined(OS_BSD)
+ // Linux, Android, and Fuchsia do not provide a UUID generator in a
+ // widely-available system library. On Linux and Android, uuid_generate()
+ // from libuuid is not available everywhere.
diff --git a/devel/electron4/files/patch-third__party_crashpad_crashpad_util_posix_close__multiple.cc b/devel/electron4/files/patch-third__party_crashpad_crashpad_util_posix_close__multiple.cc
new file mode 100644
index 000000000000..b8deba52a93e
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_crashpad_crashpad_util_posix_close__multiple.cc
@@ -0,0 +1,11 @@
+--- third_party/crashpad/crashpad/util/posix/close_multiple.cc.orig 2019-03-15 06:38:19 UTC
++++ third_party/crashpad/crashpad/util/posix/close_multiple.cc
+@@ -71,7 +71,7 @@ void CloseNowOrOnExec(int fd, bool ebadf_ok) {
+ // This is an advantage over looping over all possible file descriptors, because
+ // no attempt needs to be made to close file descriptors that are not open.
+ bool CloseMultipleNowOrOnExecUsingFDDir(int min_fd, int preserve_fd) {
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ static constexpr char kFDDir[] = "/dev/fd";
+ #elif defined(OS_LINUX) || defined(OS_ANDROID)
+ static constexpr char kFDDir[] = "/proc/self/fd";
diff --git a/devel/electron4/files/patch-third__party_crashpad_crashpad_util_posix_drop__privileges.cc b/devel/electron4/files/patch-third__party_crashpad_crashpad_util_posix_drop__privileges.cc
new file mode 100644
index 000000000000..8debecc79ae3
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_crashpad_crashpad_util_posix_drop__privileges.cc
@@ -0,0 +1,11 @@
+--- third_party/crashpad/crashpad/util/posix/drop_privileges.cc.orig 2019-03-15 06:26:36 UTC
++++ third_party/crashpad/crashpad/util/posix/drop_privileges.cc
+@@ -23,7 +23,7 @@ void DropPrivileges() {
+ gid_t gid = getgid();
+ uid_t uid = getuid();
+
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ // Based on the POSIX.1-2008 2013 edition documentation for setreuid() and
+ // setregid(), setreuid() and setregid() alone should be sufficient to drop
+ // privileges. The standard specifies that the saved ID should be set to the
diff --git a/devel/electron4/files/patch-third__party_crashpad_crashpad_util_posix_signals.cc b/devel/electron4/files/patch-third__party_crashpad_crashpad_util_posix_signals.cc
new file mode 100644
index 000000000000..97e00f3fba13
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_crashpad_crashpad_util_posix_signals.cc
@@ -0,0 +1,33 @@
+--- third_party/crashpad/crashpad/util/posix/signals.cc.orig 2019-03-15 06:38:19 UTC
++++ third_party/crashpad/crashpad/util/posix/signals.cc
+@@ -44,7 +44,7 @@ constexpr int kCrashSignals[] = {
+ #if defined(SIGEMT)
+ SIGEMT,
+ #endif // defined(SIGEMT)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ SIGXCPU,
+ SIGXFSZ,
+ #endif // defined(OS_LINUX)
+@@ -84,7 +84,7 @@ constexpr int kTerminateSignals[] = {
+ SIGXCPU,
+ SIGXFSZ,
+ #endif // defined(OS_MACOSX)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ SIGIO,
+ #endif // defined(OS_LINUX)
+ };
+@@ -214,8 +214,12 @@ bool Signals::WillSignalReraiseAutonomously(const sigi
+ // remains. See 10.12.3 xnu-3789.41.3/bsd/kern/kern_sig.c
+ // psignal_internal().
+ (code > 0 &&
++#if defined(SI_ASYNCIO)
+ code != SI_ASYNCIO &&
++#endif
++#if defined(SI_MESGQ)
+ code != SI_MESGQ &&
++#endif
+ code != SI_QUEUE &&
+ code != SI_TIMER &&
+ code != SI_USER &&
diff --git a/devel/electron4/files/patch-third__party_crashpad_crashpad_util_posix_symbolic__constants__posix.cc b/devel/electron4/files/patch-third__party_crashpad_crashpad_util_posix_symbolic__constants__posix.cc
new file mode 100644
index 000000000000..255741801c8f
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_crashpad_crashpad_util_posix_symbolic__constants__posix.cc
@@ -0,0 +1,20 @@
+--- third_party/crashpad/crashpad/util/posix/symbolic_constants_posix.cc.orig 2019-03-15 06:38:19 UTC
++++ third_party/crashpad/crashpad/util/posix/symbolic_constants_posix.cc
+@@ -64,7 +64,7 @@ constexpr const char* kSignalNames[] = {
+ "INFO",
+ "USR1",
+ "USR2",
+-#elif defined(OS_LINUX) || defined(OS_ANDROID)
++#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ #if defined(ARCH_CPU_MIPS_FAMILY)
+ "HUP",
+ "INT",
+@@ -135,7 +135,7 @@ constexpr const char* kSignalNames[] = {
+ #endif // defined(ARCH_CPU_MIPS_FAMILY)
+ #endif
+ };
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ // NSIG is 64 to account for real-time signals.
+ static_assert(arraysize(kSignalNames) == 32, "kSignalNames length");
+ #else
diff --git a/devel/electron4/files/patch-third__party_crc32c_src_src_crc32c__arm64__linux__check.h b/devel/electron4/files/patch-third__party_crc32c_src_src_crc32c__arm64__linux__check.h
new file mode 100644
index 000000000000..093b60ae3aec
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_crc32c_src_src_crc32c__arm64__linux__check.h
@@ -0,0 +1,19 @@
+--- third_party/crc32c/src/src/crc32c_arm64_linux_check.h.orig 2019-03-15 06:27:10 UTC
++++ third_party/crc32c/src/src/crc32c_arm64_linux_check.h
+@@ -29,6 +29,8 @@ extern "C" unsigned long getauxval(unsigned long type)
+ namespace crc32c {
+
+ inline bool CanUseArm64Linux() {
++return false;
++#if 0
+ #if HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL
+ // From 'arch/arm64/include/uapi/asm/hwcap.h' in Linux kernel source code.
+ constexpr unsigned long kHWCAP_PMULL = 1 << 4;
+@@ -39,6 +41,7 @@ inline bool CanUseArm64Linux() {
+ #else
+ return false;
+ #endif // HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL
++#endif
+ }
+
+ } // namespace crc32c
diff --git a/devel/electron4/files/patch-third__party_electron__node_deps_uv_BUILD.gn b/devel/electron4/files/patch-third__party_electron__node_deps_uv_BUILD.gn
new file mode 100644
index 000000000000..fe82e3a57a29
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_electron__node_deps_uv_BUILD.gn
@@ -0,0 +1,44 @@
+--- third_party/electron_node/deps/uv/BUILD.gn.orig 2019-03-16 10:00:16 UTC
++++ third_party/electron_node/deps/uv/BUILD.gn
+@@ -3,7 +3,7 @@ config("libuv_config") {
+
+ defines = []
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ defines += [ "_POSIX_C_SOURCE=200112" ]
+ }
+ if (!is_win) {
+@@ -145,7 +145,7 @@ static_library("uv") {
+ libs += [ "m" ]
+ ldflags += [ "-pthread" ]
+ }
+- if (is_mac || is_linux) {
++ if (is_mac || (is_linux && !is_bsd)) {
+ sources += [ "src/unix/proctitle.c" ]
+ }
+ if (is_mac) {
+@@ -159,7 +159,7 @@ static_library("uv") {
+ "_DARWIN_UNLIMITED_SELECT=1",
+ ]
+ }
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ defines += [ "_GNU_SOURCE" ]
+ sources += [
+ "src/unix/linux-core.c",
+@@ -179,6 +179,14 @@ static_library("uv") {
+ sources += [
+ "src/unix/bsd-ifaddrs.c",
+ "src/unix/kqueue.c",
++ ]
++ }
++ if (is_bsd) {
++ sources += [
++ "src/unix/bsd-ifaddrs.c",
++ "src/unix/freebsd.c",
++ "src/unix/kqueue.c",
++ "src/unix/posix-hrtime.c",
+ ]
+ }
+ }
diff --git a/devel/electron4/files/patch-third__party_ffmpeg_libavutil_mem.c b/devel/electron4/files/patch-third__party_ffmpeg_libavutil_mem.c
new file mode 100644
index 000000000000..753164f18794
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_ffmpeg_libavutil_mem.c
@@ -0,0 +1,12 @@
+--- third_party/ffmpeg/libavutil/mem.c.orig 2019-03-15 06:40:46 UTC
++++ third_party/ffmpeg/libavutil/mem.c
+@@ -32,9 +32,6 @@
+ #include <stdint.h>
+ #include <stdlib.h>
+ #include <string.h>
+-#if HAVE_MALLOC_H
+-#include <malloc.h>
+-#endif
+
+ #include "avassert.h"
+ #include "avutil.h"
diff --git a/devel/electron4/files/patch-third__party_googletest_src_googletest_include_gtest_internal_gtest-port.h b/devel/electron4/files/patch-third__party_googletest_src_googletest_include_gtest_internal_gtest-port.h
new file mode 100644
index 000000000000..df91aba5ab2e
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_googletest_src_googletest_include_gtest_internal_gtest-port.h
@@ -0,0 +1,11 @@
+--- third_party/googletest/src/googletest/include/gtest/internal/gtest-port.h.orig 2019-03-15 06:40:20 UTC
++++ third_party/googletest/src/googletest/include/gtest/internal/gtest-port.h
+@@ -841,7 +841,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SE
+ (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
+
+ // Determines whether test results can be streamed to a socket.
+-#if GTEST_OS_LINUX
++#if GTEST_OS_LINUX || GTEST_OS_FREEBSD
+ # define GTEST_CAN_STREAM_RESULTS_ 1
+ #endif
+
diff --git a/devel/electron4/files/patch-third__party_googletest_src_googletest_src_gtest-port.cc b/devel/electron4/files/patch-third__party_googletest_src_googletest_src_gtest-port.cc
new file mode 100644
index 000000000000..263fcca64d13
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_googletest_src_googletest_src_gtest-port.cc
@@ -0,0 +1,43 @@
+--- third_party/googletest/src/googletest/src/gtest-port.cc.orig 2019-03-15 06:40:20 UTC
++++ third_party/googletest/src/googletest/src/gtest-port.cc
+@@ -52,6 +52,11 @@
+ # include <mach/vm_map.h>
+ #endif // GTEST_OS_MAC
+
++#if GTEST_OS_FREEBSD
++#include <sys/sysctl.h>
++#include <sys/user.h>
++#endif
++
+ #if GTEST_OS_QNX
+ # include <devctl.h>
+ # include <fcntl.h>
+@@ -126,6 +131,28 @@ size_t GetThreadCount() {
+ } else {
+ return 0;
+ }
++}
++
++#elif GTEST_OS_FREEBSD
++
++#define KP_NLWP(kp) (kp.ki_numthreads)
++
++// Return the number of threads running in the process, or 0 to indicate that
++// we cannot detect it.
++size_t GetThreadCount() {
++ int mib[] = {
++ CTL_KERN,
++ KERN_PROC,
++ KERN_PROC_PID,
++ getpid(),
++ };
++ u_int miblen = sizeof(mib) / sizeof(mib[0]);
++ struct kinfo_proc(info);
++ size_t size = sizeof(info);
++ if (sysctl(mib, miblen, &info, &size, NULL, 0)) {
++ return 0;
++ }
++ return KP_NLWP(info);
+ }
+
+ #elif GTEST_OS_QNX
diff --git a/devel/electron4/files/patch-third__party_googletest_src_googletest_src_gtest.cc b/devel/electron4/files/patch-third__party_googletest_src_googletest_src_gtest.cc
new file mode 100644
index 000000000000..5aa4ce19177e
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_googletest_src_googletest_src_gtest.cc
@@ -0,0 +1,10 @@
+--- third_party/googletest/src/googletest/src/gtest.cc.orig 2019-03-15 06:40:20 UTC
++++ third_party/googletest/src/googletest/src/gtest.cc
+@@ -128,6 +128,7 @@
+
+ #if GTEST_CAN_STREAM_RESULTS_
+ # include <arpa/inet.h> // NOLINT
++# include <sys/socket.h> // NOLINT
+ # include <netdb.h> // NOLINT
+ # include <sys/socket.h> // NOLINT
+ # include <sys/types.h> // NOLINT
diff --git a/devel/electron4/files/patch-third__party_leveldatabase_env__chromium.cc b/devel/electron4/files/patch-third__party_leveldatabase_env__chromium.cc
new file mode 100644
index 000000000000..5d81cd00e6f7
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_leveldatabase_env__chromium.cc
@@ -0,0 +1,14 @@
+--- third_party/leveldatabase/env_chromium.cc.orig 2019-03-15 06:38:20 UTC
++++ third_party/leveldatabase/env_chromium.cc
+@@ -38,7 +38,11 @@
+ #include "third_party/leveldatabase/chromium_logger.h"
+ #include "third_party/leveldatabase/leveldb_chrome.h"
+ #include "third_party/leveldatabase/src/include/leveldb/options.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ using base::FilePath;
+ using base::trace_event::MemoryAllocatorDump;
diff --git a/devel/electron4/files/patch-third__party_libXNVCtrl_NVCtrl.c b/devel/electron4/files/patch-third__party_libXNVCtrl_NVCtrl.c
new file mode 100644
index 000000000000..3e574a3ea88c
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_libXNVCtrl_NVCtrl.c
@@ -0,0 +1,25 @@
+--- third_party/libXNVCtrl/NVCtrl.c.orig 2019-03-15 06:26:36 UTC
++++ third_party/libXNVCtrl/NVCtrl.c
+@@ -27,10 +27,6 @@
+ * libXNVCtrl library properly protects the Display connection.
+ */
+
+-#if !defined(XTHREADS)
+-#define XTHREADS
+-#endif /* XTHREADS */
+-
+ #define NEED_EVENTS
+ #define NEED_REPLIES
+ #include <stdint.h>
+@@ -39,6 +35,11 @@
+ #include <X11/Xutil.h>
+ #include <X11/extensions/Xext.h>
+ #include <X11/extensions/extutil.h>
++
++#if !defined(XTHREADS)
++#define XTHREADS
++#endif /* XTHREADS */
++
+ #include "NVCtrlLib.h"
+ #include "nv_control.h"
+
diff --git a/devel/electron4/files/patch-third__party_libjingle__xmpp_task__runner_taskrunner.cc b/devel/electron4/files/patch-third__party_libjingle__xmpp_task__runner_taskrunner.cc
new file mode 100644
index 000000000000..33288be95e97
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_libjingle__xmpp_task__runner_taskrunner.cc
@@ -0,0 +1,11 @@
+--- third_party/libjingle_xmpp/task_runner/taskrunner.cc.orig 2019-03-15 06:38:20 UTC
++++ third_party/libjingle_xmpp/task_runner/taskrunner.cc
+@@ -95,7 +95,7 @@ void TaskRunner::InternalRunTasks(bool in_destructor)
+ std::vector<Task *>::iterator it;
+ it = std::remove(tasks_.begin(),
+ tasks_.end(),
+- reinterpret_cast<Task *>(NULL));
++ static_cast<Task *>(NULL));
+
+ tasks_.erase(it, tasks_.end());
+
diff --git a/devel/electron4/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_memory_singleton.h b/devel/electron4/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_memory_singleton.h
new file mode 100644
index 000000000000..64df6a6843c4
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_memory_singleton.h
@@ -0,0 +1,11 @@
+--- third_party/libphonenumber/dist/cpp/src/phonenumbers/base/memory/singleton.h.orig 2019-03-15 06:28:26 UTC
++++ third_party/libphonenumber/dist/cpp/src/phonenumbers/base/memory/singleton.h
+@@ -56,7 +56,7 @@ template <class T> boost::once_flag Singleton<T>::flag
+ #include "phonenumbers/base/logging.h"
+ #include "phonenumbers/base/thread_checker.h"
+
+-#if !defined(__linux__) && !defined(__APPLE__)
++#if !defined(__linux__) && !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__OpenBSD__)
+
+ namespace i18n {
+ namespace phonenumbers {
diff --git a/devel/electron4/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_synchronization_lock.h b/devel/electron4/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_synchronization_lock.h
new file mode 100644
index 000000000000..53f5bac82614
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_synchronization_lock.h
@@ -0,0 +1,11 @@
+--- third_party/libphonenumber/dist/cpp/src/phonenumbers/base/synchronization/lock.h.orig 2019-03-15 06:28:26 UTC
++++ third_party/libphonenumber/dist/cpp/src/phonenumbers/base/synchronization/lock.h
+@@ -37,7 +37,7 @@ typedef boost::mutex::scoped_lock AutoLock;
+ // Dummy lock implementation on non-POSIX platforms. If you are running on a
+ // different platform and care about thread-safety, please compile with
+ // -DI18N_PHONENUMBERS_USE_BOOST.
+-#if !defined(__linux__) && !defined(__APPLE__)
++#if !defined(__linux__) && !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__OpenBSD__)
+
+ namespace i18n {
+ namespace phonenumbers {
diff --git a/devel/electron4/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_thread__checker.h b/devel/electron4/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_thread__checker.h
new file mode 100644
index 000000000000..998d97206463
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_thread__checker.h
@@ -0,0 +1,19 @@
+--- third_party/libphonenumber/dist/cpp/src/phonenumbers/base/thread_checker.h.orig 2019-03-15 06:28:26 UTC
++++ third_party/libphonenumber/dist/cpp/src/phonenumbers/base/thread_checker.h
+@@ -23,6 +23,7 @@
+ // user of the library know that it can't be used in a thread-safe manner when
+ // it is not depending on Boost.
+ #if !defined(__linux__) && !defined(__APPLE__) && \
++ !defined(__FreeBSD__) && !defined(__OpenBSD__) && \
+ !defined(I18N_PHONENUMBERS_NO_THREAD_SAFETY)
+ #error Building without Boost, please provide \
+ -DI18N_PHONENUMBERS_NO_THREAD_SAFETY
+@@ -31,7 +32,7 @@
+ #endif
+
+ #if !defined(NDEBUG) && !defined(I18N_PHONENUMBERS_USE_BOOST) && \
+- (defined(__linux__) || defined(__apple__))
++ (defined(__linux__) || defined(__apple__)) || defined(__FreeBSD__) || defined(__OpenBSD__)
+
+ #include <pthread.h>
+
diff --git a/devel/electron4/files/patch-third__party_libyuv_include_libyuv_row.h b/devel/electron4/files/patch-third__party_libyuv_include_libyuv_row.h
new file mode 100644
index 000000000000..caf8e923fb29
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_libyuv_include_libyuv_row.h
@@ -0,0 +1,37 @@
+--- third_party/libyuv/include/libyuv/row.h.orig 2019-03-15 06:40:37 UTC
++++ third_party/libyuv/include/libyuv/row.h
+@@ -157,10 +157,14 @@ extern "C" {
+ #define HAS_ARGBSHADEROW_SSE2
+ #define HAS_ARGBSUBTRACTROW_SSE2
+ #define HAS_ARGBUNATTENUATEROW_SSE2
++#if !(defined(__i386__) && defined(__GNUC__))
+ #define HAS_BLENDPLANEROW_SSSE3
++#endif
+ #define HAS_COMPUTECUMULATIVESUMROW_SSE2
+ #define HAS_CUMULATIVESUMTOAVERAGEROW_SSE2
++#if !(defined(__i386__) && defined(__GNUC__))
+ #define HAS_INTERPOLATEROW_SSSE3
++#endif
+ #define HAS_RGBCOLORTABLEROW_X86
+ #define HAS_SOBELROW_SSE2
+ #define HAS_SOBELTOPLANEROW_SSE2
+@@ -206,7 +210,9 @@ extern "C" {
+ #define HAS_I422TORGB565ROW_AVX2
+ #define HAS_I422TORGBAROW_AVX2
+ #define HAS_I444TOARGBROW_AVX2
++#if !(defined(__i386__) && defined(__GNUC__))
+ #define HAS_INTERPOLATEROW_AVX2
++#endif
+ #define HAS_J422TOARGBROW_AVX2
+ #define HAS_MERGEUVROW_AVX2
+ #define HAS_MIRRORROW_AVX2
+@@ -231,7 +237,9 @@ extern "C" {
+ #define HAS_ARGBMULTIPLYROW_AVX2
+ #define HAS_ARGBSUBTRACTROW_AVX2
+ #define HAS_ARGBUNATTENUATEROW_AVX2
++#if !(defined(__i386__) && defined(__GNUC__))
+ #define HAS_BLENDPLANEROW_AVX2
++#endif
+
+ #if defined(__x86_64__) || !defined(__pic__) || defined(__clang__) || \
+ defined(_MSC_VER)
diff --git a/devel/electron4/files/patch-third__party_node_node.py b/devel/electron4/files/patch-third__party_node_node.py
new file mode 100644
index 000000000000..46a6aa460643
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_node_node.py
@@ -0,0 +1,10 @@
+--- third_party/node/node.py.orig 2019-03-15 06:26:37 UTC
++++ third_party/node/node.py
+@@ -12,6 +12,7 @@ import sys
+ def GetBinaryPath():
+ return os_path.join(os_path.dirname(__file__), *{
+ 'Darwin': ('mac', 'node-darwin-x64', 'bin', 'node'),
++ 'FreeBSD': ('freebsd', 'node-freebsd-x64', 'bin', 'node'),
+ 'Linux': ('linux', 'node-linux-x64', 'bin', 'node'),
+ 'Windows': ('win', 'node.exe'),
+ }[platform.system()])
diff --git a/devel/electron4/files/patch-third__party_pdfium_core_fxcrt_fx__system.h b/devel/electron4/files/patch-third__party_pdfium_core_fxcrt_fx__system.h
new file mode 100644
index 000000000000..f6ab540dd002
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_pdfium_core_fxcrt_fx__system.h
@@ -0,0 +1,11 @@
+--- third_party/pdfium/core/fxcrt/fx_system.h.orig 2019-03-15 06:29:29 UTC
++++ third_party/pdfium/core/fxcrt/fx_system.h
+@@ -41,7 +41,7 @@
+ #elif defined(_WIN64)
+ #define _FX_OS_ _FX_OS_WIN64_
+ #define _FX_PLATFORM_ _FX_PLATFORM_WINDOWS_
+-#elif defined(__linux__)
++#elif defined(__linux__) || defined(__FreeBSD__)
+ #define _FX_OS_ _FX_OS_LINUX_
+ #define _FX_PLATFORM_ _FX_PLATFORM_LINUX_
+ #elif defined(__APPLE__)
diff --git a/devel/electron4/files/patch-third__party_pdfium_core_fxge_fx__ge__linux.cpp b/devel/electron4/files/patch-third__party_pdfium_core_fxge_fx__ge__linux.cpp
new file mode 100644
index 000000000000..8586f9b4e087
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_pdfium_core_fxge_fx__ge__linux.cpp
@@ -0,0 +1,14 @@
+--- third_party/pdfium/core/fxge/fx_ge_linux.cpp.orig 2019-03-15 06:41:33 UTC
++++ third_party/pdfium/core/fxge/fx_ge_linux.cpp
+@@ -146,9 +146,8 @@ std::unique_ptr<SystemFontInfoIface> SystemFontInfoIfa
+ const char** pUserPaths) {
+ auto pInfo = pdfium::MakeUnique<CFX_LinuxFontInfo>();
+ if (!pInfo->ParseFontCfg(pUserPaths)) {
+- pInfo->AddPath("/usr/share/fonts");
+- pInfo->AddPath("/usr/share/X11/fonts/Type1");
+- pInfo->AddPath("/usr/share/X11/fonts/TTF");
++ pInfo->AddPath("/usr/local/share/fonts/Type1");
++ pInfo->AddPath("/usr/local/share/fonts/TTF");
+ pInfo->AddPath("/usr/local/share/fonts");
+ }
+ return std::move(pInfo);
diff --git a/devel/electron4/files/patch-third__party_pdfium_fxjs_cjs__publicmethods.cpp b/devel/electron4/files/patch-third__party_pdfium_fxjs_cjs__publicmethods.cpp
new file mode 100644
index 000000000000..4f9c980e4d52
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_pdfium_fxjs_cjs__publicmethods.cpp
@@ -0,0 +1,106 @@
+--- third_party/pdfium/fxjs/cjs_publicmethods.cpp.orig 2019-03-15 06:41:33 UTC
++++ third_party/pdfium/fxjs/cjs_publicmethods.cpp
+@@ -72,6 +72,103 @@ const wchar_t* const kFullMonths[] = {L"January", L"Fe
+ L"July", L"August", L"September",
+ L"October", L"November", L"December"};
+
++#if defined(__FreeBSD__)
++/*
++ * cvt.c - IEEE floating point formatting routines for FreeBSD
++ * from GNU libc-4.6.27
++ */
++
++/*
++ * ap_ecvt converts to decimal
++ * the number of digits is specified by ndigit
++ * decpt is set to the position of the decimal point
++ * sign is set to 0 for positive, 1 for negative
++ */
++
++#define NDIG 80
++
++static char *
++ ap_cvt(double arg, int ndigits, int *decpt, int *sign, int eflag)
++{
++ register int r2;
++ double fi, fj;
++ register char *p, *p1;
++ static char buf[NDIG];
++
++ if (ndigits >= NDIG - 1)
++ ndigits = NDIG - 2;
++ r2 = 0;
++ *sign = 0;
++ p = &buf[0];
++ if (arg < 0) {
++ *sign = 1;
++ arg = -arg;
++ }
++ arg = modf(arg, &fi);
++ p1 = &buf[NDIG];
++ /*
++ * Do integer part
++ */
++ if (fi != 0) {
++ p1 = &buf[NDIG];
++ while (fi != 0) {
++ fj = modf(fi / 10, &fi);
++ *--p1 = (int) ((fj + .03) * 10) + '0';
++ r2++;
++ }
++ while (p1 < &buf[NDIG])
++ *p++ = *p1++;
++ }
++ else if (arg > 0) {
++ while ((fj = arg * 10) < 1) {
++ arg = fj;
++ r2--;
++ }
++ }
++ p1 = &buf[ndigits];
++ if (eflag == 0)
++ p1 += r2;
++ *decpt = r2;
++ if (p1 < &buf[0]) {
++ buf[0] = '\0';
++ return (buf);
++ }
++ while (p <= p1 && p < &buf[NDIG]) {
++ arg *= 10;
++ arg = modf(arg, &fj);
++ *p++ = (int) fj + '0';
++ }
++ if (p1 >= &buf[NDIG]) {
++ buf[NDIG - 1] = '\0';
++ return (buf);
++ }
++ p = p1;
++ *p1 += 5;
++ while (*p1 > '9') {
++ *p1 = '0';
++ if (p1 > buf)
++ ++ * --p1;
++ else {
++ *p1 = '1';
++ (*decpt)++;
++ if (eflag == 0) {
++ if (p > buf)
++ *p = '0';
++ p++;
++ }
++ }
++ }
++ *p = '\0';
++ return (buf);
++}
++
++static char *
++ fcvt(double arg, int ndigits, int *decpt, int *sign)
++{
++ return (ap_cvt(arg, ndigits, decpt, sign, 0));
++}
++#endif // defined(__FreeBSD__)
++
+ template <typename T>
+ T StrTrim(const T& str) {
+ T result = str;
diff --git a/devel/electron4/files/patch-third__party_pdfium_fxjs_js__define.cpp b/devel/electron4/files/patch-third__party_pdfium_fxjs_js__define.cpp
new file mode 100644
index 000000000000..a38fdbf80d49
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_pdfium_fxjs_js__define.cpp
@@ -0,0 +1,22 @@
+--- third_party/pdfium/fxjs/js_define.cpp.orig 2019-03-15 06:41:33 UTC
++++ third_party/pdfium/fxjs/js_define.cpp
+@@ -23,6 +23,11 @@ double GetLocalTZA() {
+ return 0;
+ time_t t = 0;
+ time(&t);
++#ifdef __FreeBSD__
++ struct tm lt;
++ localtime_r(&t, &lt);
++ return (double)(-(lt.tm_gmtoff * 1000));
++#else
+ localtime(&t);
+ #if _FX_PLATFORM_ == _FX_PLATFORM_WINDOWS_
+ // In gcc 'timezone' is a global variable declared in time.h. In VC++, that
+@@ -31,6 +36,7 @@ double GetLocalTZA() {
+ _get_timezone(&timezone);
+ #endif // _FX_PLATFORM_ == _FX_PLATFORM_WINDOWS_
+ return (double)(-(timezone * 1000));
++#endif // __FreeBSD__
+ }
+
+ int GetDaylightSavingTA(double d) {
diff --git a/devel/electron4/files/patch-third__party_pdfium_third__party_base_logging.h b/devel/electron4/files/patch-third__party_pdfium_third__party_base_logging.h
new file mode 100644
index 000000000000..30adc593812f
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_pdfium_third__party_base_logging.h
@@ -0,0 +1,11 @@
+--- third_party/pdfium/third_party/base/logging.h.orig 2019-03-15 06:41:33 UTC
++++ third_party/pdfium/third_party/base/logging.h
+@@ -10,7 +10,7 @@
+
+ #ifndef _WIN32
+ #define NULL_DEREF_IF_POSSIBLE \
+- *(reinterpret_cast<volatile char*>(NULL) + 42) = 0x42;
++ *(reinterpret_cast<volatile char*>(__null) + 42) = 0x42;
+ #else
+ #define NULL_DEREF_IF_POSSIBLE
+ #endif
diff --git a/devel/electron4/files/patch-third__party_perfetto_include_perfetto_base_build__config.h b/devel/electron4/files/patch-third__party_perfetto_include_perfetto_base_build__config.h
new file mode 100644
index 000000000000..8bfa807479e3
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_perfetto_include_perfetto_base_build__config.h
@@ -0,0 +1,37 @@
+--- third_party/perfetto/include/perfetto/base/build_config.h.orig 2019-03-15 06:40:52 UTC
++++ third_party/perfetto/include/perfetto/base/build_config.h
+@@ -28,6 +28,7 @@
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 1
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MACOSX() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_FREEBSD() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WIN() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WASM() 0
+ #elif defined(__APPLE__)
+@@ -36,22 +37,25 @@
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WIN() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WASM() 0
+-#elif defined(__linux__)
++#elif defined(__linux__) || defined(__FreeBSD__)
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MACOSX() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 1
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_FREEBSD() 1
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WIN() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WASM() 0
+ #elif defined(_WIN32)
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MACOSX() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_FREEBSD() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WIN() 1
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WASM() 0
+ #elif defined(__EMSCRIPTEN__)
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MACOSX() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_FREEBSD() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WIN() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WASM() 1
+ #else
diff --git a/devel/electron4/files/patch-third__party_perfetto_include_perfetto_base_watchdog__posix.h b/devel/electron4/files/patch-third__party_perfetto_include_perfetto_base_watchdog__posix.h
new file mode 100644
index 000000000000..bfdd3e46f67e
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_perfetto_include_perfetto_base_watchdog__posix.h
@@ -0,0 +1,11 @@
+--- third_party/perfetto/include/perfetto/base/watchdog_posix.h.orig 2019-03-15 06:40:52 UTC
++++ third_party/perfetto/include/perfetto/base/watchdog_posix.h
+@@ -45,7 +45,7 @@ class Watchdog {
+ Timer(const Timer&) = delete;
+ Timer& operator=(const Timer&) = delete;
+
+- timer_t timerid_ = nullptr;
++ timer_t timerid_ = 0;
+ };
+ virtual ~Watchdog();
+
diff --git a/devel/electron4/files/patch-third__party_perfetto_src_base_unix__task__runner.cc b/devel/electron4/files/patch-third__party_perfetto_src_base_unix__task__runner.cc
new file mode 100644
index 000000000000..ab28f410bbe4
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_perfetto_src_base_unix__task__runner.cc
@@ -0,0 +1,11 @@
+--- third_party/perfetto/src/base/unix_task_runner.cc.orig 2019-03-15 06:40:54 UTC
++++ third_party/perfetto/src/base/unix_task_runner.cc
+@@ -45,7 +45,7 @@ UnixTaskRunner::UnixTaskRunner() {
+ control_read_.reset(pipe_fds[0]);
+ control_write_.reset(pipe_fds[1]);
+
+-#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX)
++#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) && !PERFETTO_BUILDFLAG(PERFETTO_OS_FREEBSD)
+ // We are never expecting to have more than a few bytes in the wake-up pipe.
+ // Reduce the buffer size on Linux. Note that this gets rounded up to the page
+ // size.
diff --git a/devel/electron4/files/patch-third__party_perfetto_src_tracing_core_tracing__service__impl.cc b/devel/electron4/files/patch-third__party_perfetto_src_tracing_core_tracing__service__impl.cc
new file mode 100644
index 000000000000..cc61c8455e48
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_perfetto_src_tracing_core_tracing__service__impl.cc
@@ -0,0 +1,12 @@
+--- third_party/perfetto/src/tracing/core/tracing_service_impl.cc.orig 2019-03-15 06:40:55 UTC
++++ third_party/perfetto/src/tracing/core/tracing_service_impl.cc
+@@ -1050,7 +1050,8 @@ void TracingServiceImpl::MaybeSnapshotClocks(
+ protos::ClockSnapshot* clock_snapshot = packet.mutable_clock_snapshot();
+
+ #if !PERFETTO_BUILDFLAG(PERFETTO_OS_MACOSX) && \
+- !PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
++ !PERFETTO_BUILDFLAG(PERFETTO_OS_WIN) && \
++ !PERFETTO_BUILDFLAG(PERFETTO_OS_FREEBSD)
+ struct {
+ clockid_t id;
+ protos::ClockSnapshot::Clock::Type type;
diff --git a/devel/electron4/files/patch-third__party_protobuf_src_google_protobuf_stubs_platform__macros.h b/devel/electron4/files/patch-third__party_protobuf_src_google_protobuf_stubs_platform__macros.h
new file mode 100644
index 000000000000..874b6fae9ed6
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_protobuf_src_google_protobuf_stubs_platform__macros.h
@@ -0,0 +1,11 @@
+--- third_party/protobuf/src/google/protobuf/stubs/platform_macros.h.orig 2019-03-15 06:38:22 UTC
++++ third_party/protobuf/src/google/protobuf/stubs/platform_macros.h
+@@ -114,7 +114,7 @@ GOOGLE_PROTOBUF_PLATFORM_ERROR
+
+ #undef GOOGLE_PROTOBUF_PLATFORM_ERROR
+
+-#if defined(GOOGLE_PROTOBUF_OS_ANDROID) || defined(GOOGLE_PROTOBUF_OS_IPHONE) || defined(__OpenBSD__)
++#if defined(GOOGLE_PROTOBUF_OS_ANDROID) || defined(GOOGLE_PROTOBUF_OS_IPHONE) || defined(__FreeBSD__)
+ // Android ndk does not support the __thread keyword very well yet. Here
+ // we use pthread_key_create()/pthread_getspecific()/... methods for
+ // TLS support on android.
diff --git a/devel/electron4/files/patch-third__party_sfntly_src_cpp_src_sfntly_table_core_cmap__table.cc b/devel/electron4/files/patch-third__party_sfntly_src_cpp_src_sfntly_table_core_cmap__table.cc
new file mode 100644
index 000000000000..a6062ddfd686
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_sfntly_src_cpp_src_sfntly_table_core_cmap__table.cc
@@ -0,0 +1,47 @@
+--- third_party/sfntly/src/cpp/src/sfntly/table/core/cmap_table.cc.orig 2019-03-15 06:29:31 UTC
++++ third_party/sfntly/src/cpp/src/sfntly/table/core/cmap_table.cc
+@@ -439,7 +439,7 @@ CMapTable::CMapFormat0::Builder::Builder(
+ }
+
+ CMapTable::CMapFormat0::Builder::Builder(const CMapId& cmap_id)
+- : CMap::Builder(reinterpret_cast<ReadableFontData*>(NULL),
++ : CMap::Builder(static_cast<ReadableFontData*>(NULL),
+ CMapFormat::kFormat0,
+ cmap_id) {
+ }
+@@ -563,7 +563,7 @@ CMapTable::CMapFormat2::Builder::Builder(WritableFontD
+ : CMapTable::CMap::Builder(data ? down_cast<WritableFontData*>(
+ data->Slice(offset, data->ReadUShort(
+ offset + Offset::kFormat0Length)))
+- : reinterpret_cast<WritableFontData*>(NULL),
++ : static_cast<WritableFontData*>(NULL),
+ CMapFormat::kFormat2, cmap_id) {
+ // TODO(arthurhsu): FIXIT: heavy lifting and leak, need fix.
+ }
+@@ -574,7 +574,7 @@ CMapTable::CMapFormat2::Builder::Builder(ReadableFontD
+ : CMapTable::CMap::Builder(data ? down_cast<ReadableFontData*>(
+ data->Slice(offset, data->ReadUShort(
+ offset + Offset::kFormat0Length)))
+- : reinterpret_cast<ReadableFontData*>(NULL),
++ : static_cast<ReadableFontData*>(NULL),
+ CMapFormat::kFormat2, cmap_id) {
+ // TODO(arthurhsu): FIXIT: heavy lifting and leak, need fix.
+ }
+@@ -958,7 +958,7 @@ CMapTable::CMapFormat4::Builder::Builder(WritableFontD
+ CMapTable::CMapFormat4::Builder::Builder(SegmentList* segments,
+ std::vector<int32_t>* glyph_id_array,
+ const CMapId& cmap_id)
+- : CMap::Builder(reinterpret_cast<ReadableFontData*>(NULL),
++ : CMap::Builder(static_cast<ReadableFontData*>(NULL),
+ CMapFormat::kFormat4, cmap_id),
+ segments_(segments->begin(), segments->end()),
+ glyph_id_array_(glyph_id_array->begin(), glyph_id_array->end()) {
+@@ -966,7 +966,7 @@ CMapTable::CMapFormat4::Builder::Builder(SegmentList*
+ }
+
+ CMapTable::CMapFormat4::Builder::Builder(const CMapId& cmap_id)
+- : CMap::Builder(reinterpret_cast<ReadableFontData*>(NULL),
++ : CMap::Builder(static_cast<ReadableFontData*>(NULL),
+ CMapFormat::kFormat4, cmap_id) {
+ }
+
diff --git a/devel/electron4/files/patch-third__party_skia_src_core_SkCpu.cpp b/devel/electron4/files/patch-third__party_skia_src_core_SkCpu.cpp
new file mode 100644
index 000000000000..aecee950ad5c
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_skia_src_core_SkCpu.cpp
@@ -0,0 +1,19 @@
+--- third_party/skia/src/core/SkCpu.cpp.orig 2019-03-15 06:31:12 UTC
++++ third_party/skia/src/core/SkCpu.cpp
+@@ -74,6 +74,8 @@
+ #include <sys/auxv.h>
+
+ static uint32_t read_cpu_features() {
++return 0;
++#if 0
+ const uint32_t kHWCAP_CRC32 = (1<< 7),
+ kHWCAP_ASIMDHP = (1<<10);
+
+@@ -82,6 +84,7 @@
+ if (hwcaps & kHWCAP_CRC32 ) { features |= SkCpu::CRC32; }
+ if (hwcaps & kHWCAP_ASIMDHP) { features |= SkCpu::ASIMDHP; }
+ return features;
++#endif
+ }
+
+ #elif defined(SK_CPU_ARM32) && __has_include(<sys/auxv.h>) && \
diff --git a/devel/electron4/files/patch-third__party_skia_src_gpu_GrAutoLocaleSetter.h b/devel/electron4/files/patch-third__party_skia_src_gpu_GrAutoLocaleSetter.h
new file mode 100644
index 000000000000..13c8ea76b41e
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_skia_src_gpu_GrAutoLocaleSetter.h
@@ -0,0 +1,11 @@
+--- third_party/skia/src/gpu/GrAutoLocaleSetter.h.orig 2019-03-15 06:31:12 UTC
++++ third_party/skia/src/gpu/GrAutoLocaleSetter.h
+@@ -27,7 +27,7 @@
+ #define HAVE_XLOCALE 0
+ #endif
+
+-#if defined(SK_BUILD_FOR_ANDROID) || defined(__UCLIBC__) || defined(_NEWLIB_VERSION)
++#if defined(SK_BUILD_FOR_ANDROID) || defined(__UCLIBC__) || defined(_NEWLIB_VERSION) || defined(__FreeBSD__)
+ #define HAVE_LOCALE_T 0
+ #else
+ #define HAVE_LOCALE_T 1
diff --git a/devel/electron4/files/patch-third__party_skia_src_images_SkJpegEncoder.cpp b/devel/electron4/files/patch-third__party_skia_src_images_SkJpegEncoder.cpp
new file mode 100644
index 000000000000..4e55952fe38d
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_skia_src_images_SkJpegEncoder.cpp
@@ -0,0 +1,41 @@
+--- third_party/skia/src/images/SkJpegEncoder.cpp.orig 2019-03-15 06:41:36 UTC
++++ third_party/skia/src/images/SkJpegEncoder.cpp
+@@ -77,9 +77,14 @@ bool SkJpegEncoderMgr::setParams(const SkImageInfo& sr
+ return transform_scanline_to_premul_legacy;
+ };
+
++#ifdef JCS_EXTENSIONS
+ J_COLOR_SPACE jpegColorType = JCS_EXT_RGBA;
++#else
++ J_COLOR_SPACE jpegColorType = JCS_RGB;
++#endif
+ int numComponents = 0;
+ switch (srcInfo.colorType()) {
++#ifdef JCS_EXTENSIONS
+ case kRGBA_8888_SkColorType:
+ fProc = chooseProc8888();
+ jpegColorType = JCS_EXT_RGBA;
+@@ -90,6 +95,7 @@ bool SkJpegEncoderMgr::setParams(const SkImageInfo& sr
+ jpegColorType = JCS_EXT_BGRA;
+ numComponents = 4;
+ break;
++#endif
+ case kRGB_565_SkColorType:
+ fProc = transform_scanline_565;
+ jpegColorType = JCS_RGB;
+@@ -109,6 +115,7 @@ bool SkJpegEncoderMgr::setParams(const SkImageInfo& sr
+ jpegColorType = JCS_GRAYSCALE;
+ numComponents = 1;
+ break;
++#ifdef JCS_EXTENSIONS
+ case kRGBA_F16_SkColorType:
+ if (!srcInfo.colorSpace()) {
+ return false;
+@@ -124,6 +131,7 @@ bool SkJpegEncoderMgr::setParams(const SkImageInfo& sr
+ jpegColorType = JCS_EXT_RGBA;
+ numComponents = 4;
+ break;
++#endif
+ default:
+ return false;
+ }
diff --git a/devel/electron4/files/patch-third__party_skia_src_opts_SkRasterPipeline__opts.h b/devel/electron4/files/patch-third__party_skia_src_opts_SkRasterPipeline__opts.h
new file mode 100644
index 000000000000..cdfbea65bb96
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_skia_src_opts_SkRasterPipeline__opts.h
@@ -0,0 +1,20 @@
+--- third_party/skia/src/opts/SkRasterPipeline_opts.h.orig 2019-03-15 06:41:36 UTC
++++ third_party/skia/src/opts/SkRasterPipeline_opts.h
+@@ -657,7 +657,7 @@ SI F approx_powf(F x, F y) {
+ }
+
+ SI F from_half(U16 h) {
+-#if defined(__aarch64__) && !defined(SK_BUILD_FOR_GOOGLE3) // Temporary workaround for some Google3 builds.
++#if defined(JUMPER_IS_NEON) && defined(__aarch64__) && !defined(SK_BUILD_FOR_GOOGLE3) // Temporary workaround for some Google3 builds.
+ return vcvt_f32_f16(h);
+
+ #elif defined(JUMPER_IS_HSW) || defined(JUMPER_IS_AVX512)
+@@ -677,7 +677,7 @@ SI F from_half(U16 h) {
+ }
+
+ SI U16 to_half(F f) {
+-#if defined(__aarch64__) && !defined(SK_BUILD_FOR_GOOGLE3) // Temporary workaround for some Google3 builds.
++#if defined(JUMPER_IS_NEON) && defined(__aarch64__) && !defined(SK_BUILD_FOR_GOOGLE3) // Temporary workaround for some Google3 builds.
+ return vcvt_f16_f32(f);
+
+ #elif defined(JUMPER_IS_HSW) || defined(JUMPER_IS_AVX512)
diff --git a/devel/electron4/files/patch-third__party_skia_src_ports_SkFontHost__FreeType.cpp b/devel/electron4/files/patch-third__party_skia_src_ports_SkFontHost__FreeType.cpp
new file mode 100644
index 000000000000..183f141d6406
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_skia_src_ports_SkFontHost__FreeType.cpp
@@ -0,0 +1,77 @@
+--- third_party/skia/src/ports/SkFontHost_FreeType.cpp.orig 2019-03-15 06:41:36 UTC
++++ third_party/skia/src/ports/SkFontHost_FreeType.cpp
+@@ -112,8 +112,6 @@ class FreeTypeLibrary : SkNoncopyable { (public)
+ : fGetVarDesignCoordinates(nullptr)
+ , fGetVarAxisFlags(nullptr)
+ , fLibrary(nullptr)
+- , fIsLCDSupported(false)
+- , fLCDExtra(0)
+ {
+ if (FT_New_Library(&gFTMemory, &fLibrary)) {
+ return;
+@@ -173,12 +171,7 @@ class FreeTypeLibrary : SkNoncopyable { (public)
+ }
+ #endif
+
+- // Setup LCD filtering. This reduces color fringes for LCD smoothed glyphs.
+- // The default has changed over time, so this doesn't mean the same thing to all users.
+- if (FT_Library_SetLcdFilter(fLibrary, FT_LCD_FILTER_DEFAULT) == 0) {
+- fIsLCDSupported = true;
+- fLCDExtra = 2; //Using a filter adds one full pixel to each side.
+- }
++ FT_Library_SetLcdFilter(fLibrary, FT_LCD_FILTER_DEFAULT);
+ }
+ ~FreeTypeLibrary() {
+ if (fLibrary) {
+@@ -187,8 +180,6 @@ class FreeTypeLibrary : SkNoncopyable { (public)
+ }
+
+ FT_Library library() { return fLibrary; }
+- bool isLCDSupported() { return fIsLCDSupported; }
+- int lcdExtra() { return fLCDExtra; }
+
+ // FT_Get_{MM,Var}_{Blend,Design}_Coordinates were added in FreeType 2.7.1.
+ // Prior to this there was no way to get the coordinates out of the FT_Face.
+@@ -205,8 +196,6 @@ class FreeTypeLibrary : SkNoncopyable { (public)
+
+ private:
+ FT_Library fLibrary;
+- bool fIsLCDSupported;
+- int fLCDExtra;
+
+ // FT_Library_SetLcdFilterWeights was introduced in FreeType 2.4.0.
+ // The following platforms provide FreeType of at least 2.4.0.
+@@ -704,17 +693,6 @@ void SkTypeface_FreeType::onFilterRec(SkScalerContextR
+ rec->fTextSize = SkIntToScalar(1 << 14);
+ }
+
+- if (isLCD(*rec)) {
+- // TODO: re-work so that FreeType is set-up and selected by the SkFontMgr.
+- SkAutoMutexAcquire ama(gFTMutex);
+- ref_ft_library();
+- if (!gFTLibrary->isLCDSupported()) {
+- // If the runtime Freetype library doesn't support LCD, disable it here.
+- rec->fMaskFormat = SkMask::kA8_Format;
+- }
+- unref_ft_library();
+- }
+-
+ SkPaint::Hinting h = rec->getHinting();
+ if (SkPaint::kFull_Hinting == h && !isLCD(*rec)) {
+ // collapse full->normal hinting if we're not doing LCD
+@@ -1109,11 +1087,11 @@ bool SkScalerContext_FreeType::getCBoxForLetter(char l
+ void SkScalerContext_FreeType::updateGlyphIfLCD(SkGlyph* glyph) {
+ if (isLCD(fRec)) {
+ if (fLCDIsVert) {
+- glyph->fHeight += gFTLibrary->lcdExtra();
+- glyph->fTop -= gFTLibrary->lcdExtra() >> 1;
++ glyph->fHeight += 2;
++ glyph->fTop -= 1;
+ } else {
+- glyph->fWidth += gFTLibrary->lcdExtra();
+- glyph->fLeft -= gFTLibrary->lcdExtra() >> 1;
++ glyph->fWidth += 2;
++ glyph->fLeft -= 1;
+ }
+ }
+ }
diff --git a/devel/electron4/files/patch-third__party_skia_src_ports_SkOSFile__stdio.cpp b/devel/electron4/files/patch-third__party_skia_src_ports_SkOSFile__stdio.cpp
new file mode 100644
index 000000000000..d7a6d0d3adff
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_skia_src_ports_SkOSFile__stdio.cpp
@@ -0,0 +1,11 @@
+--- third_party/skia/src/ports/SkOSFile_stdio.cpp.orig 2019-03-15 06:41:36 UTC
++++ third_party/skia/src/ports/SkOSFile_stdio.cpp
+@@ -129,7 +129,7 @@ void sk_fflush(FILE* f) {
+
+ void sk_fsync(FILE* f) {
+ #if !defined(_WIN32) && !defined(SK_BUILD_FOR_ANDROID) && !defined(__UCLIBC__) \
+- && !defined(_NEWLIB_VERSION)
++ && !defined(_NEWLIB_VERSION) && !defined(__FreeBSD__)
+ int fd = fileno(f);
+ fsync(fd);
+ #endif
diff --git a/devel/electron4/files/patch-third__party_skia_src_sksl_SkSLString.h b/devel/electron4/files/patch-third__party_skia_src_sksl_SkSLString.h
new file mode 100644
index 000000000000..0006ccd1e37b
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_skia_src_sksl_SkSLString.h
@@ -0,0 +1,11 @@
+--- third_party/skia/src/sksl/SkSLString.h.orig 2019-03-15 06:41:36 UTC
++++ third_party/skia/src/sksl/SkSLString.h
+@@ -22,6 +22,8 @@
+ #include "SkString.h"
+ #endif
+
++#include <stdarg.h>
++
+ namespace SkSL {
+
+ // Represents a (not necessarily null-terminated) slice of a string.
diff --git a/devel/electron4/files/patch-third__party_skia_third__party_vulkanmemoryallocator_include_vk__mem__alloc.h b/devel/electron4/files/patch-third__party_skia_third__party_vulkanmemoryallocator_include_vk__mem__alloc.h
new file mode 100644
index 000000000000..17906c15830c
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_skia_third__party_vulkanmemoryallocator_include_vk__mem__alloc.h
@@ -0,0 +1,11 @@
+--- third_party/skia/third_party/vulkanmemoryallocator/include/vk_mem_alloc.h.orig 2019-03-16 09:15:20 UTC
++++ third_party/skia/third_party/vulkanmemoryallocator/include/vk_mem_alloc.h
+@@ -2232,7 +2232,7 @@ remove them if not needed.
+ #include <mutex> // for std::mutex
+ #include <atomic> // for std::atomic
+
+-#if !defined(_WIN32) && !defined(__APPLE__)
++#if !defined(_WIN32) && !defined(__APPLE__) && !defined(__FreeBSD__)
+ #include <malloc.h> // for aligned_alloc()
+ #endif
+
diff --git a/devel/electron4/files/patch-third__party_sqlite_BUILD.gn b/devel/electron4/files/patch-third__party_sqlite_BUILD.gn
new file mode 100644
index 000000000000..3407106ed016
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_sqlite_BUILD.gn
@@ -0,0 +1,11 @@
+--- third_party/sqlite/BUILD.gn.orig 2019-03-16 09:15:21 UTC
++++ third_party/sqlite/BUILD.gn
+@@ -240,7 +240,7 @@ config("sqlite_warnings") {
+ ]
+ }
+ }
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ cflags += [
+ # SQLite doesn't believe in compiler warnings, preferring testing.
+ # http://www.sqlite.org/faq.html#q17
diff --git a/devel/electron4/files/patch-third__party_swiftshader_BUILD.gn b/devel/electron4/files/patch-third__party_swiftshader_BUILD.gn
new file mode 100644
index 000000000000..bfbc8dbee204
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_swiftshader_BUILD.gn
@@ -0,0 +1,10 @@
+--- third_party/swiftshader/BUILD.gn.orig 2019-03-15 06:41:56 UTC
++++ third_party/swiftshader/BUILD.gn
+@@ -100,7 +100,6 @@ config("swiftshader_config") {
+
+ if (is_linux) {
+ ldflags = [
+- "-Wl,--hash-style=both",
+ "-Wl,--gc-sections",
+ ]
+
diff --git a/devel/electron4/files/patch-third__party_swiftshader_src_Common_Configurator.cpp b/devel/electron4/files/patch-third__party_swiftshader_src_Common_Configurator.cpp
new file mode 100644
index 000000000000..81635f9b4123
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_swiftshader_src_Common_Configurator.cpp
@@ -0,0 +1,12 @@
+--- third_party/swiftshader/src/Common/Configurator.cpp.orig 2019-03-15 06:41:56 UTC
++++ third_party/swiftshader/src/Common/Configurator.cpp
+@@ -42,6 +42,9 @@ namespace sw
+
+ bool Configurator::readFile()
+ {
++#if defined(__FreeBSD__)
++ return false;
++#endif
+ #if defined(__unix__)
+ if(access(path.c_str(), R_OK) != 0)
+ {
diff --git a/devel/electron4/files/patch-third__party_swiftshader_src_Common_MutexLock.hpp b/devel/electron4/files/patch-third__party_swiftshader_src_Common_MutexLock.hpp
new file mode 100644
index 000000000000..77b5638046b7
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_swiftshader_src_Common_MutexLock.hpp
@@ -0,0 +1,11 @@
+--- third_party/swiftshader/src/Common/MutexLock.hpp.orig 2019-03-15 06:41:56 UTC
++++ third_party/swiftshader/src/Common/MutexLock.hpp
+@@ -17,7 +17,7 @@
+
+ #include "Thread.hpp"
+
+-#if defined(__linux__)
++#if defined(__linux__) || defined(__FreeBSD__)
+ // Use a pthread mutex on Linux. Since many processes may use SwiftShader
+ // at the same time it's best to just have the scheduler overhead.
+ #include <pthread.h>
diff --git a/devel/electron4/files/patch-third__party_swiftshader_src_Common_SharedLibrary.hpp b/devel/electron4/files/patch-third__party_swiftshader_src_Common_SharedLibrary.hpp
new file mode 100644
index 000000000000..dfaf60d07695
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_swiftshader_src_Common_SharedLibrary.hpp
@@ -0,0 +1,11 @@
+--- third_party/swiftshader/src/Common/SharedLibrary.hpp.orig 2019-03-15 06:41:56 UTC
++++ third_party/swiftshader/src/Common/SharedLibrary.hpp
+@@ -115,7 +115,7 @@ void *loadLibrary(const std::string &libraryDirectory,
+
+ inline void *getLibraryHandle(const char *path)
+ {
+- #ifdef __ANDROID__
++ #if defined( __ANDROID__) || defined(__FreeBSD__)
+ // bionic doesn't support RTLD_NOLOAD before L
+ return dlopen(path, RTLD_NOW | RTLD_LOCAL);
+ #else
diff --git a/devel/electron4/files/patch-third__party_swiftshader_src_Main_SwiftConfig.cpp b/devel/electron4/files/patch-third__party_swiftshader_src_Main_SwiftConfig.cpp
new file mode 100644
index 000000000000..c96dff8a3c90
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_swiftshader_src_Main_SwiftConfig.cpp
@@ -0,0 +1,14 @@
+--- third_party/swiftshader/src/Main/SwiftConfig.cpp.orig 2019-03-15 06:41:56 UTC
++++ third_party/swiftshader/src/Main/SwiftConfig.cpp
+@@ -762,7 +762,11 @@ namespace sw
+ struct stat status;
+ int lastModified = ini.getInteger("LastModified", "Time", 0);
+
++#if !defined(__FreeBSD__)
+ bool noConfig = stat("SwiftShader.ini", &status) != 0;
++#else
++ bool noConfig = false;
++#endif
+ newConfig = !noConfig && abs((int)status.st_mtime - lastModified) > 1;
+
+ if(disableServerOverride)
diff --git a/devel/electron4/files/patch-third__party_swiftshader_src_OpenGL_libEGL_libEGL.cpp b/devel/electron4/files/patch-third__party_swiftshader_src_OpenGL_libEGL_libEGL.cpp
new file mode 100644
index 000000000000..5573e799090b
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_swiftshader_src_OpenGL_libEGL_libEGL.cpp
@@ -0,0 +1,29 @@
+--- third_party/swiftshader/src/OpenGL/libEGL/libEGL.cpp.orig 2019-03-15 06:41:56 UTC
++++ third_party/swiftshader/src/OpenGL/libEGL/libEGL.cpp
+@@ -119,7 +119,7 @@ EGLDisplay GetDisplay(EGLNativeDisplayType display_id)
+ // FIXME: Check if display_id is the default display
+ }
+
+- #if defined(__linux__) && !defined(__ANDROID__)
++ #if (defined(__linux__) || defined(__FreeBSD)) && !defined(__ANDROID__)
+ #if defined(USE_X11)
+ if(!libX11)
+ #endif // Non X11 linux is headless only
+@@ -178,7 +178,7 @@ const char *QueryString(EGLDisplay dpy, EGLint name)
+ {
+ return success(
+ "EGL_KHR_client_get_all_proc_addresses "
+-#if defined(__linux__) && !defined(__ANDROID__)
++#if (defined(__linux__) || defined(__FreeBSD__)) && !defined(__ANDROID__)
+ "EGL_KHR_platform_gbm "
+ #endif
+ #if defined(USE_X11)
+@@ -1172,7 +1172,7 @@ EGLDisplay GetPlatformDisplayEXT(EGLenum platform, voi
+ {
+ TRACE("(EGLenum platform = 0x%X, void *native_display = %p, const EGLint *attrib_list = %p)", platform, native_display, attrib_list);
+
+- #if defined(__linux__) && !defined(__ANDROID__)
++ #if (defined(__linux__) || defined(__FreeBSD__)) && !defined(__ANDROID__)
+ switch(platform)
+ {
+ #if defined(USE_X11)
diff --git a/devel/electron4/files/patch-third__party_swiftshader_src_OpenGL_libEGL_libEGL.hpp b/devel/electron4/files/patch-third__party_swiftshader_src_OpenGL_libEGL_libEGL.hpp
new file mode 100644
index 000000000000..638f09a578b5
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_swiftshader_src_OpenGL_libEGL_libEGL.hpp
@@ -0,0 +1,11 @@
+--- third_party/swiftshader/src/OpenGL/libEGL/libEGL.hpp.orig 2019-03-15 06:41:56 UTC
++++ third_party/swiftshader/src/OpenGL/libEGL/libEGL.hpp
+@@ -100,7 +100,7 @@ class LibEGL (private)
+ #endif
+ #elif defined(__ANDROID__)
+ const char *libEGL_lib[] = {"libEGL_swiftshader.so", "libEGL_swiftshader.so"};
+- #elif defined(__linux__)
++ #elif defined(__linux__) || defined(__FreeBSD__)
+ #if defined(__LP64__)
+ const char *libEGL_lib[] = {"lib64EGL_translator.so", "libEGL.so.1", "libEGL.so"};
+ #else
diff --git a/devel/electron4/files/patch-third__party_swiftshader_src_OpenGL_libGLES__CM_libGLES__CM.hpp b/devel/electron4/files/patch-third__party_swiftshader_src_OpenGL_libGLES__CM_libGLES__CM.hpp
new file mode 100644
index 000000000000..6fa9fab484bd
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_swiftshader_src_OpenGL_libGLES__CM_libGLES__CM.hpp
@@ -0,0 +1,11 @@
+--- third_party/swiftshader/src/OpenGL/libGLES_CM/libGLES_CM.hpp.orig 2019-03-15 06:41:56 UTC
++++ third_party/swiftshader/src/OpenGL/libGLES_CM/libGLES_CM.hpp
+@@ -261,7 +261,7 @@ class LibGLES_CM (private)
+ #endif
+ #elif defined(__ANDROID__)
+ const char *libGLES_CM_lib[] = {"libGLESv1_CM_swiftshader.so", "libGLESv1_CM_swiftshader.so"};
+- #elif defined(__linux__)
++ #elif defined(__linux__) || defined(__FreeBSD__)
+ #if defined(__LP64__)
+ const char *libGLES_CM_lib[] = {"lib64GLES_CM_translator.so", "libGLES_CM.so.1", "libGLES_CM.so"};
+ #else
diff --git a/devel/electron4/files/patch-third__party_swiftshader_src_OpenGL_libGLESv2_libGLESv2.hpp b/devel/electron4/files/patch-third__party_swiftshader_src_OpenGL_libGLESv2_libGLESv2.hpp
new file mode 100644
index 000000000000..01f956f6a603
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_swiftshader_src_OpenGL_libGLESv2_libGLESv2.hpp
@@ -0,0 +1,11 @@
+--- third_party/swiftshader/src/OpenGL/libGLESv2/libGLESv2.hpp.orig 2019-03-15 06:41:56 UTC
++++ third_party/swiftshader/src/OpenGL/libGLESv2/libGLESv2.hpp
+@@ -286,7 +286,7 @@ class LibGLESv2 (private)
+ #endif
+ #elif defined(__ANDROID__)
+ const char *libGLESv2_lib[] = {"libGLESv2_swiftshader.so", "libGLESv2_swiftshader.so"};
+- #elif defined(__linux__)
++ #elif defined(__linux__) || defined(__FreeBSD__)
+ #if defined(__LP64__)
+ const char *libGLESv2_lib[] = {"lib64GLES_V2_translator.so", "libGLESv2.so.2", "libGLESv2.so"};
+ #else
diff --git a/devel/electron4/files/patch-third__party_swiftshader_third__party_llvm-subzero_build_Linux_include_llvm_Config_config.h b/devel/electron4/files/patch-third__party_swiftshader_third__party_llvm-subzero_build_Linux_include_llvm_Config_config.h
new file mode 100644
index 000000000000..11d911e663ad
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_swiftshader_third__party_llvm-subzero_build_Linux_include_llvm_Config_config.h
@@ -0,0 +1,29 @@
+--- third_party/swiftshader/third_party/llvm-subzero/build/Linux/include/llvm/Config/config.h.orig 2019-03-15 06:30:14 UTC
++++ third_party/swiftshader/third_party/llvm-subzero/build/Linux/include/llvm/Config/config.h
+@@ -121,7 +121,7 @@
+ #define HAVE_LINK_H 1
+
+ /* Define to 1 if you have the `lseek64' function. */
+-#define HAVE_LSEEK64 1
++/* #undef HAVE_LSEEK64 */
+
+ /* Define to 1 if you have the <mach/mach.h> header file. */
+ /* #undef HAVE_MACH_MACH_H */
+@@ -130,7 +130,7 @@
+ /* #undef HAVE_MALLCTL */
+
+ /* Define to 1 if you have the `mallinfo' function. */
+-#define HAVE_MALLINFO 1
++/* #undef HAVE_MALLINFO */
+
+ /* Define to 1 if you have the <malloc.h> header file. */
+ #define HAVE_MALLOC_H 1
+@@ -154,7 +154,7 @@
+ /* #undef HAVE_NDIR_H */
+
+ /* Define to 1 if you have the `posix_fallocate' function. */
+-#define HAVE_POSIX_FALLOCATE 1
++/* #undef HAVE_POSIX_FALLOCATE */
+
+ /* Define to 1 if you have the `posix_spawn' function. */
+ #define HAVE_POSIX_SPAWN 1
diff --git a/devel/electron4/files/patch-third__party_swiftshader_third__party_llvm-subzero_lib_Support_Unix_Process.inc b/devel/electron4/files/patch-third__party_swiftshader_third__party_llvm-subzero_lib_Support_Unix_Process.inc
new file mode 100644
index 000000000000..98bb3bcfd5d9
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_swiftshader_third__party_llvm-subzero_lib_Support_Unix_Process.inc
@@ -0,0 +1,11 @@
+--- third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc.orig 2019-03-15 06:30:14 UTC
++++ third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc
+@@ -35,7 +35,7 @@
+ // DragonFlyBSD, OpenBSD, and Bitrig have deprecated <malloc.h> for
+ // <stdlib.h> instead. Unix.h includes this for us already.
+ #if defined(HAVE_MALLOC_H) && !defined(__DragonFly__) && \
+- !defined(__OpenBSD__) && !defined(__Bitrig__)
++ !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__Bitrig__)
+ #include <malloc.h>
+ #endif
+ #if defined(HAVE_MALLCTL)
diff --git a/devel/electron4/files/patch-third__party_usrsctp_BUILD.gn b/devel/electron4/files/patch-third__party_usrsctp_BUILD.gn
new file mode 100644
index 000000000000..39b9266d5b93
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_usrsctp_BUILD.gn
@@ -0,0 +1,20 @@
+--- third_party/usrsctp/BUILD.gn.orig 2019-03-15 06:26:39 UTC
++++ third_party/usrsctp/BUILD.gn
+@@ -116,11 +116,16 @@ static_library("usrsctp") {
+ "-UINET6",
+ ]
+
+- if (is_linux || is_android) {
++ if ((is_linux && !is_bsd) || is_android ) {
+ defines += [
+ "__Userspace_os_Linux",
+ "_GNU_SOURCE",
+ ]
++ } else if (is_bsd) {
++ defines += [
++ "__Userspace_os_FreeBSD",
++ ]
++ cflags += [ "-U__FreeBSD__" ]
+ } else if (is_mac || is_ios) {
+ defines += [
+ "HAVE_SA_LEN",
diff --git a/devel/electron4/files/patch-third__party_webrtc_BUILD.gn b/devel/electron4/files/patch-third__party_webrtc_BUILD.gn
new file mode 100644
index 000000000000..c33559a7e7bf
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_BUILD.gn
@@ -0,0 +1,12 @@
+--- third_party/webrtc/BUILD.gn.orig 2019-03-15 06:42:00 UTC
++++ third_party/webrtc/BUILD.gn
+@@ -132,6 +132,9 @@ config("common_inherited_config") {
+ if (is_linux) {
+ defines += [ "WEBRTC_LINUX" ]
+ }
++ if (is_bsd) {
++ defines += [ "WEBRTC_BSD" ]
++ }
+ if (is_mac) {
+ defines += [ "WEBRTC_MAC" ]
+ }
diff --git a/devel/electron4/files/patch-third__party_webrtc_modules_audio__device_BUILD.gn b/devel/electron4/files/patch-third__party_webrtc_modules_audio__device_BUILD.gn
new file mode 100644
index 000000000000..7b2b791b6e1c
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_modules_audio__device_BUILD.gn
@@ -0,0 +1,11 @@
+--- third_party/webrtc/modules/audio_device/BUILD.gn.orig 2019-03-15 06:42:01 UTC
++++ third_party/webrtc/modules/audio_device/BUILD.gn
+@@ -331,7 +331,7 @@ rtc_source_set("audio_device_impl") {
+ if (rtc_use_dummy_audio_file_devices) {
+ defines += [ "WEBRTC_DUMMY_FILE_DEVICES" ]
+ } else {
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ sources += [
+ "linux/alsasymboltable_linux.cc",
+ "linux/alsasymboltable_linux.h",
diff --git a/devel/electron4/files/patch-third__party_webrtc_modules_rtp__rtcp_source_forward__error__correction.cc b/devel/electron4/files/patch-third__party_webrtc_modules_rtp__rtcp_source_forward__error__correction.cc
new file mode 100644
index 000000000000..2aaca46a6d00
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_modules_rtp__rtcp_source_forward__error__correction.cc
@@ -0,0 +1,10 @@
+--- third_party/webrtc/modules/rtp_rtcp/source/forward_error_correction.cc.orig 2019-03-15 06:42:01 UTC
++++ third_party/webrtc/modules/rtp_rtcp/source/forward_error_correction.cc
+@@ -13,6 +13,7 @@
+ #include <string.h>
+
+ #include <algorithm>
++#include <cstdlib>
+ #include <iterator>
+ #include <utility>
+
diff --git a/devel/electron4/files/patch-third__party_webrtc_rtc__base_BUILD.gn b/devel/electron4/files/patch-third__party_webrtc_rtc__base_BUILD.gn
new file mode 100644
index 000000000000..0d9424e1f857
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_rtc__base_BUILD.gn
@@ -0,0 +1,20 @@
+--- third_party/webrtc/rtc_base/BUILD.gn.orig 2019-03-15 06:42:01 UTC
++++ third_party/webrtc/rtc_base/BUILD.gn
+@@ -907,8 +907,6 @@ rtc_static_library("rtc_base_generic") {
+
+ if (rtc_use_x11) {
+ libs += [
+- "dl",
+- "rt",
+ "Xext",
+ "X11",
+ "Xcomposite",
+@@ -916,7 +914,7 @@ rtc_static_library("rtc_base_generic") {
+ ]
+ }
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ libs += [
+ "dl",
+ "rt",
diff --git a/devel/electron4/files/patch-third__party_webrtc_rtc__base_byteorder.h b/devel/electron4/files/patch-third__party_webrtc_rtc__base_byteorder.h
new file mode 100644
index 000000000000..10805aa87dfb
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_rtc__base_byteorder.h
@@ -0,0 +1,11 @@
+--- third_party/webrtc/rtc_base/byteorder.h.orig 2019-03-15 06:42:01 UTC
++++ third_party/webrtc/rtc_base/byteorder.h
+@@ -79,7 +79,7 @@
+ #error WEBRTC_ARCH_BIG_ENDIAN or WEBRTC_ARCH_LITTLE_ENDIAN must be defined.
+ #endif // defined(WEBRTC_ARCH_LITTLE_ENDIAN)
+ #elif defined(WEBRTC_POSIX)
+-#include <endian.h>
++#include <sys/endian.h>
+ #endif
+
+ namespace rtc {
diff --git a/devel/electron4/files/patch-third__party_webrtc_rtc__base_httpcommon.cc b/devel/electron4/files/patch-third__party_webrtc_rtc__base_httpcommon.cc
new file mode 100644
index 000000000000..e921dff4ac1e
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_rtc__base_httpcommon.cc
@@ -0,0 +1,11 @@
+--- third_party/webrtc/rtc_base/httpcommon.cc.orig 2019-03-15 06:42:01 UTC
++++ third_party/webrtc/rtc_base/httpcommon.cc
+@@ -459,7 +459,7 @@ bool HttpDateToSeconds(const std::string& date, time_t
+ }
+ // TODO: Android should support timezone, see b/2441195
+ #if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID) || \
+- defined(BSD)
++ defined(WEBRTC_BSD)
+ tm* tm_for_timezone = localtime(&gmt);
+ *seconds = gmt + tm_for_timezone->tm_gmtoff;
+ #else
diff --git a/devel/electron4/files/patch-third__party_webrtc_rtc__base_ifaddrs__converter.h b/devel/electron4/files/patch-third__party_webrtc_rtc__base_ifaddrs__converter.h
new file mode 100644
index 000000000000..d236fc85709e
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_rtc__base_ifaddrs__converter.h
@@ -0,0 +1,11 @@
+--- third_party/webrtc/rtc_base/ifaddrs_converter.h.orig 2019-03-15 06:42:01 UTC
++++ third_party/webrtc/rtc_base/ifaddrs_converter.h
+@@ -14,6 +14,8 @@
+ #if defined(WEBRTC_ANDROID)
+ #include "rtc_base/ifaddrs-android.h"
+ #else
++#include <sys/types.h>
++#include <sys/socket.h>
+ #include <ifaddrs.h>
+ #endif // WEBRTC_ANDROID
+
diff --git a/devel/electron4/files/patch-third__party_webrtc_rtc__base_ipaddress.h b/devel/electron4/files/patch-third__party_webrtc_rtc__base_ipaddress.h
new file mode 100644
index 000000000000..326f5f7f696b
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_rtc__base_ipaddress.h
@@ -0,0 +1,13 @@
+--- third_party/webrtc/rtc_base/ipaddress.h.orig 2019-03-15 06:42:01 UTC
++++ third_party/webrtc/rtc_base/ipaddress.h
+@@ -17,6 +17,10 @@
+ #include <netinet/in.h>
+ #include <sys/socket.h>
+ #endif
++#if defined(WEBRTC_BSD)
++#include <sys/types.h>
++#include <sys/socket.h>
++#endif
+ #if defined(WEBRTC_WIN)
+ #include <winsock2.h>
+ #include <ws2tcpip.h>
diff --git a/devel/electron4/files/patch-third__party_webrtc_rtc__base_network.cc b/devel/electron4/files/patch-third__party_webrtc_rtc__base_network.cc
new file mode 100644
index 000000000000..4a37e57af788
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_rtc__base_network.cc
@@ -0,0 +1,29 @@
+--- third_party/webrtc/rtc_base/network.cc.orig 2019-03-15 06:42:01 UTC
++++ third_party/webrtc/rtc_base/network.cc
+@@ -14,7 +14,7 @@
+ // linux/if.h can't be included at the same time as the posix sys/if.h, and
+ // it's transitively required by linux/route.h, so include that version on
+ // linux instead of the standard posix one.
+-#if defined(WEBRTC_LINUX)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_BSD)
+ #include <linux/if.h>
+ #include <linux/route.h>
+ #elif !defined(__native_client__)
+@@ -764,7 +764,7 @@ bool BasicNetworkManager::CreateNetworks(bool include_
+ }
+ #endif // WEBRTC_WIN
+
+-#if defined(WEBRTC_LINUX)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_BSD)
+ bool IsDefaultRoute(const std::string& network_name) {
+ FileStream fs;
+ if (!fs.Open("/proc/net/route", "r", nullptr)) {
+@@ -805,7 +805,7 @@ bool BasicNetworkManager::IsIgnoredNetwork(const Netwo
+ strncmp(network.name().c_str(), "vboxnet", 7) == 0) {
+ return true;
+ }
+-#if defined(WEBRTC_LINUX)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_BSD)
+ // Make sure this is a default route, if we're ignoring non-defaults.
+ if (ignore_non_default_routes_ && !IsDefaultRoute(network.name())) {
+ return true;
diff --git a/devel/electron4/files/patch-third__party_webrtc_rtc__base_network.h b/devel/electron4/files/patch-third__party_webrtc_rtc__base_network.h
new file mode 100644
index 000000000000..f405694e5721
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_rtc__base_network.h
@@ -0,0 +1,13 @@
+--- third_party/webrtc/rtc_base/network.h.orig 2019-03-15 06:42:01 UTC
++++ third_party/webrtc/rtc_base/network.h
+@@ -24,6 +24,10 @@
+ #include "rtc_base/networkmonitor.h"
+ #include "rtc_base/sigslot.h"
+
++#if defined(WEBRTC_BSD)
++#include <sys/types.h>
++#endif
++
+ #if defined(WEBRTC_POSIX)
+ struct ifaddrs;
+ #endif // defined(WEBRTC_POSIX)
diff --git a/devel/electron4/files/patch-third__party_webrtc_rtc__base_physicalsocketserver.cc b/devel/electron4/files/patch-third__party_webrtc_rtc__base_physicalsocketserver.cc
new file mode 100644
index 000000000000..9af2699fa32e
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_rtc__base_physicalsocketserver.cc
@@ -0,0 +1,56 @@
+--- third_party/webrtc/rtc_base/physicalsocketserver.cc.orig 2019-03-15 06:42:01 UTC
++++ third_party/webrtc/rtc_base/physicalsocketserver.cc
+@@ -67,7 +67,7 @@ typedef void* SockOptArg;
+
+ #endif // WEBRTC_POSIX
+
+-#if defined(WEBRTC_POSIX) && !defined(WEBRTC_MAC) && !defined(__native_client__)
++#if defined(WEBRTC_POSIX) && !defined(WEBRTC_MAC) && !defined(WEBRTC_BSD) && !defined(__native_client__)
+
+ int64_t GetSocketRecvTimestamp(int socket) {
+ struct timeval tv_ioctl;
+@@ -295,7 +295,7 @@ int PhysicalSocket::GetOption(Option opt, int* value)
+ socklen_t optlen = sizeof(*value);
+ int ret = ::getsockopt(s_, slevel, sopt, (SockOptArg)value, &optlen);
+ if (ret != -1 && opt == OPT_DONTFRAGMENT) {
+-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) && !defined(WEBRTC_BSD)
+ *value = (*value != IP_PMTUDISC_DONT) ? 1 : 0;
+ #endif
+ }
+@@ -308,7 +308,7 @@ int PhysicalSocket::SetOption(Option opt, int value) {
+ if (TranslateOption(opt, &slevel, &sopt) == -1)
+ return -1;
+ if (opt == OPT_DONTFRAGMENT) {
+-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) && !defined(WEBRTC_BSD)
+ value = (value) ? IP_PMTUDISC_DO : IP_PMTUDISC_DONT;
+ #endif
+ }
+@@ -318,7 +318,7 @@ int PhysicalSocket::SetOption(Option opt, int value) {
+ int PhysicalSocket::Send(const void* pv, size_t cb) {
+ int sent = DoSend(
+ s_, reinterpret_cast<const char*>(pv), static_cast<int>(cb),
+-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) && !defined(WEBRTC_BSD)
+ // Suppress SIGPIPE. Without this, attempting to send on a socket whose
+ // other end is closed will result in a SIGPIPE signal being raised to
+ // our process, which by default will terminate the process, which we
+@@ -347,7 +347,7 @@ int PhysicalSocket::SendTo(const void* buffer,
+ size_t len = addr.ToSockAddrStorage(&saddr);
+ int sent =
+ DoSendTo(s_, static_cast<const char*>(buffer), static_cast<int>(length),
+-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) && !defined(WEBRTC_BSD)
+ // Suppress SIGPIPE. See above for explanation.
+ MSG_NOSIGNAL,
+ #else
+@@ -538,7 +538,7 @@ int PhysicalSocket::TranslateOption(Option opt, int* s
+ *slevel = IPPROTO_IP;
+ *sopt = IP_DONTFRAGMENT;
+ break;
+-#elif defined(WEBRTC_MAC) || defined(BSD) || defined(__native_client__)
++#elif defined(WEBRTC_MAC) || defined(WEBRTC_BSD) || defined(__native_client__)
+ RTC_LOG(LS_WARNING) << "Socket::OPT_DONTFRAGMENT not supported.";
+ return -1;
+ #elif defined(WEBRTC_POSIX)
diff --git a/devel/electron4/files/patch-third__party_webrtc_rtc__base_physicalsocketserver.h b/devel/electron4/files/patch-third__party_webrtc_rtc__base_physicalsocketserver.h
new file mode 100644
index 000000000000..b18898ad4cfb
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_rtc__base_physicalsocketserver.h
@@ -0,0 +1,11 @@
+--- third_party/webrtc/rtc_base/physicalsocketserver.h.orig 2019-03-15 06:42:01 UTC
++++ third_party/webrtc/rtc_base/physicalsocketserver.h
+@@ -11,7 +11,7 @@
+ #ifndef RTC_BASE_PHYSICALSOCKETSERVER_H_
+ #define RTC_BASE_PHYSICALSOCKETSERVER_H_
+
+-#if defined(WEBRTC_POSIX) && defined(WEBRTC_LINUX)
++#if defined(WEBRTC_POSIX) && defined(WEBRTC_LINUX) && !defined(WEBRTC_BSD)
+ #include <sys/epoll.h>
+ #define WEBRTC_USE_EPOLL 1
+ #endif
diff --git a/devel/electron4/files/patch-third__party_webrtc_rtc__base_platform__thread.cc b/devel/electron4/files/patch-third__party_webrtc_rtc__base_platform__thread.cc
new file mode 100644
index 000000000000..3b822e535384
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_rtc__base_platform__thread.cc
@@ -0,0 +1,12 @@
+--- third_party/webrtc/rtc_base/platform_thread.cc.orig 2019-03-15 06:42:01 UTC
++++ third_party/webrtc/rtc_base/platform_thread.cc
+@@ -15,7 +15,9 @@
+ #include "rtc_base/timeutils.h"
+
+ #if defined(WEBRTC_LINUX)
++#if !defined(__FreeBSD__)
+ #include <sys/prctl.h>
++#endif
+ #include <sys/syscall.h>
+ #endif
+
diff --git a/devel/electron4/files/patch-third__party_webrtc_rtc__base_platform__thread__types.cc b/devel/electron4/files/patch-third__party_webrtc_rtc__base_platform__thread__types.cc
new file mode 100644
index 000000000000..d0f8365b95dd
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_rtc__base_platform__thread__types.cc
@@ -0,0 +1,40 @@
+--- third_party/webrtc/rtc_base/platform_thread_types.cc.orig 2019-03-15 06:30:53 UTC
++++ third_party/webrtc/rtc_base/platform_thread_types.cc
+@@ -11,7 +11,9 @@
+ #include "rtc_base/platform_thread_types.h"
+
+ #if defined(WEBRTC_LINUX)
++#if !defined(__FreeBSD__)
+ #include <sys/prctl.h>
++#endif
+ #include <sys/syscall.h>
+ #endif
+
+@@ -27,8 +29,10 @@ PlatformThreadId CurrentThreadId() {
+ return gettid();
+ #elif defined(WEBRTC_FUCHSIA)
+ return zx_thread_self();
+-#elif defined(WEBRTC_LINUX)
++#elif defined(WEBRTC_LINUX) && !defined(__FreeBSD__)
+ return syscall(__NR_gettid);
++#elif defined(__FreeBSD__)
++ return reinterpret_cast<uint64_t>(pthread_self());
+ #else
+ // Default implementation for nacl and solaris.
+ return reinterpret_cast<pid_t>(pthread_self());
+@@ -55,6 +59,7 @@ bool IsThreadRefEqual(const PlatformThreadRef& a, cons
+ }
+
+ void SetCurrentThreadName(const char* name) {
++#if !defined(__FreeBSD__)
+ #if defined(WEBRTC_WIN)
+ struct {
+ DWORD dwType;
+@@ -72,6 +77,7 @@ void SetCurrentThreadName(const char* name) {
+ prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(name)); // NOLINT
+ #elif defined(WEBRTC_MAC) || defined(WEBRTC_IOS)
+ pthread_setname_np(name);
++#endif
+ #endif
+ }
+
diff --git a/devel/electron4/files/patch-third__party_webrtc_rtc__base_stringutils.h b/devel/electron4/files/patch-third__party_webrtc_rtc__base_stringutils.h
new file mode 100644
index 000000000000..49896b83d015
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_rtc__base_stringutils.h
@@ -0,0 +1,17 @@
+--- third_party/webrtc/rtc_base/stringutils.h.orig 2019-03-15 06:42:01 UTC
++++ third_party/webrtc/rtc_base/stringutils.h
+@@ -24,11 +24,11 @@
+ #endif // WEBRTC_WIN
+
+ #if defined(WEBRTC_POSIX)
+-#ifdef BSD
++#if defined(WEBRTC_BSD) || defined(BSD)
+ #include <stdlib.h>
+-#else // BSD
++#else // WEBRTC_BSD
+ #include <alloca.h>
+-#endif // !BSD
++#endif // !WEBRTC_BSD
+ #endif // WEBRTC_POSIX
+
+ #include <string>
diff --git a/devel/electron4/files/patch-third__party_webrtc_system__wrappers_BUILD.gn b/devel/electron4/files/patch-third__party_webrtc_system__wrappers_BUILD.gn
new file mode 100644
index 000000000000..705c548fb8ea
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_system__wrappers_BUILD.gn
@@ -0,0 +1,11 @@
+--- third_party/webrtc/system_wrappers/BUILD.gn.orig 2019-03-15 06:42:01 UTC
++++ third_party/webrtc/system_wrappers/BUILD.gn
+@@ -75,8 +75,6 @@ rtc_static_library("system_wrappers") {
+ if (!build_with_chromium) {
+ deps += [ ":cpu_features_linux" ]
+ }
+-
+- libs += [ "rt" ]
+ }
+
+ if (is_ios || is_mac) {
diff --git a/devel/electron4/files/patch-third__party_webrtc_webrtc.gni b/devel/electron4/files/patch-third__party_webrtc_webrtc.gni
new file mode 100644
index 000000000000..c27fafce71e3
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_webrtc_webrtc.gni
@@ -0,0 +1,11 @@
+--- third_party/webrtc/webrtc.gni.orig 2019-03-15 06:42:01 UTC
++++ third_party/webrtc/webrtc.gni
+@@ -206,7 +206,7 @@ rtc_libvpx_dir = "//third_party/libvpx"
+ rtc_opus_dir = "//third_party/opus"
+
+ # Desktop capturer is supported only on Windows, OSX and Linux.
+-rtc_desktop_capture_supported = is_win || is_mac || (is_linux && rtc_use_x11)
++rtc_desktop_capture_supported = is_win || is_mac || ((is_linux && rtc_use_x11) && !is_bsd)
+
+ ###############################################################################
+ # Templates
diff --git a/devel/electron4/files/patch-third__party_yasm_BUILD.gn b/devel/electron4/files/patch-third__party_yasm_BUILD.gn
new file mode 100644
index 000000000000..89e999d65f98
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_yasm_BUILD.gn
@@ -0,0 +1,16 @@
+--- third_party/yasm/BUILD.gn.orig 2019-03-15 06:38:25 UTC
++++ third_party/yasm/BUILD.gn
+@@ -60,7 +60,12 @@ if (current_toolchain == host_toolchain) {
+ # x86insn_nasm.c. These files were previously generated during the build but
+ # are now shipped pre-generated by yasm.
+ yasm_gen_include_dir = "$target_gen_dir/gen_include"
+- config_makefile = "source/config/Makefile"
++ # Hack for all BSD derivatives use OpenBSD include directory
++ if (is_bsd) {
++ config_makefile = "source/config/openbsd/Makefile"
++ } else {
++ config_makefile = "source/config/$host_os/Makefile"
++ }
+ version_file = "version.mac"
+
+ import("//build/compiled_action.gni")
diff --git a/devel/electron4/files/patch-third__party_zlib_BUILD.gn b/devel/electron4/files/patch-third__party_zlib_BUILD.gn
new file mode 100644
index 000000000000..c0a5cf7644b7
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_zlib_BUILD.gn
@@ -0,0 +1,20 @@
+--- third_party/zlib/BUILD.gn.orig 2019-03-15 06:38:25 UTC
++++ third_party/zlib/BUILD.gn
+@@ -68,7 +68,7 @@ config("zlib_arm_crc32_config") {
+ if (is_android) {
+ defines += [ "ARMV8_OS_ANDROID" ]
+ } else if (is_linux || is_chromeos) {
+- defines += [ "ARMV8_OS_LINUX" ]
++# defines += [ "ARMV8_OS_LINUX" ]
+ }
+ }
+ }
+@@ -327,7 +327,7 @@ static_library("minizip") {
+ ]
+ }
+
+- if (is_mac || is_ios || is_android || is_nacl) {
++ if (is_mac || is_ios || is_android || is_nacl || is_bsd) {
+ # Mac, Android and the BSDs don't have fopen64, ftello64, or fseeko64. We
+ # use fopen, ftell, and fseek instead on these systems.
+ defines = [ "USE_FILE32API" ]
diff --git a/devel/electron4/files/patch-third__party_zlib_arm__features.c b/devel/electron4/files/patch-third__party_zlib_arm__features.c
new file mode 100644
index 000000000000..ba73caed182c
--- /dev/null
+++ b/devel/electron4/files/patch-third__party_zlib_arm__features.c
@@ -0,0 +1,29 @@
+--- third_party/zlib/arm_features.c.orig 2019-03-15 06:38:25 UTC
++++ third_party/zlib/arm_features.c
+@@ -16,12 +16,13 @@
+ #include <asm/hwcap.h>
+ #include <sys/auxv.h>
+ #else
+-#error ### No ARM CPU features detection in your platform/OS
++/* #error ### No ARM CPU features detection in your platform/OS */
+ #endif
+
+ int ZLIB_INTERNAL arm_cpu_enable_crc32 = 0;
+ int ZLIB_INTERNAL arm_cpu_enable_pmull = 0;
+
++#ifdef ARMV8_OS_LINUX
+ static pthread_once_t cpu_check_inited_once = PTHREAD_ONCE_INIT;
+
+ static void init_arm_features(void)
+@@ -53,8 +54,11 @@ static void init_arm_features(void)
+ if (capabilities & flag_pmull)
+ arm_cpu_enable_pmull = 1;
+ }
++#endif
+
+ void ZLIB_INTERNAL arm_check_features(void)
+ {
++#ifdef ARMV8_OS_LINUX
+ pthread_once(&cpu_check_inited_once, init_arm_features);
++#endif
+ }
diff --git a/devel/electron4/files/patch-tools_gn_bootstrap_bootstrap.py b/devel/electron4/files/patch-tools_gn_bootstrap_bootstrap.py
new file mode 100644
index 000000000000..21c900e659dd
--- /dev/null
+++ b/devel/electron4/files/patch-tools_gn_bootstrap_bootstrap.py
@@ -0,0 +1,20 @@
+--- tools/gn/bootstrap/bootstrap.py.orig 2019-03-15 06:38:26 UTC
++++ tools/gn/bootstrap/bootstrap.py
+@@ -71,8 +71,6 @@ def main(argv):
+ '--no-last-commit-position',
+ '--out-path=' + gn_build_dir,
+ ]
+- if not options.with_sysroot:
+- cmd.append('--no-sysroot')
+ if options.debug:
+ cmd.append('--debug')
+ subprocess.check_call(cmd)
+@@ -81,6 +79,8 @@ def main(argv):
+ os.path.join(BOOTSTRAP_DIR, 'last_commit_position.h'), gn_build_dir)
+ subprocess.check_call(
+ ['ninja', '-C', gn_build_dir, 'gn', '-w', 'dupbuild=err'])
++ subprocess.check_call(
++ ['ninja', '-C', gn_build_dir, 'gn_unittests', '-w', 'dupbuild=err'])
+ shutil.copy2(os.path.join(gn_build_dir, 'gn'), gn_path)
+
+ gn_gen_args = options.gn_gen_args or ''
diff --git a/devel/electron4/files/patch-tools_json__schema__compiler_feature__compiler.py b/devel/electron4/files/patch-tools_json__schema__compiler_feature__compiler.py
new file mode 100644
index 000000000000..605bac419cf5
--- /dev/null
+++ b/devel/electron4/files/patch-tools_json__schema__compiler_feature__compiler.py
@@ -0,0 +1,10 @@
+--- tools/json_schema_compiler/feature_compiler.py.orig 2019-03-15 06:38:26 UTC
++++ tools/json_schema_compiler/feature_compiler.py
+@@ -205,6 +205,7 @@ FEATURE_GRAMMAR = (
+ 'enum_map': {
+ 'chromeos': 'Feature::CHROMEOS_PLATFORM',
+ 'linux': 'Feature::LINUX_PLATFORM',
++ 'bsd': 'Feature::LINUX_PLATFORM',
+ 'mac': 'Feature::MACOSX_PLATFORM',
+ 'win': 'Feature::WIN_PLATFORM',
+ }
diff --git a/devel/electron4/files/patch-tools_json__schema__compiler_model.py b/devel/electron4/files/patch-tools_json__schema__compiler_model.py
new file mode 100644
index 000000000000..ba410a564759
--- /dev/null
+++ b/devel/electron4/files/patch-tools_json__schema__compiler_model.py
@@ -0,0 +1,11 @@
+--- tools/json_schema_compiler/model.py.orig 2019-03-15 06:26:40 UTC
++++ tools/json_schema_compiler/model.py
+@@ -602,7 +602,7 @@ class Platforms(object):
+ """
+ CHROMEOS = _PlatformInfo("chromeos")
+ CHROMEOS_TOUCH = _PlatformInfo("chromeos_touch")
+- LINUX = _PlatformInfo("linux")
++ LINUX = _PlatformInfo("bsd")
+ MAC = _PlatformInfo("mac")
+ WIN = _PlatformInfo("win")
+
diff --git a/devel/electron4/files/patch-tools_perf_chrome__telemetry__build_BUILD.gn b/devel/electron4/files/patch-tools_perf_chrome__telemetry__build_BUILD.gn
new file mode 100644
index 000000000000..31950f5648a9
--- /dev/null
+++ b/devel/electron4/files/patch-tools_perf_chrome__telemetry__build_BUILD.gn
@@ -0,0 +1,11 @@
+--- tools/perf/chrome_telemetry_build/BUILD.gn.orig 2019-03-15 06:38:26 UTC
++++ tools/perf/chrome_telemetry_build/BUILD.gn
+@@ -44,7 +44,7 @@ group("telemetry_chrome_test") {
+ data_deps += [ "//chrome:reorder_imports" ]
+ }
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ data_deps += [ "//third_party/breakpad:dump_syms($host_toolchain)" ]
+ }
+
diff --git a/devel/electron4/files/patch-tools_variations_fieldtrial__to__struct.py b/devel/electron4/files/patch-tools_variations_fieldtrial__to__struct.py
new file mode 100644
index 000000000000..efaf20b67755
--- /dev/null
+++ b/devel/electron4/files/patch-tools_variations_fieldtrial__to__struct.py
@@ -0,0 +1,10 @@
+--- tools/variations/fieldtrial_to_struct.py.orig 2019-03-15 06:26:43 UTC
++++ tools/variations/fieldtrial_to_struct.py
+@@ -24,6 +24,7 @@ finally:
+ _platforms = [
+ 'android',
+ 'android_webview',
++ 'freebsd',
+ 'chromeos',
+ 'fuchsia',
+ 'ios',
diff --git a/devel/electron4/files/patch-ui_base_dragdrop_os__exchange__data__provider__factory.cc b/devel/electron4/files/patch-ui_base_dragdrop_os__exchange__data__provider__factory.cc
new file mode 100644
index 000000000000..398daaa0da94
--- /dev/null
+++ b/devel/electron4/files/patch-ui_base_dragdrop_os__exchange__data__provider__factory.cc
@@ -0,0 +1,20 @@
+--- ui/base/dragdrop/os_exchange_data_provider_factory.cc.orig 2019-03-15 06:26:43 UTC
++++ ui/base/dragdrop/os_exchange_data_provider_factory.cc
+@@ -8,7 +8,7 @@
+
+ #if defined(USE_X11)
+ #include "ui/base/dragdrop/os_exchange_data_provider_aurax11.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/base/dragdrop/os_exchange_data_provider_aura.h"
+ #elif defined(OS_MACOSX)
+ #include "ui/base/dragdrop/os_exchange_data_provider_builder_mac.h"
+@@ -42,7 +42,7 @@ OSExchangeDataProviderFactory::CreateProvider() {
+
+ #if defined(USE_X11)
+ return std::make_unique<OSExchangeDataProviderAuraX11>();
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return std::make_unique<OSExchangeDataProviderAura>();
+ #elif defined(OS_MACOSX)
+ return ui::BuildOSExchangeDataProviderMac();
diff --git a/devel/electron4/files/patch-ui_base_ime_ime__engine__handler__interface.h b/devel/electron4/files/patch-ui_base_ime_ime__engine__handler__interface.h
new file mode 100644
index 000000000000..1b5d84d6e7f5
--- /dev/null
+++ b/devel/electron4/files/patch-ui_base_ime_ime__engine__handler__interface.h
@@ -0,0 +1,11 @@
+--- ui/base/ime/ime_engine_handler_interface.h.orig 2019-03-15 06:38:27 UTC
++++ ui/base/ime/ime_engine_handler_interface.h
+@@ -162,7 +162,7 @@ class UI_BASE_IME_EXPORT IMEEngineHandlerInterface {
+ // Hides the input view window (from API call).
+ virtual void HideInputView() = 0;
+
+-#elif defined(OS_LINUX) || defined(OS_WIN)
++#elif defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+
+ // Get the id of the IME extension.
+ virtual std::string GetExtensionId() const = 0;
diff --git a/devel/electron4/files/patch-ui_base_ime_input__method__initializer.cc b/devel/electron4/files/patch-ui_base_ime_input__method__initializer.cc
new file mode 100644
index 000000000000..c1d1849078d2
--- /dev/null
+++ b/devel/electron4/files/patch-ui_base_ime_input__method__initializer.cc
@@ -0,0 +1,38 @@
+--- ui/base/ime/input_method_initializer.cc.orig 2019-03-15 06:26:43 UTC
++++ ui/base/ime/input_method_initializer.cc
+@@ -8,7 +8,7 @@
+
+ #if defined(OS_CHROMEOS)
+ #include "ui/base/ime/ime_bridge.h"
+-#elif defined(USE_AURA) && defined(OS_LINUX)
++#elif defined(USE_AURA) && (defined(OS_LINUX) || defined(OS_BSD))
+ #include "base/logging.h"
+ #include "ui/base/ime/linux/fake_input_method_context_factory.h"
+ #elif defined(OS_WIN)
+@@ -18,7 +18,7 @@
+
+ namespace {
+
+-#if !defined(OS_CHROMEOS) && defined(USE_AURA) && defined(OS_LINUX)
++#if !defined(OS_CHROMEOS) && defined(USE_AURA) && (defined(OS_LINUX) || defined(OS_BSD))
+ const ui::LinuxInputMethodContextFactory*
+ g_linux_input_method_context_factory_for_testing;
+ #endif
+@@ -46,7 +46,7 @@ void ShutdownInputMethod() {
+ void InitializeInputMethodForTesting() {
+ #if defined(OS_CHROMEOS)
+ IMEBridge::Initialize();
+-#elif defined(USE_AURA) && defined(OS_LINUX)
++#elif defined(USE_AURA) && (defined(OS_LINUX) || defined(OS_BSD))
+ if (!g_linux_input_method_context_factory_for_testing)
+ g_linux_input_method_context_factory_for_testing =
+ new FakeInputMethodContextFactory();
+@@ -67,7 +67,7 @@ void InitializeInputMethodForTesting() {
+ void ShutdownInputMethodForTesting() {
+ #if defined(OS_CHROMEOS)
+ IMEBridge::Shutdown();
+-#elif defined(USE_AURA) && defined(OS_LINUX)
++#elif defined(USE_AURA) && (defined(OS_LINUX) || defined(OS_BSD))
+ const LinuxInputMethodContextFactory* factory =
+ LinuxInputMethodContextFactory::instance();
+ CHECK(!factory || factory == g_linux_input_method_context_factory_for_testing)
diff --git a/devel/electron4/files/patch-ui_base_resource_resource__bundle.cc b/devel/electron4/files/patch-ui_base_resource_resource__bundle.cc
new file mode 100644
index 000000000000..2676a9494f09
--- /dev/null
+++ b/devel/electron4/files/patch-ui_base_resource_resource__bundle.cc
@@ -0,0 +1,20 @@
+--- ui/base/resource/resource_bundle.cc.orig 2019-03-15 06:38:27 UTC
++++ ui/base/resource/resource_bundle.cc
+@@ -720,7 +720,7 @@ void ResourceBundle::ReloadFonts() {
+ }
+
+ ScaleFactor ResourceBundle::GetMaxScaleFactor() const {
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ return max_scale_factor_;
+ #else
+ return GetSupportedScaleFactors().back();
+@@ -766,7 +766,7 @@ void ResourceBundle::InitSharedInstance(Delegate* dele
+ // On platforms other than iOS, 100P is always a supported scale factor.
+ // For Windows we have a separate case in this function.
+ supported_scale_factors.push_back(SCALE_FACTOR_100P);
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ supported_scale_factors.push_back(SCALE_FACTOR_200P);
+ #endif
+ #endif
diff --git a/devel/electron4/files/patch-ui_base_resource_resource__bundle__freebsd.cc b/devel/electron4/files/patch-ui_base_resource_resource__bundle__freebsd.cc
new file mode 100644
index 000000000000..7e8a1a3ff7dc
--- /dev/null
+++ b/devel/electron4/files/patch-ui_base_resource_resource__bundle__freebsd.cc
@@ -0,0 +1,24 @@
+--- ui/base/resource/resource_bundle_freebsd.cc.orig 2019-03-16 09:18:33 UTC
++++ ui/base/resource/resource_bundle_freebsd.cc
+@@ -0,0 +1,21 @@
++// Copyright 2017 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "ui/base/resource/resource_bundle.h"
++
++#include "base/logging.h"
++#include "base/macros.h"
++#include "ui/gfx/image/image.h"
++
++namespace ui {
++
++void ResourceBundle::LoadCommonResources() {
++ LoadChromeResources();
++}
++
++gfx::Image& ResourceBundle::GetNativeImageNamed(int resource_id) {
++ return GetImageNamed(resource_id);
++}
++
++} // namespace ui
diff --git a/devel/electron4/files/patch-ui_base_ui__base__features.cc b/devel/electron4/files/patch-ui_base_ui__base__features.cc
new file mode 100644
index 000000000000..4fc705e86fe1
--- /dev/null
+++ b/devel/electron4/files/patch-ui_base_ui__base__features.cc
@@ -0,0 +1,20 @@
+--- ui/base/ui_base_features.cc.orig 2019-03-16 09:15:20 UTC
++++ ui/base/ui_base_features.cc
+@@ -120,7 +120,7 @@ const base::Feature kPrecisionTouchpadScrollPhase{
+ "PrecisionTouchpadScrollPhase", base::FEATURE_ENABLED_BY_DEFAULT};
+ #endif // defined(OS_WIN)
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ // Enables stylus appearing as touch when in contact with digitizer.
+ const base::Feature kDirectManipulationStylus = {
+ "DirectManipulationStylus",
+@@ -130,7 +130,7 @@ const base::Feature kDirectManipulationStylus = {
+ base::FEATURE_DISABLED_BY_DEFAULT
+ #endif
+ };
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ const base::Feature kMash = {"Mash", base::FEATURE_DISABLED_BY_DEFAULT};
+
diff --git a/devel/electron4/files/patch-ui_base_ui__base__features.h b/devel/electron4/files/patch-ui_base_ui__base__features.h
new file mode 100644
index 000000000000..228bed5866e8
--- /dev/null
+++ b/devel/electron4/files/patch-ui_base_ui__base__features.h
@@ -0,0 +1,14 @@
+--- ui/base/ui_base_features.h.orig 2019-03-15 06:38:27 UTC
++++ ui/base/ui_base_features.h
+@@ -43,9 +43,9 @@ UI_BASE_EXPORT extern const base::Feature kTSFImeSuppo
+ UI_BASE_EXPORT bool IsUsingWMPointerForTouch();
+ #endif // defined(OS_WIN)
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ UI_BASE_EXPORT extern const base::Feature kDirectManipulationStylus;
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ // Used to have ash (Chrome OS system UI) run in its own process.
+ // TODO(jamescook): Make flag only available in Chrome OS.
diff --git a/devel/electron4/files/patch-ui_base_webui_web__ui__util.cc b/devel/electron4/files/patch-ui_base_webui_web__ui__util.cc
new file mode 100644
index 000000000000..01efb48bf550
--- /dev/null
+++ b/devel/electron4/files/patch-ui_base_webui_web__ui__util.cc
@@ -0,0 +1,11 @@
+--- ui/base/webui/web_ui_util.cc.orig 2019-03-15 06:26:43 UTC
++++ ui/base/webui/web_ui_util.cc
+@@ -217,7 +217,7 @@ std::string GetFontFamily() {
+
+ // TODO(dnicoara) Remove Ozone check when PlatformFont support is introduced
+ // into Ozone: crbug.com/320050
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(USE_OZONE)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS) && !defined(USE_OZONE)
+ font_family = ui::ResourceBundle::GetSharedInstance().GetFont(
+ ui::ResourceBundle::BaseFont).GetFontName() + ", " + font_family;
+ #endif
diff --git a/devel/electron4/files/patch-ui_events_devices_x11_device__data__manager__x11.cc b/devel/electron4/files/patch-ui_events_devices_x11_device__data__manager__x11.cc
new file mode 100644
index 000000000000..1aaf1647bc0b
--- /dev/null
+++ b/devel/electron4/files/patch-ui_events_devices_x11_device__data__manager__x11.cc
@@ -0,0 +1,19 @@
+--- ui/events/devices/x11/device_data_manager_x11.cc.orig 2019-03-15 06:38:27 UTC
++++ ui/events/devices/x11/device_data_manager_x11.cc
+@@ -829,6 +829,8 @@ void DeviceDataManagerX11::SetDisabledKeyboardAllowedK
+ }
+
+ void DeviceDataManagerX11::DisableDevice(int deviceid) {
++ NOTIMPLEMENTED();
++#if !defined(OS_BSD)
+ blocked_devices_.set(deviceid, true);
+ // TODO(rsadam@): Support blocking touchscreen devices.
+ std::vector<InputDevice> keyboards = GetKeyboardDevices();
+@@ -840,6 +842,7 @@ void DeviceDataManagerX11::DisableDevice(int deviceid)
+ keyboards.erase(it);
+ DeviceDataManager::OnKeyboardDevicesUpdated(keyboards);
+ }
++#endif
+ }
+
+ void DeviceDataManagerX11::EnableDevice(int deviceid) {
diff --git a/devel/electron4/files/patch-ui_events_event__switches.cc b/devel/electron4/files/patch-ui_events_event__switches.cc
new file mode 100644
index 000000000000..1abe4f4d87b6
--- /dev/null
+++ b/devel/electron4/files/patch-ui_events_event__switches.cc
@@ -0,0 +1,11 @@
+--- ui/events/event_switches.cc.orig 2019-03-15 06:38:27 UTC
++++ ui/events/event_switches.cc
+@@ -17,7 +17,7 @@ const char kEnableScrollPrediction[] = "enable-scroll-
+ const char kCompensateForUnstablePinchZoom[] =
+ "compensate-for-unstable-pinch-zoom";
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_FREEBSD)
+ // Tells chrome to interpret events from these devices as touch events. Only
+ // available with XInput 2 (i.e. X server 1.8 or above). The id's of the
+ // devices can be retrieved from 'xinput list'.
diff --git a/devel/electron4/files/patch-ui_events_event__switches.h b/devel/electron4/files/patch-ui_events_event__switches.h
new file mode 100644
index 000000000000..c108eddfd102
--- /dev/null
+++ b/devel/electron4/files/patch-ui_events_event__switches.h
@@ -0,0 +1,11 @@
+--- ui/events/event_switches.h.orig 2019-03-15 06:38:27 UTC
++++ ui/events/event_switches.h
+@@ -14,7 +14,7 @@ namespace switches {
+ EVENTS_BASE_EXPORT extern const char kEnableScrollPrediction[];
+ EVENTS_BASE_EXPORT extern const char kCompensateForUnstablePinchZoom[];
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_FREEBSD)
+ EVENTS_BASE_EXPORT extern const char kTouchDevices[];
+ EVENTS_BASE_EXPORT extern const char kPenDevices[];
+ #endif
diff --git a/devel/electron4/files/patch-ui_events_keycodes_dom_keycode__converter.cc b/devel/electron4/files/patch-ui_events_keycodes_dom_keycode__converter.cc
new file mode 100644
index 000000000000..32924a65ea0a
--- /dev/null
+++ b/devel/electron4/files/patch-ui_events_keycodes_dom_keycode__converter.cc
@@ -0,0 +1,11 @@
+--- ui/events/keycodes/dom/keycode_converter.cc.orig 2019-03-15 06:38:27 UTC
++++ ui/events/keycodes/dom/keycode_converter.cc
+@@ -20,7 +20,7 @@ namespace {
+ // and DOM Level 3 |code| strings.
+ #if defined(OS_WIN)
+ #define USB_KEYMAP(usb, evdev, xkb, win, mac, code, id) {usb, win, code}
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #define USB_KEYMAP(usb, evdev, xkb, win, mac, code, id) {usb, xkb, code}
+ #elif defined(OS_MACOSX)
+ #define USB_KEYMAP(usb, evdev, xkb, win, mac, code, id) {usb, mac, code}
diff --git a/devel/electron4/files/patch-ui_gfx_BUILD.gn b/devel/electron4/files/patch-ui_gfx_BUILD.gn
new file mode 100644
index 000000000000..39910503a685
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gfx_BUILD.gn
@@ -0,0 +1,11 @@
+--- ui/gfx/BUILD.gn.orig 2019-03-15 06:38:28 UTC
++++ ui/gfx/BUILD.gn
+@@ -572,7 +572,7 @@ source_set("memory_buffer_sources") {
+ deps += [ "//third_party/libdrm" ]
+ }
+
+- if (is_linux || is_android) {
++ if ((is_linux || is_android) && !is_bsd) {
+ deps += [ "//third_party/libsync" ]
+ }
+
diff --git a/devel/electron4/files/patch-ui_gfx_canvas__skia.cc b/devel/electron4/files/patch-ui_gfx_canvas__skia.cc
new file mode 100644
index 000000000000..32a258735fdf
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gfx_canvas__skia.cc
@@ -0,0 +1,11 @@
+--- ui/gfx/canvas_skia.cc.orig 2019-03-15 06:38:28 UTC
++++ ui/gfx/canvas_skia.cc
+@@ -208,7 +208,7 @@ void Canvas::DrawStringRectWithFlags(const base::strin
+ Range range = StripAcceleratorChars(flags, &adjusted_text);
+ bool elide_text = ((flags & NO_ELLIPSIS) == 0);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // On Linux, eliding really means fading the end of the string. But only
+ // for LTR text. RTL text is still elided (on the left) with "...".
+ if (elide_text) {
diff --git a/devel/electron4/files/patch-ui_gfx_codec_jpeg__codec.cc b/devel/electron4/files/patch-ui_gfx_codec_jpeg__codec.cc
new file mode 100644
index 000000000000..3c8a0151087b
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gfx_codec_jpeg__codec.cc
@@ -0,0 +1,20 @@
+--- ui/gfx/codec/jpeg_codec.cc.orig 2019-03-15 06:38:28 UTC
++++ ui/gfx/codec/jpeg_codec.cc
+@@ -219,6 +219,7 @@ bool JPEGCodec::Decode(const unsigned char* input, siz
+ case JCS_GRAYSCALE:
+ case JCS_RGB:
+ case JCS_YCbCr:
++#ifdef JCS_EXTENSIONS
+ // Choose an output colorspace and return if it is an unsupported one.
+ // Same as JPEGCodec::Encode(), libjpeg-turbo supports all input formats
+ // used by Chromium (i.e. RGBA and BGRA) and we just map the input
+@@ -237,6 +238,9 @@ bool JPEGCodec::Decode(const unsigned char* input, siz
+ NOTREACHED() << "Invalid pixel format";
+ return false;
+ }
++#else
++ cinfo.out_color_space = JCS_RGB;
++#endif
+ break;
+ case JCS_CMYK:
+ case JCS_YCCK:
diff --git a/devel/electron4/files/patch-ui_gfx_font__fallback__linux.cc b/devel/electron4/files/patch-ui_gfx_font__fallback__linux.cc
new file mode 100644
index 000000000000..b9a974af937a
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gfx_font__fallback__linux.cc
@@ -0,0 +1,13 @@
+--- ui/gfx/font_fallback_linux.cc.orig 2019-03-15 06:38:28 UTC
++++ ui/gfx/font_fallback_linux.cc
+@@ -15,6 +15,10 @@
+ #include "base/memory/ptr_util.h"
+ #include "ui/gfx/font.h"
+
++#if defined(OS_BSD)
++#include <unistd.h>
++#endif
++
+ namespace gfx {
+
+ namespace {
diff --git a/devel/electron4/files/patch-ui_gfx_font__list.cc b/devel/electron4/files/patch-ui_gfx_font__list.cc
new file mode 100644
index 000000000000..1bfc9560ae4f
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gfx_font__list.cc
@@ -0,0 +1,11 @@
+--- ui/gfx/font_list.cc.orig 2019-03-15 06:26:44 UTC
++++ ui/gfx/font_list.cc
+@@ -24,7 +24,7 @@ base::LazyInstance<scoped_refptr<gfx::FontListImpl>>::
+ bool g_default_impl_initialized = false;
+
+ bool IsFontFamilyAvailable(const std::string& family, SkFontMgr* fontManager) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ return !!fontManager->legacyMakeTypeface(family.c_str(), SkFontStyle());
+ #else
+ sk_sp<SkFontStyleSet> set(fontManager->matchFamily(family.c_str()));
diff --git a/devel/electron4/files/patch-ui_gfx_font__render__params.h b/devel/electron4/files/patch-ui_gfx_font__render__params.h
new file mode 100644
index 000000000000..dd0c428d0b32
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gfx_font__render__params.h
@@ -0,0 +1,18 @@
+--- ui/gfx/font_render_params.h.orig 2019-03-15 06:38:28 UTC
++++ ui/gfx/font_render_params.h
+@@ -111,13 +111,13 @@ GFX_EXPORT FontRenderParams GetFontRenderParams(
+ const FontRenderParamsQuery& query,
+ std::string* family_out);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Clears GetFontRenderParams()'s cache. Intended to be called by tests that are
+ // changing Fontconfig's configuration.
+ GFX_EXPORT void ClearFontRenderParamsCacheForTest();
+ #endif
+
+-#if defined(OS_LINUX) || (defined(OS_ANDROID) && BUILDFLAG(ENABLE_VR))
++#if defined(OS_LINUX) || (defined(OS_ANDROID) && BUILDFLAG(ENABLE_VR)) || defined(OS_BSD)
+ // Gets the device scale factor to query the FontRenderParams.
+ GFX_EXPORT float GetFontRenderParamsDeviceScaleFactor();
+
diff --git a/devel/electron4/files/patch-ui_gfx_gpu__memory__buffer.h b/devel/electron4/files/patch-ui_gfx_gpu__memory__buffer.h
new file mode 100644
index 000000000000..aa2b8ce19449
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gfx_gpu__memory__buffer.h
@@ -0,0 +1,20 @@
+--- ui/gfx/gpu_memory_buffer.h.orig 2019-03-15 06:38:28 UTC
++++ ui/gfx/gpu_memory_buffer.h
+@@ -16,7 +16,7 @@
+ #include "ui/gfx/geometry/rect.h"
+ #include "ui/gfx/gfx_export.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/gfx/native_pixmap_handle.h"
+ #elif defined(OS_MACOSX) && !defined(OS_IOS)
+ #include "ui/gfx/mac/io_surface.h"
+@@ -57,7 +57,7 @@ struct GFX_EXPORT GpuMemoryBufferHandle {
+ base::SharedMemoryHandle handle;
+ uint32_t offset;
+ int32_t stride;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ NativePixmapHandle native_pixmap_handle;
+ #elif defined(OS_MACOSX) && !defined(OS_IOS)
+ ScopedRefCountedIOSurfaceMachPort mach_port;
diff --git a/devel/electron4/files/patch-ui_gfx_ipc_gfx__param__traits__macros.h b/devel/electron4/files/patch-ui_gfx_ipc_gfx__param__traits__macros.h
new file mode 100644
index 000000000000..9f13d36dd3c5
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gfx_ipc_gfx__param__traits__macros.h
@@ -0,0 +1,29 @@
+--- ui/gfx/ipc/gfx_param_traits_macros.h.orig 2019-03-15 06:38:28 UTC
++++ ui/gfx/ipc/gfx_param_traits_macros.h
+@@ -18,7 +18,7 @@
+ #include "ui/gfx/selection_bound.h"
+ #include "ui/gfx/swap_result.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/gfx/native_pixmap_handle.h"
+ #endif
+
+@@ -51,7 +51,7 @@ IPC_STRUCT_TRAITS_BEGIN(gfx::GpuMemoryBufferHandle)
+ IPC_STRUCT_TRAITS_MEMBER(handle)
+ IPC_STRUCT_TRAITS_MEMBER(offset)
+ IPC_STRUCT_TRAITS_MEMBER(stride)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ IPC_STRUCT_TRAITS_MEMBER(native_pixmap_handle)
+ #elif defined(OS_MACOSX)
+ IPC_STRUCT_TRAITS_MEMBER(mach_port)
+@@ -66,7 +66,7 @@ IPC_STRUCT_TRAITS_BEGIN(gfx::GpuMemoryBufferId)
+ IPC_STRUCT_TRAITS_MEMBER(id)
+ IPC_STRUCT_TRAITS_END()
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ IPC_STRUCT_TRAITS_BEGIN(gfx::NativePixmapPlane)
+ IPC_STRUCT_TRAITS_MEMBER(stride)
+ IPC_STRUCT_TRAITS_MEMBER(offset)
diff --git a/devel/electron4/files/patch-ui_gfx_linux_client__native__pixmap__dmabuf.cc b/devel/electron4/files/patch-ui_gfx_linux_client__native__pixmap__dmabuf.cc
new file mode 100644
index 000000000000..0bfbc00496ad
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gfx_linux_client__native__pixmap__dmabuf.cc
@@ -0,0 +1,25 @@
+--- ui/gfx/linux/client_native_pixmap_dmabuf.cc.orig 2019-03-15 06:38:28 UTC
++++ ui/gfx/linux/client_native_pixmap_dmabuf.cc
+@@ -5,7 +5,9 @@
+ #include "ui/gfx/linux/client_native_pixmap_dmabuf.h"
+
+ #include <fcntl.h>
++#if !defined(__FreeBSD__)
+ #include <linux/version.h>
++#endif
+ #include <stddef.h>
+ #include <sys/ioctl.h>
+ #include <sys/mman.h>
+@@ -17,11 +19,7 @@
+ #include "base/strings/stringprintf.h"
+ #include "base/trace_event/trace_event.h"
+
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+-#include <linux/dma-buf.h>
+-#else
+-#include <linux/types.h>
+-
++#if defined(__FreeBSD__)
+ struct dma_buf_sync {
+ __u64 flags;
+ };
diff --git a/devel/electron4/files/patch-ui_gfx_mojo_buffer__types__struct__traits.cc b/devel/electron4/files/patch-ui_gfx_mojo_buffer__types__struct__traits.cc
new file mode 100644
index 000000000000..25e9e31b6b1c
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gfx_mojo_buffer__types__struct__traits.cc
@@ -0,0 +1,42 @@
+--- ui/gfx/mojo/buffer_types_struct_traits.cc.orig 2019-03-15 06:38:28 UTC
++++ ui/gfx/mojo/buffer_types_struct_traits.cc
+@@ -27,10 +27,10 @@ std::vector<mojo::ScopedHandle>
+ StructTraits<gfx::mojom::NativePixmapHandleDataView, gfx::NativePixmapHandle>::
+ fds(const gfx::NativePixmapHandle& pixmap_handle) {
+ std::vector<mojo::ScopedHandle> handles;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ for (const base::FileDescriptor& fd : pixmap_handle.fds)
+ handles.emplace_back(mojo::WrapPlatformFile(fd.fd));
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ return handles;
+ }
+
+@@ -38,7 +38,7 @@ bool StructTraits<
+ gfx::mojom::NativePixmapHandleDataView,
+ gfx::NativePixmapHandle>::Read(gfx::mojom::NativePixmapHandleDataView data,
+ gfx::NativePixmapHandle* out) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ mojo::ArrayDataView<mojo::ScopedHandle> handles_data_view;
+ data.GetFdsDataView(&handles_data_view);
+ for (size_t i = 0; i < handles_data_view.size(); ++i) {
+@@ -71,7 +71,7 @@ const gfx::NativePixmapHandle&
+ StructTraits<gfx::mojom::GpuMemoryBufferHandleDataView,
+ gfx::GpuMemoryBufferHandle>::
+ native_pixmap_handle(const gfx::GpuMemoryBufferHandle& handle) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ return handle.native_pixmap_handle;
+ #else
+ static gfx::NativePixmapHandle pixmap_handle;
+@@ -154,7 +154,7 @@ bool StructTraits<gfx::mojom::GpuMemoryBufferHandleDat
+ out->offset = data.offset();
+ out->stride = data.stride();
+ }
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (out->type == gfx::NATIVE_PIXMAP &&
+ !data.ReadNativePixmapHandle(&out->native_pixmap_handle))
+ return false;
diff --git a/devel/electron4/files/patch-ui_gfx_mojo_buffer__types__struct__traits.h b/devel/electron4/files/patch-ui_gfx_mojo_buffer__types__struct__traits.h
new file mode 100644
index 000000000000..2e6549b7902c
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gfx_mojo_buffer__types__struct__traits.h
@@ -0,0 +1,11 @@
+--- ui/gfx/mojo/buffer_types_struct_traits.h.orig 2019-03-15 06:38:28 UTC
++++ ui/gfx/mojo/buffer_types_struct_traits.h
+@@ -291,7 +291,7 @@ template <>
+ struct StructTraits<gfx::mojom::NativePixmapHandleDataView,
+ gfx::NativePixmapHandle> {
+ static bool IsNull(const gfx::NativePixmapHandle& handle) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ return false;
+ #else
+ // NativePixmapHandle are not used on non-linux platforms.
diff --git a/devel/electron4/files/patch-ui_gfx_native__pixmap__handle.cc b/devel/electron4/files/patch-ui_gfx_native__pixmap__handle.cc
new file mode 100644
index 000000000000..e6e30eb3e98b
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gfx_native__pixmap__handle.cc
@@ -0,0 +1,28 @@
+--- ui/gfx/native_pixmap_handle.cc.orig 2019-03-15 06:26:44 UTC
++++ ui/gfx/native_pixmap_handle.cc
+@@ -4,14 +4,14 @@
+
+ #include "ui/gfx/native_pixmap_handle.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <drm_fourcc.h>
+ #include "base/posix/eintr_wrapper.h"
+ #endif
+
+ namespace gfx {
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ static_assert(NativePixmapPlane::kNoModifier == DRM_FORMAT_MOD_INVALID,
+ "gfx::NativePixmapPlane::kNoModifier should be an alias for"
+ "DRM_FORMAT_MOD_INVALID");
+@@ -36,7 +36,7 @@ NativePixmapHandle::NativePixmapHandle(const NativePix
+
+ NativePixmapHandle::~NativePixmapHandle() {}
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ NativePixmapHandle CloneHandleForIPC(const NativePixmapHandle& handle) {
+ NativePixmapHandle clone;
+ std::vector<base::ScopedFD> scoped_fds;
diff --git a/devel/electron4/files/patch-ui_gfx_native__pixmap__handle.h b/devel/electron4/files/patch-ui_gfx_native__pixmap__handle.h
new file mode 100644
index 000000000000..121b259ef55a
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gfx_native__pixmap__handle.h
@@ -0,0 +1,28 @@
+--- ui/gfx/native_pixmap_handle.h.orig 2019-03-15 06:26:44 UTC
++++ ui/gfx/native_pixmap_handle.h
+@@ -13,7 +13,7 @@
+ #include "build/build_config.h"
+ #include "ui/gfx/gfx_export.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/file_descriptor_posix.h"
+ #endif
+
+@@ -54,14 +54,14 @@ struct GFX_EXPORT NativePixmapHandle {
+
+ ~NativePixmapHandle();
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // File descriptors for the underlying memory objects (usually dmabufs).
+ std::vector<base::FileDescriptor> fds;
+ #endif
+ std::vector<NativePixmapPlane> planes;
+ };
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Returns an instance of |handle| which can be sent over IPC. This duplicates
+ // the file-handles, so that the IPC code take ownership of them, without
+ // invalidating |handle|.
diff --git a/devel/electron4/files/patch-ui_gfx_render__text.cc b/devel/electron4/files/patch-ui_gfx_render__text.cc
new file mode 100644
index 000000000000..417ab322a581
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gfx_render__text.cc
@@ -0,0 +1,46 @@
+--- ui/gfx/render_text.cc.orig 2019-03-15 06:38:28 UTC
++++ ui/gfx/render_text.cc
+@@ -942,32 +942,33 @@ void RenderText::SetDisplayOffset(int horizontal_offse
+ const int extra_content = GetContentWidth() - display_rect_.width();
+ const int cursor_width = cursor_enabled_ ? 1 : 0;
+
+- int min_offset = 0;
+- int max_offset = 0;
++ // avoid collisions with vm_map.h on FreeBSD --cmt
++ int _min_offset = 0;
++ int _max_offset = 0;
+ if (extra_content > 0) {
+ switch (GetCurrentHorizontalAlignment()) {
+ case ALIGN_LEFT:
+- min_offset = -extra_content;
++ _min_offset = -extra_content;
+ break;
+ case ALIGN_RIGHT:
+- max_offset = extra_content;
++ _max_offset = extra_content;
+ break;
+ case ALIGN_CENTER:
+ // The extra space reserved for cursor at the end of the text is ignored
+ // when centering text. So, to calculate the valid range for offset, we
+ // exclude that extra space, calculate the range, and add it back to the
+ // range (if cursor is enabled).
+- min_offset = -(extra_content - cursor_width + 1) / 2 - cursor_width;
+- max_offset = (extra_content - cursor_width) / 2;
++ _min_offset = -(extra_content - cursor_width + 1) / 2 - cursor_width;
++ _max_offset = (extra_content - cursor_width) / 2;
+ break;
+ default:
+ break;
+ }
+ }
+- if (horizontal_offset < min_offset)
+- horizontal_offset = min_offset;
+- else if (horizontal_offset > max_offset)
+- horizontal_offset = max_offset;
++ if (horizontal_offset < _min_offset)
++ horizontal_offset = _min_offset;
++ else if (horizontal_offset > _max_offset)
++ horizontal_offset = _max_offset;
+
+ cached_bounds_and_offset_valid_ = true;
+ display_offset_.set_x(horizontal_offset);
diff --git a/devel/electron4/files/patch-ui_gl_BUILD.gn b/devel/electron4/files/patch-ui_gl_BUILD.gn
new file mode 100644
index 000000000000..a564bd3ba249
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gl_BUILD.gn
@@ -0,0 +1,11 @@
+--- ui/gl/BUILD.gn.orig 2019-03-15 06:38:28 UTC
++++ ui/gl/BUILD.gn
+@@ -209,7 +209,7 @@ component("gl") {
+ }
+ }
+
+- if (is_posix && !is_fuchsia && !is_mac) {
++ if (is_posix && !is_fuchsia && !is_mac && !is_bsd) {
+ # Windows has USE_EGL but doesn't support base::FileDescriptor.
+ # libsync isn't supported or needed on MacOSX.
+ # Fuchsia is excluded due to a libsync dependency and because it's
diff --git a/devel/electron4/files/patch-ui_gl_generate__bindings.py b/devel/electron4/files/patch-ui_gl_generate__bindings.py
new file mode 100644
index 000000000000..9d1377de5121
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gl_generate__bindings.py
@@ -0,0 +1,12 @@
+--- ui/gl/generate_bindings.py.orig 2019-03-15 06:38:28 UTC
++++ ui/gl/generate_bindings.py
+@@ -2347,6 +2347,9 @@ GLX_FUNCTIONS = [
+ 'arguments':
+ 'Display* dpy, GLXDrawable drawable, int32_t* numerator, '
+ 'int32_t* denominator' },
++{ 'return_type': '__GLXextFuncPtr',
++ 'names': ['glXGetProcAddressARB'],
++ 'arguments': 'const GLubyte* procName', },
+ { 'return_type': 'void',
+ 'names': ['glXGetSelectedEvent'],
+ 'arguments': 'Display* dpy, GLXDrawable drawable, unsigned long* mask', },
diff --git a/devel/electron4/files/patch-ui_gl_gl__bindings__api__autogen__glx.h b/devel/electron4/files/patch-ui_gl_gl__bindings__api__autogen__glx.h
new file mode 100644
index 000000000000..466082e3789a
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gl_gl__bindings__api__autogen__glx.h
@@ -0,0 +1,10 @@
+--- ui/gl/gl_bindings_api_autogen_glx.h.orig 2019-03-15 06:38:28 UTC
++++ ui/gl/gl_bindings_api_autogen_glx.h
+@@ -84,6 +84,7 @@ bool glXGetMscRateOMLFn(Display* dpy,
+ GLXDrawable drawable,
+ int32_t* numerator,
+ int32_t* denominator) override;
++__GLXextFuncPtr glXGetProcAddressARBFn(const GLubyte* procName) override;
+ void glXGetSelectedEventFn(Display* dpy,
+ GLXDrawable drawable,
+ unsigned long* mask) override;
diff --git a/devel/electron4/files/patch-ui_gl_gl__bindings__autogen__glx.cc b/devel/electron4/files/patch-ui_gl_gl__bindings__autogen__glx.cc
new file mode 100644
index 000000000000..a06b87288b6e
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gl_gl__bindings__autogen__glx.cc
@@ -0,0 +1,61 @@
+--- ui/gl/gl_bindings_autogen_glx.cc.orig 2019-03-15 06:26:44 UTC
++++ ui/gl/gl_bindings_autogen_glx.cc
+@@ -115,6 +115,8 @@ void DriverGLX::InitializeExtensionBindings() {
+
+ ext.b_GLX_ARB_create_context =
+ gfx::HasExtension(extensions, "GLX_ARB_create_context");
++ ext.b_GLX_ARB_get_proc_address =
++ gfx::HasExtension(extensions, "GLX_ARB_get_proc_address");
+ ext.b_GLX_EXT_swap_control =
+ gfx::HasExtension(extensions, "GLX_EXT_swap_control");
+ ext.b_GLX_EXT_texture_from_pixmap =
+@@ -145,6 +147,11 @@ void DriverGLX::InitializeExtensionBindings() {
+ GetGLProcAddress("glXCreateContextAttribsARB"));
+ }
+
++ if (ext.b_GLX_ARB_get_proc_address) {
++ fn.glXGetProcAddressARBFn = reinterpret_cast<glXGetProcAddressARBProc>(
++ GetGLProcAddress("glXGetProcAddressARB"));
++ }
++
+ if (ext.b_GLX_SGIX_fbconfig) {
+ fn.glXGetFBConfigFromVisualSGIXFn =
+ reinterpret_cast<glXGetFBConfigFromVisualSGIXProc>(
+@@ -346,6 +353,10 @@ bool GLXApiBase::glXGetMscRateOMLFn(Display* dpy,
+ return driver_->fn.glXGetMscRateOMLFn(dpy, drawable, numerator, denominator);
+ }
+
++__GLXextFuncPtr GLXApiBase::glXGetProcAddressARBFn(const GLubyte* procName) {
++ return driver_->fn.glXGetProcAddressARBFn(procName);
++}
++
+ void GLXApiBase::glXGetSelectedEventFn(Display* dpy,
+ GLXDrawable drawable,
+ unsigned long* mask) {
+@@ -646,6 +657,11 @@ bool TraceGLXApi::glXGetMscRateOMLFn(Display* dpy,
+ return glx_api_->glXGetMscRateOMLFn(dpy, drawable, numerator, denominator);
+ }
+
++__GLXextFuncPtr TraceGLXApi::glXGetProcAddressARBFn(const GLubyte* procName) {
++ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXGetProcAddressARB")
++ return glx_api_->glXGetProcAddressARBFn(procName);
++}
++
+ void TraceGLXApi::glXGetSelectedEventFn(Display* dpy,
+ GLXDrawable drawable,
+ unsigned long* mask) {
+@@ -1068,6 +1084,14 @@ bool DebugGLXApi::glXGetMscRateOMLFn(Display* dpy,
+ << static_cast<const void*>(denominator) << ")");
+ bool result =
+ glx_api_->glXGetMscRateOMLFn(dpy, drawable, numerator, denominator);
++ GL_SERVICE_LOG("GL_RESULT: " << result);
++ return result;
++}
++
++__GLXextFuncPtr DebugGLXApi::glXGetProcAddressARBFn(const GLubyte* procName) {
++ GL_SERVICE_LOG("glXGetProcAddressARB"
++ << "(" << static_cast<const void*>(procName) << ")");
++ __GLXextFuncPtr result = glx_api_->glXGetProcAddressARBFn(procName);
+ GL_SERVICE_LOG("GL_RESULT: " << result);
+ return result;
+ }
diff --git a/devel/electron4/files/patch-ui_gl_gl__bindings__autogen__glx.h b/devel/electron4/files/patch-ui_gl_gl__bindings__autogen__glx.h
new file mode 100644
index 000000000000..0c706e183054
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gl_gl__bindings__autogen__glx.h
@@ -0,0 +1,43 @@
+--- ui/gl/gl_bindings_autogen_glx.h.orig 2019-03-15 06:26:44 UTC
++++ ui/gl/gl_bindings_autogen_glx.h
+@@ -104,6 +104,8 @@ typedef bool(GL_BINDING_CALL* glXGetMscRateOMLProc)(Di
+ GLXDrawable drawable,
+ int32_t* numerator,
+ int32_t* denominator);
++typedef __GLXextFuncPtr(GL_BINDING_CALL* glXGetProcAddressARBProc)(
++ const GLubyte* procName);
+ typedef void(GL_BINDING_CALL* glXGetSelectedEventProc)(Display* dpy,
+ GLXDrawable drawable,
+ unsigned long* mask);
+@@ -166,6 +168,7 @@ typedef void(GL_BINDING_CALL* glXWaitXProc)(void);
+
+ struct ExtensionsGLX {
+ bool b_GLX_ARB_create_context;
++ bool b_GLX_ARB_get_proc_address;
+ bool b_GLX_EXT_swap_control;
+ bool b_GLX_EXT_texture_from_pixmap;
+ bool b_GLX_MESA_copy_sub_buffer;
+@@ -203,6 +206,7 @@ struct ProcsGLX {
+ glXGetFBConfigFromVisualSGIXProc glXGetFBConfigFromVisualSGIXFn;
+ glXGetFBConfigsProc glXGetFBConfigsFn;
+ glXGetMscRateOMLProc glXGetMscRateOMLFn;
++ glXGetProcAddressARBProc glXGetProcAddressARBFn;
+ glXGetSelectedEventProc glXGetSelectedEventFn;
+ glXGetSyncValuesOMLProc glXGetSyncValuesOMLFn;
+ glXGetVisualFromFBConfigProc glXGetVisualFromFBConfigFn;
+@@ -310,6 +314,7 @@ class GL_EXPORT GLXApi {
+ GLXDrawable drawable,
+ int32_t* numerator,
+ int32_t* denominator) = 0;
++ virtual __GLXextFuncPtr glXGetProcAddressARBFn(const GLubyte* procName) = 0;
+ virtual void glXGetSelectedEventFn(Display* dpy,
+ GLXDrawable drawable,
+ unsigned long* mask) = 0;
+@@ -394,6 +399,7 @@ class GL_EXPORT GLXApi {
+ ::gl::g_current_glx_context->glXGetFBConfigFromVisualSGIXFn
+ #define glXGetFBConfigs ::gl::g_current_glx_context->glXGetFBConfigsFn
+ #define glXGetMscRateOML ::gl::g_current_glx_context->glXGetMscRateOMLFn
++#define glXGetProcAddressARB ::gl::g_current_glx_context->glXGetProcAddressARBFn
+ #define glXGetSelectedEvent ::gl::g_current_glx_context->glXGetSelectedEventFn
+ #define glXGetSyncValuesOML ::gl::g_current_glx_context->glXGetSyncValuesOMLFn
+ #define glXGetVisualFromFBConfig \
diff --git a/devel/electron4/files/patch-ui_gl_gl__fence.cc b/devel/electron4/files/patch-ui_gl_gl__fence.cc
new file mode 100644
index 000000000000..f45c46314199
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gl_gl__fence.cc
@@ -0,0 +1,11 @@
+--- ui/gl/gl_fence.cc.orig 2019-03-15 06:26:44 UTC
++++ ui/gl/gl_fence.cc
+@@ -18,7 +18,7 @@
+ #include "ui/gl/gl_fence_apple.h"
+ #endif
+
+-#if defined(USE_EGL) && defined(OS_POSIX) && !defined(OS_MACOSX)
++#if defined(USE_EGL) && defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_FREEBSD)
+ #define USE_GL_FENCE_ANDROID_NATIVE_FENCE_SYNC
+ #include "ui/gl/gl_fence_android_native_fence_sync.h"
+ #include "ui/gl/gl_surface_egl.h"
diff --git a/devel/electron4/files/patch-ui_gl_sync__control__vsync__provider.cc b/devel/electron4/files/patch-ui_gl_sync__control__vsync__provider.cc
new file mode 100644
index 000000000000..8fbfd8957503
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gl_sync__control__vsync__provider.cc
@@ -0,0 +1,43 @@
+--- ui/gl/sync_control_vsync_provider.cc.orig 2019-03-15 06:38:28 UTC
++++ ui/gl/sync_control_vsync_provider.cc
+@@ -11,7 +11,7 @@
+ #include "base/trace_event/trace_event.h"
+ #include "build/build_config.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // These constants define a reasonable range for a calculated refresh interval.
+ // Calculating refreshes out of this range will be considered a fatal error.
+ const int64_t kMinVsyncIntervalUs = base::Time::kMicrosecondsPerSecond / 400;
+@@ -26,7 +26,7 @@ const double kRelativeIntervalDifferenceThreshold = 0.
+ namespace gl {
+
+ SyncControlVSyncProvider::SyncControlVSyncProvider() : gfx::VSyncProvider() {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // On platforms where we can't get an accurate reading on the refresh
+ // rate we fall back to the assumption that we're displaying 60 frames
+ // per second.
+@@ -48,7 +48,7 @@ bool SyncControlVSyncProvider::GetVSyncParametersIfAva
+ base::TimeTicks* timebase_out,
+ base::TimeDelta* interval_out) {
+ TRACE_EVENT0("gpu", "SyncControlVSyncProvider::GetVSyncParameters");
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // The actual clock used for the system time returned by glXGetSyncValuesOML
+ // is unspecified. In practice, the clock used is likely to be either
+ // CLOCK_REALTIME or CLOCK_MONOTONIC, so we compare the returned time to the
+@@ -157,11 +157,11 @@ bool SyncControlVSyncProvider::GetVSyncParametersIfAva
+ return true;
+ #else
+ return false;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ }
+
+ bool SyncControlVSyncProvider::SupportGetVSyncParametersIfAvailable() const {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ return true;
+ #else
+ return false;
diff --git a/devel/electron4/files/patch-ui_gl_sync__control__vsync__provider.h b/devel/electron4/files/patch-ui_gl_sync__control__vsync__provider.h
new file mode 100644
index 000000000000..0ea826154fd3
--- /dev/null
+++ b/devel/electron4/files/patch-ui_gl_sync__control__vsync__provider.h
@@ -0,0 +1,34 @@
+--- ui/gl/sync_control_vsync_provider.h.orig 2019-03-15 06:38:28 UTC
++++ ui/gl/sync_control_vsync_provider.h
+@@ -26,11 +26,11 @@ class SyncControlVSyncProvider : public gfx::VSyncProv
+ bool SupportGetVSyncParametersIfAvailable() const override;
+
+ static constexpr bool IsSupported() {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ return true;
+ #else
+ return false;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ }
+
+ protected:
+@@ -41,7 +41,7 @@ class SyncControlVSyncProvider : public gfx::VSyncProv
+ virtual bool GetMscRate(int32_t* numerator, int32_t* denominator) = 0;
+
+ private:
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ base::TimeTicks last_timebase_;
+ uint64_t last_media_stream_counter_ = 0;
+ base::TimeDelta last_good_interval_;
+@@ -52,7 +52,7 @@ class SyncControlVSyncProvider : public gfx::VSyncProv
+ // from configuration change (monitor reconfiguration, moving windows
+ // between monitors, suspend and resume, etc.).
+ base::queue<base::TimeDelta> last_computed_intervals_;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ DISALLOW_COPY_AND_ASSIGN(SyncControlVSyncProvider);
+ };
diff --git a/devel/electron4/files/patch-ui_message__center_public_cpp_message__center__constants.h b/devel/electron4/files/patch-ui_message__center_public_cpp_message__center__constants.h
new file mode 100644
index 000000000000..a8975f8c9b08
--- /dev/null
+++ b/devel/electron4/files/patch-ui_message__center_public_cpp_message__center__constants.h
@@ -0,0 +1,11 @@
+--- ui/message_center/public/cpp/message_center_constants.h.orig 2019-03-15 06:38:28 UTC
++++ ui/message_center/public/cpp/message_center_constants.h
+@@ -106,7 +106,7 @@ const int kButtonHorizontalPadding = 16; // In DIPs.
+ const int kButtonIconTopPadding = 11; // In DIPs.
+ const int kButtonIconToTitlePadding = 16; // In DIPs.
+
+-#if !defined(OS_LINUX) || defined(USE_AURA)
++#if (!defined(OS_LINUX) && !defined(OS_BSD)) || defined(USE_AURA)
+ constexpr SkColor kButtonSeparatorColor = SkColorSetRGB(234, 234, 234);
+ constexpr SkColor kHoveredButtonBackgroundColor = SkColorSetRGB(243, 243, 243);
+ #endif
diff --git a/devel/electron4/files/patch-ui_native__theme_native__theme.h b/devel/electron4/files/patch-ui_native__theme_native__theme.h
new file mode 100644
index 000000000000..ffd3cf0d1807
--- /dev/null
+++ b/devel/electron4/files/patch-ui_native__theme_native__theme.h
@@ -0,0 +1,11 @@
+--- ui/native_theme/native_theme.h.orig 2019-03-15 06:38:28 UTC
++++ ui/native_theme/native_theme.h
+@@ -47,7 +47,7 @@ class NATIVE_THEME_EXPORT NativeTheme {
+ // The part to be painted / sized.
+ enum Part {
+ kCheckbox,
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ kFrameTopArea,
+ #endif
+ kInnerSpinButton,
diff --git a/devel/electron4/files/patch-ui_native__theme_native__theme__base.cc b/devel/electron4/files/patch-ui_native__theme_native__theme__base.cc
new file mode 100644
index 000000000000..11f346176e92
--- /dev/null
+++ b/devel/electron4/files/patch-ui_native__theme_native__theme__base.cc
@@ -0,0 +1,11 @@
+--- ui/native_theme/native_theme_base.cc.orig 2019-03-15 06:26:44 UTC
++++ ui/native_theme/native_theme_base.cc
+@@ -172,7 +172,7 @@ void NativeThemeBase::Paint(cc::PaintCanvas* canvas,
+ case kCheckbox:
+ PaintCheckbox(canvas, state, rect, extra.button);
+ break;
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ case kFrameTopArea:
+ PaintFrameTopArea(canvas, state, rect, extra.frame_top_area);
+ break;
diff --git a/devel/electron4/files/patch-ui_strings_app__locale__settings.grd b/devel/electron4/files/patch-ui_strings_app__locale__settings.grd
new file mode 100644
index 000000000000..0f5b219b740f
--- /dev/null
+++ b/devel/electron4/files/patch-ui_strings_app__locale__settings.grd
@@ -0,0 +1,11 @@
+--- ui/strings/app_locale_settings.grd.orig 2019-03-15 06:26:44 UTC
++++ ui/strings/app_locale_settings.grd
+@@ -187,7 +187,7 @@
+ 75%
+ </message>
+ </if>
+- <if expr="(is_linux or is_android or is_bsd) and not chromeos">
++ <if expr="is_posix and not chromeos">
+ <!-- The font used in Web UI (e.g. History). Note that these are only
+ backups. We try to use the system font if possible. -->
+ <message name="IDS_WEB_FONT_FAMILY" use_name_for_id="true">
diff --git a/devel/electron4/files/patch-ui_views_controls_label.cc b/devel/electron4/files/patch-ui_views_controls_label.cc
new file mode 100644
index 000000000000..a4c5af861fa8
--- /dev/null
+++ b/devel/electron4/files/patch-ui_views_controls_label.cc
@@ -0,0 +1,20 @@
+--- ui/views/controls/label.cc.orig 2019-03-15 06:38:29 UTC
++++ ui/views/controls/label.cc
+@@ -549,7 +549,7 @@ bool Label::OnMousePressed(const ui::MouseEvent& event
+ GetFocusManager()->SetFocusedView(this);
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ if (event.IsOnlyMiddleMouseButton() && GetFocusManager() && !had_focus)
+ GetFocusManager()->SetFocusedView(this);
+ #endif
+@@ -734,7 +734,7 @@ bool Label::PasteSelectionClipboard() {
+ }
+
+ void Label::UpdateSelectionClipboard() {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ if (!obscured()) {
+ ui::ScopedClipboardWriter(ui::CLIPBOARD_TYPE_SELECTION)
+ .WriteText(GetSelectedText());
diff --git a/devel/electron4/files/patch-ui_views_controls_textfield_textfield.cc b/devel/electron4/files/patch-ui_views_controls_textfield_textfield.cc
new file mode 100644
index 000000000000..5e4143570aca
--- /dev/null
+++ b/devel/electron4/files/patch-ui_views_controls_textfield_textfield.cc
@@ -0,0 +1,73 @@
+--- ui/views/controls/textfield/textfield.cc.orig 2019-03-15 06:38:29 UTC
++++ ui/views/controls/textfield/textfield.cc
+@@ -59,7 +59,7 @@
+ #include "base/win/win_util.h"
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ #include "base/strings/utf_string_conversions.h"
+ #include "ui/base/ime/linux/text_edit_command_auralinux.h"
+ #include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h"
+@@ -156,14 +156,14 @@ ui::TextEditCommand GetCommandForKeyEvent(const ui::Ke
+ case ui::VKEY_BACK:
+ if (!control)
+ return ui::TextEditCommand::DELETE_BACKWARD;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Only erase by line break on Linux and ChromeOS.
+ if (shift)
+ return ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE;
+ #endif
+ return ui::TextEditCommand::DELETE_WORD_BACKWARD;
+ case ui::VKEY_DELETE:
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Only erase by line break on Linux and ChromeOS.
+ if (shift && control)
+ return ui::TextEditCommand::DELETE_TO_END_OF_LINE;
+@@ -219,7 +219,7 @@ bool IsControlKeyModifier(int flags) {
+ // Control-modified key combination, but we cannot extend it to other platforms
+ // as Control has different meanings and behaviors.
+ // https://crrev.com/2580483002/#msg46
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ return flags & ui::EF_CONTROL_DOWN;
+ #else
+ return false;
+@@ -669,7 +669,7 @@ bool Textfield::OnMousePressed(const ui::MouseEvent& e
+ ShowVirtualKeyboardIfEnabled();
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ if (!handled && !had_focus && event.IsOnlyMiddleMouseButton())
+ RequestFocusWithPointer(ui::EventPointerType::POINTER_TYPE_MOUSE);
+ #endif
+@@ -713,7 +713,7 @@ bool Textfield::OnKeyPressed(const ui::KeyEvent& event
+ if (!textfield)
+ return handled;
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ ui::TextEditKeyBindingsDelegateAuraLinux* delegate =
+ ui::GetTextEditKeyBindingsDelegate();
+ std::vector<ui::TextEditCommandAuraLinux> commands;
+@@ -875,7 +875,7 @@ void Textfield::AboutToRequestFocusFromTabTraversal(bo
+ }
+
+ bool Textfield::SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ // Skip any accelerator handling that conflicts with custom keybindings.
+ ui::TextEditKeyBindingsDelegateAuraLinux* delegate =
+ ui::GetTextEditKeyBindingsDelegate();
+@@ -2071,7 +2071,7 @@ bool Textfield::PasteSelectionClipboard() {
+ }
+
+ void Textfield::UpdateSelectionClipboard() {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ if (text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD) {
+ ui::ScopedClipboardWriter(ui::CLIPBOARD_TYPE_SELECTION)
+ .WriteText(GetSelectedText());
diff --git a/devel/electron4/files/patch-ui_views_corewm_tooltip__aura.cc b/devel/electron4/files/patch-ui_views_corewm_tooltip__aura.cc
new file mode 100644
index 000000000000..fd4e5098b22c
--- /dev/null
+++ b/devel/electron4/files/patch-ui_views_corewm_tooltip__aura.cc
@@ -0,0 +1,11 @@
+--- ui/views/corewm/tooltip_aura.cc.orig 2019-03-15 06:38:29 UTC
++++ ui/views/corewm/tooltip_aura.cc
+@@ -34,7 +34,7 @@ const int kCursorOffsetY = 15;
+
+ // TODO(varkha): Update if native widget can be transparent on Linux.
+ bool CanUseTranslucentTooltipWidget() {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ return false;
+ #else
+ return true;
diff --git a/devel/electron4/files/patch-ui_views_examples_widget__example.cc b/devel/electron4/files/patch-ui_views_examples_widget__example.cc
new file mode 100644
index 000000000000..83248556db62
--- /dev/null
+++ b/devel/electron4/files/patch-ui_views_examples_widget__example.cc
@@ -0,0 +1,11 @@
+--- ui/views/examples/widget_example.cc.orig 2019-03-15 06:26:45 UTC
++++ ui/views/examples/widget_example.cc
+@@ -79,7 +79,7 @@ void WidgetExample::CreateExampleView(View* container)
+ BuildButton(container, "Popup widget", POPUP);
+ BuildButton(container, "Dialog widget", DIALOG);
+ BuildButton(container, "Modal Dialog", MODAL_DIALOG);
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Windows does not support TYPE_CONTROL top-level widgets.
+ BuildButton(container, "Child widget", CHILD);
+ #endif
diff --git a/devel/electron4/files/patch-ui_views_selection__controller.cc b/devel/electron4/files/patch-ui_views_selection__controller.cc
new file mode 100644
index 000000000000..f5e64ee2f8b0
--- /dev/null
+++ b/devel/electron4/files/patch-ui_views_selection__controller.cc
@@ -0,0 +1,11 @@
+--- ui/views/selection_controller.cc.orig 2019-03-15 06:38:29 UTC
++++ ui/views/selection_controller.cc
+@@ -20,7 +20,7 @@ SelectionController::SelectionController(SelectionCont
+ delegate_(delegate),
+ handles_selection_clipboard_(false) {
+ // On Linux, update the selection clipboard on a text selection.
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ set_handles_selection_clipboard(true);
+ #endif
+
diff --git a/devel/electron4/files/patch-ui_views_style_platform__style.cc b/devel/electron4/files/patch-ui_views_style_platform__style.cc
new file mode 100644
index 000000000000..faccc0bdf486
--- /dev/null
+++ b/devel/electron4/files/patch-ui_views_style_platform__style.cc
@@ -0,0 +1,11 @@
+--- ui/views/style/platform_style.cc.orig 2019-03-15 06:38:29 UTC
++++ ui/views/style/platform_style.cc
+@@ -19,7 +19,7 @@
+
+ #if defined(OS_CHROMEOS)
+ #include "ui/views/controls/scrollbar/overlay_scroll_bar.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #define DESKTOP_LINUX
+ #endif
+
diff --git a/devel/electron4/files/patch-ui_views_views__delegate.cc b/devel/electron4/files/patch-ui_views_views__delegate.cc
new file mode 100644
index 000000000000..5db37da2c5d2
--- /dev/null
+++ b/devel/electron4/files/patch-ui_views_views__delegate.cc
@@ -0,0 +1,11 @@
+--- ui/views/views_delegate.cc.orig 2019-03-15 06:38:29 UTC
++++ ui/views/views_delegate.cc
+@@ -87,7 +87,7 @@ HICON ViewsDelegate::GetSmallWindowIcon() const {
+ bool ViewsDelegate::IsWindowInMetro(gfx::NativeWindow window) const {
+ return false;
+ }
+-#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#elif (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_FREEBSD)
+ gfx::ImageSkia* ViewsDelegate::GetDefaultWindowIcon() const {
+ return nullptr;
+ }
diff --git a/devel/electron4/files/patch-ui_views_views__delegate.h b/devel/electron4/files/patch-ui_views_views__delegate.h
new file mode 100644
index 000000000000..cc83d3ed30cd
--- /dev/null
+++ b/devel/electron4/files/patch-ui_views_views__delegate.h
@@ -0,0 +1,11 @@
+--- ui/views/views_delegate.h.orig 2019-03-15 06:38:29 UTC
++++ ui/views/views_delegate.h
+@@ -155,7 +155,7 @@ class VIEWS_EXPORT ViewsDelegate {
+ // Returns true if the window passed in is in the Windows 8 metro
+ // environment.
+ virtual bool IsWindowInMetro(gfx::NativeWindow window) const;
+-#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#elif defined(OS_LINUX) && !defined(OS_CHROMEOS) || defined(OS_FREEBSD)
+ virtual gfx::ImageSkia* GetDefaultWindowIcon() const;
+ #endif
+
diff --git a/devel/electron4/files/patch-ui_views_window_custom__frame__view.cc b/devel/electron4/files/patch-ui_views_window_custom__frame__view.cc
new file mode 100644
index 000000000000..a6db791500f5
--- /dev/null
+++ b/devel/electron4/files/patch-ui_views_window_custom__frame__view.cc
@@ -0,0 +1,11 @@
+--- ui/views/window/custom_frame_view.cc.orig 2019-03-15 06:38:29 UTC
++++ ui/views/window/custom_frame_view.cc
+@@ -301,7 +301,7 @@ int CustomFrameView::NonClientTopBorderHeight() const
+ int CustomFrameView::CaptionButtonY() const {
+ // Maximized buttons start at window top so that even if their images aren't
+ // drawn flush with the screen edge, they still obey Fitts' Law.
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(OS_LINUX) && !defined(OS_CHROMEOS) || defined(OS_BSD)
+ return FrameBorderThickness();
+ #else
+ return frame_->IsMaximized() ? FrameBorderThickness() : kFrameShadowThickness;
diff --git a/devel/electron4/files/patch-ui_views_window_dialog__delegate.cc b/devel/electron4/files/patch-ui_views_window_dialog__delegate.cc
new file mode 100644
index 000000000000..e74b3c6407e3
--- /dev/null
+++ b/devel/electron4/files/patch-ui_views_window_dialog__delegate.cc
@@ -0,0 +1,11 @@
+--- ui/views/window/dialog_delegate.cc.orig 2019-03-15 06:38:29 UTC
++++ ui/views/window/dialog_delegate.cc
+@@ -65,7 +65,7 @@ Widget::InitParams DialogDelegate::GetDialogWidgetInit
+ params.bounds = bounds;
+ DialogDelegate* dialog = delegate->AsDialogDelegate();
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ // The new style doesn't support unparented dialogs on Linux desktop.
+ if (dialog)
+ dialog->supports_custom_frame_ &= parent != NULL;
diff --git a/devel/electron4/files/patch-ui_views_window_frame__background.cc b/devel/electron4/files/patch-ui_views_window_frame__background.cc
new file mode 100644
index 000000000000..965a8e3036e9
--- /dev/null
+++ b/devel/electron4/files/patch-ui_views_window_frame__background.cc
@@ -0,0 +1,11 @@
+--- ui/views/window/frame_background.cc.orig 2019-03-15 06:26:45 UTC
++++ ui/views/window/frame_background.cc
+@@ -122,7 +122,7 @@ void FrameBackground::PaintMaximized(gfx::Canvas* canv
+ const View* view) const {
+ // Fill the top with the frame color first so we have a constant background
+ // for areas not covered by the theme image.
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ auto* native_theme = view->GetNativeTheme();
+ ui::NativeTheme::ExtraParams params;
+ params.frame_top_area.use_custom_frame = use_custom_frame_;
diff --git a/devel/electron4/files/patch-ui_webui_resources_js_cr.js b/devel/electron4/files/patch-ui_webui_resources_js_cr.js
new file mode 100644
index 000000000000..e3bf65d8ae23
--- /dev/null
+++ b/devel/electron4/files/patch-ui_webui_resources_js_cr.js
@@ -0,0 +1,14 @@
+--- ui/webui/resources/js/cr.js.orig 2019-03-15 06:38:29 UTC
++++ ui/webui/resources/js/cr.js
+@@ -455,6 +455,11 @@ var cr = cr || function() {
+ get doc() {
+ return document;
+ },
++
++ /** Whether this is on *BSD. */
++ get isBSD() {
++ return /BSD/.test(navigator.userAgent);
++ },
+
+ /** Whether we are using a Mac or not. */
+ get isMac() {
diff --git a/devel/electron4/files/patch-ui_webui_resources_js_icon.js b/devel/electron4/files/patch-ui_webui_resources_js_icon.js
new file mode 100644
index 000000000000..ab3da3479ac9
--- /dev/null
+++ b/devel/electron4/files/patch-ui_webui_resources_js_icon.js
@@ -0,0 +1,11 @@
+--- ui/webui/resources/js/icon.js.orig 2019-03-15 06:38:29 UTC
++++ ui/webui/resources/js/icon.js
+@@ -14,7 +14,7 @@ cr.define('cr.icon', function() {
+ // supports SCALE_FACTOR_100P on all non-iOS platforms.
+ supportedScaleFactors.push(1);
+ }
+- if (cr.isMac || cr.isChromeOS || cr.isWindows || cr.isLinux) {
++ if (cr.isMac || cr.isChromeOS || cr.isWindows || cr.isLinux || cr.isBSD) {
+ // All desktop platforms support zooming which also updates the renderer's
+ // device scale factors (a.k.a devicePixelRatio), and these platforms have
+ // high DPI assets for 2x. Let the renderer pick the closest image for
diff --git a/devel/electron4/files/patch-v8_BUILD.gn b/devel/electron4/files/patch-v8_BUILD.gn
new file mode 100644
index 000000000000..b4450a2ddc56
--- /dev/null
+++ b/devel/electron4/files/patch-v8_BUILD.gn
@@ -0,0 +1,41 @@
+--- v8/BUILD.gn.orig 2019-03-16 09:15:22 UTC
++++ v8/BUILD.gn
+@@ -2606,7 +2606,7 @@ v8_source_set("v8_base") {
+ "src/x64/simulator-x64.h",
+ "src/x64/sse-instr.h",
+ ]
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ sources += [
+ "src/trap-handler/handler-inside-linux.cc",
+ "src/trap-handler/handler-outside-linux.cc",
+@@ -2955,7 +2955,7 @@ v8_component("v8_libbase") {
+ }
+ }
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ sources += [
+ "src/base/debug/stack_trace_posix.cc",
+ "src/base/platform/platform-linux.cc",
+@@ -2975,6 +2975,12 @@ v8_component("v8_libbase") {
+ "dl",
+ "rt",
+ ]
++ } else if (is_bsd) {
++ sources += [
++ "src/base/debug/stack_trace_posix.cc",
++ "src/base/platform/platform-freebsd.cc",
++ ]
++ libs = [ "rt", "execinfo" ]
+ } else if (is_android) {
+ if (current_toolchain == host_toolchain) {
+ libs = [
+@@ -3144,6 +3150,7 @@ if (v8_use_snapshot && current_toolchain == v8_snapsho
+ sources = [
+ "src/snapshot/mksnapshot.cc",
+ ]
++ libs = ["execinfo"]
+
+ configs = [ ":internal_config" ]
+
diff --git a/devel/electron4/files/patch-v8_src_base_cpu.cc b/devel/electron4/files/patch-v8_src_base_cpu.cc
new file mode 100644
index 000000000000..ea691832cc39
--- /dev/null
+++ b/devel/electron4/files/patch-v8_src_base_cpu.cc
@@ -0,0 +1,18 @@
+--- v8/src/base/cpu.cc.orig 2019-03-15 06:33:46 UTC
++++ v8/src/base/cpu.cc
+@@ -424,6 +424,7 @@ CPU::CPU()
+
+ #if V8_OS_LINUX
+
++#if V8_OS_LINUX
+ CPUInfo cpu_info;
+
+ // Extract implementor from the "CPU implementer" field.
+@@ -457,6 +458,7 @@ CPU::CPU()
+ }
+ delete[] part;
+ }
++#endif
+
+ // Extract architecture from the "CPU Architecture" field.
+ // The list is well-known, unlike the the output of
diff --git a/devel/electron4/files/patch-v8_src_base_platform_platform-posix.cc b/devel/electron4/files/patch-v8_src_base_platform_platform-posix.cc
new file mode 100644
index 000000000000..e04c5a61e963
--- /dev/null
+++ b/devel/electron4/files/patch-v8_src_base_platform_platform-posix.cc
@@ -0,0 +1,15 @@
+--- v8/src/base/platform/platform-posix.cc.orig 2019-03-15 06:42:04 UTC
++++ v8/src/base/platform/platform-posix.cc
+@@ -496,6 +496,12 @@ int OS::GetCurrentThreadId() {
+ return static_cast<int>(syscall(__NR_gettid));
+ #elif V8_OS_ANDROID
+ return static_cast<int>(gettid());
++#elif V8_OS_DRAGONFLYBSD || defined(__DragonFly__)
++ return static_cast<int>(lwp_gettid());
++#elif V8_OS_FREEBSD
++ return static_cast<int>(pthread_getthreadid_np());
++#elif V8_OS_NETBSD
++ return static_cast<int>(_lwp_self());
+ #elif V8_OS_AIX
+ return static_cast<int>(thread_self());
+ #elif V8_OS_FUCHSIA
diff --git a/devel/electron4/files/patch-v8_src_log-utils.h b/devel/electron4/files/patch-v8_src_log-utils.h
new file mode 100644
index 000000000000..1378eb7f2442
--- /dev/null
+++ b/devel/electron4/files/patch-v8_src_log-utils.h
@@ -0,0 +1,11 @@
+--- v8/src/log-utils.h.orig 2019-03-15 06:42:05 UTC
++++ v8/src/log-utils.h
+@@ -15,6 +15,8 @@
+ #include "src/flags.h"
+ #include "src/ostreams.h"
+
++#include <stdarg.h>
++
+ namespace v8 {
+ namespace internal {
+
diff --git a/devel/electron4/pkg-descr b/devel/electron4/pkg-descr
new file mode 100644
index 000000000000..bb5485e9e735
--- /dev/null
+++ b/devel/electron4/pkg-descr
@@ -0,0 +1,10 @@
+Build cross platform desktop apps with JavaScript, HTML, and CSS.
+
+It's easier than you think.
+
+If you can build a website, you can build a desktop app. Electron is a
+framework for creating native applications with web technologies like
+JavaScript, HTML, and CSS. It takes care of the hard parts so you can
+focus on the core of your application.
+
+WWW: https://electronjs.org/
diff --git a/devel/electron4/pkg-plist b/devel/electron4/pkg-plist
new file mode 100644
index 000000000000..fd385083a25e
--- /dev/null
+++ b/devel/electron4/pkg-plist
@@ -0,0 +1,75 @@
+bin/electron
+%%DATADIR%%/LICENSE
+%%DATADIR%%/LICENSES.chromium.html
+%%DATADIR%%/chrome_100_percent.pak
+%%DATADIR%%/chrome_200_percent.pak
+%%DRIVER%%%%DATADIR%%/chromedriver
+%%DATADIR%%/electron
+%%DATADIR%%/icudtl.dat
+%%DATADIR%%/libEGL.so
+%%DATADIR%%/libGLESv2.so
+%%DATADIR%%/libVkICD_mock_icd.so
+%%DATADIR%%/locales/am.pak
+%%DATADIR%%/locales/ar.pak
+%%DATADIR%%/locales/bg.pak
+%%DATADIR%%/locales/bn.pak
+%%DATADIR%%/locales/ca.pak
+%%DATADIR%%/locales/cs.pak
+%%DATADIR%%/locales/da.pak
+%%DATADIR%%/locales/de.pak
+%%DATADIR%%/locales/el.pak
+%%DATADIR%%/locales/en-GB.pak
+%%DATADIR%%/locales/en-US.pak
+%%DATADIR%%/locales/es-419.pak
+%%DATADIR%%/locales/es.pak
+%%DATADIR%%/locales/et.pak
+%%DATADIR%%/locales/fa.pak
+%%DATADIR%%/locales/fi.pak
+%%DATADIR%%/locales/fil.pak
+%%DATADIR%%/locales/fr.pak
+%%DATADIR%%/locales/gu.pak
+%%DATADIR%%/locales/he.pak
+%%DATADIR%%/locales/hi.pak
+%%DATADIR%%/locales/hr.pak
+%%DATADIR%%/locales/hu.pak
+%%DATADIR%%/locales/id.pak
+%%DATADIR%%/locales/it.pak
+%%DATADIR%%/locales/ja.pak
+%%DATADIR%%/locales/kn.pak
+%%DATADIR%%/locales/ko.pak
+%%DATADIR%%/locales/lt.pak
+%%DATADIR%%/locales/lv.pak
+%%DATADIR%%/locales/ml.pak
+%%DATADIR%%/locales/mr.pak
+%%DATADIR%%/locales/ms.pak
+%%DATADIR%%/locales/nb.pak
+%%DATADIR%%/locales/nl.pak
+%%DATADIR%%/locales/pl.pak
+%%DATADIR%%/locales/pt-BR.pak
+%%DATADIR%%/locales/pt-PT.pak
+%%DATADIR%%/locales/ro.pak
+%%DATADIR%%/locales/ru.pak
+%%DATADIR%%/locales/sk.pak
+%%DATADIR%%/locales/sl.pak
+%%DATADIR%%/locales/sr.pak
+%%DATADIR%%/locales/sv.pak
+%%DATADIR%%/locales/sw.pak
+%%DATADIR%%/locales/ta.pak
+%%DATADIR%%/locales/te.pak
+%%DATADIR%%/locales/th.pak
+%%DATADIR%%/locales/tr.pak
+%%DATADIR%%/locales/uk.pak
+%%DATADIR%%/locales/vi.pak
+%%DATADIR%%/locales/zh-CN.pak
+%%DATADIR%%/locales/zh-TW.pak
+%%DATADIR%%/mksnapshot
+%%DATADIR%%/natives_blob.bin
+%%DATADIR%%/resources.pak
+%%DATADIR%%/resources/default_app.asar
+%%DATADIR%%/resources/electron.asar
+%%DATADIR%%/snapshot_blob.bin
+%%DATADIR%%/swiftshader/libEGL.so
+%%DATADIR%%/swiftshader/libGLESv2.so
+%%DATADIR%%/v8_context_snapshot.bin
+%%DATADIR%%/v8_context_snapshot_generator
+%%DATADIR%%/version