';
//html to dom
var dom=domParser.parseFromString(htmlStr,'text/html');
//回傳轉成 dom 的 html
resolve(dom.documentElement);
});
}//window.qbpwcf.slide.toDom end
//將多個 html、css、javaScript 轉換為 dom
window.qbpwcf.slide.toDoms=function(htmlStrArray){
//回傳 Promise
return new Promise(resolve => {
//初始化要回傳的內容
var doms=[];
//初始化用來存放排序後的 doms
var tempDoms=[];
//針對每個要輪播的內容
htmlStrArray.forEach(async function(value,key){
//將 html to dom
var dom=await window.qbpwcf.slide.toDom.call(this,value);
//記錄排序順序
dom.order=key;
//保存到 doms 陣列裡面
doms.push(dom);
//如果每個都解析成 dom 了
if(doms.length===htmlStrArray.length){
//初始化要尋找的索引
var indexToFind=0;
//初始化最後的索引
var maxlidex=htmlStrArray.length-1;
//按照 order 重新排序
for(var i=0;i<=maxlidex;i++){
//如果是要找的索引
if(doms[i].order===indexToFind){
//放置dom
tempDoms.push(doms[i]);
//要尋找的索引+1
indexToFind++;
//重新搜尋
i=-1;
//繼續迴圈
continue;
}//if end
}//for end
//回傳轉成 dom 的 array
resolve(tempDoms);
}//if end
});//forEach end
});//回傳 Promise end
}//window.qbpwcf.slide.toDoms end
//將 dom 給 ifrmae 執行完後,回傳其 document
window.qbpwcf.slide.loadDom=function(dom){
//回傳 Promise
return new Promise(resolve => {
//建立 iframe
var iframe=document.createElement('iframe');
//隱藏 iframe
iframe.style.display='none';
//放置 iframe
document.body.appendChild(iframe);
//取得 iframe 的 document
var documentInIframe=iframe.contentDocument;
//讓 iframe 開始接收內容
documentInIframe.open();
//綁定 iframe load 事件
iframe.addEventListener('load',function(){
//回傳 iframe document
resolve(documentInIframe.documentElement);
});
//讓 iframe 接收指定內容
documentInIframe.write(dom.outerHTML);
//讓 iframe 結束接收內容
documentInIframe.close();
});//回傳 Promise end
}//window.qbpwcf.slide.loadDom end
//將多個 dom 給 ifrmae 執行完後,回傳其 document 集合
window.qbpwcf.slide.loadDoms=function(doms){
//回傳 Promise
return new Promise(resolve => {
//初始化儲存 iframe document
var iframeDocs=[];
//初始化儲存排序過後的 iframe document
var tempIframeDocs=[];
//針對每個dom
doms.forEach(async function(value,key){
//取得 iframe document
var iframeDoc=await window.qbpwcf.slide.loadDom.call(this,value);
//記錄排序順序
iframeDoc.order=key;
//儲存
iframeDocs.push(iframeDoc);
//如果每個都解析成 dom 了
if(iframeDocs.length===doms.length){
//初始化要尋找的索引
var indexToFind=0;
//初始化最後的索引
var maxlidex=doms.length-1;
//按照 order 重新排序
for(var i=0;i<=maxlidex;i++){
//如果是要找的索引
if(iframeDocs[i].order===indexToFind){
//放置iframeDoc
tempIframeDocs.push(iframeDocs[i]);
//要尋找的索引+1
indexToFind++;
//重新搜尋
i=-1;
//繼續迴圈
continue;
}//if end
}//for end
//回傳各個 iframe document
resolve(tempIframeDocs);
}//if end
});//forEach end
});//回傳 Promise end
}//window.qbpwcf.slide.loadDoms end
//執行的定義
window.qbpwcf.slide.func=async function(){
//取得要輪播的元素
var eles=window.qbpwcf.slide.eles;
//如果沒有要輪播的內容
if(eles.length===0){
//提示錯誤訊息
console.error('Array(window.qbpwcf.slide.eles) should not be empty');
//結束執行
return false;
}//if end
//取得放置輪播的div QuerySelectorString
var displayDivByQuerySelector=window.qbpwcf.slide.displayDivByQuerySelector;
//取得放置輪播的div
var displayDiv=document.querySelector(displayDivByQuerySelector);
//如果沒有找到放置輪播內容的div
if(displayDiv===null){
//提示錯誤訊息
console.error('result of querySelector by '+displayDivByQuerySelector+' is null');
//結束執行
return false;
}//if end
//取得每個slide的最小播放時間
var showTime=window.qbpwcf.slide.showTime;
//將輪播內容轉換為doms
var doms = await window.qbpwcf.slide.toDoms.call(this,eles);
//debug
//console.log(doms);
//取得每個 iframe 的 document
var iframeDocs = await window.qbpwcf.slide.loadDoms.call(this,doms);
//debug
//console.log(iframeDocs);
//放置讀取好的投影片
for(var i=0;i0){
//如果是影片
if(prePlayContent.children[0].tagName==='VIDEO'){
//播放之
prePlayContent.children[0].play();
}//if end
}//if end
//播放 showTime 秒
await window.qbpwcf.sleep.func(showTime);
//如果尚不行置換slide
while(prePlayContent.dataset.canChangeNow==='false'){
//多播放 1 秒
await window.qbpwcf.sleep.func(1);
}//while end
//如果有子元素
if(prePlayContent.children.length>0){
//如果是影片
if(prePlayContent.children[0].tagName==='VIDEO'){
//設置下次要等待影片播放完才能換頁
prePlayContent.dataset.canChangeNow=false;
}//if end
}//if end
//執行到這邊代表可以置換slide了
//計數增加
i++;
}//while end
}//window.qbpwcf.slide.func end
/*
說明:
取得用戶端的檔案.
回傳結果:
result.data,取得檔案的 base64 data
result.mime,取得檔案的 mime
result.base64,取得檔案的純 base64 部分
參考資料:
https://developer.mozilla.org/en-US/docs/Web/API/File
https://developer.mozilla.org/en-US/docs/Web/API/FileList
https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/accept
https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL_static
https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL
*/
//初始化
window.qbpwcf.clientFile={};
//取得用戶端檔案的參數設定
window.qbpwcf.clientFile.params={};
//初始化multiple參數為false
window.qbpwcf.clientFile.params.multiple=false;
//初始化accept參數為''
window.qbpwcf.clientFile.params.accept='';
//設置只接受video
window.qbpwcf.clientFile.acceptVideoOnly=function(){
//設置accept為'video/*'
window.qbpwcf.clientFile.params.accept='video/*';
}//function end
//設置只接受audio
window.qbpwcf.clientFile.acceptAudioOnly=function(){
//設置accept為'audio/*'
window.qbpwcf.clientFile.params.accept='audio/*';
}//function end
//設置只接受image
window.qbpwcf.clientFile.acceptImageOnly=function(){
//設置accept為'image/*'
window.qbpwcf.clientFile.params.accept='image/*';
}//function end
//累加允許的檔案類型
window.qbpwcf.clientFile.acceptAppend=function(type){
//如果已經有內容
if(window.qbpwcf.clientFile.params.accept!=''){
//增加允許的類型
window.qbpwcf.clientFile.params.accept=window.qbpwcf.clientFile.params.accept+','+type;
}//if end
//反之尚無設定
else{
//設置允許的類型
window.qbpwcf.clientFile.params.accept=type;
}//else end
}//function end
//觸發選擇檔案的視窗後,若沒有選擇到的檔案,會強制使用者再度選擇,預設為'false'不啟用;反之為'true'要啟用.
window.qbpwcf.clientFile.forceSelectFileAfterTrigger='false';
//取得用戶端的檔案,使用時前面請加上 await 才能取得回應.
window.qbpwcf.clientFile.init=async function(){
//建立 input
var input=document.createElement('input');
//設置 type 為檔案
input.type='file';
//設置multiple參數
input.multiple=window.qbpwcf.clientFile.params.multiple;
//設置multiple參數
input.accept=window.qbpwcf.clientFile.params.accept;
//初始化要回傳的結果物件
input.result={};
//預設使用者尚未取消選取檔案
input.canceled='false';
//當選擇的檔案有異動
input.onchange=function(){
//轉換與取得ObjectURL
input.result.url=URL.createObjectURL(input.files[0]);
//初始化 FileReader
var reader = new FileReader();
//讀取檔案
reader.readAsDataURL(input.files[0]);
//當檔案讀取完畢後
reader.onload=function(){
//取得檔案的 base64 data
input.result.data = reader.result;
//取得檔案的 mime
input.result.mime = input.result.data.split(':')[1].split(';')[0];
//取得檔案的純 base64 部分
input.result.base64 = input.result.data.split(',')[1];
}//function end
};//function end
//綁定使用按下取消的事件
//參考資料:
//https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/cancel_event
input.addEventListener('cancel',function(event){
//debug
//console.log(event,Object.keys(input.result).length);return false;
//如果沒有結果
if(Object.keys(input.result).length===0){
//設置被按下cancel了
input.canceled='true';
}//if end
});
//觸發使用者選擇檔案
input.click();
//無窮迴圈
while(true){
//如果使用者取消了
if(input.canceled==='true'){
//回傳結果
return input.result;
}//if end
//休息一秒
await window.qbpwcf.sleep.func(1);
//debug
console.log('wait file selected');
//如果有結果
if(input.result!={}){
//如果
if(
//url存在
input.result.url!=undefined
&&
//data存在
input.result.data!=undefined
&&
//mime存在
input.result.mime!=undefined
&&
//base64存在
input.result.base64!=undefined
){
//執行到這代表資料都有了
//結束迴圈
break;
}//if end
}//if end
}//while end
//回傳結果
return input.result;
};
/*
說明:
text_editor,編輯文字.
*/
//初始化
window.qbpwcf.text_editor={};
//用於取得顯示輸入內容的區塊
window.qbpwcf.text_editor.selector='';
//執行
window.qbpwcf.text_editor.init=function(){
//取得用來顯示輸入內容的 selector
var displayTag=document.querySelector(window.qbpwcf.text_editor.selector);
//取得一開始的內容,用一個div代表一行.
var lines=displayTag.children;
//關注用來顯示輸入內容的元素後
displayTag.addEventListener('focus',function(event){
//取得觸發的元素
var eTarget=event.target;
//debug
console.log(eTarget);
//建立暫存的textInput
var tempInput=document.createElement('input');
//設置為單行輸入
tempInput.type='text';
//break point
return;
//初始化內容
tempInput.value=contentOfTag;
//關注之
tempInput.focus();
//若內容有改變
tempInput.addEventListener('change',function(event){
//更新用來顯示輸入的內容
displayTag.innerText=this.value;
});
});
}
/*
說明:
openWindow,由javaScript開啟可管控的視窗,甚至存取其內容.
範例:
//第一段
var script=document.createElement('script');
script.src='https://latest.qbpwcf.org/qbpwcf/javaScript/qbpwcf.php';
document.head.appendChild(script);
//第二段
window.qbpwcf.openWindow.params.url=window.location.href;
window.qbpwcf.openWindow.saveSourceAtTheEnd='true';
await window.qbpwcf.openWindow.func();
參考資料:
https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL
https://developer.mozilla.org/en-US/docs/Web/API/File/File
*/
//初始化物件
window.qbpwcf.openWindow={};
//初始化參數
window.qbpwcf.openWindow.init=function(){
//初始化參數物件
window.qbpwcf.openWindow.params={};
//初始化目標網址
window.qbpwcf.openWindow.params.url='https://sourceforge.net/projects/qbpwc/';
//初始化要將window.open()儲存到哪個全域變數裡面.
window.qbpwcf.openWindow.params.varName='qbpwcf_openWindow_instance';
//初始化給予 window.open() 的第三個參數.
window.qbpwcf.openWindow.params.windowFeatures='';
//初始化window.open()後,其回應的html source
window.qbpwcf.openWindow.resSource='';
//初始化window.open()後,要執行什麼操作,參數Window為其opened的Window的.
window.qbpwcf.openWindow.actionAfterOpen=function(Window){
//預設的提示訊息
console.log('do something after window.oepn()');
}//actionAfterOpen end
//預設window.open()後經過處理後結果不要下載下來
window.qbpwcf.openWindow.saveSourceAtTheEnd='false';
}//funciton end
//初始化參數
window.qbpwcf.openWindow.init();
//window.open
window.qbpwcf.openWindow.func=async function(){
//window.open()並儲存回傳的結果
window[window.qbpwcf.openWindow.params.varName]=await window.open(window.qbpwcf.openWindow.params.url,'_blank',window.qbpwcf.openWindow.params.windowFeatures);
//如果執行失敗
if(!(window[window.qbpwcf.openWindow.params.varName])){
//提示錯誤訊息
console.error('The window wasn\'t allowed to open. This is likely caused by built-in popup blockers.');
//結束執行
return;
}//if end
//加入load事件
window[window.qbpwcf.openWindow.params.varName].addEventListener('load',function(event){
//debug
//console.log(this);
//呼叫開啟後要做度事情
window.qbpwcf.openWindow.actionAfterOpen(this);
//取得html原始碼
window.qbpwcf.openWindow.resSource=''+window[window.qbpwcf.openWindow.params.varName].document.head.outerHTML+window[window.qbpwcf.openWindow.params.varName].document.body.outerHTML+'';
//如果要下載內容
if(window.qbpwcf.openWindow.saveSourceAtTheEnd=='true'){
//建立檔案File
var filed2download=new File([window.qbpwcf.openWindow.resSource],'filed2download');
//建立用來讀取檔案的FileReader
var fileReader=new FileReader();
//檔案讀取完畢後
fileReader.addEventListener('load',function(event){
//取得dataUrl
dataUrl=fileReader.result;
//建立 a
var a=document.createElement('a');
//設置連結為dataUrl
a.href=dataUrl;
//點擊開始下載
a.click();
});
//讀取檔案為 dataUrl]
fileReader.readAsDataURL(filed2download);
}//if end
});
}//function end
/*
說明:
儲存當前頁面的原始碼
範例:
window.qbpwcf.saveSource();
*/
//儲存當前頁面原始碼
window.qbpwcf.saveSource=async function(){
//取得原始碼
var sourceStr=''+document.head.outerHTML+document.body.outerHTML+'';
//建立File,檔案名稱隨機產生.
var file2download=new File([sourceStr],'file2download');
//建立用來讀取檔案的FileReader
var fileReader=new FileReader();
//檔案讀取完畢後
fileReader.addEventListener('load',function(event){
//取得dataUrl
dataUrl=fileReader.result;
//建立 a
var a=document.createElement('a');
//設置連結為dataUrl
a.href=dataUrl;
//點擊開始下載
a.click();
});
//讀取檔案為 dataUrl
fileReader.readAsDataURL(file2download);
}//function end
//run in last
window.addEventListener('load',async function(event){
//console.log('All resources finished loading!');
//debug
console.log('override addEventListener');
//參考資料 https://stackoverflow.com/questions/446892/how-to-find-event-listeners-on-a-dom-node-when-debugging-or-from-the-javascript
//override addEventListener, when not native code
if(Element.prototype.addEventListener.toString().includes('native code')!==true){
Element.prototype._addEventListener = Element.prototype.addEventListener;
Element.prototype.addEventListener = function(a,b,c){
this._addEventListener(a,b,c);
if(!this.eventListenerList) {
this.eventListenerList = {};
}
if(!this.eventListenerList[a]) {
this.eventListenerList[a] = [];
}
this.eventListenerList[a].push(b);
};
}//if end
//debug
//console.log('add scrollingListMiddleEvent');
//新增當視窗大小改變時的事件
window.scrollingListMiddleEvent();
//frame 大小調整 - start
//立馬跑一次
window.changeFrameEleHeightToFullLessSource.run.call();
//綁定事件
window.addEventListener('resize',window.changeFrameEleHeightToFullLessSource.run);
//frame 大小調整 - end
//div frame 大小調整 - start
//立馬跑一次
window.changeDivFrameEleHeightToFullLessSource.run.call();
//綁定事件
window.addEventListener('resize',window.changeDivFrameEleHeightToFullLessSource.run);
//frame 大小調整 - end
//綁定檢查reCAPTCHA的事件
getGoogle_reCAPTCHA_res_event();
//托移的事件
window.dragEventHandler.func.call();
//如果沒有 window.qbpwcf
if(window.qbpwcf===undefined){
//初始化為空物件
window.qbpwcf={};
}//if end
//close Icon
window.qbpwcf.closeIcon='data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpvc2I9Imh0dHA6Ly93d3cub3BlbnN3YXRjaGJvb2sub3JnL3VyaS8yMDA5L29zYiIKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjEwNS43ODE3Mm1tIgogICBoZWlnaHQ9IjEwNS4zNDM0NG1tIgogICB2aWV3Qm94PSIwIDAgMTA1Ljc4MTcyIDEwNS4zNDM0NCIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnOCIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC45MitkZXZlbCB1bmtub3duIgogICBzb2RpcG9kaTpkb2NuYW1lPSJjbG9zZUljb24uc3ZnIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzMiI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQzMTUiCiAgICAgICBvc2I6cGFpbnQ9InNvbGlkIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0MzEzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxmaWx0ZXIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHN0eWxlPSJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6c1JHQiIKICAgICAgIGlkPSJmaWx0ZXI0MzkxIgogICAgICAgeD0iLTAuMDY4OTc3MTAzIgogICAgICAgd2lkdGg9IjEuMTM3OTU0MiIKICAgICAgIHk9Ii0wLjA3NTI5OTk5MyIKICAgICAgIGhlaWdodD0iMS4xNTA2Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgICAgc3RkRGV2aWF0aW9uPSIxLjAwNjI1NDMiCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjQzOTMiIC8+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHN0eWxlPSJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6c1JHQiIKICAgICAgIGlkPSJmaWx0ZXI0NDM4IgogICAgICAgeD0iLTAuMDIyNjIyOTA0IgogICAgICAgd2lkdGg9IjEuMDQ1MjQ1OCIKICAgICAgIHk9Ii0wLjAyNTU1NTYxNCIKICAgICAgIGhlaWdodD0iMS4wNTExMTEyIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgICAgc3RkRGV2aWF0aW9uPSIwLjIyMTcwNjAxIgogICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI0NDQwIiAvPgogICAgPC9maWx0ZXI+CiAgICA8ZmlsdGVyCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICBzdHlsZT0iY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOnNSR0IiCiAgICAgICBpZD0iZmlsdGVyNDQ0NiIKICAgICAgIHg9Ii0wLjAyMzIzMjg0NyIKICAgICAgIHdpZHRoPSIxLjA0NjQ2NTgiCiAgICAgICB5PSItMC4wMjQ4MTk1NDUiCiAgICAgICBoZWlnaHQ9IjEuMDQ5NjM5MSI+CiAgICAgIDxmZUdhdXNzaWFuQmx1cgogICAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMC4yMjIwOTQyOCIKICAgICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNDQ0OCIgLz4KICAgIDwvZmlsdGVyPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMS40IgogICAgIGlua3NjYXBlOmN4PSIxMzAuNTY4NjgiCiAgICAgaW5rc2NhcGU6Y3k9IjIwMS4zNDg0NSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0ibW0iCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iZzQ0ODgiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtcm90YXRpb249IjAiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTYwMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4MzYiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjI3IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGUgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01MC4wNTQwMzQsLTg5LjA0MzUyMikiPgogICAgPGcKICAgICAgIGlkPSJnNDQ4OCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuNjU1MDQ0MywwLDAsMi44NTQ2OTA3LC0xMTAuOTk1MTgsLTMyNi45MjY1MikiPgogICAgICA8ZWxsaXBzZQogICAgICAgICByeT0iMTYuMDM1OTI3IgogICAgICAgICByeD0iMTcuNTA1ODg0IgogICAgICAgICBjeT0iMTY0LjE2NTUxIgogICAgICAgICBjeD0iODAuNTc4NzIiCiAgICAgICAgIGlkPSJwYXRoMzQ3NCIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4zO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNjQ5OTk5OTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxO2ZpbHRlcjp1cmwoI2ZpbHRlcjQzOTEpO2ltYWdlLXJlbmRlcmluZzphdXRvIiAvPgogICAgICA8cmVjdAogICAgICAgICB0cmFuc2Zvcm09InJvdGF0ZSgtNDIuODA4OTU1KSIKICAgICAgICAgcnk9IjAiCiAgICAgICAgIHk9IjE3NC41NTY0OSIKICAgICAgICAgeD0iLTY3LjM5ODc1OCIKICAgICAgICAgaGVpZ2h0PSIyLjE1MjIwNjQiCiAgICAgICAgIHdpZHRoPSIyOS4yNzk2NDgiCiAgICAgICAgIGlkPSJyZWN0NDQxMyIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiNmZmZmMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MTtmaWx0ZXI6dXJsKCNmaWx0ZXI0NDQ2KSIgLz4KICAgICAgPHJlY3QKICAgICAgICAgdHJhbnNmb3JtPSJyb3RhdGUoLTEzOS4wMzQ0MikiCiAgICAgICAgIHJ5PSIwIgogICAgICAgICB5PSItNzMuMDUwOTQ5IgogICAgICAgICB4PSItMTgyLjk2MjUyIgogICAgICAgICBoZWlnaHQ9IjIuMTUyMjA2NCIKICAgICAgICAgd2lkdGg9IjI5LjI3OTY0OCIKICAgICAgICAgaWQ9InJlY3Q0NDEzLTMiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojZmZmZjAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyNDQzOCkiIC8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K';
});