<pre style='margin:0'>
Christopher Nielsen (mascguy) pushed a commit to branch master
in repository macports-ports.
</pre>
<p><a href="https://github.com/macports/macports-ports/commit/c7b5f64a4df2c7a8f9542716940d5d4b9762db7f">https://github.com/macports/macports-ports/commit/c7b5f64a4df2c7a8f9542716940d5d4b9762db7f</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit c7b5f64a4df2c7a8f9542716940d5d4b9762db7f
</span>Author: Steven Thomas Smith <s.t.smith@ieee.org>
AuthorDate: Mon Feb 14 20:34:44 2022 -0500
<span style='display:block; white-space:pre;color:#404040;'> py-undetected-chromedriver: Submission
</span>---
python/py-undetected-chromedriver/Portfile | 88 ++++++++++++++++++++++
.../patch-undetected_chromedriver-__init__-py.diff | 57 ++++++++++++++
.../patch-undetected_chromedriver-patcher-py.diff | 81 ++++++++++++++++++++
3 files changed, 226 insertions(+)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-undetected-chromedriver/Portfile b/python/py-undetected-chromedriver/Portfile
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..3fa1dd1b870
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-undetected-chromedriver/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,88 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+PortSystem 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+PortGroup python 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+name py-undetected-chromedriver
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+version 3.1.3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+categories-append python www
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+maintainers nomaintainer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+license GPL-3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+supported_archs noarch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+description Custom Selenium Chromedriver
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+long_description {*}${description} | Zero-Config | \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Passes ALL bot mitigation systems \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (like Distil / Imperva/ Datadadome / CloudFlare IUAM)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+homepage https://github.com/ultrafunkamsterdam/undetected-chromedriver
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+checksums rmd160 487c1f61efb09340b7db6bd2cd201a0a6c01ba26 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sha256 d8884a9d2a65fbe272c184d4c8f92fc6c8e686aa49bf441dd63bf92ff58007e8 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size 39157
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+python.versions 37 38 39 310
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {${name} ne ${subport}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ depends_build-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:python${python.version} \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:py${python.version}-requests \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:py${python.version}-setuptools \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:py${python.version}-websockets
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ depends_lib-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:py${python.version}-selenium
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ depends_test-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:py${python.version}-pytest
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ post-patch {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fs-traverse f ${worksrcpath}/undetected_chromedriver {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[file isfile ${f}] && [string match "*.py" ${f}]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reinplace -E -q \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "1s|^(#!\[\[:space:]]*)/usr/bin/env\[\[:space:]]+python3|\\1${python.bin}|" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ${f}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ test.run yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ test.env-append PYTHONPATH=${worksrcpath}/build/lib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ test.cmd py.test-${python.branch}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ test.target tests/v2/test_uc.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant port_chromedriver_binary \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {Patch the chromedriver port binary.} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {${name} ne ${subport}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # diff -Naurd ./uc-orig/undetected_chromedriver/__init__.py ./uc-new/undetected_chromedriver/__init__.py | sed -E -e 's/\.\/uc-(orig|new)\//.\//g' | sed -E -e 's|/opt/local|@PREFIX@|g' > ~/Downloads/patch-undetected_chromedriver-__init__-py.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patchfiles-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patch-undetected_chromedriver-__init__-py.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patch-undetected_chromedriver-patcher-py.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ post-patch {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reinplace "s|@PREFIX@|${prefix}|g" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ${worksrcpath}/undetected_chromedriver/__init__.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reinplace "s|@NAME@|chromedriver|g" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ${worksrcpath}/undetected_chromedriver/__init__.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ notes-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "This package is intended to be used with the port
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ chromedriver +undetected
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+and the Python code:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import undetected_chromedriver as uc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ driver = uc.Chrome()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+To use separate chromedriver binaries with distinct signatures, use:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ driver = uc.Chrome(executable_path='${prefix}/bin/chromedriver-original', executable_path_mkdtemp=True)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ driver.delete_executable_path_mkdtemp()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default_variants-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ +port_chromedriver_binary
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-undetected-chromedriver/files/patch-undetected_chromedriver-__init__-py.diff b/python/py-undetected-chromedriver/files/patch-undetected_chromedriver-__init__-py.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..6c18ee32196
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-undetected-chromedriver/files/patch-undetected_chromedriver-__init__-py.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,57 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./undetected_chromedriver/__init__.py 2022-02-14 13:34:12.000000000 -0500
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./undetected_chromedriver/__init__.py 2022-02-22 14:44:18.000000000 -0500
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -110,6 +110,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patcher_force_close=False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ suppress_welcome=True,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use_subprocess=False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ executable_path='@PREFIX@/bin/@NAME@',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ executable_path_mkdtemp=False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug=False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ **kw
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -198,15 +200,30 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ in that case you can set this to `True`. The browser will start via subprocess, and will keep running most of times.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ! setting it to True comes with NO support when being detected. !
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ executable_path: str, optional, default: '@PREFIX@/bin/@NAME@'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ a full file path to the patched chromedriver executable.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ executable_path_mkdtemp: bool or str, optional, default: False
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Make a temporary directory, copy `chromedriver` there from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ `executable_path`, and patch the executable. The user must
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ delete this `chromedriver` copy and temporary path with the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ method `delete_executable_path_mkdtemp`.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ """
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self.debug = debug
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patcher = Patcher(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- executable_path=None,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ executable_path=executable_path,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ executable_path_mkdtemp=executable_path_mkdtemp,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ force=patcher_force_close,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ version_main=version_main,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patcher.auto()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if hasattr(patcher, 'executable_path_mkdtemp') \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ and patcher.executable_path_mkdtemp \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ and isinstance(patcher.executable_path_mkdtemp, str):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ self.executable_path_mkdtemp = patcher.executable_path_mkdtemp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if not options:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ options = ChromeOptions()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -613,6 +630,13 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def __hash__(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return hash(self.options.debugger_address)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ def delete_executable_path_mkdtemp(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if hasattr(self, 'executable_path_mkdtemp') \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ and self.executable_path_mkdtemp \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ and isinstance(self.executable_path_mkdtemp, str):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ os.unlink(self.executable_path_mkdtemp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ os.rmdir(os.path.dirname(self.executable_path_mkdtemp))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def find_chrome_executable():
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ """
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-undetected-chromedriver/files/patch-undetected_chromedriver-patcher-py.diff b/python/py-undetected-chromedriver/files/patch-undetected_chromedriver-patcher-py.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..fc40153ef38
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-undetected-chromedriver/files/patch-undetected_chromedriver-patcher-py.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,81 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./undetected_chromedriver/patcher.py 2022-02-22 14:13:01.000000000 -0500
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./undetected_chromedriver/patcher.py 2022-02-22 14:42:04.000000000 -0500
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6,8 +6,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import os
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import random
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import re
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import shutil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import string
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import sys
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import tempfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import zipfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from distutils.version import LooseVersion
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from urllib.request import urlopen, urlretrieve
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -43,12 +45,15 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ d = "~/.undetected_chromedriver"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data_path = os.path.abspath(os.path.expanduser(d))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- def __init__(self, executable_path=None, force=False, version_main: int = 0):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ def __init__(self, executable_path=None, executable_path_mkdtemp=False, force=False, version_main: int = 0):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ """
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Args:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ executable_path: None = automatic
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ a full file path to the chromedriver executable
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ executable_path_mkdtemp: bool or str, optional, default: False
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Make a temporary directory, copy `chromedriver` there from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ `executable_path`, and patch the executable.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ force: False
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ terminate processes which are holding lock
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ version_main: 0 = auto
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -78,16 +83,30 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if executable_path:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self._custom_exe_path = True
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self.executable_path = executable_path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if executable_path_mkdtemp:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ self.executable_path_mkdtemp = executable_path_mkdtemp \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if isinstance(executable_path_mkdtemp, str) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ else os.path.join(tempfile.mkdtemp(), self.exe_name)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self.version_main = version_main
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self.version_full = None
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- def auto(self, executable_path=None, force=False, version_main=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ def auto(self, executable_path=None, executable_path_mkdtemp=False, force=False, version_main=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ """"""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if executable_path:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self.executable_path = executable_path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self._custom_exe_path = True
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if executable_path_mkdtemp:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ self.executable_path_mkdtemp = executable_path_mkdtemp \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if isinstance(executable_path_mkdtemp, str) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ else os.path.join(tempfile.mkdtemp(), self.exe_name)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if self._custom_exe_path:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if hasattr(self, 'executable_path_mkdtemp') \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ and self.executable_path_mkdtemp \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ and isinstance(self.executable_path_mkdtemp, str):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ shutil.copy(self.executable_path, self.executable_path_mkdtemp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ self.executable_path = self.executable_path_mkdtemp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ispatched = self.is_binary_patched(self.executable_path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if not ispatched:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return self.patch_exe()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -194,10 +213,14 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @staticmethod
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def gen_random_cdc():
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- cdc = random.choices(string.ascii_lowercase, k=26)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- cdc[-6:-4] = map(str.upper, cdc[-6:-4])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- cdc[2] = cdc[0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- cdc[3] = "_"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ """Generate a length 26 random bytestring that doesn't start with 'cdc_'."""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ while True:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ cdc = random.choices(string.ascii_lowercase, k=26)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if cdc[0] == 'c' and cdc[1] == 'd': continue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ cdc[-6:-4] = map(str.upper, cdc[-6:-4])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ cdc[2] = cdc[0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ cdc[3] = "_"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ break
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return "".join(cdc).encode()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def is_binary_patched(self, executable_path=None):
</span></pre><pre style='margin:0'>
</pre>