Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: one verbiage tweak

...

Code Block
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>SAML AuthnRequest Generator</title>
<style type="text/css">
.button {
    border: 1px outset black;
    border-radius:10px;
    background-color: #d1d1e0;
    height:50px;
    width:300px;
    cursor:pointer;
    font-size:larger;
}

.button:hover {
    background-color: #427730;
    color:white;
}

td {
    vertical-align:top;
}
</style>

</head>
<body>
<h1>SAML AuthnRequest Generator</h1>

<h1>Step 1 - Parse SAML Parameters</h1>
This step decodes redirect-based SAML AuthnRequests.  You can beskip skippedit if you have already parsed/decodedhave the AuthnRequestXML.
<form id=samlSource>

Original Request URL:<br>
<textarea autofocus cols=80 rows=15 id=InputRequestURL placeholder="Paste the source request url here">
</textarea>
<br>
<button class="button" type="button" onclick="inputAll()">Parse the SAML AuthnRequest</button>


</form>
<script>
function inputSAMLRequest() {
    samlRequestURL = document.getElementById('InputRequestURL');
    samlRequestString=document.getElementById('ModifySAMLRequest'); 
    
    regex=/[?|&]SAMLRequest=([^&]*)/;
    match=regex.exec(samlRequestURL.value);
    if(match != null) {
        osr=match[1];
        osrDecoded=atob(decodeURIComponent(osr));
        osrInflated=zip_inflate(osrDecoded);
        samlRequestString.value=osrInflated;
//         samlRequestString.value=XMLTree(osrInflated);
    } else {
        samlRequestString.value="";
        samlRequestString.placeholder="SAMLRequest parameter not found";
    }
}

function inputRelayState() {
    samlRequestURL = document.getElementById('InputRequestURL');
    modifyRelayState=document.getElementById('ModifyRelayState'); 
    
    regex=/[?|&]RelayState=([^&]*)/;
    match=regex.exec(samlRequestURL.value);
    if(match != null) {
        modifyRelayState.value=decodeURIComponent(match[1]);
    } else {
        modifyRelayState.value="";
        modifyRelayState.placeholder="RelayState not found";
    }
}

function inputAll() {
    inputSAMLRequest();
    inputRelayState();
}

</script>
</form>

<h1>Step 2 - Modify SAML Parameters</h1>
<form id=samlSetup>

<table>
<tr>
<th>Parameter</th>
<th>Value</th>
<th></th>
</tr>

<tr>
<td>Local Time</td>
<td><input id=localTime type="datetime-local" size=40 readonly placeholder="Will be updated automatically"></td>
<td><label><input type=checkbox id=localTimeCheckbox onclick="clickAutomaticCheckbox(this)" checked>Update from current time each build</label></td>
</tr>


<tr>
<td>ISODate</td>
<td><input id=isoDate size=40 readonly placeholder="Will be updated automatically"></td>
<td><label><input type=checkbox id=isoDateCheckbox onclick="clickAutomaticCheckbox(this)" checked>Convert from Local Time each build</label></td>
</tr>

<tr>
<td>ID</td>
<td><input id=uniqueID size=40 readonly placeholder="Will be updated automatically"></td>
<td><label><input type=checkbox id=uniqueIDCheckbox onclick="clickAutomaticCheckbox(this)" checked>Generate random ID each build</label></td>
</tr>
</table>

<br>
AuthnRequest:
<button type="button" onclick="formatSAMLRequest();">Format XML</button>
<label><input type=checkbox id=WrapModifySAMLRequest onclick="wrapModifySAMLRequest(this)">Wrap</label>
<br>
<textarea wrap="off" cols=80 rows=15 id=ModifySAMLRequest placeholder="Paste the AuthnRequest xml block here">
</textarea>

<br>
<br>
<label><input type=checkbox id=RelayStateCheckbox onclick="relayStateCheckbox(this)" checked>Include RelayState</label>

<div id=ModifyRelayStateDiv>
RelayState:<br>
<textarea cols=80 rows=15 id=ModifyRelayState placeholder="Paste the RelayState parameter here">
</textarea>
</div>

<br>
<br>

<table>
<tr>
<th>Form Parameters</th>
<th></th>
</tr>

<tr>
<td>Endpoint Request Method</td>
<td>
<input type = "radio"
     name = "endpointMethod"
     id = "get"
     value = "GET"
     checked = "checked" />
<label for = "get">GET</label>
<input type = "radio"
     name = "endpointMethod"
     id = "post"
     value = "POST" />
<label for = "post">POST</label>
</td>
</tr>

<tr>
<td>Endpoint URL</td>
<td><input id=endpointURL size=80 readonly placeholder="Will be updated automatically"><br>
<label><input type=checkbox id=endpointURLCheckbox onclick="clickAutomaticCheckbox(this)" checked>Update Endpoint URL from AuthnRequest Destination each build</label></td>
</tr>

</table>

<br>
<br>

<button class="button" type="button" onclick="buildSAMLRequest()">Build the SAML AuthnRequest</button>
</form>


<br>
<h1>Step 3 - Submit to SAML Endpoint</h1>

<div style="outline: 2px dashed black; padding: 5px; display: inline-block;">
<form id=samlForm method=GET action="/" target="_blank">
SAMLRequest (deflate/base64):<br>
<textarea id=SAMLRequest name=SAMLRequest cols=60 rows=5 onfocus="this.select()">
</textarea>

<br>
<div id=RelayStateDiv>
RelayState:<br>
<textarea id=RelayState name=RelayState cols=60 rows=5 onfocus="this.select()">
</textarea>

<br>
</div>

<input class="button" id=samlFormSubmit type=submit value=Submit>
</form>
</div>

<script>
var placeholder=[];
placeholder["localTime"] = "yyyy-MM-ddThh:mm";
placeholder["isoDate"] = "yyyy-MM-ddThh:mm:ss.SSSSZ";
placeholder["uniqueID"] = "_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
placeholder["endpointURL"] = "https://idp.example.com/idp/profile/SAML2/Redirect/SSO";

function clickAutomaticCheckbox(checkbox) {
    fieldName = checkbox.id.replace("Checkbox","");
    field = document.getElementById(fieldName);
    if (checkbox.checked) {
        field.readOnly = true;
        field.placeholder = "Will be updated automatically";
    } else {
        field.readOnly = false;
        field.placeholder = placeholder[fieldName];    
    }
}

function formatSAMLRequest () {
    modifySAMLRequest=document.getElementById('ModifySAMLRequest'); 
    modifySAMLRequest.value=beautify.xml(modifySAMLRequest.value);
}

function wrapModifySAMLRequest (checkbox) {
    modifySAMLRequest=document.getElementById('ModifySAMLRequest'); 
    if(checkbox.checked) {
        modifySAMLRequest.wrap="on";
    } else {
        modifySAMLRequest.wrap="off";
    }
}

function relayStateCheckbox(checkbox) {
    modifyRelayState = document.getElementById("ModifyRelayState");
    modifyRelayStateDiv = document.getElementById("ModifyRelayStateDiv");
    relayState = document.getElementById("RelayState");
    relayStateDiv = document.getElementById("RelayStateDiv");
    if (checkbox.checked) {
        modifyRelayState.disabled = false;
        relayState.disabled = false;
        modifyRelayStateDiv.hidden = false;
        relayStateDiv.hidden = false;
    } else {
        modifyRelayState.disabled = true;
        relayState.disabled = true;
        modifyRelayStateDiv.hidden = true;
        relayStateDiv.hidden = true;
    }
}

function buildSAMLRequest() {
    localTimeInput = document.getElementById('localTime'); 
    if(document.getElementById('localTimeCheckbox').checked){
        currentTime=new Date(Date.now()); 
        localTime=currentTime.getFullYear().toString()+'-'+
                  (currentTime.getMonth()+1).toString().padStart(2,'0')+'-'+
                  currentTime.getDate().toString().padStart(2,'0')+'T'+
                  currentTime.getHours().toString().padStart(2,'0')+':'+
                  currentTime.getMinutes().toString().padStart(2,'0')+':'+
                  currentTime.getSeconds().toString().padStart(2,'0');
        localTimeInput.value = localTime; 
    }

    isoDateInput=document.getElementById('isoDate'); 
    if(document.getElementById('isoDateCheckbox').checked){
        n2=new Date(localTimeInput.value);
        isoDate=n2.toISOString();
        isoDateInput.value=isoDate;
    }

    uniqueIDInput=document.getElementById('uniqueID'); 
    if(document.getElementById('uniqueIDCheckbox').checked){
        id="_"+randomGUID();
        uniqueIDInput.value=id;
    }

    modifySAMLRequest=document.getElementById('ModifySAMLRequest'); 
    modifySAMLRequest.value=modifySAMLRequest.value.replace(/(IssueInstant=\")([^\"]*)(\")/,'$1'+isoDateInput.value+'$3'); 
    modifySAMLRequest.value=modifySAMLRequest.value.replace(/(ID=\")([^\"]*)(\")/,'$1'+uniqueIDInput.value+'$3'); 

    samlRequest=document.getElementById('SAMLRequest'); 
    samlRequest.value = btoa(zip_deflate(modifySAMLRequest.value));
    
    document.getElementById('RelayState').value=document.getElementById('ModifyRelayState').value;
    
    endpointURLInput=document.getElementById('endpointURL');
    if(document.getElementById('endpointURLCheckbox').checked){
        regex=/Destination=\"?([^"]*)\"?/;
        match=regex.exec(modifySAMLRequest.value);
        if(match != null) {
            endpointURLInput.value=match[1];
        } else {
            endpointURLInput.value="";
            endpointURLInput.placeholder="Destination not found";
        }
    }
    
    document.getElementById("samlForm").action = endpointURLInput.value;
    
    methodButtons = document.getElementById('samlSetup').elements['endpointMethod']
    for (var i=0, len=methodButtons.length; i<len; i++) {
        if ( methodButtons[i].checked ) { // radio checked?
            document.getElementById("samlForm").method = methodButtons[i].value;
            break;
        }
    }
    
    document.getElementById("samlFormSubmit").focus();
    
}
</script>

<!--
Including these inline here to make this all in a single file, but could be
done in an external reference too.
-->

<!--
from http://www.onicos.com/staff/iz/amuse/javascript/expert/
mailto:iz@onicos.co.jp
-->
<script>
var zip_WSIZE=32768,zip_STORED_BLOCK=0,zip_STATIC_TREES=1,zip_DYN_TREES=2,zip_DEFAULT_LEVEL=6,zip_FULL_SEARCH=!0,zip_INBUFSIZ=32768,zip_INBUF_EXTRA=64,zip_OUTBUFSIZ=8192,zip_window_size=2*zip_WSIZE,zip_MIN_MATCH=3,zip_MAX_MATCH=258,zip_BITS=16,zip_LIT_BUFSIZE=8192,zip_HASH_BITS=13;zip_LIT_BUFSIZE>zip_INBUFSIZ&&alert("error: zip_INBUFSIZ is too small"),zip_WSIZE<<1>1<<zip_BITS&&alert("error: zip_WSIZE is too large"),zip_HASH_BITS>zip_BITS-1&&alert("error: zip_HASH_BITS is too large"),(zip_HASH_BITS<8||258!=zip_MAX_MATCH)&&alert("error: Code too clever");var zip_free_queue,zip_qhead,zip_qtail,zip_initflag,zip_outcnt,zip_outoff,zip_complete,zip_window,zip_d_buf,zip_l_buf,zip_prev,zip_bi_buf,zip_bi_valid,zip_block_start,zip_ins_h,zip_hash_head,zip_prev_match,zip_match_available,zip_match_length,zip_prev_length,zip_strstart,zip_match_start,zip_eofile,zip_lookahead,zip_max_chain_length,zip_max_lazy_match,zip_compr_level,zip_good_match,zip_nice_match,zip_dyn_ltree,zip_dyn_dtree,zip_static_ltree,zip_static_dtree,zip_bl_tree,zip_l_desc,zip_d_desc,zip_bl_desc,zip_bl_count,zip_heap,zip_heap_len,zip_heap_max,zip_depth,zip_length_code,zip_dist_code,zip_base_length,zip_base_dist,zip_flag_buf,zip_last_lit,zip_last_dist,zip_last_flags,zip_flags,zip_flag_bit,zip_opt_len,zip_static_len,zip_deflate_data,zip_deflate_pos,zip_DIST_BUFSIZE=zip_LIT_BUFSIZE,zip_HASH_SIZE=1<<zip_HASH_BITS,zip_HASH_MASK=zip_HASH_SIZE-1,zip_WMASK=zip_WSIZE-1,zip_NIL=0,zip_TOO_FAR=4096,zip_MIN_LOOKAHEAD=zip_MAX_MATCH+zip_MIN_MATCH+1,zip_MAX_DIST=zip_WSIZE-zip_MIN_LOOKAHEAD,zip_SMALLEST=1,zip_MAX_BITS=15,zip_MAX_BL_BITS=7,zip_LENGTH_CODES=29,zip_LITERALS=256,zip_END_BLOCK=256,zip_L_CODES=zip_LITERALS+1+zip_LENGTH_CODES,zip_D_CODES=30,zip_BL_CODES=19,zip_REP_3_6=16,zip_REPZ_3_10=17,zip_REPZ_11_138=18,zip_HEAP_SIZE=2*zip_L_CODES+1,zip_H_SHIFT=parseInt((zip_HASH_BITS+zip_MIN_MATCH-1)/zip_MIN_MATCH),zip_outbuf=null,zip_extra_lbits=new Array(0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0),zip_extra_dbits=new Array(0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13),zip_extra_blbits=new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7),zip_bl_order=new Array(16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15),zip_configuration_table=new Array(new zip_DeflateConfiguration(0,0,0,0),new zip_DeflateConfiguration(4,4,8,4),new zip_DeflateConfiguration(4,5,16,8),new zip_DeflateConfiguration(4,6,32,32),new zip_DeflateConfiguration(4,4,16,16),new zip_DeflateConfiguration(8,16,32,32),new zip_DeflateConfiguration(8,16,128,128),new zip_DeflateConfiguration(8,32,128,256),new zip_DeflateConfiguration(32,128,258,1024),new zip_DeflateConfiguration(32,258,258,4096));function zip_DeflateCT(){this.fc=0,this.dl=0}function zip_DeflateTreeDesc(){this.dyn_tree=null,this.static_tree=null,this.extra_bits=null,this.extra_base=0,this.elems=0,this.max_length=0,this.max_code=0}function zip_DeflateConfiguration(_,i,p,z){this.good_length=_,this.max_lazy=i,this.nice_length=p,this.max_chain=z}function zip_DeflateBuffer(){this.next=null,this.len=0,this.ptr=new Array(zip_OUTBUFSIZ),this.off=0}function zip_deflate_start(_){var i;if(_?_<1?_=1:_>9&&(_=9):_=zip_DEFAULT_LEVEL,zip_compr_level=_,zip_initflag=!1,zip_eofile=!1,null==zip_outbuf){for(zip_free_queue=zip_qhead=zip_qtail=null,zip_outbuf=new Array(zip_OUTBUFSIZ),zip_window=new Array(zip_window_size),zip_d_buf=new Array(zip_DIST_BUFSIZE),zip_l_buf=new Array(zip_INBUFSIZ+zip_INBUF_EXTRA),zip_prev=new Array(1<<zip_BITS),zip_dyn_ltree=new Array(zip_HEAP_SIZE),i=0;i<zip_HEAP_SIZE;i++)zip_dyn_ltree[i]=new zip_DeflateCT;for(zip_dyn_dtree=new Array(2*zip_D_CODES+1),i=0;i<2*zip_D_CODES+1;i++)zip_dyn_dtree[i]=new zip_DeflateCT;for(zip_static_ltree=new Array(zip_L_CODES+2),i=0;i<zip_L_CODES+2;i++)zip_static_ltree[i]=new zip_DeflateCT;for(zip_static_dtree=new Array(zip_D_CODES),i=0;i<zip_D_CODES;i++)zip_static_dtree[i]=new zip_DeflateCT;for(zip_bl_tree=new Array(2*zip_BL_CODES+1),i=0;i<2*zip_BL_CODES+1;i++)zip_bl_tree[i]=new zip_DeflateCT;zip_l_desc=new zip_DeflateTreeDesc,zip_d_desc=new zip_DeflateTreeDesc,zip_bl_desc=new zip_DeflateTreeDesc,zip_bl_count=new Array(zip_MAX_BITS+1),zip_heap=new Array(2*zip_L_CODES+1),zip_depth=new Array(2*zip_L_CODES+1),zip_length_code=new Array(zip_MAX_MATCH-zip_MIN_MATCH+1),zip_dist_code=new Array(512),zip_base_length=new Array(zip_LENGTH_CODES),zip_base_dist=new Array(zip_D_CODES),zip_flag_buf=new Array(parseInt(zip_LIT_BUFSIZE/8))}}function zip_deflate_end(){zip_free_queue=zip_qhead=zip_qtail=null,zip_outbuf=null,zip_window=null,zip_d_buf=null,zip_l_buf=null,zip_prev=null,zip_dyn_ltree=null,zip_dyn_dtree=null,zip_static_ltree=null,zip_static_dtree=null,zip_bl_tree=null,zip_l_desc=null,zip_d_desc=null,zip_bl_desc=null,zip_bl_count=null,zip_heap=null,zip_depth=null,zip_length_code=null,zip_dist_code=null,zip_base_length=null,zip_base_dist=null,zip_flag_buf=null}function zip_reuse_queue(_){_.next=zip_free_queue,zip_free_queue=_}function zip_new_queue(){var _;return null!=zip_free_queue?(_=zip_free_queue,zip_free_queue=zip_free_queue.next):_=new zip_DeflateBuffer,_.next=null,_.len=_.off=0,_}function zip_head1(_){return zip_prev[zip_WSIZE+_]}function zip_head2(_,i){return zip_prev[zip_WSIZE+_]=i}function zip_put_byte(_){zip_outbuf[zip_outoff+zip_outcnt++]=_,zip_outoff+zip_outcnt==zip_OUTBUFSIZ&&zip_qoutbuf()}function zip_put_short(_){_&=65535,zip_outoff+zip_outcnt<zip_OUTBUFSIZ-2?(zip_outbuf[zip_outoff+zip_outcnt++]=255&_,zip_outbuf[zip_outoff+zip_outcnt++]=_>>>8):(zip_put_byte(255&_),zip_put_byte(_>>>8))}function zip_INSERT_STRING(){zip_ins_h=(zip_ins_h<<zip_H_SHIFT^255&zip_window[zip_strstart+zip_MIN_MATCH-1])&zip_HASH_MASK,zip_hash_head=zip_head1(zip_ins_h),zip_prev[zip_strstart&zip_WMASK]=zip_hash_head,zip_head2(zip_ins_h,zip_strstart)}function zip_SEND_CODE(_,i){zip_send_bits(i[_].fc,i[_].dl)}function zip_D_CODE(_){return 255&(_<256?zip_dist_code[_]:zip_dist_code[256+(_>>7)])}function zip_SMALLER(_,i,p){return _[i].fc<_[p].fc||_[i].fc==_[p].fc&&zip_depth[i]<=zip_depth[p]}function zip_read_buff(_,i,p){var z;for(z=0;z<p&&zip_deflate_pos<zip_deflate_data.length;z++)_[i+z]=255&zip_deflate_data.charCodeAt(zip_deflate_pos++);return z}function zip_lm_init(){var _;for(_=0;_<zip_HASH_SIZE;_++)zip_prev[zip_WSIZE+_]=0;if(zip_max_lazy_match=zip_configuration_table[zip_compr_level].max_lazy,zip_good_match=zip_configuration_table[zip_compr_level].good_length,zip_FULL_SEARCH||(zip_nice_match=zip_configuration_table[zip_compr_level].nice_length),zip_max_chain_length=zip_configuration_table[zip_compr_level].max_chain,zip_strstart=0,zip_block_start=0,(zip_lookahead=zip_read_buff(zip_window,0,2*zip_WSIZE))<=0)return zip_eofile=!0,void(zip_lookahead=0);for(zip_eofile=!1;zip_lookahead<zip_MIN_LOOKAHEAD&&!zip_eofile;)zip_fill_window();for(zip_ins_h=0,_=0;_<zip_MIN_MATCH-1;_++)zip_ins_h=(zip_ins_h<<zip_H_SHIFT^255&zip_window[_])&zip_HASH_MASK}function zip_longest_match(_){var i,p,z=zip_max_chain_length,e=zip_strstart,t=zip_prev_length,a=zip_strstart>zip_MAX_DIST?zip_strstart-zip_MAX_DIST:zip_NIL,l=zip_strstart+zip_MAX_MATCH,n=zip_window[e+t-1],r=zip_window[e+t];zip_prev_length>=zip_good_match&&(z>>=2);do{if(zip_window[(i=_)+t]==r&&zip_window[i+t-1]==n&&zip_window[i]==zip_window[e]&&zip_window[++i]==zip_window[e+1]){e+=2,i++;do{}while(zip_window[++e]==zip_window[++i]&&zip_window[++e]==zip_window[++i]&&zip_window[++e]==zip_window[++i]&&zip_window[++e]==zip_window[++i]&&zip_window[++e]==zip_window[++i]&&zip_window[++e]==zip_window[++i]&&zip_window[++e]==zip_window[++i]&&zip_window[++e]==zip_window[++i]&&e<l);if(p=zip_MAX_MATCH-(l-e),e=l-zip_MAX_MATCH,p>t){if(zip_match_start=_,t=p,zip_FULL_SEARCH){if(p>=zip_MAX_MATCH)break}else if(p>=zip_nice_match)break;n=zip_window[e+t-1],r=zip_window[e+t]}}}while((_=zip_prev[_&zip_WMASK])>a&&0!=--z);return t}function zip_fill_window(){var _,i,p=zip_window_size-zip_lookahead-zip_strstart;if(-1==p)p--;else if(zip_strstart>=zip_WSIZE+zip_MAX_DIST){for(_=0;_<zip_WSIZE;_++)zip_window[_]=zip_window[_+zip_WSIZE];for(zip_match_start-=zip_WSIZE,zip_strstart-=zip_WSIZE,zip_block_start-=zip_WSIZE,_=0;_<zip_HASH_SIZE;_++)zip_head2(_,(i=zip_head1(_))>=zip_WSIZE?i-zip_WSIZE:zip_NIL);for(_=0;_<zip_WSIZE;_++)i=zip_prev[_],zip_prev[_]=i>=zip_WSIZE?i-zip_WSIZE:zip_NIL;p+=zip_WSIZE}zip_eofile||((_=zip_read_buff(zip_window,zip_strstart+zip_lookahead,p))<=0?zip_eofile=!0:zip_lookahead+=_)}function zip_deflate_fast(){for(;0!=zip_lookahead&&null==zip_qhead;){var _;if(zip_INSERT_STRING(),zip_hash_head!=zip_NIL&&zip_strstart-zip_hash_head<=zip_MAX_DIST&&(zip_match_length=zip_longest_match(zip_hash_head))>zip_lookahead&&(zip_match_length=zip_lookahead),zip_match_length>=zip_MIN_MATCH)if(_=zip_ct_tally(zip_strstart-zip_match_start,zip_match_length-zip_MIN_MATCH),zip_lookahead-=zip_match_length,zip_match_length<=zip_max_lazy_match){zip_match_length--;do{zip_strstart++,zip_INSERT_STRING()}while(0!=--zip_match_length);zip_strstart++}else zip_strstart+=zip_match_length,zip_match_length=0,zip_ins_h=((zip_ins_h=255&zip_window[zip_strstart])<<zip_H_SHIFT^255&zip_window[zip_strstart+1])&zip_HASH_MASK;else _=zip_ct_tally(0,255&zip_window[zip_strstart]),zip_lookahead--,zip_strstart++;for(_&&(zip_flush_block(0),zip_block_start=zip_strstart);zip_lookahead<zip_MIN_LOOKAHEAD&&!zip_eofile;)zip_fill_window()}}function zip_deflate_better(){for(;0!=zip_lookahead&&null==zip_qhead;){if(zip_INSERT_STRING(),zip_prev_length=zip_match_length,zip_prev_match=zip_match_start,zip_match_length=zip_MIN_MATCH-1,zip_hash_head!=zip_NIL&&zip_prev_length<zip_max_lazy_match&&zip_strstart-zip_hash_head<=zip_MAX_DIST&&((zip_match_length=zip_longest_match(zip_hash_head))>zip_lookahead&&(zip_match_length=zip_lookahead),zip_match_length==zip_MIN_MATCH&&zip_strstart-zip_match_start>zip_TOO_FAR&&zip_match_length--),zip_prev_length>=zip_MIN_MATCH&&zip_match_length<=zip_prev_length){var _;_=zip_ct_tally(zip_strstart-1-zip_prev_match,zip_prev_length-zip_MIN_MATCH),zip_lookahead-=zip_prev_length-1,zip_prev_length-=2;do{zip_strstart++,zip_INSERT_STRING()}while(0!=--zip_prev_length);zip_match_available=0,zip_match_length=zip_MIN_MATCH-1,zip_strstart++,_&&(zip_flush_block(0),zip_block_start=zip_strstart)}else 0!=zip_match_available?(zip_ct_tally(0,255&zip_window[zip_strstart-1])&&(zip_flush_block(0),zip_block_start=zip_strstart),zip_strstart++,zip_lookahead--):(zip_match_available=1,zip_strstart++,zip_lookahead--);for(;zip_lookahead<zip_MIN_LOOKAHEAD&&!zip_eofile;)zip_fill_window()}}function zip_init_deflate(){zip_eofile||(zip_bi_buf=0,zip_bi_valid=0,zip_ct_init(),zip_lm_init(),zip_qhead=null,zip_outcnt=0,zip_outoff=0,zip_compr_level<=3?(zip_prev_length=zip_MIN_MATCH-1,zip_match_length=0):(zip_match_length=zip_MIN_MATCH-1,zip_match_available=0),zip_complete=!1)}function zip_deflate_internal(_,i,p){var z;return zip_initflag||(zip_init_deflate(),zip_initflag=!0,0!=zip_lookahead)?(z=zip_qcopy(_,i,p))==p?p:zip_complete?z:(zip_compr_level<=3?zip_deflate_fast():zip_deflate_better(),0==zip_lookahead&&(0!=zip_match_available&&zip_ct_tally(0,255&zip_window[zip_strstart-1]),zip_flush_block(1),zip_complete=!0),z+zip_qcopy(_,z+i,p-z)):(zip_complete=!0,0)}function zip_qcopy(_,i,p){var z,e,t;for(z=0;null!=zip_qhead&&z<p;){for((e=p-z)>zip_qhead.len&&(e=zip_qhead.len),t=0;t<e;t++)_[i+z+t]=zip_qhead.ptr[zip_qhead.off+t];var a;if(zip_qhead.off+=e,zip_qhead.len-=e,z+=e,0==zip_qhead.len)a=zip_qhead,zip_qhead=zip_qhead.next,zip_reuse_queue(a)}if(z==p)return z;if(zip_outoff<zip_outcnt){for((e=p-z)>zip_outcnt-zip_outoff&&(e=zip_outcnt-zip_outoff),t=0;t<e;t++)_[i+z+t]=zip_outbuf[zip_outoff+t];z+=e,zip_outcnt==(zip_outoff+=e)&&(zip_outcnt=zip_outoff=0)}return z}function zip_ct_init(){var _,i,p,z,e;if(0==zip_static_dtree[0].dl){for(zip_l_desc.dyn_tree=zip_dyn_ltree,zip_l_desc.static_tree=zip_static_ltree,zip_l_desc.extra_bits=zip_extra_lbits,zip_l_desc.extra_base=zip_LITERALS+1,zip_l_desc.elems=zip_L_CODES,zip_l_desc.max_length=zip_MAX_BITS,zip_l_desc.max_code=0,zip_d_desc.dyn_tree=zip_dyn_dtree,zip_d_desc.static_tree=zip_static_dtree,zip_d_desc.extra_bits=zip_extra_dbits,zip_d_desc.extra_base=0,zip_d_desc.elems=zip_D_CODES,zip_d_desc.max_length=zip_MAX_BITS,zip_d_desc.max_code=0,zip_bl_desc.dyn_tree=zip_bl_tree,zip_bl_desc.static_tree=null,zip_bl_desc.extra_bits=zip_extra_blbits,zip_bl_desc.extra_base=0,zip_bl_desc.elems=zip_BL_CODES,zip_bl_desc.max_length=zip_MAX_BL_BITS,zip_bl_desc.max_code=0,p=0,z=0;z<zip_LENGTH_CODES-1;z++)for(zip_base_length[z]=p,_=0;_<1<<zip_extra_lbits[z];_++)zip_length_code[p++]=z;for(zip_length_code[p-1]=z,e=0,z=0;z<16;z++)for(zip_base_dist[z]=e,_=0;_<1<<zip_extra_dbits[z];_++)zip_dist_code[e++]=z;for(e>>=7;z<zip_D_CODES;z++)for(zip_base_dist[z]=e<<7,_=0;_<1<<zip_extra_dbits[z]-7;_++)zip_dist_code[256+e++]=z;for(i=0;i<=zip_MAX_BITS;i++)zip_bl_count[i]=0;for(_=0;_<=143;)zip_static_ltree[_++].dl=8,zip_bl_count[8]++;for(;_<=255;)zip_static_ltree[_++].dl=9,zip_bl_count[9]++;for(;_<=279;)zip_static_ltree[_++].dl=7,zip_bl_count[7]++;for(;_<=287;)zip_static_ltree[_++].dl=8,zip_bl_count[8]++;for(zip_gen_codes(zip_static_ltree,zip_L_CODES+1),_=0;_<zip_D_CODES;_++)zip_static_dtree[_].dl=5,zip_static_dtree[_].fc=zip_bi_reverse(_,5);zip_init_block()}}function zip_init_block(){var _;for(_=0;_<zip_L_CODES;_++)zip_dyn_ltree[_].fc=0;for(_=0;_<zip_D_CODES;_++)zip_dyn_dtree[_].fc=0;for(_=0;_<zip_BL_CODES;_++)zip_bl_tree[_].fc=0;zip_dyn_ltree[zip_END_BLOCK].fc=1,zip_opt_len=zip_static_len=0,zip_last_lit=zip_last_dist=zip_last_flags=0,zip_flags=0,zip_flag_bit=1}function zip_pqdownheap(_,i){for(var p=zip_heap[i],z=i<<1;z<=zip_heap_len&&(z<zip_heap_len&&zip_SMALLER(_,zip_heap[z+1],zip_heap[z])&&z++,!zip_SMALLER(_,p,zip_heap[z]));)zip_heap[i]=zip_heap[z],i=z,z<<=1;zip_heap[i]=p}function zip_gen_bitlen(_){var i,p,z,e,t,a,l=_.dyn_tree,n=_.extra_bits,r=_.extra_base,o=_.max_code,d=_.max_length,s=_.static_tree,f=0;for(e=0;e<=zip_MAX_BITS;e++)zip_bl_count[e]=0;for(l[zip_heap[zip_heap_max]].dl=0,i=zip_heap_max+1;i<zip_HEAP_SIZE;i++)(e=l[l[p=zip_heap[i]].dl].dl+1)>d&&(e=d,f++),l[p].dl=e,p>o||(zip_bl_count[e]++,t=0,p>=r&&(t=n[p-r]),a=l[p].fc,zip_opt_len+=a*(e+t),null!=s&&(zip_static_len+=a*(s[p].dl+t)));if(0!=f){do{for(e=d-1;0==zip_bl_count[e];)e--;zip_bl_count[e]--,zip_bl_count[e+1]+=2,zip_bl_count[d]--,f-=2}while(f>0);for(e=d;0!=e;e--)for(p=zip_bl_count[e];0!=p;)(z=zip_heap[--i])>o||(l[z].dl!=e&&(zip_opt_len+=(e-l[z].dl)*l[z].fc,l[z].fc=e),p--)}}function zip_gen_codes(_,i){var p,z,e=new Array(zip_MAX_BITS+1),t=0;for(p=1;p<=zip_MAX_BITS;p++)t=t+zip_bl_count[p-1]<<1,e[p]=t;for(z=0;z<=i;z++){var a=_[z].dl;0!=a&&(_[z].fc=zip_bi_reverse(e[a]++,a))}}function zip_build_tree(_){var i,p,z=_.dyn_tree,e=_.static_tree,t=_.elems,a=-1,l=t;for(zip_heap_len=0,zip_heap_max=zip_HEAP_SIZE,i=0;i<t;i++)0!=z[i].fc?(zip_heap[++zip_heap_len]=a=i,zip_depth[i]=0):z[i].dl=0;for(;zip_heap_len<2;){var n=zip_heap[++zip_heap_len]=a<2?++a:0;z[n].fc=1,zip_depth[n]=0,zip_opt_len--,null!=e&&(zip_static_len-=e[n].dl)}for(_.max_code=a,i=zip_heap_len>>1;i>=1;i--)zip_pqdownheap(z,i);do{i=zip_heap[zip_SMALLEST],zip_heap[zip_SMALLEST]=zip_heap[zip_heap_len--],zip_pqdownheap(z,zip_SMALLEST),p=zip_heap[zip_SMALLEST],zip_heap[--zip_heap_max]=i,zip_heap[--zip_heap_max]=p,z[l].fc=z[i].fc+z[p].fc,zip_depth[i]>zip_depth[p]+1?zip_depth[l]=zip_depth[i]:zip_depth[l]=zip_depth[p]+1,z[i].dl=z[p].dl=l,zip_heap[zip_SMALLEST]=l++,zip_pqdownheap(z,zip_SMALLEST)}while(zip_heap_len>=2);zip_heap[--zip_heap_max]=zip_heap[zip_SMALLEST],zip_gen_bitlen(_),zip_gen_codes(z,a)}function zip_scan_tree(_,i){var p,z,e=-1,t=_[0].dl,a=0,l=7,n=4;for(0==t&&(l=138,n=3),_[i+1].dl=65535,p=0;p<=i;p++)z=t,t=_[p+1].dl,++a<l&&z==t||(a<n?zip_bl_tree[z].fc+=a:0!=z?(z!=e&&zip_bl_tree[z].fc++,zip_bl_tree[zip_REP_3_6].fc++):a<=10?zip_bl_tree[zip_REPZ_3_10].fc++:zip_bl_tree[zip_REPZ_11_138].fc++,a=0,e=z,0==t?(l=138,n=3):z==t?(l=6,n=3):(l=7,n=4))}function zip_send_tree(_,i){var p,z,e=-1,t=_[0].dl,a=0,l=7,n=4;for(0==t&&(l=138,n=3),p=0;p<=i;p++)if(z=t,t=_[p+1].dl,!(++a<l&&z==t)){if(a<n)do{zip_SEND_CODE(z,zip_bl_tree)}while(0!=--a);else 0!=z?(z!=e&&(zip_SEND_CODE(z,zip_bl_tree),a--),zip_SEND_CODE(zip_REP_3_6,zip_bl_tree),zip_send_bits(a-3,2)):a<=10?(zip_SEND_CODE(zip_REPZ_3_10,zip_bl_tree),zip_send_bits(a-3,3)):(zip_SEND_CODE(zip_REPZ_11_138,zip_bl_tree),zip_send_bits(a-11,7));a=0,e=z,0==t?(l=138,n=3):z==t?(l=6,n=3):(l=7,n=4)}}function zip_build_bl_tree(){var _;for(zip_scan_tree(zip_dyn_ltree,zip_l_desc.max_code),zip_scan_tree(zip_dyn_dtree,zip_d_desc.max_code),zip_build_tree(zip_bl_desc),_=zip_BL_CODES-1;_>=3&&0==zip_bl_tree[zip_bl_order[_]].dl;_--);return zip_opt_len+=3*(_+1)+5+5+4,_}function zip_send_all_trees(_,i,p){var z;for(zip_send_bits(_-257,5),zip_send_bits(i-1,5),zip_send_bits(p-4,4),z=0;z<p;z++)zip_send_bits(zip_bl_tree[zip_bl_order[z]].dl,3);zip_send_tree(zip_dyn_ltree,_-1),zip_send_tree(zip_dyn_dtree,i-1)}function zip_flush_block(_){var i,p,z,e,t;if(e=zip_strstart-zip_block_start,zip_flag_buf[zip_last_flags]=zip_flags,zip_build_tree(zip_l_desc),zip_build_tree(zip_d_desc),z=zip_build_bl_tree(),(p=zip_static_len+3+7>>3)<=(i=zip_opt_len+3+7>>3)&&(i=p),e+4<=i&&zip_block_start>=0)for(zip_send_bits((zip_STORED_BLOCK<<1)+_,3),zip_bi_windup(),zip_put_short(e),zip_put_short(~e),t=0;t<e;t++)zip_put_byte(zip_window[zip_block_start+t]);else p==i?(zip_send_bits((zip_STATIC_TREES<<1)+_,3),zip_compress_block(zip_static_ltree,zip_static_dtree)):(zip_send_bits((zip_DYN_TREES<<1)+_,3),zip_send_all_trees(zip_l_desc.max_code+1,zip_d_desc.max_code+1,z+1),zip_compress_block(zip_dyn_ltree,zip_dyn_dtree));zip_init_block(),0!=_&&zip_bi_windup()}function zip_ct_tally(_,i){if(zip_l_buf[zip_last_lit++]=i,0==_?zip_dyn_ltree[i].fc++:(_--,zip_dyn_ltree[zip_length_code[i]+zip_LITERALS+1].fc++,zip_dyn_dtree[zip_D_CODE(_)].fc++,zip_d_buf[zip_last_dist++]=_,zip_flags|=zip_flag_bit),zip_flag_bit<<=1,0==(7&zip_last_lit)&&(zip_flag_buf[zip_last_flags++]=zip_flags,zip_flags=0,zip_flag_bit=1),zip_compr_level>2&&0==(4095&zip_last_lit)){var p,z=8*zip_last_lit,e=zip_strstart-zip_block_start;for(p=0;p<zip_D_CODES;p++)z+=zip_dyn_dtree[p].fc*(5+zip_extra_dbits[p]);if(z>>=3,zip_last_dist<parseInt(zip_last_lit/2)&&z<parseInt(e/2))return!0}return zip_last_lit==zip_LIT_BUFSIZE-1||zip_last_dist==zip_DIST_BUFSIZE}function zip_compress_block(_,i){var p,z,e,t,a=0,l=0,n=0,r=0;if(0!=zip_last_lit)do{0==(7&a)&&(r=zip_flag_buf[n++]),z=255&zip_l_buf[a++],0==(1&r)?zip_SEND_CODE(z,_):(zip_SEND_CODE((e=zip_length_code[z])+zip_LITERALS+1,_),0!=(t=zip_extra_lbits[e])&&zip_send_bits(z-=zip_base_length[e],t),zip_SEND_CODE(e=zip_D_CODE(p=zip_d_buf[l++]),i),0!=(t=zip_extra_dbits[e])&&zip_send_bits(p-=zip_base_dist[e],t)),r>>=1}while(a<zip_last_lit);zip_SEND_CODE(zip_END_BLOCK,_)}var zip_Buf_size=16;function zip_send_bits(_,i){zip_bi_valid>zip_Buf_size-i?(zip_put_short(zip_bi_buf|=_<<zip_bi_valid),zip_bi_buf=_>>zip_Buf_size-zip_bi_valid,zip_bi_valid+=i-zip_Buf_size):(zip_bi_buf|=_<<zip_bi_valid,zip_bi_valid+=i)}function zip_bi_reverse(_,i){var p=0;do{p|=1&_,_>>=1,p<<=1}while(--i>0);return p>>1}function zip_bi_windup(){zip_bi_valid>8?zip_put_short(zip_bi_buf):zip_bi_valid>0&&zip_put_byte(zip_bi_buf),zip_bi_buf=0,zip_bi_valid=0}function zip_qoutbuf(){if(0!=zip_outcnt){var _,i;for(_=zip_new_queue(),null==zip_qhead?zip_qhead=zip_qtail=_:zip_qtail=zip_qtail.next=_,_.len=zip_outcnt-zip_outoff,i=0;i<_.len;i++)_.ptr[i]=zip_outbuf[zip_outoff+i];zip_outcnt=zip_outoff=0}}function zip_deflate(_,i){var p,z,e,t;for(zip_deflate_data=_,zip_deflate_pos=0,void 0===i&&(i=zip_DEFAULT_LEVEL),zip_deflate_start(i),z=new Array(1024),p="";(e=zip_deflate_internal(z,0,z.length))>0;)for(t=0;t<e;t++)p+=String.fromCharCode(z[t]);return zip_deflate_data=null,p}
var zip_slide,zip_wp,zip_fixed_td,zip_fixed_bl,fixed_bd,zip_bit_buf,zip_bit_len,zip_method,zip_eof,zip_copy_leng,zip_copy_dist,zip_tl,zip_td,zip_bl,zip_bd,zip_inflate_data,zip_inflate_pos,zip_WSIZE=32768,zip_STORED_BLOCK=0,zip_STATIC_TREES=1,zip_DYN_TREES=2,zip_lbits=9,zip_dbits=6,zip_INBUFSIZ=32768,zip_INBUF_EXTRA=64,zip_fixed_tl=null,zip_MASK_BITS=new Array(0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535),zip_cplens=new Array(3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0),zip_cplext=new Array(0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,99,99),zip_cpdist=new Array(1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577),zip_cpdext=new Array(0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13),zip_border=new Array(16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15);function zip_HuftList(){this.next=null,this.list=null}function zip_HuftNode(){this.e=0,this.b=0,this.n=0,this.t=null}function zip_HuftBuild(i,_,p,z,t,e){this.BMAX=16,this.N_MAX=288,this.status=0,this.root=null,this.m=0;var n,r,l,f,o,s,d,u,a,T,B,S,E,I,b,c,h,D=new Array(this.BMAX+1),w=new Array(this.BMAX+1),y=new zip_HuftNode,M=new Array(this.BMAX),A=new Array(this.N_MAX),N=new Array(this.BMAX+1);for(h=this.root=null,s=0;s<D.length;s++)D[s]=0;for(s=0;s<w.length;s++)w[s]=0;for(s=0;s<M.length;s++)M[s]=null;for(s=0;s<A.length;s++)A[s]=0;for(s=0;s<N.length;s++)N[s]=0;r=_>256?i[256]:this.BMAX,a=i,T=0,s=_;do{D[a[T]]++,T++}while(--s>0);if(D[0]==_)return this.root=null,this.m=0,void(this.status=0);for(d=1;d<=this.BMAX&&0==D[d];d++);for(u=d,e<d&&(e=d),s=this.BMAX;0!=s&&0==D[s];s--);for(f=s,e>s&&(e=s),I=1<<d;d<s;d++,I<<=1)if((I-=D[d])<0)return this.status=2,void(this.m=e);if((I-=D[s])<0)return this.status=2,void(this.m=e);for(D[s]+=I,N[1]=d=0,a=D,T=1,E=2;--s>0;)N[E++]=d+=a[T++];a=i,T=0,s=0;do{0!=(d=a[T++])&&(A[N[d]++]=s)}while(++s<_);for(_=N[f],N[0]=s=0,a=A,T=0,o=-1,S=w[0]=0,B=null,b=0;u<=f;u++)for(n=D[u];n-- >0;){for(;u>S+w[1+o];){if(S+=w[1+o],o++,b=(b=f-S)>e?e:b,(l=1<<(d=u-S))>n+1)for(l-=n+1,E=u;++d<b&&!((l<<=1)<=D[++E]);)l-=D[E];for(S+d>r&&S<r&&(d=r-S),b=1<<d,w[1+o]=d,B=new Array(b),c=0;c<b;c++)B[c]=new zip_HuftNode;(h=null==h?this.root=new zip_HuftList:h.next=new zip_HuftList).next=null,h.list=B,M[o]=B,o>0&&(N[o]=s,y.b=w[o],y.e=16+d,y.t=B,d=(s&(1<<S)-1)>>S-w[o],M[o-1][d].e=y.e,M[o-1][d].b=y.b,M[o-1][d].n=y.n,M[o-1][d].t=y.t)}for(y.b=u-S,T>=_?y.e=99:a[T]<p?(y.e=a[T]<256?16:15,y.n=a[T++]):(y.e=t[a[T]-p],y.n=z[a[T++]-p]),l=1<<u-S,d=s>>S;d<b;d+=l)B[d].e=y.e,B[d].b=y.b,B[d].n=y.n,B[d].t=y.t;for(d=1<<u-1;0!=(s&d);d>>=1)s^=d;for(s^=d;(s&(1<<S)-1)!=N[o];)S-=w[o],o--}this.m=w[1],this.status=0!=I&&1!=f?1:0}function zip_GET_BYTE(){return zip_inflate_data.length==zip_inflate_pos?-1:255&zip_inflate_data.charCodeAt(zip_inflate_pos++)}function zip_NEEDBITS(i){for(;zip_bit_len<i;)zip_bit_buf|=zip_GET_BYTE()<<zip_bit_len,zip_bit_len+=8}function zip_GETBITS(i){return zip_bit_buf&zip_MASK_BITS[i]}function zip_DUMPBITS(i){zip_bit_buf>>=i,zip_bit_len-=i}function zip_inflate_codes(i,_,p){var z,t,e;if(0==p)return 0;for(e=0;;){for(zip_NEEDBITS(zip_bl),z=(t=zip_tl.list[zip_GETBITS(zip_bl)]).e;z>16;){if(99==z)return-1;zip_DUMPBITS(t.b),zip_NEEDBITS(z-=16),z=(t=t.t[zip_GETBITS(z)]).e}if(zip_DUMPBITS(t.b),16!=z){if(15==z)break;for(zip_NEEDBITS(z),zip_copy_leng=t.n+zip_GETBITS(z),zip_DUMPBITS(z),zip_NEEDBITS(zip_bd),z=(t=zip_td.list[zip_GETBITS(zip_bd)]).e;z>16;){if(99==z)return-1;zip_DUMPBITS(t.b),zip_NEEDBITS(z-=16),z=(t=t.t[zip_GETBITS(z)]).e}for(zip_DUMPBITS(t.b),zip_NEEDBITS(z),zip_copy_dist=zip_wp-t.n-zip_GETBITS(z),zip_DUMPBITS(z);zip_copy_leng>0&&e<p;)zip_copy_leng--,zip_copy_dist&=zip_WSIZE-1,zip_wp&=zip_WSIZE-1,i[_+e++]=zip_slide[zip_wp++]=zip_slide[zip_copy_dist++];if(e==p)return p}else if(zip_wp&=zip_WSIZE-1,i[_+e++]=zip_slide[zip_wp++]=t.n,e==p)return p}return zip_method=-1,e}function zip_inflate_stored(i,_,p){var z;if(zip_DUMPBITS(z=7&zip_bit_len),zip_NEEDBITS(16),z=zip_GETBITS(16),zip_DUMPBITS(16),zip_NEEDBITS(16),z!=(65535&~zip_bit_buf))return-1;for(zip_DUMPBITS(16),zip_copy_leng=z,z=0;zip_copy_leng>0&&z<p;)zip_copy_leng--,zip_wp&=zip_WSIZE-1,zip_NEEDBITS(8),i[_+z++]=zip_slide[zip_wp++]=zip_GETBITS(8),zip_DUMPBITS(8);return 0==zip_copy_leng&&(zip_method=-1),z}function zip_inflate_fixed(i,_,p){if(null==zip_fixed_tl){var z,t,e=new Array(288);for(z=0;z<144;z++)e[z]=8;for(;z<256;z++)e[z]=9;for(;z<280;z++)e[z]=7;for(;z<288;z++)e[z]=8;if(0!=(t=new zip_HuftBuild(e,288,257,zip_cplens,zip_cplext,zip_fixed_bl=7)).status)return alert("HufBuild error: "+t.status),-1;for(zip_fixed_tl=t.root,zip_fixed_bl=t.m,z=0;z<30;z++)e[z]=5;if(zip_fixed_bd=5,(t=new zip_HuftBuild(e,30,0,zip_cpdist,zip_cpdext,zip_fixed_bd)).status>1)return zip_fixed_tl=null,alert("HufBuild error: "+t.status),-1;zip_fixed_td=t.root,zip_fixed_bd=t.m}return zip_tl=zip_fixed_tl,zip_td=zip_fixed_td,zip_bl=zip_fixed_bl,zip_bd=zip_fixed_bd,zip_inflate_codes(i,_,p)}function zip_inflate_dynamic(i,_,p){var z,t,e,n,r,l,f,o,s,d=new Array(316);for(z=0;z<d.length;z++)d[z]=0;if(zip_NEEDBITS(5),f=257+zip_GETBITS(5),zip_DUMPBITS(5),zip_NEEDBITS(5),o=1+zip_GETBITS(5),zip_DUMPBITS(5),zip_NEEDBITS(4),l=4+zip_GETBITS(4),zip_DUMPBITS(4),f>286||o>30)return-1;for(t=0;t<l;t++)zip_NEEDBITS(3),d[zip_border[t]]=zip_GETBITS(3),zip_DUMPBITS(3);for(;t<19;t++)d[zip_border[t]]=0;if(0!=(s=new zip_HuftBuild(d,19,19,null,null,zip_bl=7)).status)return-1;for(zip_tl=s.root,zip_bl=s.m,n=f+o,z=e=0;z<n;)if(zip_NEEDBITS(zip_bl),zip_DUMPBITS(t=(r=zip_tl.list[zip_GETBITS(zip_bl)]).b),(t=r.n)<16)d[z++]=e=t;else if(16==t){if(zip_NEEDBITS(2),t=3+zip_GETBITS(2),zip_DUMPBITS(2),z+t>n)return-1;for(;t-- >0;)d[z++]=e}else if(17==t){if(zip_NEEDBITS(3),t=3+zip_GETBITS(3),zip_DUMPBITS(3),z+t>n)return-1;for(;t-- >0;)d[z++]=0;e=0}else{if(zip_NEEDBITS(7),t=11+zip_GETBITS(7),zip_DUMPBITS(7),z+t>n)return-1;for(;t-- >0;)d[z++]=0;e=0}if(s=new zip_HuftBuild(d,f,257,zip_cplens,zip_cplext,zip_bl=zip_lbits),0==zip_bl&&(s.status=1),0!=s.status)return s.status,-1;for(zip_tl=s.root,zip_bl=s.m,z=0;z<o;z++)d[z]=d[z+f];return s=new zip_HuftBuild(d,o,0,zip_cpdist,zip_cpdext,zip_bd=zip_dbits),zip_td=s.root,0==(zip_bd=s.m)&&f>257?-1:(s.status,0!=s.status?-1:zip_inflate_codes(i,_,p))}function zip_inflate_start(){null==zip_slide&&(zip_slide=new Array(2*zip_WSIZE)),zip_wp=0,zip_bit_buf=0,zip_bit_len=0,zip_method=-1,zip_eof=!1,zip_copy_leng=zip_copy_dist=0,zip_tl=null}function zip_inflate_internal(i,_,p){var z,t;for(z=0;z<p;){if(zip_eof&&-1==zip_method)return z;if(zip_copy_leng>0){if(zip_method!=zip_STORED_BLOCK)for(;zip_copy_leng>0&&z<p;)zip_copy_leng--,zip_copy_dist&=zip_WSIZE-1,zip_wp&=zip_WSIZE-1,i[_+z++]=zip_slide[zip_wp++]=zip_slide[zip_copy_dist++];else{for(;zip_copy_leng>0&&z<p;)zip_copy_leng--,zip_wp&=zip_WSIZE-1,zip_NEEDBITS(8),i[_+z++]=zip_slide[zip_wp++]=zip_GETBITS(8),zip_DUMPBITS(8);0==zip_copy_leng&&(zip_method=-1)}if(z==p)return z}if(-1==zip_method){if(zip_eof)break;zip_NEEDBITS(1),0!=zip_GETBITS(1)&&(zip_eof=!0),zip_DUMPBITS(1),zip_NEEDBITS(2),zip_method=zip_GETBITS(2),zip_DUMPBITS(2),zip_tl=null,zip_copy_leng=0}switch(zip_method){case 0:t=zip_inflate_stored(i,_+z,p-z);break;case 1:t=null!=zip_tl?zip_inflate_codes(i,_+z,p-z):zip_inflate_fixed(i,_+z,p-z);break;case 2:t=null!=zip_tl?zip_inflate_codes(i,_+z,p-z):zip_inflate_dynamic(i,_+z,p-z);break;default:t=-1}if(-1==t)return zip_eof?0:-1;z+=t}return z}function zip_inflate(i){var _,p,z,t;zip_inflate_start(),zip_inflate_data=i,zip_inflate_pos=0;var e=-1;for(p=new Array(1024),_="";(z=zip_inflate_internal(p,0,p.length))>0&&e!=zip_inflate_pos;)for(e=zip_inflate_pos,t=0;t<z;t++)_+=String.fromCharCode(p[t]);return zip_inflate_data=null,_}
</script>

<!--
from http://www.broofa.com
mailto:robert@broofa.com
-->
<script>
function randomGUID(){return'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(c){var r=Math.random()*16|0,v=c=='x'?r:(r&0x3|0x8);return v.toString(16)})}
</script>

<!-- vkbeautify (modified)
from https://code.google.com/archive/p/vkbeautify/
 -->
<script>
function createShiftArr(e){var a="    ";if(isNaN(parseInt(e)))a=e;else switch(e){case 1:a=" ";break;case 2:a="  ";break;case 3:a="   ";break;case 4:a="    ";break;case 5:a="     ";break;case 6:a="      ";break;case 7:a="       ";break;case 8:a="        ";break;case 9:a="         ";break;case 10:a="          ";break;case 11:a="           ";break;case 12:a="            "}var s=["\n"];for(ix=0;ix<100;ix++)s.push(s[ix]+a);return s}function vkbeautify(){this.step="    ",this.shift=createShiftArr(this.step),this.xml=vkbeautifyxml}function vkbeautifyxml(e,a){var s=e.replace(/\s+</g,"<").replace(/</g,"~::~<").replace(/\s*xmlns\:/g,"~::~xmlns:").replace(/\s*xmlns\=/g,"~::~xmlns=").replace(/\s*([^\s]*\=)/g,"~::~$1").split("~::~"),r=s.length,c=!1,h=0,t="",i=0,l=a?createShiftArr(a):this.shift;for(i=0;i<r;i++)s[i].search(/<!/)>-1?(t+=l[h]+s[i],c=!0,(s[i].search(/-->/)>-1||s[i].search(/\]>/)>-1||s[i].search(/!DOCTYPE/)>-1)&&(c=!1)):s[i].search(/-->/)>-1||s[i].search(/\]>/)>-1?(t+=s[i],c=!1):/^<\w/.exec(s[i-1])&&/^<\/\w/.exec(s[i])&&/^<[\w:\-\.\,]+/.exec(s[i-1])==/^<\/[\w:\-\.\,]+/.exec(s[i])[0].replace("/","")?(t+=s[i],c||h--):s[i].search(/<\w/)>-1&&-1==s[i].search(/<\//)&&-1==s[i].search(/\/>/)?t=t+=c?s[i]:l[h++]+s[i]:s[i].search(/<\w/)>-1&&s[i].search(/<\//)>-1?t=t+=c?s[i]:l[h]+s[i]:s[i].search(/<\//)>-1?t=t+=c?s[i]:l[--h]+s[i]:s[i].search(/[^\s]*\=[^\s]*\s*\/>/)>-1?t=t+=c?s[i]:l[h--]+s[i]:s[i].search(/\/>/)>-1?t=t+=c?s[i]:l[h]+s[i]:s[i].search(/<\?/)>-1?t+=l[h]+s[i]:s[i].search(/[^\s]*\=/)>-1?t+=l[h]+s[i]:t+=s[i];return"\n"==t[0]?t.slice(1):t}beautify=new vkbeautify;
</script>

<br>
<br>
<sup>by Dan Malone &lt;dmalone@calpoly.edu&gt;</sup>
</body>
</html>