{"id":2687,"date":"2026-10-28T10:23:37","date_gmt":"2026-10-28T08:23:37","guid":{"rendered":"https:\/\/skinarttraining.com\/za\/?page_id=2687"},"modified":"2026-10-28T10:23:37","modified_gmt":"2026-10-28T08:23:37","slug":"lessons-and-assignments","status":"publish","type":"page","link":"https:\/\/skinarttraining.com\/za\/faq-videos\/lessons-and-assignments\/","title":{"rendered":"How do Skinart lessons and assignments work?"},"content":{"rendered":"<style id=\"skinart-video-guides-css\">.sat-video-guides{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr));gap:24px;margin:28px 0 42px}.sat-video-guides__card{display:flex;flex-direction:column;overflow:hidden;border:1px solid #665b43;border-radius:12px;background:#20251f;color:#f4f0e7!important;text-decoration:none!important}.sat-video-guides__card:hover,.sat-video-guides__card:focus-visible{border-color:#d0b174;outline:2px solid #d0b174;outline-offset:3px}.sat-video-guides__card img{display:block;width:100%;height:auto;aspect-ratio:16\/9;object-fit:cover}.sat-video-guides__text{display:block;padding:18px}.sat-video-guides__text strong{display:block;font-size:1.1rem;line-height:1.35;color:#f4f0e7}.sat-video-guides__text small{display:block;margin-top:10px;color:#d0b174}.sat-video-watch{max-width:1040px;margin:0 auto}.sat-video-watch__summary{max-width:78ch;margin:28px 0 20px}.sat-video-watch__related{margin:36px 0}.sat-video-watch__related li{margin:10px 0}.sat-video-watch__current{border-left:3px solid #c8a56a;padding:12px 18px}<\/style><article class=\"sat-video-watch\">        <section class=\"cisvc cisvc--memory-cards cisvc--single-track cisvc--clean-controls cisvc--standalone\" id=\"cisvc_9024bd88-5694-4f02-bccf-3f302260e06a\" data-base-url=\"https:\/\/skinarttraining.com\/za\/wp-content\/mu-plugins\/videos\/\" data-hls-local=\"https:\/\/skinarttraining.com\/za\/wp-content\/mu-plugins\/videos\/hls.min.js\" data-thumb-version=\"thumbs-20261027-3e56e9308db2\" data-media-version=\"skinart-faq-20261027-r1\" data-versioned-folders=\"[&quot;Skinart_What_is_the_accreditation&quot;,&quot;Skinart-how-long-does-thee-course-take&quot;,&quot;Skinart_how_does_the_tutor_service_work&quot;,&quot;Skinart_what_are_the_pre_requisites&quot;,&quot;Skinart-lesson-format-and-assignments&quot;,&quot;Skinart_what_payment_options_are_available&quot;,&quot;Skinart_will_this_course_help_me_get_employment&quot;,&quot;Skinart_How_do_Learn_the_practical_skills&quot;,&quot;Skinart-Training-Validation&quot;]\" data-labels=\"{&quot;notWatched&quot;:&quot;Not watched&quot;,&quot;watched&quot;:&quot;Watched&quot;,&quot;percent&quot;:&quot;% watched&quot;,&quot;resume&quot;:&quot;Resume at&quot;,&quot;play&quot;:&quot;Play&quot;,&quot;again&quot;:&quot;Watch again&quot;}\">\n            <div class=\"cisvc__viewport\" tabindex=\"0\" role=\"region\" aria-label=\"Video carousel\">\n                <div class=\"cisvc__track\" role=\"list\">\n                                            <div class=\"cisvc__slide\" data-index=\"0\" data-folder=\"Skinart-lesson-format-and-assignments\" data-title=\"What is the lesson format\" role=\"listitem\" aria-label=\"1 of 1: What is the lesson format\">\n                            <div class=\"cisvc__card\">\n                                <div class=\"cisvc__media\">\n                                    <img class=\"cisvc__thumb no-lazyload skip-lazy\" src=\"https:\/\/skinarttraining.com\/za\/wp-content\/mu-plugins\/videos\/Skinart-lesson-format-and-assignments.webp?v=thumbs-20261027-3e56e9308db2\" alt=\"What is the lesson format\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" data-no-lazy=\"1\" data-skip-lazy=\"1\">\n                                    <div class=\"cisvc__poster-copy\" aria-hidden=\"true\"><span>SKINART TRAINING<\/span><strong>What is the lesson format<\/strong><\/div>\n                                    <div class=\"cisvc__player-mount\">                                        <video controls controlslist=\"nodownload\" playsinline preload=\"none\" poster=\"https:\/\/skinarttraining.com\/za\/wp-content\/mu-plugins\/videos\/Skinart-lesson-format-and-assignments.webp?v=thumbs-20261027-3e56e9308db2\" aria-label=\"What is the lesson format\"><source src=\"https:\/\/skinarttraining.com\/za\/wp-content\/mu-plugins\/videos\/Skinart-lesson-format-and-assignments\/master480.m3u8?v=skinart-faq-20261027-r1\" type=\"application\/vnd.apple.mpegurl\"><\/video>\n                                    <\/div>\n                                    <button class=\"cisvc__play\" type=\"button\" aria-label=\"Play video\"><span class=\"cisvc__playIcon\" aria-hidden=\"true\"><\/span><\/button>\n                                <\/div>\n                                <div class=\"cisvc__caption\">\n                                    <div class=\"cisvc__summary\"><p class=\"cisvc__current-status\" data-watch-status>0% watched<\/p><div class=\"cisvc__progress-track\" aria-hidden=\"true\"><span data-watch-bar><\/span><\/div><\/div>\n                                <\/div>\n                                <a class=\"cisvc__watch-page cisvc__sr-only\" href=\"https:\/\/skinarttraining.com\/za\/faq-videos\/lessons-and-assignments\/\">What is the lesson format<\/a>                            <\/div>\n                        <\/div>\n                                    <\/div>\n            <\/div>\n            <div class=\"cisvc__controls\" role=\"group\" aria-label=\"Carousel navigation\">\n                <button type=\"button\" class=\"cisvc__nav\" data-action=\"prev\" aria-label=\"Previous slide\" hidden>&lt;<\/button>\n                <span class=\"cisvc__number\" data-current-number hidden>1 \/ 1<\/span>\n                <button type=\"button\" class=\"cisvc__nav\" data-action=\"next\" aria-label=\"Next slide\" hidden>&gt;<\/button>\n                <button type=\"button\" class=\"cisvc__quality\" data-action=\"quality\" aria-label=\"Toggle quality\">SD<\/button>\n\n            <div class=\"cisvc__langRow\" role=\"group\" aria-label=\"Language controls\">\n                <select class=\"cisvc__select cisvc__audio\" aria-label=\"Audio language\">\n                    <option value=\"-1\">Default Audio<\/option>\n                <\/select>\n                <select class=\"cisvc__select cisvc__subs\" aria-label=\"Subtitle language\">\n                    <option value=\"off\">Subtitles Off<\/option>\n                <\/select>\n            <\/div>\n\n            <\/div>\n        <\/section>\n                            <style id=\"cis-video-carousel-css\">\n.cisvc{--w:min(84vw,860px);--g:clamp(10px,1.8vw,18px);max-width:1200px;margin:24px auto;padding:clamp(10px,1.8vw,16px);border-radius:16px;background:#161616;border:1px solid #414141;box-shadow:0 18px 34px #0005;color:#f8f8f8;overflow:hidden}\n.cisvc__viewport{overflow:hidden;overflow:clip;border-radius:12px;background:#161616;touch-action:pan-y;user-select:none;cursor:grab;outline:none;overscroll-behavior:contain;-webkit-user-select:none;-webkit-touch-callout:none}\n.cisvc.is-focused .cisvc__viewport{cursor:default}.cisvc.is-dragging .cisvc__viewport,.cisvc.is-dragging .cisvc__play{cursor:grabbing!important}\n.cisvc__track{display:flex;flex-wrap:nowrap;align-items:stretch;gap:var(--g);background:#161616;transform:translate3d(0,0,0);transition:transform .42s cubic-bezier(.22,.78,.22,1);will-change:transform}\n.cisvc__slide{flex:0 0 var(--w);max-width:100%;background:#161616}\n.cisvc__card{height:100%;display:flex;flex-direction:column;position:relative;background:#161616;border:1px solid #494949;border-radius:12px;overflow:hidden;box-shadow:0 8px 22px #0004}\n.cisvc__media{width:100%;aspect-ratio:16\/9;flex:0 0 auto;background:#161616;position:relative}\n.cisvc__thumb{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;background:#161616;z-index:1;pointer-events:none}.cisvc__thumb.is-missing{display:none}\n.cisvc__player-mount{position:absolute;inset:0;z-index:2;width:100%;height:100%}.cisvc__player-mount video{width:100%;height:100%;display:block;opacity:1;filter:none;background:#111;object-fit:contain}\n.cisvc__poster-copy{position:absolute;inset:0;z-index:3;pointer-events:none;display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-start;padding:7% 5%;background:linear-gradient(90deg,#111c,#1114 48%,transparent 74%)}\n.cisvc__poster-copy span{font-size:clamp(9px,1vw,12px);font-weight:650;letter-spacing:.15em;color:#e4e4e4;margin-bottom:12px}.cisvc__poster-copy strong{display:block;max-width:48%;font-size:clamp(25px,3.1vw,40px);font-weight:600;letter-spacing:-.025em;line-height:1.12;text-align:left;text-wrap:balance;color:#fff;text-shadow:0 2px 12px #0008}\n\/* These rules only override theme buttons inside this carousel. *\/\n.cisvc.cisvc--clean-controls button:is(.cisvc__play,.cisvc__nav,.cisvc__quality){appearance:none!important;-webkit-appearance:none!important;margin:0!important;font-family:inherit!important;font-weight:500!important;letter-spacing:normal!important;text-transform:none!important;color:#fff!important;box-shadow:none!important;background-image:none!important;cursor:pointer}\n.cisvc.cisvc--clean-controls button.cisvc__play{position:absolute!important;inset:0!important;z-index:4;width:100%!important;height:100%!important;min-height:0!important;min-width:0!important;max-width:none!important;max-height:none!important;transform:none!important;padding:0!important;border:0!important;border-radius:0!important;background:transparent!important;display:block!important}\n.cisvc.cisvc--clean-controls button.cisvc__play:hover,.cisvc.cisvc--clean-controls button.cisvc__play:active,.cisvc.cisvc--clean-controls button.cisvc__play:focus{background:transparent!important;color:#fff!important}\n.cisvc__playIcon{position:absolute;left:13%;top:28%;transform:translate(-50%,-50%);width:clamp(74px,12vw,100px);height:clamp(46px,7vw,60px);display:flex;align-items:center;justify-content:center;border:1px solid #a5a5a5;border-radius:10px;background:#111d;pointer-events:none}\n.cisvc__playIcon::after{content:\"\";display:block;width:0;height:0;border-top:10px solid transparent;border-bottom:10px solid transparent;border-left:16px solid #fff;position:relative;left:2px}\n.cisvc.cisvc--clean-controls button.cisvc__play:hover .cisvc__playIcon{background:#333e;border-color:#fff}\n.cisvc.cisvc--clean-controls .cisvc__slide.has-video .cisvc__play,.cisvc .cisvc__slide.has-video .cisvc__poster-copy,.cisvc .cisvc__slide.has-video .cisvc__thumb,.cisvc.cisvc--single-track .cisvc__slide.has-video .cisvc__caption{display:none!important}\n.cisvc.cisvc--single-track .cisvc__caption{display:block;margin:0;padding:7px 12px 8px;min-height:0;color:#dedede;background:#202020}\n.cisvc__summary{display:flex;gap:12px;align-items:center;min-width:0}.cisvc__current-status{font-size:11px!important;line-height:1.4!important;margin:0!important;color:#dedede!important;font-variant-numeric:tabular-nums;white-space:nowrap}\n.cisvc__progress-track{height:2px;flex:1;background:#505050;margin:0;border-radius:2px;overflow:hidden}.cisvc__progress-track span{display:block;height:100%;width:0;background:#eee;transition:width .2s}\n.cisvc__controls{margin-top:10px;display:flex;align-items:center;justify-content:center;gap:8px;flex-wrap:wrap;background:#161616;opacity:.35;pointer-events:none}.cisvc.is-booted .cisvc__controls{opacity:1;pointer-events:auto}\n.cisvc.cisvc--clean-controls button:is(.cisvc__nav,.cisvc__quality){box-sizing:border-box!important;min-height:34px!important;min-width:34px!important;border-radius:7px!important;border:1px solid #656565!important;background:#222!important;font-size:13px!important;line-height:1.2!important;padding:6px 10px!important}\n.cisvc.cisvc--clean-controls button:is(.cisvc__nav,.cisvc__quality):hover,.cisvc.cisvc--clean-controls button:is(.cisvc__nav,.cisvc__quality):active{background:#3a3a3a!important;border-color:#aaa!important}.cisvc__number{font-size:12px;font-variant-numeric:tabular-nums;color:inherit;min-width:35px;text-align:center}\n.cisvc.cisvc--clean-controls .cisvc__select{box-sizing:border-box;height:34px!important;min-height:34px!important;border:1px solid #656565!important;background:#222!important;color:#fff!important;border-radius:7px!important;padding:0 24px 0 8px!important;font-family:inherit!important;font-size:12px!important;line-height:1.2!important;max-width:100%;margin:0!important}.cisvc__langRow{display:flex;justify-content:center;align-items:center;gap:8px;flex-wrap:wrap;margin:0;min-width:0}\n.cisvc .cisvc__audio,.cisvc .cisvc__subs{display:none}.cisvc.has-player .cisvc__audio,.cisvc.has-player .cisvc__subs{display:inline-block}.cisvc video::cue{color:#fff!important;background:rgba(0,0,0,.82)!important;text-shadow:0 1px 2px rgba(0,0,0,.95)!important;font-size:16px!important;font-family:sans-serif!important;line-height:normal!important;white-space:pre-line!important;overflow-wrap:break-word!important}\n@media(max-width:600px){.cisvc video::cue{font-size:13px!important}}\n.cisvc__banner{margin-bottom:8px;padding:8px 10px;border-radius:8px;border:1px solid #888;background:#333;color:#fff;font-size:12px;line-height:1.4}\n.cisvc.cisvc--clean-controls :is(button,select,a):focus-visible,.cisvc.cisvc--clean-controls .cisvc__viewport:focus-visible{outline:2px solid #fff!important;outline-offset:3px!important}.cisvc.cisvc--clean-controls button.cisvc__play:focus-visible{outline-offset:-4px!important}.cisvc [hidden]{display:none!important}\n.cisvc__sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.cisvc .cisvc__sr-only:focus{clip:auto!important;width:auto!important;height:auto!important;margin:0!important;left:8px;top:8px;z-index:5;padding:8px!important;background:#111!important;color:#fff!important}\n.cisvc--standalone{--w:100%;--g:0px}.cisvc--standalone .cisvc__viewport{cursor:default}\n@media(max-width:680px){.cisvc{--w:84vw;--g:10px;margin:14px auto;border-radius:14px}.cisvc--standalone{--w:100%;--g:0px}.cisvc__poster-copy{padding:6% 5%}.cisvc__poster-copy strong{max-width:49%;font-size:clamp(18px,4.3vw,27px)}.cisvc__poster-copy span{font-size:8px;margin-bottom:8px}.cisvc__playIcon{left:14%;top:25%;width:64px;height:43px}.cisvc.cisvc--single-track .cisvc__caption{padding:6px 9px 7px}.cisvc__current-status{font-size:10px!important}.cisvc__controls{gap:6px}.cisvc__langRow{gap:6px}}\n@media(prefers-reduced-motion:reduce){.cisvc__track,.cisvc__progress-track span{transition:none}}\n<\/style>\n        <script type=\"text\/javascript\" id=\"cis-video-carousel-js\" data-cfasync=\"false\">\n            (function(){\n                console.log('[cisvc] script loaded');\n                function A(x){return Array.prototype.slice.call(x||[])}function C(v,min,max){return Math.max(min,Math.min(max,v))}\n                function D(){try{return new URLSearchParams(window.location.search).get('cisvc_debug')==='1'}catch(e){return false}}\n                var DEBUG_GLOBAL=D();\n                function B(root,msg){if(!DEBUG_GLOBAL||!root)return;var n=root.querySelector('.cisvc__banner');if(!n){n=document.createElement('div');n.className='cisvc__banner';root.insertBefore(n,root.firstChild)}n.textContent=String(msg||'Unknown error')}\n                function G(){if(!DEBUG_GLOBAL||window.__cisvc_global_hooks)return;window.__cisvc_global_hooks=true;window.addEventListener('error',function(e){var m='[cisvc] window error: '+(e&&e.message?e.message:'unknown');console.error(m,e&&e.error&&e.error.stack?e.error.stack:e);A(document.querySelectorAll('.cisvc')).forEach(function(r){B(r,m+' (boot may have failed)')})});window.addEventListener('unhandledrejection',function(e){var rs=e&&e.reason?(e.reason.message||String(e.reason)):'unknown';var m='[cisvc] unhandled rejection: '+rs;console.error(m,e&&e.reason&&e.reason.stack?e.reason.stack:e);A(document.querySelectorAll('.cisvc')).forEach(function(r){B(r,m+' (boot may have failed)')})})}\n                var storageOK=true;\n                function storageGet(key){try{return window.localStorage.getItem(key)}catch(_e){storageOK=false;return null}}\n                function storageSet(key,value){try{window.localStorage.setItem(key,value);return true}catch(_e){storageOK=false;return false}}\n\/* Pure browser-local watch memory. No network calls or account identifiers. *\/\nfunction createWatchMemory(storage, now) {\n    var KEY = 'cisvc_watch_v1', LIMIT = 100, MAX_RANGES = 64;\n    var clock = now || Date.now, available = true, entries = Object.create(null), selections = Object.create(null), dirty = Object.create(null), lastSample = null;\n    function validId(id) { return typeof id === 'string' && \/^[A-Za-z0-9_-]{1,180}$\/.test(id) && !\/^(?:__proto__|prototype|constructor)$\/.test(id); }\n    function finite(n) { return typeof n === 'number' && Number.isFinite(n); }\n    function clamp(n, lo, hi) { return Math.max(lo, Math.min(hi, n)); }\n    function ranges(input, duration) {\n        var result = [];\n        (Array.isArray(input) ? input : []).slice(0, 256).forEach(function (p) {\n            if (!Array.isArray(p) || !finite(p[0]) || !finite(p[1])) return;\n            var a = clamp(p[0], 0, duration), b = clamp(p[1], 0, duration);\n            if (b > a) result.push([a, b]);\n        });\n        result.sort(function (a, b) { return a[0] - b[0]; });\n        var merged = [];\n        result.forEach(function (p) {\n            var previous = merged[merged.length - 1];\n            if (previous && p[0] <= previous[1] + 0.02) previous[1] = Math.max(previous[1], p[1]);\n            else merged.push(p.slice());\n        });\n        if (merged.length > MAX_RANGES) {\n            merged.sort(function (a, b) { return (b[1] - b[0]) - (a[1] - a[0]); });\n            merged = merged.slice(0, MAX_RANGES).sort(function (a, b) { return a[0] - b[0]; });\n        }\n        return merged;\n    }\n    function clean(value) {\n        if (!value || !finite(value.duration) || value.duration <= 0 || value.duration > 86400) return null;\n        return { position: clamp(finite(value.position) ? value.position : 0, 0, value.duration), duration: value.duration,\n            ranges: ranges(value.ranges, value.duration), updatedAt: finite(value.updatedAt) ? value.updatedAt : 0 };\n    }\n    function read() {\n        var data;\n        try {\n            var raw = storage.getItem(KEY);\n            if (!raw || raw.length > 524288) return { entries: Object.create(null), selections: Object.create(null) };\n            data = JSON.parse(raw);\n        } catch (_) { available = false; }\n        var videos = Object.create(null), chosen = Object.create(null);\n        if (data && data.version === 1 && data.videos && typeof data.videos === 'object') {\n            Object.keys(data.videos).slice(0, 300).forEach(function (id) { var item = validId(id) && clean(data.videos[id]); if (item) videos[id] = item; });\n            Object.keys(data.selections || {}).slice(0, 30).forEach(function (key) {\n                var value = data.selections[key];\n                if (\/^set-[a-f0-9]{1,8}$\/.test(key) && validId(value)) chosen[key] = value;\n            });\n        }\n        return { entries: videos, selections: chosen };\n    }\n    var loaded = read(); entries = loaded.entries; selections = loaded.selections;\n    function summary(id) {\n        var item = entries[id], seconds = item ? item.ranges.reduce(function (sum, p) { return sum + p[1] - p[0]; }, 0) : 0;\n        var fraction = item ? clamp(seconds \/ item.duration, 0, 1) : 0;\n        return { position: item ? item.position : 0, duration: item ? item.duration : 0, watchedSeconds: seconds,\n            percent: Math.floor(fraction * 100), complete: fraction >= 0.95 };\n    }\n    function sample(id, position, duration, state) {\n        if (!validId(id) || !finite(position) || !finite(duration) || duration <= 0 || duration > 86400) { lastSample = null; return summary(id); }\n        var time = clock(), item = entries[id], meta = state || {}, speed = finite(meta.rate) && meta.rate > 0 ? meta.rate : 1;\n        if (!item || Math.abs(item.duration - duration) > Math.max(2, item.duration * 0.03)) item = { position: 0, duration: duration, ranges: [], updatedAt: 0 };\n        item.duration = duration; position = clamp(position, 0, duration);\n        if (lastSample && lastSample.id === id && meta.playing && meta.visible !== false && !meta.seeking) {\n            var elapsed = (time - lastSample.wall) \/ 1000, delta = position - lastSample.position;\n            if (elapsed > 0 && elapsed <= 5 && delta > 0 && delta <= elapsed * speed + 0.75 && delta <= 5 * speed) {\n                item.ranges = ranges(item.ranges.concat([[lastSample.position, position]]), duration);\n            }\n        }\n        item.position = position; item.updatedAt = time; entries[id] = item; dirty[id] = true;\n        lastSample = meta.playing && meta.visible !== false && !meta.seeking ? { id: id, position: position, wall: time } : null;\n        return summary(id);\n    }\n    function save() {\n        var fresh = read();\n        Object.keys(dirty).forEach(function (id) {\n            var item = entries[id], other = fresh.entries[id];\n            if (other && Math.abs(other.duration - item.duration) <= Math.max(2, item.duration * 0.03)) {\n                item.ranges = ranges(item.ranges.concat(other.ranges), item.duration);\n                if (other.updatedAt > item.updatedAt) { item.position = other.position; item.updatedAt = other.updatedAt; }\n            }\n            fresh.entries[id] = item;\n        });\n        var ids = Object.keys(fresh.entries).sort(function (a, b) { return fresh.entries[b].updatedAt - fresh.entries[a].updatedAt; }).slice(0, LIMIT);\n        var kept = Object.create(null); ids.forEach(function (id) { kept[id] = fresh.entries[id]; });\n        Object.keys(selections).forEach(function (key) { fresh.selections[key] = selections[key]; });\n        var recentSelections = Object.create(null);\n        Object.keys(fresh.selections).slice(-30).forEach(function (key) { recentSelections[key] = fresh.selections[key]; });\n        entries = kept; selections = recentSelections;\n        try { storage.setItem(KEY, JSON.stringify({ version: 1, videos: entries, selections: selections })); available = true; dirty = Object.create(null); }\n        catch (_) { available = false; }\n        return available;\n    }\n    function remember(collection, id) { if (\/^set-[a-f0-9]{1,8}$\/.test(collection) && validId(id)) { selections[collection] = id; save(); } }\n    function restart(id) { if (entries[id]) { entries[id].position = 0; entries[id].updatedAt = clock(); dirty[id] = true; } lastSample = null; save(); }\n    function collection(ids) { var hash = 2166136261; ids.slice().sort().join('|').split('').forEach(function (ch) { hash ^= ch.charCodeAt(0); hash = Math.imul(hash, 16777619); }); return 'set-' + (hash >>> 0).toString(16); }\n    function refresh() {\n        var fresh = read(); Object.keys(dirty).forEach(function (id) { fresh.entries[id] = entries[id]; });\n        entries = fresh.entries; selections = fresh.selections;\n    }\n    return { get: summary, sample: sample, resetAnchor: function () { lastSample = null; }, save: save, remember: remember,\n        selected: function (key) { return selections[key] || ''; }, restart: restart, collection: collection, refresh: refresh,\n        available: function () { return available; }, key: KEY };\n}\n\n                var watchMemory=createWatchMemory({getItem:storageGet,setItem:function(key,value){if(!storageSet(key,value))throw new Error('Storage unavailable')}});\n                function init(root){\n                    var DEBUG=D(),log=function(){if(!DEBUG)return;var a=['[cisvc]'];for(var i=0;i<arguments.length;i++)a.push(arguments[i]);console.log.apply(console,a)};\n                    if(root.dataset.cisvcBooted==='1')return;\n                    var viewport=root.querySelector('.cisvc__viewport'),track=root.querySelector('.cisvc__track'),slides=A(root.querySelectorAll('.cisvc__slide')),thumbs=A(root.querySelectorAll('.cisvc__thumb'));\n                    var audio=root.querySelector('.cisvc__audio'),subs=root.querySelector('.cisvc__subs'),qualityBtn=root.querySelector('.cisvc__quality'),numberNode=root.querySelector('[data-current-number]');\n                    if(!viewport||!track||!slides.length||!audio||!subs||!qualityBtn){B(root,'Carousel boot failed: missing required element');return}\n                    var base=root.getAttribute('data-base-url')||'',hlsLocal=root.getAttribute('data-hls-local')||'',motionQuery=window.matchMedia&&window.matchMedia('(prefers-reduced-motion: reduce)'),reduced=!!(motionQuery&&motionQuery.matches),versionedFolders=[],labels={};\n                    try{versionedFolders=JSON.parse(root.getAttribute('data-versioned-folders')||'[]');labels=JSON.parse(root.getAttribute('data-labels')||'{}')}catch(_e){}\n                    var SLIDE_INTERVAL_MS=9000,NAV_PAUSE_MS=120000;\n                    var state={index:0,focused:false,isDragging:false,isVisible:true,pauseUntil:0},players=Object.create(null),docVisible=!document.hidden,timer=null,tx=0,suppressUntil=0,hlsPromise=null,drag={id:null,startX:0,startY:0,startTx:0,dx:0,dy:0};\n                                        var siteKey=(function(){try{return (new URL(base,window.location.href)).pathname.split('\/').filter(Boolean)[0]||'root'}catch(_e){return (location.pathname.split('\/').filter(Boolean)[0]||'root')}})();\n                    var LQ='cisvc_quality_'+siteKey,LS='cisvc_sub_lang_v2_'+siteKey,LA='cisvc_audio_track_'+siteKey,LAL='cisvc_audio_lang_'+siteKey;\n                    function getCookie(n){try{var m=document.cookie.match(new RegExp('(?:^|; )'+String(n).replace(\/[.*+?^${}()|[\\]\\\\]\/g,'\\\\$&')+'=([^;]*)'));return m?decodeURIComponent(m[1]):''}catch(_e){return''}}\n                    function setCookie(n,v){try{document.cookie=String(n)+'='+encodeURIComponent(String(v||''))+'; path=\/; max-age=31536000; samesite=lax'}catch(_e){}}\n                    var quality=((storageGet(LQ)||storageGet('cisvc_quality')||'sd')==='hd')?'hd':'sd';\n                    var subPref=(getCookie(LS)||storageGet(LS)||'off');\n                    if(\/^\\d+$\/.test(subPref)){subPref='off'}\n                    var audioPref=parseInt(storageGet(LA)||storageGet('cisvc_audio_track')||'-1',10);\n                    var audioLangPref=(getCookie(LAL)||storageGet(LAL)||'en').toLowerCase();\n                    if(!getCookie(LS)){setCookie(LS,subPref)}\n                    if(!getCookie(LAL)){setCookie(LAL,audioLangPref)}\n                    qualityBtn.textContent=quality.toUpperCase();\n\n                    function label(key,fallback){return labels[key]||fallback}\n                    function stamp(seconds){seconds=Math.max(0,Math.floor(seconds||0));return Math.floor(seconds\/60)+':'+String(seconds%60).padStart(2,'0')}\n                    var collection=watchMemory.collection(slides.map(function(slide){return slide.getAttribute('data-folder')||''}));\n                    var remembered=watchMemory.selected(collection),initialIndex=slides.findIndex(function(slide){return slide.getAttribute('data-folder')===remembered});\n                    function activePlayer(){return players[state.index]||null}\n                    function refreshProgress(){\n                        slides.forEach(function(slide){var id=slide.getAttribute('data-folder')||'',title=slide.getAttribute('data-title')||'',entry=watchMemory.get(id),bar=slide.querySelector('[data-watch-bar]'),status=slide.querySelector('[data-watch-status]'),play=slide.querySelector('.cisvc__play');\n                            if(bar)bar.style.width=entry.percent+'%';if(status)status.textContent=entry.percent+label('percent','% watched');\n                            if(play)play.setAttribute('aria-label',(entry.complete?label('again','Watch again'):entry.position>2?label('resume','Resume at')+' '+stamp(entry.position):label('play','Play'))+': '+title);\n                        });\n                        if(numberNode)numberNode.textContent=(state.index+1)+' \/ '+slides.length;\n                    }\n                    function loadThumbAt(idx){var img=thumbs[((idx%thumbs.length)+thumbs.length)%thumbs.length];if(!img)return;var src=img.getAttribute('data-src');if(src){img.src=src;img.removeAttribute('data-src');img.classList.remove('is-lazy')}}\n                    function loadThumbsAround(idx){loadThumbAt(idx);loadThumbAt(idx-1);loadThumbAt(idx+1)}\n                    thumbs.forEach(function(img){img.addEventListener('error',function(){img.classList.add('is-missing')})});\n                    function manifest(folder){var f=encodeURIComponent(folder),rootBase=String(base||'').replace(\/\\\/+$\/,'')+'\/';var b=rootBase+f+'\/',version=versionedFolders.indexOf(folder)>=0?'?v='+encodeURIComponent(root.getAttribute('data-media-version')||''):'';return{base:b,sd:b+'master480.m3u8'+version,hd:b+'master720.m3u8'+version,thumb:rootBase+f+'.webp?v='+encodeURIComponent(root.getAttribute('data-thumb-version')||'')}}\nfunction absUrl(baseDir,u){if(!u)return u;if(\/^(https?:)?\\\/\\\/\/i.test(u)||\/^data:\/i.test(u)||\/^blob:\/i.test(u)){return u}if(u.charAt(0)==='\/'){try{var o=new URL(baseDir);return o.protocol+'\/\/'+o.host+u}catch(_e){return u}}return baseDir+u.replace(\/^\\.?\\\/\/,'')}\nfunction parseAudioTrackLines(text){var out=[];String(text||'').split(\/\\r?\\n\/).forEach(function(ln){if(!\/^#EXT-X-MEDIA:TYPE=AUDIO\/i.test(ln)){return}var attrs={};ln.replace(\/([A-Z0-9-]+)=((\\\"[^\\\"]*\\\")|[^,]*)\/gi,function(_m,k,v){attrs[k]=String(v||'').replace(\/^\\\"|\\\"$\/g,'');return''});out.push({name:attrs.NAME||'',lang:attrs.LANGUAGE||'',attrs:attrs})});return out}\nfunction normalizeMasterText(text,src){var raw=String(text||'');var lines=raw.split(\/\\r?\\n\/);var baseDir=String(src||'').replace(\/[^\\\/?#]*([?#].*)?$\/,'');var audio=[];var rest=[];var firstStream=-1;for(var i=0;i<lines.length;i++){var ln=lines[i];if(firstStream<0&&\/^#EXT-X-STREAM-INF\/i.test(ln)){firstStream=i}if(\/^#EXT-X-MEDIA:TYPE=AUDIO\/i.test(ln)){var m=ln.match(\/URI=\\\"([^\\\"]+)\\\"\/i);if(m&&m[1]){ln=ln.replace(\/URI=\\\"([^\\\"]+)\\\"\/i,'URI=\\\"'+absUrl(baseDir,m[1])+'\\\"')}audio.push(ln)}else{rest.push(ln)}}for(var x=0;x<rest.length;x++){var rl=rest[x];if(rl&&rl.charAt(0)!=='#'){rest[x]=absUrl(baseDir,rl)}}if(!audio.length||firstStream<0){var only=rest.join('\\n');return{text:only,changed:only!==raw,audioTracks:parseAudioTrackLines(only)}}var streamPos=0;for(var k=0;k<rest.length;k++){if(\/^#EXT-X-STREAM-INF\/i.test(rest[k])){streamPos=k;break}}var out=rest.slice(0,streamPos).concat(audio).concat(rest.slice(streamPos));var outText=out.join('\\n');return{text:outText,changed:outText!==raw,audioTracks:parseAudioTrackLines(outText)}}\n                    function ensureHls(){if(window.Hls&&window.Hls.isSupported&&window.Hls.isSupported()){return Promise.resolve(true)}if(hlsPromise)return hlsPromise;hlsPromise=new Promise(function(resolve){if(!hlsLocal){log('hls missing path');resolve(false);return}var s=document.createElement('script');s.src=hlsLocal;s.defer=true;s.onload=function(){var ok=!!(window.Hls&&window.Hls.isSupported&&window.Hls.isSupported());log('hls loaded',hlsLocal,'supported',ok);resolve(ok)};s.onerror=function(){log('hls load failed',hlsLocal);resolve(false)};document.head.appendChild(s)});return hlsPromise}\n                    function canAuto(){var p=activePlayer();return !reduced&&!state.isDragging&&state.isVisible&&docVisible&&slides.length>1&&!(p&&p.playing())}\n                    function stopAuto(){if(timer!==null){clearTimeout(timer);timer=null}}\n                    function pauseAuto(){state.pauseUntil=Math.max(state.pauseUntil,Date.now()+NAV_PAUSE_MS)}\n                    function startAuto(){stopAuto();if(!canAuto())return;var delay=Math.max(SLIDE_INTERVAL_MS,state.pauseUntil-Date.now());timer=setTimeout(function(){timer=null;if(canAuto())setActive(state.index+1,false)},delay)}\n                    function resetViewportScroll(){if(viewport.scrollLeft)viewport.scrollLeft=0}\n                    viewport.addEventListener('scroll',resetViewportScroll,{passive:true});root.addEventListener('focusin',resetViewportScroll);\n                    function gap(){var s=window.getComputedStyle(track),g=parseFloat(s.columnGap||s.gap||'0');return Number.isFinite(g)?g:0}\n                    function m(){var sw=slides[0]?slides[0].offsetWidth:0,step=sw+gap(),off=(viewport.clientWidth-sw)\/2;return{sw:sw,step:step,off:off}}\n                    function i2x(i){var k=m();return k.step>0?-(i*k.step-k.off):0}function x2i(x){var k=m();return k.step>0?C(Math.round((-x+k.off)\/k.step),0,slides.length-1):state.index}\n                    function setX(x,animate){var a=i2x(0),b=i2x(slides.length-1),value=C(x,Math.min(a,b),Math.max(a,b));track.style.transition=animate&&!reduced?'transform .42s cubic-bezier(.22,.78,.22,1)':'none';track.style.transform='translate3d('+value+'px,0,0)';tx=value;resetViewportScroll()}\n                    function syncActive(){var p=activePlayer(),seen=!!(p&&p.loaded());state.focused=seen;root.classList.toggle('has-player',seen);root.classList.toggle('is-focused',seen);slides.forEach(function(slide,i){slide.classList.toggle('is-active',i===state.index);slide.classList.toggle('is-focused',i===state.index&&seen);slide.setAttribute('aria-current',i===state.index?'true':'false');A(slide.querySelectorAll('.cisvc__play,.cisvc__watch-page')).forEach(function(control){control.tabIndex=i===state.index?0:-1})});if(p)p.activate();else{qualityBtn.textContent=quality.toUpperCase();audio.innerHTML='';subs.innerHTML=''}refreshProgress()}\n                    function focusPlayer(){if(window.__cisvc_active_controller&&window.__cisvc_active_controller!==api)window.__cisvc_active_controller.forceBlur();window.__cisvc_active_controller=api;syncActive();stopAuto()}\n                    function setActive(n,user){if(user)pauseAuto();var previous=activePlayer(),index=((n%slides.length)+slides.length)%slides.length;if(index!==state.index&&previous)previous.pause(true);state.index=index;loadThumbsAround(index);setX(i2x(index),true);if(user)watchMemory.remember(collection,slides[index].getAttribute('data-folder')||'');syncActive();startAuto()}\n                    function createPlayer(slide,index){\n                        var currentFolder=slide.getAttribute('data-folder')||'',video=slide.querySelector('video')||document.createElement('video'),hls=null,manifestBlobUrl='',cachedAudioTracks=[],loadSerial=0,pendingRestore=null,pendingSubFetches=Object.create(null),pstate={customSubTrack:null,customSubLang:'',customSubCues:[],customSubPool:Object.create(null),selectedSubTrack:null,subtitlesReady:false,subtitleMeasure:null,subtitleCueLayout:new WeakMap(),subtitleLayoutViewport:'',subtitleResizeFrame:0},lastPersist=0,isLoaded=false,loadingStarted=false,sourceLoading=false,playPending=false,playerQuality=quality;\n                        video.id=video.id||'cisvc_video_'+Math.random().toString(36).slice(2);video.controls=true;video.setAttribute('controlslist','nodownload');video.addEventListener('contextmenu',function(e){e.preventDefault()});video.preload='none';video.playsInline=true;video.setAttribute('playsinline','playsinline');video.crossOrigin='anonymous';video.setAttribute('aria-label',slide.getAttribute('data-title')||'Video');slide.querySelector('.cisvc__player-mount').appendChild(video);\n                        var nativeHls=!!video.canPlayType('application\/vnd.apple.mpegurl');\n                        function isActive(){return state.index===index&&players[index]===player}\n                        function sampleWatch(force){if(Number.isFinite(video.duration)&&video.duration>0){watchMemory.sample(currentFolder,video.currentTime,video.duration,{playing:isActive()&&!video.paused,seeking:video.seeking,visible:docVisible&&isActive(),rate:video.playbackRate});if(force||Date.now()-lastPersist>5000){watchMemory.save();lastPersist=Date.now()}}refreshProgress()}\n                        function resumeLoading(position){if(hls&&!loadingStarted){loadingStarted=true;try{hls.startLoad(Number.isFinite(position)?position:-1)}catch(_e){}}video.preload='metadata'}\n                        function stopLoading(){loadingStarted=false;if(hls){try{hls.stopLoad()}catch(_e){}}video.preload='none'}\n                        function playbackFailed(err){playPending=false;sourceLoading=false;if(pendingRestore)pendingRestore.autoplay=false;video.pause();stopLoading();log('play error',err&&err.message?err.message:err);if(isActive()){pauseAuto();startAuto()}}\n                        function safePlay(){if(!isActive()||!docVisible||!state.isVisible)return;var serial=loadSerial;playPending=true;stopAuto();resumeLoading(-1);try{var promise=video.play();if(promise&&promise.then)promise.then(function(){if(serial===loadSerial)playPending=false},function(err){if(serial===loadSerial)playbackFailed(err)});else playPending=false}catch(err){if(serial===loadSerial)playbackFailed(err)}}\n                        function restorePlayback(){var pending=pendingRestore;if(!pending||!pending.ready||pending.serial!==loadSerial||!Number.isFinite(video.duration)||video.duration<=0)return;pendingRestore=null;sourceLoading=false;applySubs(subPref);watchMemory.resetAnchor();try{video.currentTime=C(pending.position,0,Math.max(0,video.duration-.25))}catch(_e){}if(pending.autoplay&&isActive())safePlay();else{video.pause();startAuto()}}\n                        function startPlaybackLoad(){var pending=pendingRestore;if(!pending||!pending.ready||pending.serial!==loadSerial)return;if(!isActive()||!docVisible||!state.isVisible){pending.autoplay=false;sourceLoading=false;stopLoading();return}sourceLoading=true;resumeLoading(pending.position);if(pending.autoplay)safePlay();restorePlayback()}\n                        function clearTracks(){A(video.querySelectorAll('track')).forEach(function(t){t.remove()})}\nfunction subtitleTrackEls(){return A(video.querySelectorAll('track[kind=\"subtitles\"]'))}\nfunction subtitleTracks(){return A(video.textTracks).filter(function(t){return \/^(subtitles|captions)$\/.test(String(t.kind||'').toLowerCase())})}\nfunction subtitleFontSize(){return window.matchMedia&&window.matchMedia('(max-width:600px)').matches?13:16}\nfunction subtitleCueHeight(cue,width){var probe=pstate.subtitleMeasure;if(!probe){probe=document.createElement('span');probe.setAttribute('aria-hidden','true');probe.style.cssText='position:fixed;left:-10000px;top:0;display:block;visibility:hidden;pointer-events:none;margin:0;padding:0;border:0;box-sizing:content-box;font:16px sans-serif;line-height:normal;white-space:pre-line;overflow-wrap:break-word;text-align:center;unicode-bidi:plaintext;';document.body.appendChild(probe);pstate.subtitleMeasure=probe}probe.style.fontSize=subtitleFontSize()+'px';probe.style.width=(width*.94)+'px';probe.textContent='';if(cue.getCueAsHTML)probe.appendChild(cue.getCueAsHTML());else probe.textContent=String(cue.text||'');var height=Math.max(subtitleFontSize()*1.125,probe.getBoundingClientRect().height);probe.textContent='';return height}\nfunction presentSubtitleCue(cue){if(!cue)return;var width=video.clientWidth||346,height=video.clientHeight||width*9\/16,key=width+'x'+height+'@'+subtitleFontSize(),layout=pstate.subtitleCueLayout.get(cue);if(!layout||layout.key!==key){var reserve=width<=480?76:Math.max(72,Math.min(90,height*.12)),endSupported=!!(window.VTTCue&&'lineAlign' in window.VTTCue.prototype),offset=height-reserve-(endSupported?0:subtitleCueHeight(cue,width));layout={key:key,line:Math.max(0,Math.min(100,offset\/height*100)),endSupported:endSupported};pstate.subtitleCueLayout.set(cue,layout)}pstate.subtitleLayoutViewport=key;try{cue.snapToLines=false;cue.line=layout.line;if(layout.endSupported)cue.lineAlign='end';cue.position=50;if(window.VTTCue&&'positionAlign' in window.VTTCue.prototype)cue.positionAlign='center';cue.align='center';cue.size=94}catch(_e){}}\nfunction presentSubtitleTrack(tr){if(tr&&tr.cues)A(tr.cues).forEach(presentSubtitleCue)}\nfunction refreshSubtitleLayout(){var width=video.clientWidth||346,height=video.clientHeight||width*9\/16,key=width+'x'+height+'@'+subtitleFontSize(),changed=!!pstate.subtitleLayoutViewport&&pstate.subtitleLayoutViewport!==key,tracks=subtitleTracks(),showing=tracks.filter(function(tr){return tr.mode==='showing'});tracks.forEach(presentSubtitleTrack);if(changed)showing.forEach(function(tr){tr.mode='disabled';tr.mode='showing'})}\nfunction queueSubtitleLayout(){if(pstate.subtitleResizeFrame)return;pstate.subtitleResizeFrame=window.requestAnimationFrame(function(){pstate.subtitleResizeFrame=0;refreshSubtitleLayout()})}\nfunction setSubtitleModes(selected,loading){subtitleTracks().forEach(function(tr){var mode=tr===selected?'showing':tr===loading?'hidden':'disabled';if(tr.mode!==mode)tr.mode=mode});pstate.selectedSubTrack=selected||null}\nfunction syncNativeSubs(){if(!isActive()||!pstate.subtitlesReady||sourceLoading||pendingRestore)return;var showing=subtitleTracks().filter(function(tr){return tr.mode==='showing'}),chosen=showing.filter(function(tr){return tr!==pstate.selectedSubTrack}).pop()||showing[0]||null,wanted=chosen?String(chosen.language||'').toLowerCase():'off';if(wanted!=='off'&&!subtitleTrackEls().some(function(el){return String(el.srclang||'').toLowerCase()===wanted}))return;if(subPref!==wanted){subPref=wanted;storageSet(LS,wanted);setCookie(LS,wanted);subs.value=wanted}applySubs(wanted)}\nfunction addTracks(folder){var p=manifest(folder),serial=loadSerial;clearTracks();['af','ar','bn','da','de','en','es','fa','fi','fr','he','hi','it','ja','ko','nl','no','pl','pt','ru','sv','ta','th','uk','vi','zh','zu'].forEach(function(lang){var t=document.createElement('track');t.kind='subtitles';t.srclang=lang;t.label=lang.toUpperCase();t.default=(subPref!=='off'&&subPref===lang);var url=p.base+encodeURIComponent(folder)+'-'+encodeURIComponent(lang)+'.vtt';t.setAttribute('data-src',url);if(subPref!=='off'&&subPref===lang)t.src=url;t.addEventListener('error',function(){log('subtitle missing',folder,lang);if(isActive()&&serial===loadSerial&&currentFolder===folder&&subPref===lang)loadCustomSub(lang,url)});t.addEventListener('load',function(){if(serial!==loadSerial||currentFolder!==folder)return;presentSubtitleTrack(t.track);if(isActive()&&subPref!=='off'&&subPref===lang)applySubs(subPref)});video.appendChild(t)})}\nfunction ensureTrackSource(el){var src=el&&el.getAttribute('data-src');if(src&&!el.getAttribute('src'))el.setAttribute('src',src)}\nfunction clearCustomSub(){var tr=pstate.customSubTrack;if(tr){(pstate.customSubCues||[]).forEach(function(cue){try{tr.removeCue(cue)}catch(_e){}});try{tr.mode='disabled'}catch(_e){}pstate.customSubTrack=null;pstate.customSubLang='';pstate.customSubCues=[]}}\nfunction tsToSec(s){var p=String(s||'').trim().replace(',', '.').split(':');if(p.length!==3){return NaN}return (parseFloat(p[0])*3600)+(parseFloat(p[1])*60)+parseFloat(p[2])}\nfunction parseVtt(text){var lines=String(text||'').replace(\/\\r\/g,'').split('\\n');var cues=[];for(var i=0;i<lines.length;i++){var ln=lines[i].trim();if(!ln||ln==='WEBVTT'||\/^\\d+$\/.test(ln)){continue}if(ln.indexOf('-->')>-1){var t=ln.split('-->');var start=tsToSec(t[0]);var end=tsToSec((t[1]||'').trim().split(' ')[0]);if(!(start>=0&&end>start)){continue}var payload=[];for(var j=i+1;j<lines.length&&lines[j].trim()!=='';j++){payload.push(lines[j]);i=j}var txt=payload.join('\\n').trim();if(txt){cues.push({s:start,e:end,t:txt})}}}return cues}\nfunction loadCustomSub(lang,url){if(!url||!window.fetch||!('VTTCue' in window)||!isActive()||String(subPref).toLowerCase()!==lang)return;var folder=currentFolder,serial=loadSerial,key=serial+'|'+folder+'|'+lang+'|'+url;var nativeReady=subtitleTrackEls().some(function(el){return String(el.srclang||'').toLowerCase()===lang&&el.track&&el.track.cues&&el.track.cues.length});if(nativeReady){applySubs(lang);return}if(pstate.customSubTrack&&pstate.customSubLang===lang){applySubs(lang);return}if(pendingSubFetches[key])return;pendingSubFetches[key]=true;return fetch(url,{credentials:'same-origin',cache:'no-store'}).then(function(r){if(!r||!r.ok)throw new Error('subtitle fetch failed');return r.text()}).then(function(vtt){var cues=parseVtt(vtt);if(!cues.length)throw new Error('subtitle cues empty');if(!isActive()||serial!==loadSerial||folder!==currentFolder||String(subPref).toLowerCase()!==lang)return;var nativeReady=subtitleTrackEls().some(function(el){return String(el.srclang||'').toLowerCase()===lang&&el.track&&el.track.cues&&el.track.cues.length});if(nativeReady){applySubs(lang);return}if(pstate.customSubTrack&&pstate.customSubLang===lang)return;clearCustomSub();var tr=pstate.customSubPool[lang]||(pstate.customSubPool[lang]=video.addTextTrack('subtitles',lang.toUpperCase(),lang));pstate.customSubCues=[];for(var i=0;i<cues.length;i++){try{var cue=new VTTCue(cues[i].s,cues[i].e,cues[i].t);presentSubtitleCue(cue);tr.addCue(cue);pstate.customSubCues.push(cue)}catch(_e){}}pstate.customSubTrack=tr;pstate.customSubLang=lang;applySubs(lang);log('subtitle fallback cues',lang,cues.length)}).catch(function(err){log('subtitle fallback failed',lang,err&&err.message?err.message:err)}).then(function(){delete pendingSubFetches[key]})}\nfunction applySubs(v){var wanted=String(v||'off').toLowerCase(),serial=loadSerial,folder=currentFolder,selected=null,nativeTrack=null,selectedSrc='',cueCount=-1;if(pstate.customSubLang!==wanted)clearCustomSub();subtitleTrackEls().forEach(function(el){var tr=el.track;if(!tr)return;if(wanted!=='off'&&String(el.srclang||tr.language||'').toLowerCase()===wanted){ensureTrackSource(el);nativeTrack=tr;if(tr.mode==='disabled')tr.mode=pstate.customSubTrack?'hidden':'showing';presentSubtitleTrack(tr);selectedSrc=el.src||'';cueCount=tr.cues?tr.cues.length:-1}else{presentSubtitleTrack(tr)}});if(nativeTrack){if(cueCount>0){clearCustomSub();selected=nativeTrack}else{selected=pstate.customSubTrack&&pstate.customSubLang===wanted?pstate.customSubTrack:nativeTrack}}setSubtitleModes(selected,selected&&selected!==nativeTrack?nativeTrack:null);pstate.subtitlesReady=true;if(nativeTrack&&cueCount<=0&&!pstate.customSubTrack&&selectedSrc)setTimeout(function(){if(!isActive()||serial!==loadSerial||folder!==currentFolder||String(subPref).toLowerCase()!==wanted)return;var count=nativeTrack.cues?nativeTrack.cues.length:-1;log('subtitle cues',wanted,count,'mode',nativeTrack.mode);if(count<=0)loadCustomSub(wanted,selectedSrc)},1500);log('subtitle applied',wanted,!!selected,'cues',cueCount)}\nfunction fillSubs(){if(!isActive())return;subs.innerHTML='';var o=document.createElement('option');o.value='off';o.textContent='Subtitles Off';subs.appendChild(o);var trackEls=subtitleTrackEls();trackEls.forEach(function(t){var x=document.createElement('option');x.value=(t.srclang||'').toLowerCase();x.textContent=t.label||((t.srclang||'').toUpperCase())||'Sub';subs.appendChild(x)});subs.disabled=trackEls.length===0;subs.value=(subs.querySelector('option[value=\\\"'+String(subPref).toLowerCase()+'\\\"]')?String(subPref).toLowerCase():'off');applySubs(subs.value);log('subtitle selection',subs.value)}\nfunction audioLabel(t,i){var a=t&&t.attrs?t.attrs:{};return (t&&t.name)||(t&&t.lang)||(a&&a.NAME)||(a&&a.LANGUAGE)||('Audio '+(i+1))}\nfunction audioLangFromTrack(t,i){var a=t&&t.attrs?t.attrs:{};var raw=(t&&t.lang)||(a&&a.LANGUAGE)||(t&&t.name)||(a&&a.NAME)||'';raw=String(raw||'').toLowerCase();var m=raw.match(\/[a-z]{2,3}(?:-[a-z]{2})?\/i);return m?m[0].toLowerCase():''}\nfunction activeAudioTracks(){if(hls&&hls.audioTracks&&hls.audioTracks.length){return hls.audioTracks}return cachedAudioTracks||[]}\nfunction fillAudio(){if(!isActive())return;audio.innerHTML='';var tracks=activeAudioTracks();if(tracks.length<=1){var baseOpt=document.createElement('option');baseOpt.value='-1';baseOpt.textContent='Default Audio';audio.appendChild(baseOpt);audio.disabled=true;audio.value='-1';log('audio tracks available',tracks.length,'selected','default');return}tracks.forEach(function(t,i){var o=document.createElement('option');o.value=String(i);o.textContent=audioLabel(t,i);audio.appendChild(o)});audio.disabled=false;var selected=-1;if(audioLangPref){for(var ai=0;ai<tracks.length;ai++){var alang=audioLangFromTrack(tracks[ai],ai);if(alang===audioLangPref||alang.indexOf(audioLangPref+'-')===0){selected=ai;break}}}if(selected<0&&Number.isFinite(audioPref)&&audioPref>=0&&audioPref<tracks.length){selected=audioPref}if(selected<0){selected=(hls&&hls.audioTrack>=0&&hls.audioTrack<tracks.length)?hls.audioTrack:0}if(hls){hls.audioTrack=selected}audio.value=String(selected);audioPref=selected;var selTrack=tracks[selected]||null;var selLang=audioLangFromTrack(selTrack,selected)||audioLangPref||'en';audioLangPref=selLang;storageSet(LAL,audioLangPref);setCookie(LAL,audioLangPref);log('audio tracks available',tracks.length,'selected',audio.value,'lang',audioLangPref)}\nfunction prepareHlsSource(src,serial){if(!window.fetch){return Promise.resolve(src)}return fetch(src,{credentials:'same-origin',cache:'no-store'}).then(function(r){if(!r||!r.ok){return src}return r.text().then(function(txt){if(serial!==loadSerial)return src;var n=normalizeMasterText(txt,src);cachedAudioTracks=n.audioTracks||[];if(!n.changed){return src}if(manifestBlobUrl){try{URL.revokeObjectURL(manifestBlobUrl)}catch(e1){}}manifestBlobUrl=URL.createObjectURL(new Blob([n.text],{type:'application\/vnd.apple.mpegurl'}));log('normalized master manifest for audio tracks');return manifestBlobUrl})}).catch(function(){return src})}\n                        function resetSource(){pstate.subtitlesReady=false;loadSerial++;pendingRestore=null;sourceLoading=false;playPending=false;video.pause();stopLoading();if(hls){try{hls.destroy()}catch(_e){}hls=null}if(manifestBlobUrl){try{URL.revokeObjectURL(manifestBlobUrl)}catch(_e){}manifestBlobUrl=''}cachedAudioTracks=[];clearCustomSub();clearTracks();A(video.querySelectorAll('source')).forEach(function(source){source.remove()});video.removeAttribute('src');video.load()}\n                        function load(options){options=options||{};var saved=watchMemory.get(currentFolder),position=Number.isFinite(options.position)?options.position:saved.complete?0:saved.position;watchMemory.remember(collection,currentFolder);resetSource();isLoaded=true;sourceLoading=true;stopAuto();slide.classList.add('has-video');video.controls=isActive();var serial=loadSerial,paths=manifest(currentFolder),src=playerQuality==='hd'?paths.hd:paths.sd;pendingRestore={serial:serial,position:position,autoplay:options.autoplay!==false,ready:false};addTracks(currentFolder);focusPlayer();ensureHls().then(function(has){if(serial!==loadSerial)return;if(!has&&nativeHls){pendingRestore.ready=true;video.src=src;video.load();if(isActive()){fillAudio();fillSubs()}startPlaybackLoad();return}if(!has){pendingRestore=null;playbackFailed(new Error('HLS unavailable'));B(root,'Hls.js not loaded, cannot play HLS on this browser.');return}hls=new window.Hls({startLevel:0,autoStartLoad:false,maxBufferLength:12,maxMaxBufferLength:20,maxBufferSize:16777216,backBufferLength:3,capLevelToPlayerSize:false,fragLoadPolicy:{default:{maxTimeToFirstByteMs:60000,maxLoadTimeMs:120000,timeoutRetry:{maxNumRetry:3,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:3,retryDelayMs:1000,maxRetryDelayMs:8000}}}});var owner=hls;owner.attachMedia(video);owner.on(window.Hls.Events.MEDIA_ATTACHED,function(){prepareHlsSource(src,serial).then(function(finalSrc){if(serial===loadSerial&&hls===owner)owner.loadSource(finalSrc)})});owner.on(window.Hls.Events.MANIFEST_PARSED,function(){if(serial!==loadSerial)return;if(isActive()){fillAudio();fillSubs()}if(pendingRestore)pendingRestore.ready=true;startPlaybackLoad()});owner.on(window.Hls.Events.AUDIO_TRACKS_UPDATED,function(){if(serial===loadSerial&&isActive())fillAudio()});owner.on(window.Hls.Events.ERROR,function(_,d){if(serial!==loadSerial||hls!==owner)return;log('hls error',d&&d.type,d&&d.details,d&&d.fatal,d&&(d.frag&&d.frag.url||d.url||d.context&&d.context.url||d.response&&d.response.url)||'');if(d&&d.fatal){pendingRestore=null;playbackFailed(new Error(d.details||d.type||'Manifest\/player error'));if(isActive())B(root,'Manifest\/player error: '+(d.details||d.type||'unknown'))}})})}\n                        function pause(inactive){sampleWatch(true);playPending=false;sourceLoading=false;if(pendingRestore)pendingRestore.autoplay=false;video.pause();stopLoading();if(inactive)video.controls=false;watchMemory.resetAnchor()}\n                        function activate(){video.controls=true;qualityBtn.textContent=playerQuality.toUpperCase();if(isLoaded){fillAudio();fillSubs();if(pendingRestore&&pendingRestore.ready)startPlaybackLoad()}}\n                        function changeQuality(next){var position=video.currentTime||0,wasPlaying=!video.paused;playerQuality=next;load({position:position,autoplay:wasPlaying})}\n                        function selectAudio(i){var tracks=activeAudioTracks(),chosen=tracks[i]||null;audioPref=i;audioLangPref=(audioLangFromTrack(chosen,i)||audioLangPref||'en').toLowerCase();storageSet(LA,String(i));storageSet(LAL,audioLangPref);setCookie(LAL,audioLangPref);if(hls&&i>=0&&i<tracks.length){var position=video.currentTime||0,wasPlaying=!video.paused,serial=loadSerial;hls.audioTrack=i;if(wasPlaying)resumeLoading(-1);setTimeout(function(){if(serial!==loadSerial||!isActive())return;try{video.currentTime=position}catch(_e){}if(wasPlaying)safePlay();else{video.pause();stopLoading()}},80)}}\n                        video.addEventListener('play',function(){if(!isActive()){video.pause();return}if(!isLoaded){load({autoplay:true});return}focusPlayer();resumeLoading(-1);watchMemory.resetAnchor();stopAuto()});\n                        video.addEventListener('playing',function(){playPending=false;sourceLoading=false;if(!isActive()){pause(true);return}watchMemory.resetAnchor();sampleWatch(false);stopAuto()});\n                        video.addEventListener('pause',function(){playPending=false;sampleWatch(true);stopLoading();if(isActive()&&!video.ended&&docVisible&&state.isVisible&&!(pendingRestore&&pendingRestore.autoplay))pauseAuto();startAuto()});video.addEventListener('ended',function(){playPending=false;sourceLoading=false;pendingRestore=null;sampleWatch(true);watchMemory.resetAnchor();stopLoading();if(isActive())state.pauseUntil=0;startAuto()});\n                        video.addEventListener('error',function(){if(isLoaded){pendingRestore=null;playbackFailed(video.error||new Error('Video unavailable'))}});\n                        if(window.ResizeObserver){pstate.subtitleResizeObserver=new window.ResizeObserver(queueSubtitleLayout);pstate.subtitleResizeObserver.observe(video)}window.addEventListener('resize',queueSubtitleLayout);document.addEventListener('fullscreenchange',queueSubtitleLayout);video.addEventListener('webkitbeginfullscreen',queueSubtitleLayout);video.addEventListener('webkitendfullscreen',queueSubtitleLayout);video.addEventListener('timeupdate',function(){sampleWatch(false)});video.addEventListener('loadedmetadata',restorePlayback);video.addEventListener('durationchange',restorePlayback);video.addEventListener('canplay',restorePlayback);\n                        video.addEventListener('loadeddata',function(){if(video.paused&&!pendingRestore)stopLoading()});video.addEventListener('seeking',function(){watchMemory.resetAnchor();if(isActive())resumeLoading(video.currentTime)});video.addEventListener('seeked',function(){sampleWatch(true);if(video.paused&&!pendingRestore)stopLoading()});video.addEventListener('ratechange',function(){watchMemory.resetAnchor();sampleWatch(true)});\n                        if(video.textTracks&&video.textTracks.addEventListener)video.textTracks.addEventListener('change',syncNativeSubs);\n                        var player={video:video,loaded:function(){return isLoaded},playing:function(){return isLoaded&&(sourceLoading||playPending||(!video.paused&&!video.ended)||!!(pendingRestore&&pendingRestore.autoplay))},play:safePlay,load:load,pause:pause,activate:activate,quality:changeQuality,audio:selectAudio,subtitles:applySubs,restart:function(){watchMemory.restart(currentFolder);if(isLoaded){if(pendingRestore)pendingRestore.position=0;try{video.currentTime=0}catch(_e){}safePlay()}else load({position:0,autoplay:true})}};\n                        return player;\n                    }\n                    function playActive(options){var p=activePlayer();if(!p){p=createPlayer(slides[state.index],state.index);players[state.index]=p}if(!p.loaded())p.load(options||{});else{focusPlayer();if(options&&options.position===0)p.restart();else p.play()}}\n                    function blurFocus(){var p=activePlayer();if(p)p.pause(false);state.focused=false;root.classList.remove('is-focused');slides.forEach(function(slide){slide.classList.remove('is-focused')});startAuto()}\n                    viewport.addEventListener('pointerdown',function(e){if(slides.length<2||e.target.closest('video,a,select')||(e.target.closest('button')&&!e.target.closest('.cisvc__play'))||(e.pointerType==='mouse'&&e.button!==0))return;state.isDragging=true;root.classList.add('is-dragging');drag={id:e.pointerId,startX:e.clientX,startY:e.clientY,startTx:tx,dx:0,dy:0};stopAuto()});\n                    viewport.addEventListener('pointermove',function(e){if(!state.isDragging||drag.id!==e.pointerId)return;drag.dx=e.clientX-drag.startX;drag.dy=e.clientY-drag.startY;if(Math.abs(drag.dx)>Math.abs(drag.dy)){if(Math.abs(drag.dx)>=10){try{viewport.setPointerCapture(e.pointerId)}catch(_e){}}setX(drag.startTx+drag.dx,false)}});\n                    function endDrag(e){if(!state.isDragging||drag.id!==e.pointerId)return;state.isDragging=false;root.classList.remove('is-dragging');try{viewport.releasePointerCapture(e.pointerId)}catch(_e){}var moved=Math.max(Math.abs(drag.dx),Math.abs(drag.dy)),horizontal=Math.abs(drag.dx)>Math.abs(drag.dy),target=x2i(tx),cancelled=e.type==='pointercancel';drag.id=null;drag.dx=0;drag.dy=0;if(moved<10&&!cancelled){setX(i2x(state.index),true);startAuto();return}suppressUntil=Date.now()+650;if(horizontal&&!cancelled)setActive(target,true);else{setX(i2x(state.index),true);startAuto()}}\n                    viewport.addEventListener('pointerup',endDrag);viewport.addEventListener('pointercancel',endDrag);\n                    root.addEventListener('click',function(e){if(e.detail!==0&&Date.now()<suppressUntil){e.preventDefault();e.stopPropagation();return}var action=e.target.closest('[data-action]');if(action&&root.contains(action)){e.preventDefault();var name=action.getAttribute('data-action');if(name==='prev'){setActive(state.index-1,true);return}if(name==='next'){setActive(state.index+1,true);return}if(name==='quality'){var current=activePlayer(),next=(qualityBtn.textContent||quality).toLowerCase()==='hd'?'sd':'hd';quality=next;storageSet(LQ,next);qualityBtn.textContent=next.toUpperCase();if(current&&current.loaded())current.quality(next);return}}var play=e.target.closest('.cisvc__play');if(play&&root.contains(play)){e.preventDefault();var slide=play.closest('.cisvc__slide'),idx=parseInt(slide.getAttribute('data-index'),10);if(idx!==state.index)setActive(idx,true);playActive();return}if(e.target.closest('video,a,select,button'))return;var slide=e.target.closest('.cisvc__slide');if(slide&&root.contains(slide)){var idx=parseInt(slide.getAttribute('data-index'),10);if(idx!==state.index)setActive(idx,true)}});\n                    root.addEventListener('keydown',function(e){if(e.target.closest('video,select,input,textarea'))return;if(e.key==='ArrowLeft'&&slides.length>1){e.preventDefault();setActive(state.index-1,true)}if(e.key==='ArrowRight'&&slides.length>1){e.preventDefault();setActive(state.index+1,true)}if(e.key==='Escape'){e.preventDefault();blurFocus()}});\n                    document.addEventListener('pointerdown',function(e){if(!root.contains(e.target)){blurFocus();if(window.__cisvc_active_controller===api)window.__cisvc_active_controller=null}},true);\n                    document.addEventListener('visibilitychange',function(){docVisible=!document.hidden;var p=activePlayer();if(!docVisible&&p)p.pause(false);watchMemory.resetAnchor();if(docVisible)startAuto();else stopAuto()});\n                    if('IntersectionObserver'in window){var io=new IntersectionObserver(function(entries){entries.forEach(function(entry){if(entry.target===root){state.isVisible=entry.isIntersecting&&entry.intersectionRatio>=.3;if(state.isVisible)startAuto();else{var p=activePlayer();if(p)p.pause(false);stopAuto()}}})},{threshold:[0,.3,.6,1]});io.observe(root)}\n                    if(motionQuery&&motionQuery.addEventListener)motionQuery.addEventListener('change',function(e){reduced=e.matches;refreshProgress();startAuto()});\n                    window.addEventListener('resize',function(){setX(i2x(state.index),false)});window.addEventListener('pagehide',function(){Object.keys(players).forEach(function(key){players[key].pause(true)});watchMemory.save()});window.addEventListener('storage',function(e){if(e.key===watchMemory.key){watchMemory.refresh();refreshProgress()}});\n                    audio.addEventListener('change',function(){var p=activePlayer(),i=parseInt(audio.value,10);if(p&&Number.isFinite(i))p.audio(i)});subs.addEventListener('change',function(){subPref=subs.value;storageSet(LS,subPref);setCookie(LS,subPref);var p=activePlayer();if(p)p.subtitles(subPref)});\n                    var api={forceBlur:blurFocus};\n                    root.dataset.cisvcBooted='1';root.classList.add('is-booted');\n                    slides.forEach(function(slide,i){if(slide.querySelector('video'))players[i]=createPlayer(slide,i)});\n                    setActive(initialIndex>=0?initialIndex:0,false);refreshProgress();log('init',root.id,base);\n                }\n\n                function bootOne(root){try{init(root)}catch(err){console.error('[cisvc] boot error',err&&err.stack?err.stack:err);if(DEBUG_GLOBAL){console.log('[cisvc] errors caught',err&&err.message?err.message:String(err))}B(root,'Carousel boot exception: '+(err&&err.message?err.message:String(err)))}}\n                function boot(){G();A(document.querySelectorAll('.cisvc')).forEach(bootOne)}\n                if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',boot);else boot();\n            })();\n        <\/script>\n                                    <div class=\"sat-video-watch__summary\"><p>Gary introduces the recorded lessons and assignments used in online study, alongside tutor support and options for further practical learning. Work through the current curriculum and assessment requirements on your selected course page. Use the Student Chat Portal for current support arrangements.<\/p><\/div><p><a href=\"https:\/\/skinarttraining.com\/za\/faq-videos\/\">All video guides<\/a> \u00b7 <a href=\"https:\/\/skinarttraining.com\/za\/shop\/\">Explore current course information<\/a><\/p><nav class=\"sat-video-watch__related\" aria-label=\"Related video guides\"><h2>Related video guides<\/h2><ul><li><a href=\"https:\/\/skinarttraining.com\/za\/faq-videos\/certificates-and-accreditation\/\">Skinart certificates and course completion<\/a><\/li><li><a href=\"https:\/\/skinarttraining.com\/za\/faq-videos\/tutor-support\/\">How does Skinart tutor support work?<\/a><\/li><li><a href=\"https:\/\/skinarttraining.com\/za\/faq-videos\/learning-practical-skills\/\">How do I learn practical body-art skills online?<\/a><\/li><\/ul><\/nav><\/article>\n","protected":false},"excerpt":{"rendered":"<p>Gary introduces recorded lessons, assignments and tutor support in Skinart online courses, with guidance on further practical learning.<\/p>\n","protected":false},"author":4043,"featured_media":0,"parent":2329,"menu_order":5,"comment_status":"closed","ping_status":"closed","template":"","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"class_list":["post-2687","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/skinarttraining.com\/za\/wp-json\/wp\/v2\/pages\/2687","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/skinarttraining.com\/za\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/skinarttraining.com\/za\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/skinarttraining.com\/za\/wp-json\/wp\/v2\/users\/4043"}],"replies":[{"embeddable":true,"href":"https:\/\/skinarttraining.com\/za\/wp-json\/wp\/v2\/comments?post=2687"}],"version-history":[{"count":1,"href":"https:\/\/skinarttraining.com\/za\/wp-json\/wp\/v2\/pages\/2687\/revisions"}],"predecessor-version":[{"id":2694,"href":"https:\/\/skinarttraining.com\/za\/wp-json\/wp\/v2\/pages\/2687\/revisions\/2694"}],"up":[{"embeddable":true,"href":"https:\/\/skinarttraining.com\/za\/wp-json\/wp\/v2\/pages\/2329"}],"wp:attachment":[{"href":"https:\/\/skinarttraining.com\/za\/wp-json\/wp\/v2\/media?parent=2687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}