(function(n){"use strict";n.stringify=function t(n){function i(n){return/[^\w-.]/.test(n)?n.replace(/[^\w-.]/g,function(n){return n==="$"?"!":(n=n.charCodeAt(0),n<256?"*"+("00"+n.toString(16)).slice(-2):"**"+("0000"+n.toString(16)).slice(-4))}):n}switch(typeof n){case"number":return isFinite(n)?"~"+n:"~null";case"boolean":return"~"+n;case"string":return"~'"+i(n);case"object":return n?Array.isArray(n)?"~("+(n.map(function(n){return t(n)||"~null"}).join("")||"~")+")":"~("+Object.keys(n).map(function(r){var u=t(n[r]);return u&&i(r)+u}).filter(function(n){return n}).join("~")+")":"~null";default:return}};var i={"true":!0,"false":!1,"null":null};n.parse=function(n){function u(i){if(n[t]!==i)throw new Error("bad JSURL syntax: expected "+i+", got "+(n&&n[t]));t++}function f(){for(var i=t,f,u="";t<r&&(f=n[t])!=="~"&&f!==")";)switch(f){case"*":i<t&&(u+=n.substring(i,t));n[t+1]==="*"?(u+=String.fromCharCode(parseInt(n.substring(t+2,t+6),16)),i=t+=6):(u+=String.fromCharCode(parseInt(n.substring(t+1,t+3),16)),i=t+=3);break;case"!":i<t&&(u+=n.substring(i,t));u+="$";i=++t;break;default:t++}return u+n.substring(i,t)}if(!n)return n;var t=0,r=n.length;return function e(){var o,h,c,l,s;u("~");switch(h=n[t]){case"(":if(t++,n[t]==="~"){if(o=[],n[t+1]===")")t++;else do o.push(e());while(n[t]==="~")}else if(o={},n[t]!==")")do l=f(),o[l]=e();while(n[t]==="~"&&++t);u(")");break;case"'":t++;o=f();break;default:for(c=t++;t<r&&/[^)~]/.test(n[t]);)t++;if(s=n.substring(c,t),/[\d\-]/.test(h))o=parseFloat(s);else if(o=i[s],typeof o=="undefined")throw new Error("bad value keyword: "+s);}return o}()}})(typeof exports!="undefined"?exports:window.JSURL=window.JSURL||{});