"mobile"
Bootstrap 3.0.0 Snippet by evarevirus

<link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css"> <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script> <script src="//code.jquery.com/jquery-1.11.1.min.js"></script> <!------ Include the above in your HEAD tag ----------> <!DOCTYPE html><html lang='en' class=''> <head><script src='//production-assets.codepen.io/assets/editor/live/console_runner-079c09a0e3b9ff743e39ee2d5637b9216b3545af0de366d4b9aad9dc87e26bfd.js'></script><script src='//production-assets.codepen.io/assets/editor/live/events_runner-73716630c22bbc8cff4bd0f07b135f00a0bdc5d14629260c3ec49e5606f98fdd.js'></script><script src='//production-assets.codepen.io/assets/editor/live/css_live_reload_init-2c0dc5167d60a5af3ee189d570b1835129687ea2a61bee3513dee3a50c115a77.js'></script><meta charset='UTF-8'><meta name="robots" content="noindex"><link rel="shortcut icon" type="image/x-icon" href="//production-assets.codepen.io/assets/favicon/favicon-8ea04875e70c4b0bb41da869e81236e54394d63638a1ef12fa558a4a835f1164.ico" /><link rel="mask-icon" type="" href="//production-assets.codepen.io/assets/favicon/logo-pin-f2d2b6d2c61838f7e76325261b7195c27224080bc099486ddd6dccb469b8e8e6.svg" color="#111" /><link rel="canonical" href="https://codepen.io/og2t/pen/AqlLn?limit=all&page=10&q=app" /> <style class="cp-pen-styles">*, *:before, *:after { -webkit-box-sizing: border-box; box-sizing: border-box; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } body { margin: 0; padding: 0; background: #000; overflow: hidden; } .icons-list { position: absolute; background: url("https://www.dropbox.com/s/v6plr4aagpfp0nu/iphone5s.png?raw=1") no-repeat; background-size: 510px 883px; width: 510px; height: 883px; margin: -403px 0 0 -249px; left: 50%; top: 50%; } .icons-list ul { position: absolute; padding: 26px 16px; background: url("https://www.dropbox.com/s/guzcdl7itxkoecl/bgrd.png?raw=1"); background-size: 320px 568px; width: 320px; height: 568px; left: 89px; top: 103px; overflow: hidden; } .icons-list ul.shaking .dragging div { -webkit-animation: none; animation: none; } .icons-list ul.shaking div { -webkit-animation: shake 0.25s 0s ease-in-out infinite; animation: shake 0.25s 0s ease-in-out infinite; } .icons-list li { -webkit-transition: opacity, -webkit-transform 0.25s ease-in-out; transition: opacity, -webkit-transform 0.25s ease-in-out; transition: opacity, transform 0.25s ease-in-out; transition: opacity, transform 0.25s ease-in-out, -webkit-transform 0.25s ease-in-out; cursor: pointer; list-style: none; position: absolute; text-align: center; font-size: 11px; color: #000; font-family: Helvetica, Arial, sans-serif; } .icons-list li span { width: 100%; display: block; position: absolute; text-align: center; top: 64px; } .icons-list li.placeholder { cursor: auto; } .icons-list li.placeholder div { background: none; } .icons-list li.placeholder span { display: none; } .icons-list li.dragging { -webkit-transition: none; transition: none; opacity: 0.75; } .icons-list li.dragging div { -webkit-transform: scale(1.25); transform: scale(1.25); } .icons-list li.dragging div:after { opacity: 0.75; } .icons-list li div { background: #fff url("https://www.dropbox.com/s/dx2rln3r2cni89c/icons.jpg?raw=1") no-repeat; background-size: 1440px 60px; width: 100%; height: 100%; border-radius: 12px; -webkit-transition: -webkit-transform 0.25s ease-out; transition: -webkit-transform 0.25s ease-out; transition: transform 0.25s ease-out; transition: transform 0.25s ease-out, -webkit-transform 0.25s ease-out; } .icons-list li div:after { content: ''; left: 0; top: 0; background: #000; position: absolute; z-index: 1; width: 100%; height: 100%; border-radius: 12px; opacity: 0; } .icons-list li div.appstore { background-position: 0px 0px; } .icons-list li div.calculator { background-position: -60px 0px; } .icons-list li div.calendar { background-position: -120px 0px; } .icons-list li div.camera { background-position: -180px 0px; } .icons-list li div.clock { background-position: -240px 0px; } .icons-list li div.compass { background-position: -300px 0px; } .icons-list li div.facetime { background-position: -360px 0px; } .icons-list li div.itunesstore { background-position: -420px 0px; } .icons-list li div.mail { background-position: -480px 0px; } .icons-list li div.maps { background-position: -540px 0px; } .icons-list li div.messages { background-position: -600px 0px; } .icons-list li div.music { background-position: -660px 0px; } .icons-list li div.passbook { background-position: -720px 0px; } .icons-list li div.phone { background-position: -780px 0px; } .icons-list li div.photos { background-position: -840px 0px; } .icons-list li div.reminders { background-position: -900px 0px; } .icons-list li div.safari { background-position: -960px 0px; } .icons-list li div.settings { background-position: -1020px 0px; } .icons-list li div.stocks { background-position: -1080px 0px; } .icons-list li div.twitter { background-position: -1140px 0px; } .icons-list li div.weather { background-position: -1200px 0px; } .icons-list li div.newsstand { background-position: -1260px 0px; } .icons-list li div.videos { background-position: -1320px 0px; } .icons-list li div.notes { background-position: -1380px 0px; } .info { width: 320px; font-family: Arial, sans-serif; position: absolute; z-index: 1000; left: -300px; top: 350px; } .info h4 { color: #fff; margin-bottom: 10px; } .info p { color: #fff; font-size: 14px; } @-webkit-keyframes shake { 0% { -webkit-transform: rotateZ(-2deg); transform: rotateZ(-2deg); } 33.3% { -webkit-transform: rotateZ(0deg); transform: rotateZ(0deg); } 66.6% { -webkit-transform: rotateZ(2deg); transform: rotateZ(2deg); } 100% { -webkit-transform: rotateZ(0deg); transform: rotateZ(0deg); } } @keyframes shake { 0% { -webkit-transform: rotateZ(-2deg); transform: rotateZ(-2deg); } 33.3% { -webkit-transform: rotateZ(0deg); transform: rotateZ(0deg); } 66.6% { -webkit-transform: rotateZ(2deg); transform: rotateZ(2deg); } 100% { -webkit-transform: rotateZ(0deg); transform: rotateZ(0deg); } } </style></head><body> <div class="icons-list"> <ul> <li> <div class="appstore"><span>App Store</span></div> </li> <li> <div class="calculator"><span>Calculator</span></div> </li> <li> <div class="calendar"><span>Calendar</span></div> </li> <li> <div class="camera"><span>Camera</span></div> </li> <li> <div class="compass"><span>Compass</span></div> </li> <li> <div class="itunesstore"><span>iTunes</span></div> </li> <li> <div class="mail"><span>Mail</span></div> </li> <li> <div class="maps"><span>Maps</span></div> </li> <li> <div class="music"><span>Music</span></div> </li> <li> <div class="passbook"><span>Passbook</span></div> </li> <li> <div class="photos"><span>Photos</span></div> </li> <li> <div class="reminders"><span>Reminders</span></div> </li> <li> <div class="safari"><span>Safari</span></div> </li> <li> <div class="stocks"><span>Stocks</span></div> </li> <li> <div class="weather"><span>Weather</span></div> </li> <li> <div class="facetime"><span>FaceTime</span></div> </li> <li> <div class="newsstand"><span>Newsstand</span></div> </li> <li> <div class="videos"><span>Videos</span></div> </li> <li> <div class="notes"><span>Notes</span></div> </li> <li class="placeholder"> <div class="twitter"><span>Twitter</span></div> </li> <li> <div class="phone"><span>Phone</span></div> </li> <li> <div class="messages"><span>Messages</span></div> </li> <li> <div class="clock"><span>Clock</span></div> </li> <li> <div class="settings"><span>Settings</span></div> </li> </ul> <div class="info"> <h4>iOS apps reordering done right :)</h4> <p>Use mouse to drag and drop (Webkit only)</p> </div> </div> <script src='//production-assets.codepen.io/assets/common/stopExecutionOnTimeout-b2a7b3fe212eaa732349046d8416e00a9dec26eb7fd347590fbced3ab38af52e.js'></script> <script >(function() { // Polyfills var ShuffleGrid, addClass, grid, hasClass, iconsList, removeClass; addClass = function(el, className) { if (hasClass(el, className)) { return; } if (el.classList) { el.classList.add(className); } else { el.className += ' ' + className; } }; removeClass = function(el, className) { if (el.classList) { el.classList.remove(className); } else { el.className = el.className.replace(new RegExp("(^|\\b)" + className.split(" ").join("|") + "(\\b|$)", "gi"), " "); } }; hasClass = function(el, className) { if (el.classList) { return el.classList.contains(className); } else { return new RegExp("(^| )" + className + "( |$)", "gi").test(el.className); } }; ShuffleGrid = (function() { var VENDORS; // Here we go... class ShuffleGrid { constructor(context, cols, rows, colSize, rowSize, paddingX = 0, paddingY = 0) { this.initIndex = this.initIndex.bind(this); this.addItem = this.addItem.bind(this); this.shuffleItems = this.shuffleItems.bind(this); this.snapToGrid = this.snapToGrid.bind(this); this.positionItem = this.positionItem.bind(this); this.getPosition = this.getPosition.bind(this); this.getCell = this.getCell.bind(this); this.onMousePress = this.onMousePress.bind(this); this.onMouseMove = this.onMouseMove.bind(this); this.onMouseRelease = this.onMouseRelease.bind(this); this.numCells = this.numCells.bind(this); this.startDrag = this.startDrag.bind(this); this.stopDrag = this.stopDrag.bind(this); this.context = context; this.cols = cols; this.rows = rows; this.colSize = colSize; this.rowSize = rowSize; this.paddingX = paddingX; this.paddingY = paddingY; this.numItems = 0; this.initIndex(); this.items = [].slice.call(this.context.children); this.items.forEach((item, id) => { return this.addItem(item); }); return; } initIndex() { var i; this.itemVOs = []; this.index = new Array(this.rows); i = 0; while (i < this.rows) {if (window.CP.shouldStopExecution(1)){break;}if (window.CP.shouldStopExecution(1)){break;} this.index[i++] = new Array(this.cols); } window.CP.exitedLoop(1); window.CP.exitedLoop(1); } addItem(item) { var col, id, itemVO, position, row; col = this.numItems % this.cols; row = Math.floor(this.numItems / this.cols); position = this.getPosition(row, col); id = this.numItems; this.numItems++; itemVO = { row: row, col: col, item: item, id: id }; item.style.width = `${this.colSize}px`; item.style.height = `${this.rowSize}px`; item.setAttribute('id', id); this.positionItem(item, position.x, position.y); this.index[row][col] = itemVO; this.itemVOs[id] = itemVO; if (hasClass(item, 'placeholder')) { return; } item.children[0].style.webkitAnimationDelay = Math.random() * 0.5 + 's'; item.children[0].style.MozAnimationDelay = Math.random() * 0.5 + 's'; item.addEventListener('mousedown', this.onMousePress, false); return item; } shuffleItems() { var cell, col, hMove, i, item, itemVO, move, row, vMove; itemVO = this.itemVOs[this.currentItem.getAttribute('id')]; cell = this.getCell(parseInt(this.currentItem.getAttribute('x')), parseInt(this.currentItem.getAttribute('y'))); col = cell.x; row = cell.y; if (col === itemVO.col && row === itemVO.row) { return; } hMove = col - itemVO.col; vMove = row - itemVO.row; move = []; if (hMove < 0) { i = itemVO.col - 1; while (i >= itemVO.col + hMove) {if (window.CP.shouldStopExecution(2)){break;}if (window.CP.shouldStopExecution(2)){break;} if (this.index[itemVO.row][i]) { item = this.index[itemVO.row][i]; item.col++; this.index[item.row][item.col] = item; move.push(item); } i--; } window.CP.exitedLoop(2); window.CP.exitedLoop(2); } else { i = itemVO.col + 1; while (i <= itemVO.col + hMove) {if (window.CP.shouldStopExecution(3)){break;}if (window.CP.shouldStopExecution(3)){break;} if (this.index[itemVO.row][i]) { item = this.index[itemVO.row][i]; item.col--; this.index[item.row][item.col] = item; move.push(item); } i++; } window.CP.exitedLoop(3); window.CP.exitedLoop(3); } if (vMove < 0) { i = itemVO.row - 1; while (i >= itemVO.row + vMove) {if (window.CP.shouldStopExecution(4)){break;}if (window.CP.shouldStopExecution(4)){break;} if (this.index[i][itemVO.col + hMove]) { item = this.index[i][itemVO.col + hMove]; item.row++; this.index[item.row][item.col] = item; move.push(item); } i--; } window.CP.exitedLoop(4); window.CP.exitedLoop(4); } else { i = itemVO.row + 1; while (i <= itemVO.row + vMove) {if (window.CP.shouldStopExecution(5)){break;}if (window.CP.shouldStopExecution(5)){break;} if (this.index[i][itemVO.col + hMove]) { item = this.index[i][itemVO.col + hMove]; item.row--; this.index[item.row][item.col] = item; move.push(item); } i++; } window.CP.exitedLoop(5); window.CP.exitedLoop(5); } i = 0; while (i < move.length) {if (window.CP.shouldStopExecution(6)){break;}if (window.CP.shouldStopExecution(6)){break;} this.snapToGrid(move[i++]); } window.CP.exitedLoop(6); window.CP.exitedLoop(6); itemVO.row = row; itemVO.col = col; this.index[row][col] = itemVO; } snapToGrid(itemVO) { var position; position = this.getPosition(itemVO.row, itemVO.col); this.positionItem(itemVO.item, position.x, position.y); } positionItem(item, x, y) { var j, len, vendor; for (j = 0, len = VENDORS.length; j < len; j++) {if (window.CP.shouldStopExecution(7)){break;}if (window.CP.shouldStopExecution(7)){break;} vendor = VENDORS[j]; item.style[`${vendor}Transform`] = `translateX(${x}px) translateY(${y}px)`; } window.CP.exitedLoop(7); window.CP.exitedLoop(7); } getPosition(row, col) { var offsetY, position; // Only used for the iOS demo if (row > 4) { offsetY = 20; } else { offsetY = 0; } position = { x: col * (this.colSize + this.paddingX), y: row * (this.rowSize + this.paddingY) + offsetY }; return position; } getCell(x, y) { var cell; cell = { x: Math.max(0, Math.min(this.cols - 1, Math.round(x / (this.colSize + this.paddingX)))), y: Math.max(0, Math.min(this.rows - 1, Math.round(y / (this.rowSize + this.paddingY)))) }; return cell; } onMousePress(event) { var contextOffset; this.currentItem = event.currentTarget; contextOffset = this.context.getBoundingClientRect(); this.originOffset = { x: event.offsetX + contextOffset.left + 16, y: event.offsetY + contextOffset.top + 26 }; this.startDrag(this.currentItem); this.onMouseMove(event); this.context.addEventListener('mouseup', this.onMouseRelease, false); this.context.addEventListener('mousemove', this.onMouseMove, false); this.context.addEventListener('mouseleave', this.onMouseRelease, false); } onMouseMove(event) { var x, y; x = event.clientX - this.originOffset.x; y = event.clientY - this.originOffset.y; this.currentItem.setAttribute('x', x); this.currentItem.setAttribute('y', y); this.positionItem(this.currentItem, x, y); this.shuffleItems(); } onMouseRelease(event) { this.currentItem.removeEventListener('mouseout', this.onMouseRelease); this.stopDrag(this.currentItem); this.context.removeEventListener('mousemove', this.onMouseMove); this.snapToGrid(this.itemVOs[this.currentItem.getAttribute('id')]); } numCells() { return this.rows * this.cols; } startDrag(item) { this.zIndex++; item.style.zIndex = this.zIndex; addClass(item, 'dragging'); addClass(this.context, 'shaking'); } stopDrag(item) { removeClass(item, 'dragging'); removeClass(this.context, 'shaking'); } }; VENDORS = ['webkit', 'Moz']; ShuffleGrid.prototype.zIndex = 100; return ShuffleGrid; })(); // Time to launch iconsList = document.querySelector('.icons-list ul'); grid = new ShuffleGrid(iconsList, 4, 6, 60, 60, 16, 28); }).call(this); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiPGFub255bW91cz4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFBQTtBQUFBLE1BQUEsV0FBQSxFQUFBLFFBQUEsRUFBQSxJQUFBLEVBQUEsUUFBQSxFQUFBLFNBQUEsRUFBQTs7RUFFQSxRQUFBLEdBQVcsUUFBQSxDQUFDLEVBQUQsRUFBSyxTQUFMLENBQUE7SUFDVCxJQUFHLFFBQUEsQ0FBUyxFQUFULEVBQWEsU0FBYixDQUFIO0FBQStCLGFBQS9COztJQUNBLElBQUcsRUFBRSxDQUFDLFNBQU47TUFDRSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQWIsQ0FBaUIsU0FBakIsRUFERjtLQUFBLE1BQUE7TUFHRSxFQUFFLENBQUMsU0FBSCxJQUFnQixHQUFBLEdBQU0sVUFIeEI7O0VBRlM7O0VBUVgsV0FBQSxHQUFjLFFBQUEsQ0FBQyxFQUFELEVBQUssU0FBTCxDQUFBO0lBQ1osSUFBRyxFQUFFLENBQUMsU0FBTjtNQUNFLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBYixDQUFvQixTQUFwQixFQURGO0tBQUEsTUFBQTtNQUdFLEVBQUUsQ0FBQyxTQUFILEdBQWUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFiLENBQXFCLElBQUksTUFBSixDQUFXLFNBQUEsR0FBWSxTQUFTLENBQUMsS0FBVixDQUFnQixHQUFoQixDQUFvQixDQUFDLElBQXJCLENBQTBCLEdBQTFCLENBQVosR0FBNkMsU0FBeEQsRUFBbUUsSUFBbkUsQ0FBckIsRUFBK0YsR0FBL0YsRUFIakI7O0VBRFk7O0VBT2QsUUFBQSxHQUFXLFFBQUEsQ0FBQyxFQUFELEVBQUssU0FBTCxDQUFBO0lBQ1QsSUFBRyxFQUFFLENBQUMsU0FBTjtBQUNFLGFBQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFiLENBQXNCLFNBQXRCLEVBRFQ7S0FBQSxNQUFBO0FBR0UsYUFBTyxJQUFJLE1BQUosQ0FBVyxPQUFBLEdBQVUsU0FBVixHQUFzQixPQUFqQyxFQUEw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QUFELENBQUE7UUFDUixXQUFBLENBQVksSUFBWixFQUFrQixVQUFsQjtRQUNBLFdBQUEsQ0FBWSxJQUFDLENBQUEsT0FBYixFQUFzQixTQUF0QjtNQUZROztJQXJNWjs7SUFFRSxPQUFBLEdBQVUsQ0FBQyxRQUFELEVBQVcsS0FBWDs7MEJBRVYsTUFBQSxHQUFROzs7O09BOUJWOzs7O0VBc09BLFNBQUEsR0FBWSxRQUFRLENBQUMsYUFBVCxDQUF1QixnQkFBdkI7O0VBQ1osSUFBQSxHQUFPLElBQUksV0FBSixDQUFnQixTQUFoQixFQUEyQixDQUEzQixFQUE4QixDQUE5QixFQUFpQyxFQUFqQyxFQUFxQyxFQUFyQyxFQUF5QyxFQUF6QyxFQUE2QyxFQUE3QztBQXZPUCIsInNvdXJjZXNDb250ZW50IjpbIiMgUG9seWZpbGxzXG5cbmFkZENsYXNzID0gKGVsLCBjbGFzc05hbWUpIC0+XG4gIGlmIGhhc0NsYXNzIGVsLCBjbGFzc05hbWUgdGhlbiByZXR1cm5cbiAgaWYgZWwuY2xhc3NMaXN0XG4gICAgZWwuY2xhc3NMaXN0LmFkZCBjbGFzc05hbWVcbiAgZWxzZVxuICAgIGVsLmNsYXNzTmFtZSArPSAnICcgKyBjbGFzc05hbWVcbiAgcmV0dXJuXG5cbnJlbW92ZUNsYXNzID0gKGVsLCBjbGFzc05hbWUpIC0+XG4gIGlmIGVsLmNsYXNzTGlzdFxuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUgY2xhc3NOYW1lXG4gIGVsc2VcbiAgICBlbC5jbGFzc05hbWUgPSBlbC5jbGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKFwiKF58XFxcXGIpXCIgKyBjbGFzc05hbWUuc3BsaXQoXCIgXCIpLmpvaW4oXCJ8XCIpICsgXCIoXFxcXGJ8JClcIiwgXCJnaVwiKSwgXCIgXCIpXG4gIHJldHVyblxuXG5oYXNDbGFzcyA9IChlbCwgY2xhc3NOYW1lKSAtPlxuICBpZiBlbC5jbGFzc0xpc3RcbiAgICByZXR1cm4gZWwuY2xhc3NMaXN0LmNvbnRhaW5zIGNsYXNzTmFtZVxuICBlbHNlXG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXCIoXnwgKVwiICsgY2xhc3NOYW1lICsgXCIoIHwkKVwiLCBcImdpXCIpLnRlc3QgZWwuY2xhc3NOYW1lXG5cblxuIyBIZXJlIHdlIGdvLi4uXG5cbmNsYXNzIFNodWZmbGVHcmlkXG5cbiAgVkVORE9SUyA9IFsnd2Via2l0JywgJ01veiddXG4gIFxuICB6SW5kZXg6IDEwMFxuXG4gIGNvbnN0cnVjdG9yOiAoQGNvbnRleHQsIEBjb2xzLCBAcm93cywgQGNvbFNpemUsIEByb3dTaXplLCBAcGFkZGluZ1ggPSAwLCBAcGFkZGluZ1kgPSAwKSAtPlxuICAgIEBudW1JdGVtcyA9IDBcbiAgICBAaW5pdEluZGV4KClcblxuICAgIEBpdGVtcyA9IFtdLnNsaWNlLmNhbGwgQGNvbnRleHQuY2hpbGRyZW5cbiAgICBAaXRlbXMuZm9yRWFjaCAoaXRlbSwgaWQpID0+XG4gICAgICBAYWRkSXRlbSBpdGVtXG4gICAgcmV0dXJuXG5cblxuICBpbml0SW5kZXg6ICgpID0+XG4gICAgQGl0ZW1WT3MgPSBbXVxuICAgIEBpbmRleCA9IG5ldyBBcnJheSBAcm93c1xuXG4gICAgaSA9IDBcbiAgICB3aGlsZSBpIDwgQHJvd3NcbiAgICAgIEBpbmRleFtpKytdID0gbmV3IEFycmF5IEBjb2xzXG4gICAgcmV0dXJuXG5cblxuICBhZGRJdGVtOiAoaXRlbSkgPT5cbiAgICBjb2wgPSBAbnVtSXRlbXMgJSBAY29sc1xuICAgIHJvdyA9IE1hdGguZmxvb3IgQG51bUl0ZW1zIC8gQGNvbHNcblxuICAgIHBvc2l0aW9uID0gQGdldFBvc2l0aW9uIHJvdywgY29sXG5cbiAgICBpZCA9IEBudW1JdGVtc1xuICAgIEBudW1JdGVtcysrXG4gICAgXG4gICAgaXRlbVZPID1cbiAgICAgIHJvdzogcm93XG4gICAgICBjb2w6IGNvbFxuICAgICAgaXRlbTogaXRlbVxuICAgICAgaWQ6IGlkXG5cbiAgICBpdGVtLnN0eWxlLndpZHRoID0gXCIje0Bjb2xTaXplfXB4XCJcbiAgICBpdGVtLnN0eWxlLmhlaWdodCA9IFwiI3tAcm93U2l6ZX1weFwiXG4gICAgaXRlbS5zZXRBdHRyaWJ1dGUgJ2lkJywgaWRcbiAgICBAcG9zaXRpb25JdGVtIGl0ZW0sIHBvc2l0aW9uLngsIHBvc2l0aW9uLnlcblxuICAgIFxuICAgIEBpbmRleFtyb3ddW2NvbF0gPSBpdGVtVk9cbiAgICBAaXRlbVZPc1tpZF0gPSBpdGVtVk9cblxuICAgIGlmIGhhc0NsYXNzIGl0ZW0sICdwbGFjZWhvbGRlcicgdGhlbiByZXR1cm5cblxuICAgIGl0ZW0uY2hpbGRyZW5bMF0uc3R5bGUud2Via2l0QW5pbWF0aW9uRGVsYXkgPSBNYXRoLnJhbmRvbSgpICogMC41ICsgJ3MnXG4gICAgaXRlbS5jaGlsZHJlblswXS5zdHlsZS5Nb3pBbmltYXRpb25EZWxheSA9IE1hdGgucmFuZG9tKCkgKiAwLjUgKyAncydcbiAgICBcbiAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIgJ21vdXNlZG93bicsIEBvbk1vdXNlUHJlc3MsIGZhbHNlXG4gICAgcmV0dXJuIGl0ZW1cblxuXG4gIHNodWZmbGVJdGVtczogKCkgPT5cbiAgICBpdGVtVk8gPSBAaXRlbVZPc1tAY3VycmVudEl0ZW0uZ2V0QXR0cmlidXRlICdpZCddXG5cbiAgICBjZWxsID0gQGdldENlbGwgcGFyc2VJbnQoQGN1cnJlbnRJdGVtLmdldEF0dHJpYnV0ZSAneCcpLCBwYXJzZUludChAY3VycmVudEl0ZW0uZ2V0QXR0cmlidXRlICd5JylcblxuICAgIGNvbCA9IGNlbGwueFxuICAgIHJvdyA9IGNlbGwueVxuXG4gICAgcmV0dXJuIGlmIGNvbCBpcyBpdGVtVk8uY29sIGFuZCByb3cgaXMgaXRlbVZPLnJvd1xuXG4gICAgaE1vdmUgPSBjb2wgLSBpdGVtVk8uY29sXG4gICAgdk1vdmUgPSByb3cgLSBpdGVtVk8ucm93XG5cbiAgICBtb3ZlID0gW11cblxuICAgIGlmIGhNb3ZlIDwgMFxuICAgICAgaSA9IGl0ZW1WTy5jb2wgLSAxXG4gICAgICB3aGlsZSBpID49IGl0ZW1WTy5jb2wgKyBoTW92ZVxuICAgICAgICBpZiBAaW5kZXhbaXRlbVZPLnJvd11baV1cbiAgICAgICAgICBpdGVtID0gQGluZGV4W2l0ZW1WTy5yb3ddW2ldXG4gICAgICAgICAgaXRlbS5jb2wrK1xuICAgICAgICAgIEBpbmRleFtpdGVtLnJvd11baXRlbS5jb2xdID0gaXRlbVxuICAgICAgICAgIG1vdmUucHVzaCBpdGVtXG4gICAgICAgIGktLVxuICAgIGVsc2VcbiAgICAgIGkgPSBpdGVtVk8uY29sICsgMVxuICAgICAgd2hpbGUgaSA8PSBpdGVtVk8uY29sICsgaE1vdmVcbiAgICAgICAgaWYgQGluZGV4W2l0ZW1WTy5yb3ddW2ldXG4gICAgICAgICAgaXRlbSA9IEBpbmRleFtpdGVtVk8ucm93XVtpXVxuICAgICAgICAgIGl0ZW0uY29sLS1cbiAgICAgICAgICBAaW5kZXhbaXRlbS5yb3ddW2l0ZW0uY29sXSA9IGl0ZW1cbiAgICAgICAgICBtb3ZlLnB1c2ggaXRlbVxuICAgICAgICBpKytcblxuICAgIGlmIHZNb3ZlIDwgMFxuICAgICAgaSA9IGl0ZW1WTy5yb3cgLSAxXG4gICAgICB3aGlsZSBpID49IGl0ZW1WTy5yb3cgKyB2TW92ZVxuICAgICAgICBpZiBAaW5kZXhbaV1baXRlbVZPLmNvbCArIGhNb3ZlXVxuICAgICAgICAgIGl0ZW0gPSBAaW5kZXhbaV1baXRlbVZPLmNvbCArIGhNb3ZlXVxuICAgICAgICAgIGl0ZW0ucm93KytcbiAgICAgICAgICBAaW5kZXhbaXRlbS5yb3ddW2l0ZW0uY29sXSA9IGl0ZW1cbiAgICAgICAgICBtb3ZlLnB1c2ggaXRlbVxuICAgICAgICBpLS1cbiAgICBlbHNlXG4gICAgICBpID0gaXRlbVZPLnJvdyArIDFcbiAgICAgIHdoaWxlIGkgPD0gaXRlbVZPLnJvdyArIHZNb3ZlXG4gICAgICAgIGlmIEBpbmRleFtpXVtpdGVtVk8uY29sICsgaE1vdmVdXG4gICAgICAgICAgaXRlbSA9IEBpbmRleFtpXVtpdGVtVk8uY29sICsgaE1vdmVdXG4gICAgICAgICAgaXRlbS5yb3ctLVxuICAgICAgICAgIEBpbmRleFtpdGVtLnJvd11baXRlbS5jb2xdID0gaXRlbVxuICAgICAgICAgIG1vdmUucHVzaCBpdGVtXG4gICAgICAgIGkrK1xuICAgIFxuICAgIGkgPSAwXG4gICAgd2hpbGUgaSA8IG1vdmUubGVuZ3RoXG4gICAgICBAc25hcFRvR3JpZCBtb3ZlW2krK11cblxuICAgIGl0ZW1WTy5yb3cgPSByb3dcbiAgICBpdGVtVk8uY29sID0gY29sXG4gICAgQGluZGV4W3Jvd11bY29sXSA9IGl0ZW1WT1xuICAgIHJldHVyblxuXG5cbiAgc25hcFRvR3JpZDogKGl0ZW1WTykgPT5cbiAgICBwb3NpdGlvbiA9IEBnZXRQb3NpdGlvbiBpdGVtVk8ucm93LCBpdGVtVk8uY29sXG4gICAgQHBvc2l0aW9uSXRlbSBpdGVtVk8uaXRlbSwgcG9zaXRpb24ueCwgcG9zaXRpb24ueVxuICAgIHJldHVyblxuXG5cbiAgcG9zaXRpb25JdGVtOiAoaXRlbSwgeCwgeSkgPT5cbiAgICBmb3IgdmVuZG9yIGluIFZFTkRPUlNcbiAgICAgIGl0ZW0uc3R5bGVbXCIje3ZlbmRvcn1UcmFuc2Zvcm1cIl0gPSBcInRyYW5zbGF0ZVgoI3t4fXB4KSB0cmFuc2xhdGVZKCN7eX1weClcIlxuICAgIHJldHVyblxuXG5cbiAgZ2V0UG9zaXRpb246IChyb3csIGNvbCkgPT5cbiAgICAjIE9ubHkgdXNlZCBmb3IgdGhlIGlPUyBkZW1vXG4gICAgaWYgcm93ID4gNCB0aGVuIG9mZnNldFkgPSAyMCBlbHNlIG9mZnNldFkgPSAwIFxuXG4gICAgcG9zaXRpb24gPSBcbiAgICAgIHg6IGNvbCAqIChAY29sU2l6ZSArIEBwYWRkaW5nWClcbiAgICAgIHk6IHJvdyAqIChAcm93U2l6ZSArIEBwYWRkaW5nWSkgKyBvZmZzZXRZXG4gICAgcmV0dXJuIHBvc2l0aW9uXG5cblxuICBnZXRDZWxsOiAoeCwgeSkgPT5cbiAgICBjZWxsID0gXG4gICAgICB4OiBNYXRoLm1heCgwLCBNYXRoLm1pbihAY29scyAtIDEsIE1hdGgucm91bmQoeCAvIChAY29sU2l6ZSArIEBwYWRkaW5nWCkpKSlcbiAgICAgIHk6IE1hdGgubWF4KDAsIE1hdGgubWluKEByb3dzIC0gMSwgTWF0aC5yb3VuZCh5IC8gKEByb3dTaXplICsgQHBhZGRpbmdZKSkpKVxuICAgIHJldHVybiBjZWxsXG5cblxuICBvbk1vdXNlUHJlc3M6IChldmVudCkgPT5cbiAgICBAY3VycmVudEl0ZW0gPSBldmVudC5jdXJyZW50VGFyZ2V0XG4gXG4gICAgY29udGV4dE9mZnNldCA9IEBjb250ZXh0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgQG9yaWdpbk9mZnNldCA9IFxuICAgICAgeDogZXZlbnQub2Zmc2V0WCArIGNvbnRleHRPZmZzZXQubGVmdCArIDE2XG4gICAgICB5OiBldmVudC5vZmZzZXRZICsgY29udGV4dE9mZnNldC50b3AgKyAyNlxuXG4gICAgQHN0YXJ0RHJhZyBAY3VycmVudEl0ZW1cbiAgICBAb25Nb3VzZU1vdmUgZXZlbnRcbiAgICBAY29udGV4dC5hZGRFdmVudExpc3RlbmVyICdtb3VzZXVwJywgQG9uTW91c2VSZWxlYXNlLCBmYWxzZVxuICAgIEBjb250ZXh0LmFkZEV2ZW50TGlzdGVuZXIgJ21vdXNlbW92ZScsIEBvbk1vdXNlTW92ZSwgZmFsc2VcbiAgICBAY29udGV4dC5hZGRFdmVudExpc3RlbmVyICdtb3VzZWxlYXZlJywgQG9uTW91c2VSZWxlYXNlLCBmYWxzZVxuICAgIHJldHVyblxuXG5cbiAgb25Nb3VzZU1vdmU6IChldmVudCkgPT5cbiAgICB4ID0gZXZlbnQuY2xpZW50WCAtIEBvcmlnaW5PZmZzZXQueFxuICAgIHkgPSBldmVudC5jbGllbnRZIC0gQG9yaWdpbk9mZnNldC55XG4gICAgQGN1cnJlbnRJdGVtLnNldEF0dHJpYnV0ZSAneCcsIHhcbiAgICBAY3VycmVudEl0ZW0uc2V0QXR0cmlidXRlICd5JywgeVxuICAgIEBwb3NpdGlvbkl0ZW0gQGN1cnJlbnRJdGVtLCB4LCB5XG4gICAgQHNodWZmbGVJdGVtcygpXG4gICAgcmV0dXJuXG4gIFxuXG4gIG9uTW91c2VSZWxlYXNlOiAoZXZlbnQpID0+XG4gICAgQGN1cnJlbnRJdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgJ21vdXNlb3V0JywgQG9uTW91c2VSZWxlYXNlXG4gICAgQHN0b3BEcmFnIEBjdXJyZW50SXRlbVxuICAgIEBjb250ZXh0LnJlbW92ZUV2ZW50TGlzdGVuZXIgJ21vdXNlbW92ZScsIEBvbk1vdXNlTW92ZVxuICAgIEBzbmFwVG9HcmlkIEBpdGVtVk9zW0BjdXJyZW50SXRlbS5nZXRBdHRyaWJ1dGUgJ2lkJ11cbiAgICByZXR1cm5cblxuXG4gIG51bUNlbGxzOiAoKSA9PlxuICAgcmV0dXJuIEByb3dzICogQGNvbHNcblxuXG4gIHN0YXJ0RHJhZzogKGl0ZW0pID0+XG4gICAgQHpJbmRleCsrXG4gICAgaXRlbS5zdHlsZS56SW5kZXggPSBAekluZGV4XG4gICAgYWRkQ2xhc3MgaXRlbSwgJ2RyYWdnaW5nJ1xuICAgIGFkZENsYXNzIEBjb250ZXh0LCAnc2hha2luZydcbiAgICByZXR1cm4gIFxuXG5cbiAgc3RvcERyYWc6IChpdGVtKSA9PlxuICAgIHJlbW92ZUNsYXNzIGl0ZW0sICdkcmFnZ2luZydcbiAgICByZW1vdmVDbGFzcyBAY29udGV4dCwgJ3NoYWtpbmcnXG4gICAgcmV0dXJuICBcblxuXG4jIFRpbWUgdG8gbGF1bmNoIFxuaWNvbnNMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciAnLmljb25zLWxpc3QgdWwnXG5ncmlkID0gbmV3IFNodWZmbGVHcmlkIGljb25zTGlzdCwgNCwgNiwgNjAsIDYwLCAxNiwgMjgiXX0= //# sourceURL=coffeescript //# sourceURL=pen.js </script> </body></html>

Related: See More


Questions / Comments: