PageSourceSearch

https://christian-ludwig.vercel.app/imprint

html christian-ludwig.vercel.app collected 2026-10-03 05:15:45 UTC 26,532 bytes, 554 lines download raw bytes

1<!DOCTYPE html><html data-wf-page="6863cf4e8a8fd8f51a50a1e4" data-wf-site="6863cf4e8a8fd8f51a50a119" lang="en"><head>
2  <meta charset="utf-8">
3  <title>Christian Ludwig | Imprint</title>
4  <meta content="" name="description">
5  <meta content="Christian Ludwig | Imprint" property="og:title">
6  <meta content="" property="og:description">
7  <meta content="https://cdn.prod.website-files.com/6863cf4e8a8fd8f51a50a119/686487d751b2f87b6e1844eb_WE1_7254.webp" property="og:image">
8  <meta content="Christian Ludwig | Imprint" property="twitter:title">
9  <meta content="" property="twitter:description">
10  <meta content="https://cdn.prod.website-files.com/6863cf4e8a8fd8f51a50a119/686487d751b2f87b6e1844eb_WE1_7254.webp" property="twitter:image">
11  <meta property="og:type" content="website">
12  <meta content="summary_large_image" name="twitter:card">
13  <meta content="width=device-width, initial-scale=1" name="viewport">
14  <link href="css/normalize.css" rel="stylesheet" type="text/css">
15  <link href="css/components.css" rel="stylesheet" type="text/css">
16  <link href="css/christian-ludwig-29b251.css" rel="stylesheet" type="text/css">
17  
17<script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script>
17
18  <link href="images/favicon.png" rel="shortcut icon" type="image/x-icon">
19  <link href="images/webclip.png" rel="apple-touch-icon">
20  
20<script async="" src="https://cdn.jsdelivr.net/npm/@finsweet/cookie-consent@1/fs-cc.js" fs-cc-mode="opt-in"></script>
20
21  <style>
22  * {
23    -webkit-font-smoothing: antialiased;
24    -moz-osx-font-smoothing: grayscale;
25  }
26  .w-nav-overlay{
27    top:0;
28  }
29</style>
30  <style>
31  .youtube {
32    background-color: #939393;
33    position: relative;
34    overflow: hidden;
35    cursor: pointer;
36    min-height:150px;
37    padding-top:56.25%;
38  }
39  .youtube img {
40    top:0;
41    left: 0;
42    height: 100%;
43    width: 100%;
44    object-fit: cover;
45  }
46  .youtube .play-button {
47    width: 60px;
48    height: 60px;
49    z-index: 1;
50    opacity: 1;
51    display: flex;
52    align-items: center;
53    justify-content: center;
54  }
55  .youtube img,
56  .youtube .play-button {
57    cursor: pointer; 
58  }
59  .youtube img,
60  .youtube iframe,
61  .youtube .play-button,
62  .youtube .play-button:before {
63    position: absolute;
64  }
65  .youtube .play-button,
66  .youtube .play-button:before {
67    top: 50%; left: 50%; transform: translate3d( -50%, -50%, 0 ); 
68  }
69  .youtube iframe {
70    height: 100%; width: 100%; top: 0; left: 0; 
71  }
72  .w-lightbox-backdrop {
73    z-index:9999999;
74  }
75</style>
76  <link rel="stylesheet" href="https://cdn.plyr.io/3.7.8/plyr.css">
77  
77<script async="" src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-cmsload@1/cmsload.js"></script>
77
78</head>
79<body>
80  <div class="page-wrapper">
81    <div class="global-styles w-embed">
82      <style>
83/* Snippet gets rid of top margin on first element in any rich text*/
84.w-richtext>:first-child {
85	margin-top: 0;
86}
87/* Snippet gets rid of bottom margin on last element in any rich text*/
88.w-richtext>:last-child, .w-richtext ol li:last-child, .w-richtext ul li:last-child {
89    margin-bottom: 0;
90}
91/* Snippet makes all link elements listed below to inherit color from their parent */
92a, 
93.w-tab-link,
94.w-nav-link,
95.w-dropdown-btn,
96.w-dropdown-toggle,
97.w-dropdown-link
98{
99color: inherit;
100}
101/* Snippet prevents all click and hover interaction with an element */
102.clickable-off {
103  pointer-events: none;
104}
105/* Snippet enables all click and hover interaction with an element */
106.clickable-on{
107  pointer-events: auto;
108}
109/* Snippet enables you to add class of div-square which creates and maintains a 1:1 dimension of a div.*/
110.div-square::after {
111  content: "";
112  display: block;
113  padding-bottom: 100%;
114}
115/*Hide focus outline for main content element*/
116    main:focus-visible {
117    outline: -webkit-focus-ring-color auto 0px;
118}
119/* Make sure containers never lose their center alignment*/
120.container-medium, .container-small, .container-large {
121  margin-right: auto !important;
122  margin-left: auto !important;
123}
124/*Reset selects, buttons, and links styles*/
125.w-input, .w-select, a {
126color: inherit;
127text-decoration: inherit;
128font-size: inherit;
129}
130/*Apply "..." after 3 lines of text */
131.text-style-3lines {
132    display: -webkit-box;
133    overflow: hidden;
134    -webkit-line-clamp: 3;
135    -webkit-box-orient: vertical;
136}
137/* Apply "..." after 2 lines of text */
138.text-style-2lines {
139    display: -webkit-box;
140    overflow: hidden;
141    -webkit-line-clamp: 2;
142    -webkit-box-orient: vertical;
143}
144/* Apply "..." at 100% width */
145.truncate-width { 
146		width: 100%; 
147    white-space: nowrap; 
148    overflow: hidden; 
149    text-overflow: ellipsis; 
150}
151/* Removes native scrollbar */
152.no-scrollbar {
153    -ms-overflow-style: none;  // IE 10+
154    overflow: -moz-scrollbars-none;  // Firefox
155}
156.no-scrollbar::-webkit-scrollbar {
157    display: none; // Safari and Chrome
158}
159</style>
160    </div>
161    <div class="cookie-consent">
162      <div fs-cc="banner" class="cc-banner_component">
163        <div class="fs-cc-banner2_container">
164          <div class="fs-cc-banner2_text">By clicking “Accept”, you agree to the storing of cookies on your device to enhance site navigation, analyze site usage, and assist in our marketing efforts. View our <a href="privacy-policy.html" class="fs-cc-banner2_text-link">Privacy Policy</a> for more information.</div>
165          <div class="fs-cc-banner2_buttons-wrapper">
166            <a fs-cc="deny" href="#" class="fs-cc-banner2_button fs-cc-button-alt w-button">Deny</a>
167            <a fs-cc="allow" href="#" class="fs-cc-banner2_button w-button">Accept</a>
168          </div>
169        </div>
170      </div>
171      <div fs-cc="manager" class="cc-manager_component">
172        <div fs-cc="open-preferences" role="button" tabindex="0" title="Cookie Preferences" aria-label="Cookie Preferences" class="fs-cc-manager2_button w-embed"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
173            <path d="M9 8L9 8.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
174            <path d="M16 15L16 15.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
175            <path d="M10 17L10 17.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
176            <path d="M11 13L11 13.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
177            <path d="M6 12L6 12.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
178            <path d="M12 21C16.9706 21 21 16.9706 21 12C21 11.4402 20.9489 10.8924 20.8511 10.361C20.3413 10.7613 19.6985 11 19 11C18.4536 11 17.9413 10.8539 17.5 10.5987C17.0587 10.8539 16.5464 11 16 11C14.3431 11 13 9.65685 13 8C13 7.60975 13.0745 7.23691 13.2101 6.89492C11.9365 6.54821 11 5.38347 11 4C11 3.66387 11.0553 3.34065 11.1572 3.03894C6.58185 3.46383 3 7.31362 3 12C3 16.9706 7.02944 21 12 21Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
179          </svg></div>
180      </div>
181      <div fs-cc-scroll="disable" fs-cc="preferences" class="cc-prefs_component">
182        <div class="fs-cc-prefs2_form-wrapper w-form">
183          <form id="cookie-preferences" name="wf-form-Cookie-Preferences" data-name="Cookie Preferences" method="get" class="fs-cc-prefs2_form" data-wf-page-id="6863cf4e8a8fd8f51a50a1e4" data-wf-element-id="c4bd1fb6-5502-677d-1794-351bc3102070">
184            <div fs-cc="close" class="fs-cc-prefs2_close">
185              <div class="fs-cc-preferences2_close-icon w-embed"><svg fill="currentColor" aria-hidden="true" focusable="false" viewBox="0 0 16 16">
186                  <path d="M9.414 8l4.293-4.293-1.414-1.414L8 6.586 3.707 2.293 2.293 3.707 6.586 8l-4.293 4.293 1.414 1.414L8 9.414l4.293 4.293 1.414-1.414L9.414 8z"></path>
187                </svg></div>
188            </div>
189            <div class="fs-cc-prefs2_content">
190              <div class="fs-cc-prefs2_space-small">
191                <div class="fs-cc-prefs2_title">Privacy Preferences</div>
192              </div>
193              <div class="fs-cc-prefs2_option">
194                <div class="fs-cc-prefs2_toggle-wrapper">
195                  <div class="fs-cc-prefs2_label">Essential cookies</div>
196                  <div>Required</div>
197                </div>
198              </div>
199              <div class="fs-cc-prefs2_option">
200                <div class="fs-cc-prefs2_toggle-wrapper">
201                  <div class="fs-cc-prefs2_label">Marketing cookies</div><label class="w-checkbox fs-cc-prefs2_checkbox-field">
202                    <div class="w-checkbox-input w-checkbox-input--inputType-custom fs-cc-prefs2_checkbox"></div><input type="checkbox" id="marketing-2" name="marketing-2" data-name="Marketing 2" fs-cc-checkbox="marketing" style="opacity:0;position:absolute;z-index:-1"><span for="marketing-2" class="fs-cc-prefs2_checkbox-label w-form-label">Essential</span>
203                  </label>
204                </div>
205              </div>
206              <div class="fs-cc-prefs2_option">
207                <div class="fs-cc-prefs2_toggle-wrapper">
208                  <div class="fs-cc-prefs2_label">Personalization cookies</div><label class="w-checkbox fs-cc-prefs2_checkbox-field">
209                    <div class="w-checkbox-input w-checkbox-input--inputType-custom fs-cc-prefs2_checkbox"></div><input type="checkbox" id="personalization-2" name="personalization-2" data-name="Personalization 2" fs-cc-checkbox="personalization" style="opacity:0;position:absolute;z-index:-1"><span for="personalization-2" class="fs-cc-prefs2_checkbox-label w-form-label">Essential</span>
210                  </label>
211                </div>
212              </div>
213              <div class="fs-cc-prefs2_option">
214                <div class="fs-cc-prefs2_toggle-wrapper">
215                  <div class="fs-cc-prefs2_label">Analytics cookies</div><label class="w-checkbox fs-cc-prefs2_checkbox-field">
216                    <div class="w-checkbox-input w-checkbox-input--inputType-custom fs-cc-prefs2_checkbox"></div><input type="checkbox" id="analytics-2" name="analytics-2" data-name="Analytics 2" fs-cc-checkbox="analytics" style="opacity:0;position:absolute;z-index:-1"><span for="analytics-2" class="fs-cc-prefs2_checkbox-label w-form-label">Essential</span>
217                  </label>
218                </div>
219              </div>
220              <div class="fs-cc-prefs2_buttons-wrapper">
221                <a fs-cc="deny" href="#" class="fs-cc-prefs2_button fs-cc-button-alt w-button">
221Reject all cookies</a>
222                <a fs-cc="allow" href="#" class="fs-cc-prefs2_button w-button">Allow all cookies</a>
223                <a fs-cc="submit" href="#" class="fs-cc-prefs2_submit w-button">Save preferences</a>
224              </div>
225            </div>
226          </form>
227          <div class="form-done"></div>
228          <div class="form-fail"></div>
229          <div fs-cc="close" class="fs-cc-prefs2_overlay"></div>
230        </div>
231      </div>
232    </div>
233    <main class="main-wrapper">
234      <header class="section-legal">
235        <div class="page-padding">
236          <div class="container-large">
237            <div class="padding-vertical padding-xhuge">
238              <div class="max-width-large align-center">
239                <div class="w-dyn-list">
240                  <div role="list" class="w-dyn-items">
241                    <div role="listitem" class="w-dyn-item">
242                      <div class="margin-bottom margin-xxlarge">
243                        <div class="max-width-large">
244                          <h2 class="">Imprint</h2>
245                        </div>
246                      </div>
247                      <div class="blogpost1_content">
248                        <div class="text-rich-text w-richtext"><p>Angaben gemäß §5 DDG:</p>
249<p><a href="//www.xxxxx.de" rel="noopener noreferrer nofollow" data-link-auto="">www.christianludwig.com</a> ist ein Angebot von</p>
250<p>Christian Ludwig</p>
251<p>Rheinaustrasse 32</p>
252<p>D – 53225 Bonn</p>
253<p>USt-IdNr:&nbsp;</p>
254<p>E-Mail-Adresse: [email protected]</p>
255<p>Fotomaterial: Paul Meixner</p>
256<p>Webdesign &amp; Umsetzung:</p>
257<p><a href="//www.dreher-media.de" rel="noopener noreferrer nofollow" data-link-auto="">www.dreher-media.de</a></p>
258<p>&nbsp;</p>
259<p><strong>Haftung für Inhalte</strong></p>
260<p>Als Diensteanbieter sind wir gemäß § 7 Abs.1 DDG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 DDG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen.</p>
261<p>Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.</p>
262<p>&nbsp;</p>
263<p><strong>Haftung für Links</strong></p>
264<p>Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.</p>
265<p>&nbsp;</p>
266<p><strong>Urheberrecht</strong></p>
267<p>Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet.</p>
268<p>Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.</p>
269<p>&nbsp;</p>
270<p>Die Europäische Kommission stellt eine Plattform für die außergerichtliche Online-Streitbeilegung (OS-Plattform) bereit, die unter<a href="http://www.ec.europa.eu/consumers/odr" rel="noopener noreferrer nofollow"> </a><a href="//www.ec.europa.eu/consumers/odr" rel="noopener noreferrer nofollow" data-link-auto="">www.ec.europa.eu/consumers/odr</a> aufrufbar ist. Wir sind nicht bereit und nicht verpflichtet, an dieser Streitbeilegung teilzunehmen.</p>
271<p>‍</p>
272<p>‍</p></div>
273                      </div>
274                    </div>
275                  </div>
276                </div>
277              </div>
278            </div>
279          </div>
280        </div>
281      </header>
282      <footer class="footer">
283        <div class="w-layout-grid footer_grid">
284          <div id="w-node-_3f8a519d-e42a-33a3-9e93-b9a22482b781-2482b77f" class="footer_wrapper">
285            <a href="imprint.html" aria-current="page" class="w-inline-block w--current">
286              <div class="coopyright_text created">Imprint</div>
287            </a>
288            <div class="coopyright_text created">|</div>
289            <a href="privacy-policy.html" class="w-inline-block">
290              <div class="coopyright_text created">Privacy Policy</div>
291            </a>
292          </div>
293          <div id="w-node-_3f8a519d-e42a-33a3-9e93-b9a22482b788-2482b77f" class="coopyright_text">©<span class="copyright-year">YEAR</span> Christian Ludwig</div>
294          <div id="w-node-_3f8a519d-e42a-33a3-9e93-b9a22482b78a-2482b77f" class="footer_wrapper">
295            <div class="coopyright_text created">created by</div>
296            <a href="https://www.dreher-media.de" target="_blank" class="w-inline-block"><img src="images/dreher.media-logo_website-white.svg" loading="lazy" alt="" class="dreher-media-logo 
296inverted"></a>
297          </div>
298        </div>
299      </footer>
300    </main>
301  </div>
302  
302<script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=6863cf4e8a8fd8f51a50a119" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
302
303  
303<script src="js/christian-ludwig-29b251.js" type="text/javascript"></script>
303
304  
304<script>
305  // Functionality for fs-cc-reject
306  let initFsCCListener = false;
307  function handleFsCcReject() {
308    if (!window.FsCC) {
309      setTimeout(handleFsCcReject, 200);
310      return;
311    }
312    if (!initFsCCListener) { 
313      // Add a listener for changes in consent preferences
314      window.FsCC.consentController.on('updateconsents', (consents) => {
315        handleFsCcReject(); // Run the function whenever consent changes
316      });
317    }
318    // Iterate through all elements with fs-cc-reject attributes
319    document.querySelectorAll('[fs-cc-reject]').forEach((rejectElement) => {
320      const category = rejectElement.getAttribute('fs-cc-reject'); // Get the consent category
321      const isConsentGiven = window.FsCC.store.consents[category]; // Check if consent is granted for the category
322      const consentElement = document.querySelector('[fs-cc="' + category + '"]'); // Find the corresponding fs-cc element
323      // Toggle visibility based on consent state
324      if (isConsentGiven) {
325        rejectElement.style.display = 'none'; // Hide the reject element
326        if (consentElement) consentElement.style.display = 'block'; // Show the consented content
327      } else {
328        rejectElement.style.display = 'block'; // Show the reject element
329        if (consentElement) consentElement.style.display = 'none'; // Hide the consented content
330      }
331    });
332  }
333  // Run the script on page load
334  document.addEventListener('DOMContentLoaded', handleFsCcReject);
335</script>
335
336  
336<script>
337  Webflow.push(function() {
338    $('.copyright-year').text(new Date().getFullYear());
339  });
340  window.addEventListener('load', (event) => {
341    const routeName = window.location.pathname?.split('/')?.slice(-1)?.[0]
342    document
343      .querySelectorAll('a[href*="' + routeName + '"]')
344      ?.forEach((el) => el?.classList?.add('w--current'))
345  })
346  function addSeparatorsByDataAttribute() {
347    // Find all elements in the document
348    const matchingElements = document.querySelectorAll('[data-separator]');
349    // Process each matching element
350    matchingElements.forEach(element => {
351      // Get the separator text from the data-separator attribute
352      const separatorText = element.getAttribute('data-separator');
353      // Get all child elements of the current element
354      const children = Array.from(element.children);
355      // Iterate through the children and insert separators
356      children.forEach((child, index) => {
357        if (index < children.length - 1) { // No separator after the last child
358          // Create a new separator element (you could change this to suit)
359          const separator = document.createElement('span');
360          separator.innerHTML = '&nbsp;' + separatorText + '&nbsp;'; // Set separator text
361          // Insert the separator after the current child
362          child.insertAdjacentElement('afterend', separator);
363        }
364      });
365    });
366  }
367  addSeparatorsByDataAttribute();
368  document.querySelectorAll('.tab-link')
369    ?.forEach((el) => el.addEventListener('click', (event) => {
370    el.parentNode.querySelector('.tab-link.active').classList.remove('active')
371    el.classList.add('active')
372  }))
373  document.querySelectorAll('.biography-lang-links .tab-link')
374    ?.forEach((el) => el.addEventListener('click', (event) => {
375    const lang = el.dataset?.lang
376    document.querySelectorAll('.biography-text:not(.' + lang + ')')
377      ?.forEach((bioEl) => bioEl.style.display = 'none')
378    document.querySelectorAll('.biography-text.' + lang)
379      ?.forEach((bioEl) => bioEl.style.display = 'block')
380  }))
381  const videoSwipers = []
382</script>
382
383  
383<script src="https://cdn.plyr.io/3.7.8/plyr.polyfilled.js"></script>
383
384  
384<script src="https://www.youtube.com/iframe_api"></script>
384
385  
385<script src="https://player.vimeo.com/api/player.js"></script>
385
386  
386<script src="https://geo.dailymotion.com/libs/player.js"></script>
386
387  
387<script>
388  const plyrPlayers = Plyr.setup('._init-plyr');
389  var youtube = document.querySelectorAll('.youtube');
390  const players = {};
391  let init = false;
392  function onYouTubeIframeAPIReady() {
393    init = true;
394    for (const el of youtube) {
395      el.addEventListener('click', () => {
396        const customEmbed = el.querySelector('[data-custom-embed]');
397        if (customEmbed) {
398          el.innerHTML = customEmbed.innerHTML;
399        }
400        const id = 'player_' + el.dataset.id;
401        const type = el.dataset.type;
402        const videoId = el.dataset.videoId;
403        const time = el.dataset.time || 0;  // Start time in seconds
404        onPlay(id);  // Manage autoplay functionality
405        let player;
406        // YouTube Player
407        if (type === 'youtube') {
408          player = new YT.Player(id, {
409            videoId: videoId,
410            playerVars: {
411              start: time,
412            },
413            events: {
414              onReady: (event) => {
415                event.target.playVideo();
416              },
417              onStateChange: (event) => {
418                if (event.data === YT.PlayerState.PLAYING) {
419                  onPlay(id);
420                } else if (
421                  event.data === YT.PlayerState.PAUSED ||
422                  event.data === YT.PlayerState.ENDED
423                ) {
424                  onPause(id);
425                }
426              },
427            },
428          });
429          // Vimeo Player
430        } else if (type === 'vimeo') {
431          document.getElementById(id).innerHTML = '';
432          player = new Vimeo.Player(id, {
433            id: videoId,
434            autoplay: true,
435            start: time,
436          });
437          player.on('play', () => onPlay(id));
438          player.on('pause', () => onPause(id));
439          // Dailymotion Player (using Player Library Script)
440        } else if (type === 'dailymotion') {
441          const container = document.getElementById(id);
442          // Create Dailymotion player instance using Player Library
443          dailymotion.createPlayer(id, {
444            video: videoId,
445            params: {
446              autoplay: 1,
447              start: time,
448              mute: false,  // Adjust other parameters as needed
449            }
450          })
451            .then((playerInstance) => {
452            console.log('Dailymotion Player initialized:', playerInstance);
453            // Attach event listeners for play, pause, and ended events
454            playerInstance.on('play', () => onPlay(id));
455            playerInstance.on('pause', () => onPause(id));
456            playerInstance.on('ended', () => onPause(id));
457            // Store the player instance for later control
458            players[id] = { type: 'dailymotion', player: playerInstance };
459          })
460            .catch((error) => console.error('Error initializing Dailymotion player:', error));
461        }
462        // Store the player instance (for YouTube or Vimeo)
463        players[id] = { type, player };
464      });
465    }
466  }
467  const pauseAllPlayers = (id = null) => {
468    for (const [key, value] of Object.entries(players)) {
469      if (id === key) continue;
470      if (value.type === 'youtube') {
471        value.player.pauseVideo();
472      } else if (value.type === 'vimeo') {
473        value.player.pause();
474      } else if (value.type === 'dailymotion') {
475        value.player.pause();  // Pause Dailymotion video using the Player Library
476      }
477    }
478  };
479  const onPlay = (id) => {
480    pauseAllPlayers(id);
481    videoSwipers?.forEach((swiper) => {
482      swiper.autoplay.stop();
483    });
484  };
485  const onPause = (id) => {
486    videoSwipers?.forEach((swiper) => {
487      swiper.autoplay.start();
488    });
489  };
490  document.addEventListener("DOMContentLoaded", () => {
491    videoSwipers?.forEach((swiper) => {
492      swiper.on('slideChange', () => {
493        pauseAllPlayers();
494      });
495    });
496    setTimeout(() => {
497      if (!init) {
498        onYouTubeIframeAPIReady();
499      }
500    }, 500);
501  });
502  const checkYouTubeThumbnails = (el, currentIndex = 0) => {
503    if (el.naturalWidth > 120) return
504    const thumbnailSizes = [
505      'maxresdefault',
506      'sddefault',
507      'hqdefault',
508      'mqdefault',
509      'default',
510    ]
511    if (currentIndex >= thumbnailSizes.length) {
512      return
513    }
514    const size = thumbnailSizes[currentIndex]
515    const originalSrc = el.src
516    const img = new Image()
517    img.onload = function () {
518      if (img.naturalWidth > 120) {
519        el.src = img.src
520      } else {
521        checkYouTubeThumbnails(el, currentIndex + 1)
522      }
523    }
524    img.onerror = function () {
525      checkYouTubeThumbnails(el, currentIndex + 1)
526    }
527    img.src = originalSrc.replace(/maxresdefault/, size)
528  }
529  document.querySelectorAll('.youtube img').forEach((el) => {
530    checkYouTubeThumbnails(el)
531  })
532</script>
532
533  
533<script>
534  // Function to download a file
535  function downloadFile(url, filename) {
536    const link = document.createElement('a');
537    link.href = url;
538    link.download = filename || url.split('/').pop(); // Use filename if provided, otherwise extract from URL
539    document.body.appendChild(link);
540    link.click();
541    document.body.removeChild(link);
542  }
543  // Add event listeners to all elements with the [data-download-href] attribute
544  document.querySelectorAll('[data-download-href]').forEach(element => {
545    element.addEventListener('click', function(event) {
546      event.preventDefault(); // Prevent the default action (if it's a link)
547      event.stopPropagation();
548      const url = element.getAttribute('data-download-href');
549      const filename = element.getAttribute('data-download-filename'); // Optional filename attribute
550      downloadFile(url, filename);
551    });
552  });
553</script>
553
554</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.