Skip to content

Instantly share code, notes, and snippets.

@betzrhodes
Created February 20, 2019 17:25
Show Gist options
  • Save betzrhodes/3d46ae92aff6255021561aa627448160 to your computer and use it in GitHub Desktop.
Save betzrhodes/3d46ae92aff6255021561aa627448160 to your computer and use it in GitHub Desktop.
iBeacon Bi-Directional
// iBeacon Bi-Directional Device Application
// Map hardware pins to global variables
BLE_REG_ON <- hardware.pinJ;
BLE_LPO <- hardware.pinE;
BLE_UART_TX <- hardware.pinF;
BLE_UART_RX <- hardware.pinG;
BLE_UART <- hardware.uartFGJH;
// BLE FIRMWARE
// Firmware is a string or blob containing Broadcom-proprietary firmware
// which is softloaded into the 43438 on boot. This is approximately
// 16KB in size.
// _wiced_3_4_0_43438a1_37_4mhz
const BLE_FIRMWARE = "\x4C\xFC\x46\x00\x17\x21\x00\x42\x52\x43\x4D\x63\x66\x67\x53\x00\x00\x00\x00\x32\x00\x00\x00\x01\x01\x04\x18\x92\x00\x00\x00\x03\x06\xAC\x1F\x12\xA1\x43\x43\x00\x01\x1C\x42\x17\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFE\x00\x00\x4C\xFC\xFF\x42\x17\x21\x00\x42\x52\x43\x4D\x63\x66\x67\x44\x00\x00\x00\x00\xF1\x39\x00\x00\x03\x03\x22\x42\x43\x4D\x34\x33\x34\x33\x41\x31\x20\x55\x41\x52\x54\x20\x33\x37\x2E\x34\x20\x4D\x48\x7A\x20\x77\x6C\x62\x67\x61\x5F\x72\x65\x66\x00\x16\x03\x02\x1C\x00\x02\x01\x98\x03\x08\x01\x32\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x32\x00\xFF\x0F\x00\x00\x62\x08\x00\x00\x70\x00\x64\x00\x80\x00\x00\x00\x80\x00\x00\x00\xAC\x00\x32\x00\xFF\xFF\xFF\x01\x00\x00\x2F\x00\x8C\x00\x32\x00\x00\xF0\xFF\x0F\x00\x10\x11\x01\x78\x00\x32\x00\xFF\xFF\xFF\xFF\xB9\xB8\xB8\xB8\x60\x2C\x20\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x10\x01\x32\x00\x00\x00\xFF\xFF\x00\x00\x18\x18\x6C\x01\x60\x00\xFF\xFF\xFF\xFF\x0B\x00\x00\x00\x70\x01\x60\x00\xFF\xFF\xFF\xFF\x10\x00\x00\x00\x74\x01\x60\x00\xFF\xFF\xFF\xFF\x15\x00\x00\x00\x78\x01\x60\x00\xFF\xFF\xFF\xFF\x19\x00\x00\x00\x7C\x01\x60\x00\xFF\xFF\x00\x00\x1D\x00\x00\x00\x84\x01\x60\x00\xFF\xFF\xFF\xFF\x21\x00\x00\x00\x60\x06\x41\x00\xFF\xFF\x00\x00\x33\x03\x00\x00\x64\x06\x41\x00\xFF\xFF\x00\x00\x29\x4C\xFC\xFF\x3D\x18\x21\x00\x3A\x00\x00\x64\x06\x41\x00\xFF\xFF\x00\x00\x29\x3A\x00\x00\x68\x06\x41\x00\xFF\xFF\x00\x00\x68\x05\x00\x00\x6C\x06\x41\x00\xFF\xFF\x00\x00\xA8\x30\x00\x00\x70\x06\x41\x00\xFF\xFF\x00\x00\xE8\x3E\x00\x00\x74\x06\x41\x00\xFF\xFF\x00\x00\x1C\x32\x00\x00\x78\x06\x41\x00\xFF\xFF\x00\x00\xBB\x33\x00\x00\x7C\x06\x41\x00\xFF\xFF\x00\x00\x30\x09\x00\x00\x40\x01\x41\x00\xFF\xFF\x00\x00\x10\x05\x00\x00\x44\x01\x41\x00\xFF\xFF\x00\x00\x09\x09\x00\x00\x4C\x01\x41\x00\xFF\xFF\x00\x00\x09\x08\x00\x00\x50\x01\x41\x00\xFF\xFF\x00\x00\x0F\x07\x00\x00\x54\x01\x41\x00\xFF\xFF\x00\x00\x05\x08\x00\x00\x5C\x01\x41\x00\xFF\xFF\x00\x00\x0E\x09\x00\x00\x60\x01\x41\x00\xFF\xFF\x00\x00\x05\x09\x00\x00\x64\x01\x41\x00\xFF\xFF\x00\x00\x10\x0A\x00\x00\xE0\x06\x41\x00\xFF\xFF\x00\x00\x71\x20\x00\x00\x9C\x01\x60\x00\xFF\x00\x00\x00\x03\x00\x00\x00\x64\x01\x60\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x09\x01\x04\x02\x01\x00\x00\x22\x03\x02\x01\x00\xF0\x01\x28\x04\x00\x00\x00\x20\x15\x32\x00\xFF\xFF\xFA\xFF\xD9\x03\x3E\xFE\x28\x4C\xFC\xFF\x38\x19\x21\x00\x15\x32\x00\x00\x00\x7F\xFE\x34\x10\x28\x02\x2C\x09\x64\x00\x0E\x00\x00\x00\x0C\x00\x00\x00\xF0\x01\x28\x01\x00\x00\x00\x20\x15\x32\x00\xFF\xFF\xFA\xFF\xDD\x03\x3E\xFE\x28\x15\x32\x00\x00\x00\x7F\xFE\x34\x10\x28\x02\x2C\x09\x64\x00\x0E\x00\x00\x00\x0C\x00\x00\x00\xF0\x01\x28\x02\x00\x00\x00\x20\x15\x32\x00\xFF\xFF\xFA\xFF\xD9\x03\x3E\xFE\x28\x15\x32\x00\x00\x00\x7F\xFE\x34\x10\x28\x02\x2C\x09\x64\x00\x0E\x00\x00\x00\x0C\x00\x00\x00\xF0\x01\xA0\x01\x03\x00\x00\x00\x10\x15\x32\x00\x00\x00\x00\x00\xF0\xF0\xF0\x00\x14\x15\x32\x00\x00\x00\x00\x00\xF0\xF0\xF0\x00\x18\x15\x32\x00\x00\x00\x00\x00\xF0\xF0\xF0\x00\x1C\x15\x32\x00\x00\x00\x00\x00\x4C\x4C\x00\x00\x20\x15\x32\x00\xFF\xFF\xFA\xFF\xDD\x03\x3E\xFE\x24\x15\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x15\x32\x00\x00\x00\x7F\xFE\x34\x10\x28\x02\x34\x15\x32\x00\x00\x00\x00\x00\xF0\x00\x00\x00\x38\x15\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x15\x32\x00\x00\x00\x00\x00\xCA\x06\x00\x00\x2C\x09\x64\x00\x0E\x00\x00\x00\x0C\x00\x00\x00\xF8\x00\x4C\xFC\xFF\x33\x1A\x21\x00\x64\x00\x51\x00\x00\x00\x10\x00\x00\x00\x78\x08\x64\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x07\xB5\x03\x04\x06\x0A\x23\x3C\x5A\x6E\x7D\x05\x38\x04\x88\x04\x9C\x04\x88\x04\xD8\x04\x74\x04\xC4\x04\xD8\x04\xC4\x04\x14\x05\xB0\x04\x00\x05\x14\x05\x00\x05\x50\x05\xF6\x04\x46\x05\x5A\x05\x46\x05\x96\x05\x3C\x05\x8C\x05\xA0\x05\x8C\x05\xDC\x05\x82\x05\xD2\x05\xE6\x05\xD2\x05\x22\x06\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\xA8\x02\xA8\x02\xA8\x02\xA8\x02\xA8\x02\xE4\x02\xE4\x02\xE4\x02\xE4\x02\xE4\x02\x20\x03\x20\x03\x20\x03\x20\x03\x20\x03\x66\x03\x66\x03\x66\x03\x66\x03\x66\x03\xAC\x03\xAC\x03\xAC\x03\xAC\x03\xAC\x03\xF2\x03\xF2\x03\xF2\x03\xF2\x03\xF2\x03\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x06\x00\x00\x00\x60\x00\x05\x9C\x02\xFF\xA0\x02\xFF\xA4\x02\xFF\xA8\x02\xFF\xAC\x02\xFF\x00\x00\x60\x00\x05\xC8\x02\xFF\xCC\x02\xFF\xD0\x02\xFF\xD4\x02\xFF\xD8\x02\xFF\x00\x00\x60\x00\x05\x88\x03\xFF\x8C\x03\xFF\x90\x03\xFF\x94\x03\xFF\x98\x03\xFF\x00\x00\x60\x00\x05\x9C\x03\xFF\xA0\x03\x4C\xFC\xFF\x2E\x1B\x21\x00\xFF\xA4\x03\xFF\xA8\x03\xFF\xAC\x03\xFF\x00\x00\x60\x00\x05\x80\x03\xFF\x84\x03\xFF\xA0\x06\xFF\xB4\x02\xFF\x38\x07\xFF\x00\x00\x60\x00\x03\xA4\x06\xFF\x5C\x06\xFF\x98\x06\xFF\x4C\x4C\x4C\x4C\x4C\x41\x41\x41\x41\x41\x85\x85\x85\x85\x84\xA6\xA5\xA5\xA5\xA5\xA4\xF4\x18\x03\xFA\x65\x03\xCC\x5F\x5F\x5F\x5F\x5F\x4D\x4D\x4D\x4D\x4D\x84\x84\x84\x84\x83\xA5\xA4\xA4\xA4\xA4\xA4\xF4\x1A\x03\xFA\x66\x03\xCC\x6C\x6C\x6C\x6C\x6C\x58\x58\x58\x58\x58\x84\x84\x84\x84\x83\xA5\xA4\xA4\xA4\xA4\xA4\xF4\x1F\x03\xFA\x66\x03\xCC\x85\x85\x85\x85\x85\x69\x69\x69\x69\x69\x84\x84\x84\x84\x83\xA5\xA4\xA4\xA4\xA4\xA4\xF4\x1F\x03\xFA\x66\x03\xCC\x99\x99\x99\x99\x99\x74\x74\x74\x74\x74\x84\x84\x84\x84\x83\xA5\xA4\xA4\xA4\xA4\xA4\xF4\x1F\x03\xFA\x67\x03\xCC\xB3\xB3\xB3\xB3\xB3\x82\x82\x82\x82\x82\x84\x84\x84\x84\x83\xA5\xA4\xA4\xA4\xA4\xA4\xF4\x1F\x03\xFA\x67\x23\xFF\x01\x07\xB5\x03\x00\x06\x0A\x23\x3C\x5A\x6E\x7D\x05\x5C\x03\x3E\x03\x48\x03\x5C\x03\x48\x03\x98\x03\x7A\x03\x84\x03\x98\x03\x84\x03\xD4\x03\xB6\x03\xC0\x03\x4C\xFC\xFF\x29\x1C\x21\x00\xD4\x03\xC0\x03\x1A\x04\xFC\x03\x06\x04\x1A\x04\x06\x04\x60\x04\x42\x04\x4C\x04\x60\x04\x4C\x04\xA6\x04\x88\x04\x92\x04\xA6\x04\x92\x04\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x44\x02\x30\x02\x26\x02\x12\x02\x1C\x02\x80\x02\x6C\x02\x62\x02\x4E\x02\x58\x02\xBC\x02\xA8\x02\x9E\x02\x8A\x02\x94\x02\x02\x03\xEE\x02\xE4\x02\xD0\x02\xDA\x02\x48\x03\x34\x03\x2A\x03\x16\x03\x20\x03\x8E\x03\x7A\x03\x70\x03\x5C\x03\x66\x03\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x06\x00\x00\x00\x60\x00\x05\x9C\x02\xFF\xA0\x02\xFF\xA4\x02\xFF\xA8\x02\xFF\xAC\x02\xFF\x00\x00\x60\x00\x05\xC8\x02\xFF\xCC\x02\xFF\xD0\x02\xFF\xD4\x02\xFF\xD8\x02\xFF\x00\x00\x60\x00\x05\x88\x03\xFF\x8C\x03\xFF\x90\x03\xFF\x94\x03\xFF\x98\x03\xFF\x00\x00\x60\x00\x05\x9C\x03\xFF\xA0\x03\xFF\xA4\x03\xFF\xA8\x03\xFF\xAC\x03\xFF\x00\x00\x60\x00\x05\x80\x03\xFF\x84\x03\xFF\xA0\x06\xFF\xB4\x02\xFF\x38\x07\xFF\x00\x00\x60\x00\x03\xA4\x06\xFF\x5C\x06\xFF\x98\x06\xFF\x43\x39\x37\x37\x38\x38\x35\x35\x36\x35\x88\x86\x86\x86\x85\xA8\xA6\x4C\xFC\xFF\x24\x1D\x21\x00\xA6\xA6\xA4\xA4\xF4\x18\x03\xFA\x65\x03\xCC\x4C\x45\x41\x42\x43\x40\x3C\x3B\x3B\x3C\x88\x86\x86\x86\x85\xA8\xA6\xA6\xA6\xA4\xA4\xF4\x1A\x03\xFA\x66\x03\xCC\x5C\x52\x52\x52\x52\x4B\x47\x47\x47\x47\x88\x86\x86\x86\x85\xA8\xA6\xA6\xA6\xA4\xA4\xF4\x1F\x03\xFA\x66\x03\xCC\x6A\x63\x5F\x5F\x64\x57\x53\x52\x52\x53\x88\x86\x86\x86\x85\xA8\xA6\xA6\xA6\xA4\xA4\xF4\x1F\x03\xFA\x66\x03\xCC\x7C\x71\x6E\x6E\x71\x61\x5D\x5C\x5C\x5D\x88\x86\x86\x86\x85\xA8\xA6\xA6\xA6\xA4\xA4\xF4\x1F\x03\xFA\x67\x03\xCC\x8C\x81\x7F\x7F\x81\x6F\x68\x67\x67\x68\x88\x86\x86\x86\x85\xA8\xA6\xA6\xA6\xA4\xA4\xF4\x1F\x03\xFA\x67\x23\xFF\x02\x07\x7F\x04\x06\x05\x38\x04\x88\x04\x9C\x04\x88\x04\xD8\x04\x74\x04\xC4\x04\xD8\x04\xC4\x04\x14\x05\xB0\x04\x00\x05\x14\x05\x00\x05\x50\x05\xF6\x04\x46\x05\x5A\x05\x46\x05\x96\x05\x3C\x05\x8C\x05\xA0\x05\x8C\x05\xDC\x05\x82\x05\xD2\x05\xE6\x05\xD2\x05\x22\x06\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x01\x00\x00\x00\x60\x00\x05\x9C\x02\xFF\xA0\x02\xFF\xA4\x02\xFF\xA8\x02\xFF\xAC\x02\xFF\x4C\xFC\xFF\x1F\x1E\x21\x00\x4C\x4C\x4C\x4C\x4C\x5F\x5F\x5F\x5F\x5F\x6C\x6C\x6C\x6C\x6C\x85\x85\x85\x85\x85\x99\x99\x99\x99\x99\xB3\xB3\xB3\xB3\xB3\x02\x07\x7F\x00\x06\x05\x5C\x03\x3E\x03\x48\x03\x5C\x03\x48\x03\x98\x03\x7A\x03\x84\x03\x98\x03\x84\x03\xD4\x03\xB6\x03\xC0\x03\xD4\x03\xC0\x03\x1A\x04\xFC\x03\x06\x04\x1A\x04\x06\x04\x60\x04\x42\x04\x4C\x04\x60\x04\x4C\x04\xA6\x04\x88\x04\x92\x04\xA6\x04\x92\x04\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x01\x00\x00\x00\x60\x00\x05\x9C\x02\xFF\xA0\x02\xFF\xA4\x02\xFF\xA8\x02\xFF\xAC\x02\xFF\x43\x39\x37\x37\x38\x4C\x45\x41\x42\x43\x5C\x53\x52\x52\x52\x6A\x63\x5F\x5F\x64\x7C\x71\x6E\x6E\x71\x8C\x81\x7F\x7F\x81\x00\x07\x04\x3F\x00\x00\x00\x03\x01\xC4\x01\x08\x0A\x20\x00\x08\x08\x00\x00\x04\x04\x00\x00\x10\x10\x00\x00\x08\x08\x00\x00\x18\x18\x00\x00\x28\x28\x00\x00\x20\x20\x00\x00\x2C\x2C\x00\x00\x28\x28\x00\x00\x30\x30\x00\x00\x41\x41\x00\x00\x34\x34\x00\x00\x49\x49\x00\x00\x20\x20\x01\x01\x50\x50\x00\x00\x24\x24\x01\x01\x58\x58\x00\x00\x40\x40\x01\x01\x8A\x8A\x00\x00\x4C\xFC\xFF\x1A\x1F\x21\x00\x60\x60\x01\x01\x8B\x8B\x00\x00\x64\x64\x01\x01\x8C\x8C\x00\x00\x60\x60\x02\x02\x8D\x8D\x00\x00\x64\x64\x02\x02\x8E\x8E\x00\x00\x68\x68\x02\x02\x8F\x8F\x00\x00\x6C\x6C\x02\x02\x96\x96\x00\x00\x70\x70\x02\x02\xA5\xA5\x00\x00\x50\x50\x03\x03\xA6\xA6\x00\x00\x54\x54\x03\x03\xDD\xDD\x00\x00\x74\x74\x03\x03\xE5\xE5\x00\x00\x78\x78\x03\x03\xED\xED\x00\x00\x98\x98\x03\x03\xEE\xEE\x00\x00\xFC\xFC\x03\x03\xEF\xEF\x00\x00\xBC\xBC\x03\x03\xEF\xEF\x00\x00\xBC\xBC\x03\x03\x03\x01\x64\xC8\x0A\x20\x00\x40\x00\x00\x01\x40\x00\x00\x01\x40\x00\x00\x01\x40\x00\x00\x01\x40\x00\x00\x01\x41\x00\x04\x01\x49\x00\x24\x01\x50\x00\x40\x01\x58\x00\x60\x01\x52\x00\x48\x01\x53\x00\x4C\x01\x54\x00\x50\x01\x55\x00\x54\x01\x56\x00\x58\x01\x57\x00\x5C\x01\x66\x00\x98\x01\x6E\x00\xB8\x01\x76\x00\xD8\x01\x7E\x00\xF8\x01\x7F\x00\xFC\x01\x7F\x00\xFC\x01\x7F\x00\xFC\x01\x7F\x00\xFC\x01\x7F\x00\xFC\x01\x03\x01\x3A\x28\x0B\x20\x00\x01\x00\x00\x01\x00\x00\x05\x00\x00\x0D\x00\x00\x1D\x00\x00\x0E\x00\x00\x1E\x00\x00\x3E\x00\x00\x0F\x4C\xFC\xFF\x15\x20\x21\x00\x00\x00\x1F\x00\x00\x3F\x00\x00\x7F\x00\x00\xFF\x00\x00\xFF\x00\x00\xFF\x00\x00\xFF\x00\x00\xFF\x00\x00\xFF\x00\x00\x03\x01\x05\x08\x08\x20\x00\x06\x03\x01\x05\x0C\x08\x20\x00\x05\x03\x01\x05\x10\x08\x20\x00\x0B\x03\x01\x05\x14\x08\x20\x00\x0A\x04\x07\x98\x01\x04\x32\x1F\x00\x00\x1D\x00\x00\x1C\x01\x00\x1A\x02\x00\x17\x02\x00\x15\x12\x00\x13\x55\x00\x11\x64\x00\x0F\x11\x00\x0E\x03\x00\x0D\x14\x00\x0B\x50\x00\x0A\x64\x00\x09\x23\x00\x08\x23\x00\x07\x03\x00\x07\x16\x00\x06\x15\x00\x05\x13\x00\x05\x16\x00\x04\x13\x00\x04\x26\x00\x04\x19\x00\x03\x05\x00\x03\x08\x00\x03\x2A\x00\x02\x03\x00\x02\x16\x00\x02\x09\x00\x02\x2B\x00\x02\x3D\x00\x02\x3F\x00\x01\x02\x00\x01\x15\x00\x01\x18\x00\x01\x3A\x00\x01\x1D\x00\x01\x1F\x00\x01\x8F\x00\x01\xEF\x00\x01\x3F\x01\x01\x8F\x01\x01\xCF\x01\x01\x0F\x02\x01\x4F\x02\x01\x7F\x02\x01\xAF\x02\x01\xCF\x02\x01\x00\x00\x01\x00\x00\x04\x07\x98\x01\x00\x32\x1F\x00\x00\x1D\x00\x00\x1C\x01\x00\x1A\x02\x00\x17\x02\x00\x15\x12\x00\x13\x55\x00\x11\x64\x00\x0F\x11\x00\x0E\x4C\xFC\xFF\x10\x21\x21\x00\x03\x00\x0D\x14\x00\x0B\x50\x00\x0A\x64\x00\x09\x23\x00\x08\x23\x00\x07\x03\x00\x07\x16\x00\x06\x15\x00\x05\x13\x00\x05\x16\x00\x04\x13\x00\x04\x26\x00\x04\x19\x00\x03\x05\x00\x03\x08\x00\x03\x2A\x00\x02\x03\x00\x02\x16\x00\x02\x09\x00\x02\x2B\x00\x02\x3D\x00\x02\x3F\x00\x01\x02\x00\x01\x15\x00\x01\x18\x00\x01\x3A\x00\x01\x1D\x00\x01\x1F\x00\x01\x8F\x00\x01\xEF\x00\x01\x3F\x01\x01\x8F\x01\x01\xCF\x01\x01\x0F\x02\x01\x4F\x02\x01\x7F\x02\x01\xAF\x02\x01\xCF\x02\x01\x00\x00\x01\x00\x00\x03\x07\x2B\x01\x00\x00\x00\x01\x00\x00\x00\x00\x14\x0A\x00\x04\x00\x00\x00\x00\x00\x00\x0A\x02\xFE\x0B\xE4\xFE\x1C\x01\xE4\xFE\x1C\x01\x0A\x02\xFE\x0B\xF1\xFF\x0F\x00\xF1\xFF\x0F\x00\x0F\x03\x28\x02\x78\x14\x7F\x5A\x00\x14\x02\x14\x1E\x00\x02\x03\x00\x1E\xAA\x33\x19\x05\xCF\x00\x80\x0A\x92\x00\x00\x00\x00\x07\x00\x00\xA2\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x05\x18\x13\x21\x00\x90\x03\x01\x0C\xDC\x1D\x20\x00\x01\x01\x30\x00\x02\x0A\x0A\x00\x03\x01\x05\x48\x2C\x20\x00\x01\x03\x01\x05\x24\x33\x20\x00\x00\x03\x4C\xFC\xFF\x0B\x22\x21\x00\x01\x05\x4E\x05\x20\x00\x00\x03\x01\x14\x00\x02\x0D\x00\x8F\xB0\x00\x24\x01\x48\xC4\x61\x6D\xF7\x90\xBC\x00\x3F\x20\x00\x03\x01\x0E\x10\x02\x0D\x00\x10\x22\xA8\xF7\x9D\xFD\xA9\xF7\x53\xB8\x03\x01\x12\x1A\x02\x0D\x00\x02\xD5\x20\x46\x00\xF0\x81\xF8\xA8\xF7\xCF\xBB\x00\x00\x03\x01\x0C\x28\x02\x0D\x00\x00\xF0\xDE\xF8\x10\xBD\x00\x00\x03\x01\x0C\x30\x02\x0D\x00\x73\xF7\xC0\xFC\x72\xF7\xA6\xBA\x03\x01\x0C\x38\x02\x0D\x00\x00\xF0\xF4\xF8\x10\xBD\x00\x00\x03\x01\x18\x40\x02\x0D\x00\x20\x46\x29\x46\x00\xF0\xF8\xF9\x08\xB1\x4F\xF7\x57\xBF\x4F\xF7\x69\xBF\x00\x00\x03\x01\x24\x54\x02\x0D\x00\x04\x70\x7D\xF7\xA6\xFC\x5E\xF7\x57\xFD\x5B\xF7\x11\xFD\x5B\xF7\x67\xFD\x00\xF0\xF6\xF8\x4F\xF4\xC0\x20\x00\x21\x5B\xF7\xAE\xBC\x03\x01\x14\x74\x02\x0D\x00\x15\x7F\x06\x2D\x01\xD0\xC2\xF8\x1A\x40\x86\xF7\xD1\xBC\x00\x00\x03\x01\x10\x84\x02\x0D\x00\xE8\x60\x01\x20\xA8\x76\x99\xF7\x49\xBF\x00\x00\x03\x01\x10\x90\x02\x0D\x00\xC8\xF8\x08\x10\x00\xF0\xDE\xFB\x73\xF7\x7C\xB8\x03\x01\x0C\x9C\x02\x0D\x00\x00\xF0\x88\xFC\x4C\xFC\xFF\x06\x23\x21\x00\xBD\xE8\xF0\x81\x03\x01\x0C\xA4\x02\x0D\x00\x01\xF0\x66\xFA\xBD\xE8\xF0\x81\x03\x01\x0C\xAC\x02\x0D\x00\xBD\xE8\xF0\x4F\x01\xF0\xD9\xBB\x03\x01\x10\xB4\x02\x0D\x00\x62\xF7\xAF\xFD\xAD\xF8\x0C\x00\x64\xF7\x5C\xBD\x03\x01\x0C\xC0\x02\x0D\x00\x01\xF0\x52\xFD\x70\xBD\x00\x00\x03\x01\x18\xC8\x02\x0D\x00\x01\x20\x60\xF3\x0F\x24\x04\xF0\xFE\x00\x5C\xF7\xBE\xFF\x5D\xF7\x14\xB8\x00\x00\x03\x01\x10\xDC\x02\x0D\x00\x28\x46\x02\xF0\x0F\xFB\xBD\xE8\xF0\x81\x00\x00\x03\x01\x14\xE8\x02\x0D\x00\x20\x46\x02\x49\x32\xF7\xF3\xFE\xA6\xF7\xFD\xBE\x25\x2A\x0D\x00\x03\x01\x0C\xF8\x02\x0D\x00\x02\xF0\xCB\xFB\x32\xF7\x2C\xBE\x03\x01\x1C\x00\x03\x0D\x00\x04\x46\x0D\x46\x02\xF0\xCF\xFB\x10\xB1\x02\x4A\x32\xF7\x6B\xBF\x70\xBD\x00\x00\xC4\x18\x20\x00\x03\x01\x10\x18\x03\x0D\x00\x02\x28\x01\xD9\x4B\xF7\x70\xB9\x4B\xF7\x71\xB9\x03\x01\xC8\x01\x24\x03\x0D\x00\x2D\xE9\xF0\x47\x04\x46\x90\xF8\xD2\x00\x00\xF0\x6B\xF8\x06\x46\xB4\xF8\x48\x00\xB4\xF8\x4A\x10\x88\x42\x03\xD0\x94\xF8\x20\x21\xA8\xF7\xB2\xFA\x45\x00\x35\x80\x4A\x4C\xFC\xFF\x01\x24\x21\x00\xD0\xB4\xF8\x22\x11\x20\x46\x64\xF7\xEF\xFD\x82\x46\x20\x6C\x00\x26\x20\xF4\x80\x20\x4F\xF6\xFF\x79\x20\x64\x04\xEB\x46\x07\xB7\xF8\x28\x01\x48\x45\x37\xD0\x41\x00\x50\x46\x70\xF7\x3E\xFB\xB0\xFB\xF5\xF1\x80\x46\x05\xFB\x11\x80\xA7\xF8\x28\x01\x5F\xEA\x48\x10\x15\xD4\x94\xF8\xD2\x00\x66\xF7\x5C\xFD\x40\x01\x20\xD5\x4F\xF0\x80\x60\xB0\xFB\xF5\xF1\x69\x43\x40\x46\x70\xF7\xAD\xFC\xB0\xFB\xF5\xF1\x05\xFB\x11\x01\xA7\xF8\x28\x11\x40\x01\x10\xD5\xB7\xF8\x28\x01\x02\x23\x2A\x46\x00\x21\x64\xF7\x41\xFA\xA7\xF8\x28\x01\x01\x20\xB0\x40\x21\x6C\xC0\xF3\x00\x00\x41\xEA\x80\x40\x20\x64\x76\x1C\x06\x2E\xC1\xD3\xBD\xE8\xF0\x87\x03\x01\x24\xE8\x03\x0D\x00\x05\x48\x00\x68\x00\x06\x04\xD5\x04\x48\x01\x68\x21\xF0\x02\x01\x01\x60\x00\xF0\x2C\xB8\x00\x00\xFC\x32\x20\x00\x6C\x01\x32\x00\x03\x01\x20\x08\x04\x0D\x00\x04\x49\x09\x78\x88\x42\x03\xD2\x03\x49\x01\xEB\x40\x00\x70\x47\x00\x20\x70\x47\x49\x29\x20\x00\xE0\x30\x0D\x00\x03\x01\x2C\x24\x04\x0D\x00\x06\x4A\x12\x78\x3A\xB1\x06\x4A\x12\x68\x92\x05\x05\xD5\x05\x4C\xFC\xFF\xFC\x24\x21\x00\x4A\x12\x78\x00\x2A\x01\xD0\x80\xF8\x56\x10\x70\x47\xAC\x30\x0D\x00\xFC\x32\x20\x00\xF3\x32\x20\x00\x03\x01\x0E\x4C\x04\x0D\x00\x1F\x48\x00\x21\x01\x60\x08\x46\x70\x47\x03\x01\xAA\x01\x56\x04\x0D\x00\x70\xB5\x1D\x4D\x28\x68\x00\x28\x33\xD0\x1C\x49\x1D\x4C\x09\x78\x22\x78\x51\x43\x74\xF7\xC1\xFF\x00\x20\xFF\x22\x29\x68\x03\xE0\x01\xEB\x00\x13\x40\x1C\x1A\x71\x23\x78\x98\x42\xF8\xD3\x15\x48\x01\x24\x01\x78\x15\x48\x00\x68\x00\xF8\x01\x1B\x14\x49\x08\x60\x14\x49\x0A\x78\x02\x70\x13\x48\x02\x78\x13\x48\x00\x68\x00\xF8\x01\x2B\x12\x4A\x10\x60\x0B\x78\x04\xEB\x43\x03\x03\x70\x10\x68\x10\x4A\x09\x78\x12\x78\xBD\xE8\x70\x40\x10\x44\xFF\x22\xA4\xF7\xF8\xBA\x70\xBD\x00\x00\xA2\x34\x20\x00\xA8\x34\x20\x00\x99\x34\x20\x00\x98\x34\x20\x00\x68\x33\x20\x00\xAC\x34\x20\x00\xB0\x34\x20\x00\x9E\x34\x20\x00\x69\x33\x20\x00\xB4\x34\x20\x00\xB8\x34\x20\x00\x9B\x34\x20\x00\x03\x01\xC0\x02\xFC\x04\x0D\x00\x2D\xE9\xF7\x4F\x82\xB0\x04\x00\x18\xD0\xB4\xF8\x50\x10\xB4\xF8\x4E\x00\x0D\x1A\x95\x42\x00\xD9\x15\x46\x28\x4C\xFC\xFF\xF7\x25\x21\x00\x44\xA4\xF8\x4E\x00\x20\x6C\xA9\x46\x28\x44\x20\x64\x61\x6A\x04\xF1\x10\x00\x4F\xF0\x00\x0A\x00\x90\x51\xB9\x83\xF7\x01\xF9\x18\xB1\x00\x20\x05\xB0\xBD\xE8\xF0\x8F\x20\x69\x60\x62\xC4\xF8\x2C\xA0\xD4\xF8\x24\x80\x04\xF1\x55\x0B\x57\xE0\xB4\xF8\x4C\x10\xE0\x6A\x0E\x1A\xAE\x42\x00\xD9\x2E\x46\xA1\x69\x08\xF1\x0C\x07\x38\x44\x0B\x68\x32\x46\x03\x99\x98\x47\x03\x90\x94\xF8\x54\x00\x30\xB1\xE0\x6A\x32\x46\xC1\x19\x58\x46\x96\xF7\x57\xFD\x08\xE0\x94\xF8\x55\x00\x28\xB1\xE0\x6A\x32\x46\xC1\x19\x58\x46\x96\xF7\x35\xFD\xE0\x6A\xAD\x1B\x30\x44\xE0\x62\xB4\xF8\x4C\x10\x88\x42\x2C\xD1\x40\x46\x83\xF7\xC0\xF8\x04\xF1\x08\x01\x40\x46\x83\xF7\xB7\xF8\xC4\xF8\x2C\xA0\x00\x98\x83\xF7\xBB\xF8\xD8\xB1\xC4\xF8\x24\xA0\x5D\xB1\xB4\xF8\x4E\x00\xA9\xEB\x05\x09\xA0\xEB\x05\x00\xA4\xF8\x4E\x00\x20\x6C\xA0\xEB\x05\x00\x20\x64\xE0\x69\xB4\xF8\x4E\x20\x81\x68\xD9\xB1\xC1\x8B\xCB\x06\x18\xD5\xC1\xF3\x01\x03\x01\x2B\x06\xD0\x08\xE0\x20\x69\x60\x62\x80\x46\x00\x2D\xA5\xD1\xEC\xE7\x83\x8B\x93\x42\x04\xD9\x8B\x07\x08\xD1\x4C\xFC\xFF\xF2\x26\x21\x00\x83\x8B\x93\x42\x05\xD3\x21\xF0\x10\x01\xC1\x83\x82\x68\x81\x69\x90\x47\xA0\x69\xC1\x8B\x41\xF0\x10\x01\xC1\x83\x20\x46\x96\xF7\xC0\xFB\x48\x46\x80\xE7\x03\x01\x38\x38\x06\x0D\x00\x70\xB5\x05\x46\x08\x46\x01\x26\x90\xF8\xA3\x00\xB5\xF8\x0B\x40\xA9\x7A\x40\x09\x00\x22\x48\xF7\xD3\xFD\x00\x28\x09\xD0\x40\x88\xA0\x42\x00\xD2\x04\x46\x2A\x7A\x21\x46\x30\x46\x4F\xF7\x3E\xF9\x01\x20\x70\xBD\x03\x01\x84\x02\x6C\x06\x0D\x00\x2D\xE9\xF0\x4F\x87\xB0\x17\x46\x00\xF1\x09\x04\x53\xF7\x6E\xFF\x74\xF7\x16\xF8\x74\xF7\xEB\xFE\x06\x90\x01\x20\x89\xF7\x84\xFC\x47\x4D\x28\x69\x40\xF0\x01\x00\x28\x61\x28\x68\x40\xF0\x01\x00\x28\x60\x4F\xF4\x48\x1B\xDB\xF8\x00\x00\x42\x4E\x00\x90\x30\x68\x01\x90\x41\x48\x00\x68\x02\x90\x56\xF8\xB8\x0C\xDF\xF8\xFC\x90\x03\x90\xD9\xF8\x00\x00\xDF\xF8\xF8\x80\x04\x90\xD8\xF8\x00\x00\x4F\xF0\x00\x0A\x05\x90\xCB\xF8\x00\xA0\x4F\xF0\x64\x00\x4C\xF7\x18\xFF\x01\x20\x30\x60\x34\x48\xD4\xF8\x06\x10\x01\x60\xE0\x78\x40\xF0\x80\x00\x46\xF8\xB8\x0C\x4F\xF4\xC0\x41\xC8\xF8\x00\x10\xC8\x20\x4C\xFC\xFF\xED\x27\x21\x00\x4C\xF7\x06\xFF\xA0\x88\x40\xF4\x00\x51\xC9\xF8\x00\x10\x41\xF2\x88\x30\x4C\xF7\xFD\xFE\xA1\x88\xC9\xF8\x00\x10\xC8\xF8\x00\xA0\x00\x98\xCB\xF8\x00\x00\x01\x98\x30\x60\x22\x49\x02\x98\x08\x60\x03\x98\x46\xF8\xB8\x0C\x04\x98\xC9\xF8\x00\x00\x05\x98\xC8\xF8\x00\x00\x89\xF7\x52\xFC\x28\x69\x20\xF0\x01\x00\x28\x61\x28\x68\x20\xF0\x01\x00\x28\x60\x06\x98\x74\xF7\x84\xFE\x53\xF7\x1B\xFF\x87\xF8\x05\xA0\x0E\x20\x38\x70\x07\xB0\xBD\xE8\xF0\x8F\x03\x01\x5C\x6C\x07\x0D\x00\x10\xB5\x04\x46\x00\x21\x13\x20\x81\xF7\x51\xFC\x11\x49\x00\x22\xC1\xE9\x0A\x22\x8E\xF7\x44\xFA\x73\xF7\xC7\xF9\x18\xB1\xBD\xE8\x10\x40\x8B\xF7\xF5\xBF\x01\x20\x5B\xF7\xF5\xF9\xB4\xF8\x09\x00\x00\x21\x32\xF7\x53\xFF\xBD\xE8\x10\x40\x00\xF0\xD5\xBF\x00\x00\x60\x01\x65\x00\xBC\x01\x60\x00\x9C\x04\x32\x00\xA0\x04\x32\x00\xFC\x04\x41\x00\x18\x41\x20\x00\x03\x01\x14\xC4\x07\x0D\x00\x12\x48\x81\x68\xC2\xF8\x06\x10\xC0\x68\xC2\xF8\x0A\x00\x70\x47\x03\x01\x50\xD4\x07\x0D\x00\x70\xB5\x0F\x4C\x0E\x46\x00\xF1\x09\x05\xA1\x69\x31\xB1\xB0\xF8\x4C\xFC\xFF\xE8\x28\x21\x00\x09\x00\xBD\xE8\x70\x40\x0C\x21\x32\xF7\x2C\xBF\x09\x48\x73\xF7\x99\xFB\xAB\xF7\x02\xFB\x08\x48\xA5\x61\xC4\xE9\x02\x04\x05\x48\x73\xF7\x96\xFB\x00\x20\x30\x70\x70\xBD\x00\x00\x10\x82\x20\x00\xF4\xEF\x20\x00\x88\x29\x20\x00\x63\x85\x01\x00\x03\x01\x9A\x01\x20\x08\x0D\x00\x2D\xE9\xF0\x41\x00\xF1\x09\x01\x05\x7B\x40\x7B\x4E\x79\x10\x72\x95\x71\xC0\xF3\x41\x01\x14\x46\x00\xF0\x01\x07\xD6\x71\x03\x29\x05\xD0\x29\x06\x05\xD5\x11\x20\x50\x71\xBD\xE8\xF0\x81\x12\x20\xFA\xE7\x04\x2D\x01\xD2\x60\x49\x01\xE0\x5F\x49\x09\x1D\xAB\x07\x4F\xEA\xD3\x6C\x0A\x68\xFF\x23\x03\xFA\x0C\xF3\x9A\x43\x00\xFA\x0C\xF0\x10\x43\x59\x4A\x08\x60\x10\x68\x4F\xEA\x85\x03\x4F\xF0\x0F\x01\x01\xFA\x03\xF1\x20\xEA\x01\x00\x10\x60\x87\xF0\x01\x02\x4F\xF0\x00\x01\x28\x46\x91\xF7\x27\xFE\x27\xB1\x28\x46\x91\xF7\x14\xFE\xC6\xB2\x03\xE0\x31\x46\x28\x46\x91\xF7\x00\xFE\xE6\x71\x00\x20\x60\x71\xC9\xE7\x03\x01\x2C\xB6\x08\x0D\x00\x70\xB5\x00\xF1\x09\x05\x00\x7B\x02\x21\x14\x46\xB1\xEB\xD0\x0F\x02\xD8\x30\x20\x50\x71\x70\xBD\x91\xF7\x4C\xFC\xFF\xE3\x29\x21\x00\xFC\xFD\xE0\x71\xE8\x78\xA0\x71\x00\x20\x60\x71\x70\xBD\x03\x01\x2A\xDE\x08\x0D\x00\x10\xB5\x04\x46\x74\xF7\xBA\xFD\x3E\x4A\xD2\xF8\x00\x11\x14\xB1\x41\xF4\x00\x01\x01\xE0\x21\xF4\x00\x01\xC2\xF8\x00\x11\xBD\xE8\x10\x40\x74\xF7\xAF\xBD\x03\x01\x4E\x04\x09\x0D\x00\x70\xB5\x04\x46\x0D\x46\x74\xF7\xA6\xFD\x35\x4B\x01\x46\xD3\xF8\x94\x20\x24\xB1\x01\x2C\x05\xD0\x02\x2C\x06\xD0\x09\xE0\x22\xF0\x01\x02\x06\xE0\x42\xF0\x03\x02\x03\xE0\x22\xF0\x02\x00\x40\xF0\x80\x02\x22\xF4\x70\x10\x0D\xB1\x00\xF5\x80\x20\xC3\xF8\x94\x00\xBD\xE8\x70\x40\x08\x46\x74\xF7\x8A\xBD\x03\x01\x2C\x4E\x09\x0D\x00\x10\xB5\x24\x4C\x38\xB1\x00\x20\x62\xF7\x78\xF8\x20\x68\x40\xF0\x04\x00\x20\x60\x10\xBD\x20\x68\x20\xF0\x04\x00\x20\x60\xBD\xE8\x10\x40\x00\x20\x62\xF7\x05\xB9\x03\x01\x44\x76\x09\x0D\x00\x10\xB5\x04\x46\x1B\x48\x02\x78\x5A\xB1\x01\x2A\x17\xD1\x21\x46\x01\x20\xFF\xF7\xBC\xFF\x4F\xF0\x00\x00\x54\xB1\x5F\xF7\x99\xFE\x09\xE0\x21\x46\x00\x20\xFF\xF7\xB2\xFF\x20\x46\xBD\xE8\x10\x40\xD2\xE7\x5F\xF7\xB9\xFE\x20\x46\xBD\x4C\xFC\xFF\xDE\x2A\x21\x00\xE8\x10\x40\x94\xE7\x10\xBD\x03\x01\x16\xB6\x09\x0D\x00\x0D\x49\x02\x7B\xC8\x7C\x62\xF3\x86\x10\xC8\x74\xC0\xF3\x80\x10\xD6\xE7\x03\x01\x2C\xC8\x09\x0D\x00\x08\x48\xC0\x7C\xC0\xF3\x80\x10\x90\x71\x00\x20\x50\x71\x70\x47\x68\x00\x32\x00\x88\x00\x32\x00\x00\x20\x35\x00\x00\x10\x35\x00\x60\x2C\x20\x00\x18\x41\x20\x00\x03\x01\x30\xF0\x09\x0D\x00\x10\xB5\x04\x46\x00\x6D\x48\xB1\x07\x4A\xB4\xF8\x9C\x10\x40\xF2\x71\x23\x12\x78\x5A\x43\x51\x43\x74\xF7\xBF\xFB\x20\x46\xBD\xE8\x10\x40\x4E\xF7\x8B\xBF\x00\x00\x37\x31\x20\x00\x03\x01\x3C\x1C\x0A\x0D\x00\x10\xB5\x09\x4C\x20\x21\x09\x48\x9A\xF7\xAB\xFB\x08\x48\x74\xF7\xD5\xFB\x20\x46\x6A\xF7\xD9\xFC\x08\xB1\x8E\xF7\x0B\xFE\x05\x49\x8B\x20\x08\x60\x10\xBD\x00\x00\xC8\xD9\x20\x00\x88\x60\x20\x00\xA8\x60\x20\x00\xEC\x8A\x31\x00\x03\x01\x0E\x54\x0A\x0D\x00\x11\x48\x00\x21\xC0\xE9\x0C\x11\x70\x47\x03\x01\x4A\x5E\x0A\x0D\x00\x70\xB5\x00\x22\x0F\x4D\x10\x46\x11\x46\x53\x23\x4B\x43\x05\xEB\x83\x03\xDC\x69\xE6\x02\x0A\xD5\x93\xF8\x9B\x60\x04\x2E\x06\xD0\xC4\xF3\x4C\xFC\xFF\xD9\x2B\x21\x00\xC4\x04\x08\x2C\x02\xD1\xB3\xF8\x64\x00\x52\x1C\x49\x1C\x0B\x29\xEA\xDB\x01\x2A\x00\xD0\x00\x20\x70\xBD\x00\x00\x18\x41\x20\x00\x68\x42\x20\x00\x03\x01\x20\xA4\x0A\x0D\x00\x05\x48\x10\xB5\x80\x7B\x20\xB9\x8E\xF7\x95\xF8\x08\xB1\x02\x20\x10\xBD\x00\x20\x10\xBD\x00\x00\xF8\x5B\x20\x00\x03\x01\xF4\x01\xC0\x0A\x0D\x00\x70\xB5\x32\x4D\x28\x68\x80\x7B\x70\xF7\x95\xF9\x29\x68\xC9\x6E\x70\xF7\x19\xF9\x29\x68\x2E\x4E\x2E\x4B\x91\xF8\xED\x20\xC2\xB1\x91\xF8\xE5\x20\x9A\xB9\x2C\x4C\xD1\xF8\xC8\x20\x24\x68\x22\x42\x06\xD0\x91\xF8\x94\x40\x24\x06\x09\xD4\x34\x78\xA0\x42\x06\xD8\x26\x48\x27\x4C\x00\x68\x24\x68\x20\x43\x02\x42\x01\xD0\x9C\x78\x00\xE0\x5C\x78\x91\xF8\xE5\x00\x18\xB1\x18\x5C\xA0\x42\x00\xD9\x04\x46\x20\x48\x00\x68\x00\x07\x00\xD5\xDC\x78\xD1\xF8\xC0\x00\x40\x1C\x16\xD0\x88\x7B\x70\xF7\x5E\xF9\x29\x68\xD1\xF8\xC0\x10\x70\xF7\xE9\xF8\x18\x49\x00\x28\x07\xDB\x2A\x68\x4F\xF0\xFF\x30\xC2\xF8\xC0\x00\x3F\x20\x08\x70\x03\xE0\x08\x78\x84\x42\x00\xD2\x04\x46\x70\x78\x40\xB1\x45\x2C\x06\xD1\x28\x68\x4C\xFC\xFF\xD4\x2C\x21\x00\x90\xF8\xA8\x00\x4F\xF7\xCF\xF9\x00\xB1\x0F\x24\x21\x46\x28\x68\x6B\xF7\xF8\xFB\x0A\x48\x00\x78\x85\xF8\x34\x00\x70\xBD\x00\x00\xF0\x6E\x20\x00\xAD\x30\x0D\x00\x30\x24\x20\x00\x00\x26\x20\x00\xB4\x30\x20\x00\x2C\x24\x20\x00\x38\x1E\x20\x00\x18\x24\x20\x00\x20\x24\x20\x00\x03\x01\xE4\x04\xB0\x0B\x0D\x00\x2D\xE9\xF0\x41\x04\x46\x81\x7B\x4F\xF4\x46\x18\x08\xF5\x00\x70\x01\x60\x41\x68\x21\xF0\x80\x01\x41\x60\x87\x48\x00\x68\x30\xB9\x86\x48\x90\xF8\x30\x00\x10\xB1\x6F\xF7\xD0\xFB\x78\xB1\x20\x46\x6A\xF7\xE5\xFB\x00\x21\x20\x46\x6A\xF7\x96\xFF\x94\xF8\x61\x10\x80\xB2\x8A\x1C\x82\x42\x0D\xD8\x40\x1A\x87\xB2\x11\xE0\xA0\x7B\x9A\xF7\xB2\xFD\xA0\x7B\x9A\xF7\x58\xFE\x40\xF2\x71\x21\xB0\xFB\xF1\xF0\xEB\xE7\x94\xF8\x62\x20\x8A\x42\x71\xD8\x82\x42\x6F\xD8\x02\x27\x00\x26\x84\xF8\x60\x60\xA0\x7B\x70\xF7\xE9\xF8\x80\x1C\x20\xF0\x01\x00\x81\xB2\x94\xF8\x5B\x00\x90\xB1\xB4\xF8\x50\x00\x47\xF6\xFF\x72\x08\x1A\x21\x8D\x08\x1A\x20\xF0\x01\x00\x80\xB2\x81\x1E\x91\x42\x00\xD3\x02\x20\xB8\x42\x00\xD3\x38\x46\x60\x4C\xFC\xFF\xCF\x2D\x21\x00\x85\x7D\xE0\xA0\x8D\x40\xB1\x62\x4B\x22\x68\x1B\x68\x9A\x42\x09\xD1\x60\x4A\x12\x68\x12\x07\x05\xD5\x20\x8D\xB8\x42\x00\xD2\x07\x46\x67\x85\x6C\xE0\x22\x8D\xBA\x42\x00\xD2\x17\x46\x67\x85\xB4\xF8\x50\x20\x03\x23\x89\x1A\xCA\x17\x01\xEB\x12\x72\x22\xF0\x0F\x02\x89\x1A\x8D\xB2\x94\xF8\x62\x10\x02\x29\x09\xD0\x03\xFA\x05\xF1\x94\xF8\x58\x20\x89\xB2\x32\xB3\x31\xEA\x00\x00\x06\xD0\x30\xE0\x01\x20\xA8\x40\x84\xF8\x58\x60\x81\xB2\x1C\xE0\x4A\x4A\x94\xF8\x59\x00\x12\x78\x90\x42\x14\xD2\x94\xF8\x5A\x00\x02\x28\x00\xD3\x7D\xB1\x6F\xF7\xE3\xFA\x94\xF8\x59\x00\x40\x1C\x84\xF8\x59\x00\x00\x2D\x03\xD1\x14\xF8\x5A\x0F\x40\x1C\x20\x70\xBD\xE8\xF0\x81\x18\xE0\x84\xF8\x58\x60\x00\x20\x04\xEB\x40\x02\x92\x8D\x31\xEA\x02\x02\x02\xD1\x40\x1C\x10\x28\xF6\xD3\x10\x28\x0A\xD0\x84\xF8\x60\x00\x94\xF8\x60\x00\x02\x26\x04\xEB\x40\x00\x4F\xF6\xFF\x72\x80\x8D\x12\xE0\xBD\xE8\xF0\x41\x6F\xF7\xB8\xBA\x03\xFA\x05\xF1\x01\x43\xAD\x1C\x88\xB2\x05\xF0\x0F\x05\x03\xFA\x05\xF1\x89\xB2\x90\x42\x10\xD0\x81\x43\x0E\xD0\xB6\x1C\x4C\xFC\xFF\xCA\x2E\x21\x00\xB7\x42\xEE\xD8\x61\x8D\x40\xF2\x71\x22\x01\xFB\x02\xF0\x94\xF8\x5C\x20\x42\xB1\x49\x1C\x61\x85\x22\x49\x05\xE0\xB7\x42\x00\xD2\x3E\x46\x66\x85\xEE\xE7\x1F\x49\x09\x88\x08\x44\x1F\x49\x08\x60\x04\xF1\x56\x04\xD8\xF8\x88\x00\x61\x7A\xA2\x7A\x01\xEB\x10\x31\x01\xF0\x10\x00\x11\x44\x01\xF0\x0F\x01\x40\xEA\x01\x00\x14\xF8\x56\x19\x09\xB1\x80\xF0\x10\x00\x15\x49\x0A\x68\x22\xF0\x1F\x02\x02\x43\x0A\x60\x13\x48\x90\xF9\x06\x00\x81\xF7\x86\xFD\x00\x21\xA9\xF7\xC7\xF8\x94\xF8\x57\x00\x00\x21\x6F\xF7\x9C\xF8\x6F\xF7\x44\xFC\x00\x28\x8D\xD1\x32\x20\xA0\x74\x8A\xE7\x00\x00\x74\x2B\x0D\x00\xF8\x5B\x20\x00\xE4\x30\x20\x00\x38\x1E\x20\x00\xED\x30\x20\x00\xF2\x30\x20\x00\xF0\x30\x20\x00\x0C\x8B\x31\x00\xAC\x86\x31\x00\x4B\x1E\x20\x00\x03\x01\x52\x10\x0E\x0D\x00\x70\xB5\x27\x49\x25\x4C\x09\x78\x00\x29\x1D\xD0\x08\x30\x01\x22\xE1\x8B\x82\x40\x23\x48\x11\x43\xE1\x83\x90\xF8\x30\x00\x2E\x25\x98\xB1\x21\x49\xB4\xF9\x1C\x00\x09\x78\x88\x42\x06\xDC\x40\x42\x88\x42\x03\xDC\x94\xF8\x36\x00\x00\x28\x05\xD0\x20\x46\x4C\xFC\xFF\xC5\x2F\x21\x00\x61\xF7\xD6\xF8\x00\x28\x00\xD0\xA5\x74\x70\xBD\xA0\x8B\xF4\xE7\x03\x01\x62\x5E\x0E\x0D\x00\x70\xB5\x12\x4C\x01\x22\x82\x40\xE1\x8B\x04\xEB\x40\x00\x11\x43\xE1\x83\x00\x21\x41\x84\x0F\x48\x2E\x25\x90\xF8\x30\x00\x98\xB1\x0E\x49\xB4\xF9\x1C\x00\x09\x78\x88\x42\x06\xDC\x40\x42\x88\x42\x03\xDC\x94\xF8\x36\x00\x00\x28\x05\xD0\x20\x46\x61\xF7\xB0\xF8\x00\x28\x00\xD0\xA5\x74\x70\xBD\xA0\x8B\xF4\xE7\x00\x00\x9C\x5B\x20\x00\x1F\x23\x20\x00\xF8\x5B\x20\x00\x20\x23\x20\x00\x03\x01\xE4\x01\xBC\x0E\x0D\x00\x70\xB5\x04\x46\x6A\xF7\x1A\xFE\x00\x26\x01\x25\x58\xB1\x8E\x48\x00\x21\x06\x70\x20\x46\x9F\xF7\xB7\xF8\x20\x46\x9F\xF7\xF7\xF8\x84\xF8\x5B\x50\x70\xBD\x20\x46\x6A\xF7\xE5\xFF\x00\x28\xF9\xD0\x20\x46\xE1\x8B\x9F\xF7\xA8\xF8\xA0\x7B\x6F\xF7\x7E\xFF\xA1\x69\x6F\xF7\x03\xFF\xE1\x8B\x89\x1E\x88\x42\x0C\xD8\x20\x46\x9E\xF7\x03\xFF\x7E\x49\x08\x60\x7E\x49\x08\x60\x7E\x48\x05\x60\x6F\xF7\x55\xFF\x7D\x49\x08\x60\x94\xF8\x5B\x00\x98\xB1\x5D\xF7\x94\xFE\x4C\xF7\xBF\xFA\x01\x28\x0B\xD1\x20\x46\x5D\xF7\x34\xFB\x4C\xFC\xFF\xC0\x30\x21\x00\x38\xB1\x94\xF8\x6F\x00\x20\xB1\x84\xF8\x6E\x50\x20\x46\x9D\xF7\x7E\xFE\x84\xF8\x5B\x60\x94\xF8\x6B\x00\xE8\xB9\x94\xF8\x28\x00\x01\x28\x0D\xD0\x94\xF8\x24\x00\x94\xF8\x2C\x10\xC0\xF3\x02\x00\xC1\xF3\x02\x01\x88\x42\x03\xD1\x94\xF8\x29\x00\x02\x28\x0B\xD0\x20\x46\x5D\xF7\x11\xFB\x38\xB1\x94\xF8\x6F\x00\x20\xB1\x84\xF8\x6E\x50\x20\x46\x9D\xF7\x5B\xFE\x20\x46\xBD\xE8\x70\x40\x9F\xF7\x17\xB8\x03\x01\x1E\x9C\x0F\x0D\x00\x10\xB5\x5F\x48\x5D\x4C\x2C\x22\x04\x60\x5E\x49\x20\x46\x89\xF7\xEF\xFD\xAF\xF2\xF3\x00\x60\x60\x10\xBD\x03\x01\xFA\x02\xB6\x0F\x0D\x00\x2D\xE9\xF0\x41\x5A\x49\x8A\xB0\x04\x46\x09\x68\x00\x29\x7E\xD1\x58\x48\x90\xF8\x30\x10\x00\x29\x79\xD0\xD0\xF8\xC0\x10\x19\xB9\xD0\xF8\xC4\x00\x00\x28\x7A\xD0\xE0\x7B\x01\x28\x77\xD0\xA0\x89\x00\x28\x74\xD1\x94\xF8\x69\x00\x94\xF8\x68\x10\x40\x1A\xC7\xB2\xA0\x7B\x6F\xF7\xFD\xFE\x01\x21\x6F\xF7\xFB\xFC\x20\xF0\x01\x08\xA0\x69\x40\x00\x02\x90\xE0\x7B\x30\xB9\x94\xF8\x30\x00\x41\x00\x02\x98\x6F\xF7\x46\xFC\x02\x90\x00\x25\x03\x95\x94\xF8\x2A\x00\x4C\xFC\xFF\xBB\x31\x21\x00\x41\x00\x02\x98\x6F\xF7\x3D\xFC\xCD\xE9\x06\x05\xA0\x7B\x08\xA9\x6F\xF7\x00\xFF\xA0\x7B\x08\xAB\x02\x46\x02\xA9\x6F\xF7\x7F\xFD\xA0\x7B\x08\xAB\x02\x46\x06\xA9\x6F\xF7\x79\xFD\xDD\xE9\x02\x01\xCD\xE9\x00\x01\xDD\xE9\x06\x01\xCD\xE9\x04\x01\xE0\x8B\x68\x43\x41\x00\x00\x98\x6F\xF7\x1D\xFC\x00\x90\xE0\x8B\x68\x43\x41\x00\x04\x98\x6F\xF7\x16\xFC\x00\x26\x04\x90\x1A\xE0\x04\xA9\x68\x46\x9E\xF7\xAE\xFD\x38\xB3\x04\xF1\x2A\x04\xA0\x79\x21\x78\x08\x44\x4F\xEA\x40\x01\x00\x98\x6F\xF7\x04\xFC\x00\x90\xA0\x79\x14\xF8\x2A\x19\x08\x44\x41\x00\x04\x98\x6F\xF7\xFB\xFB\x76\x1C\xF6\xB2\x04\x90\x94\xF8\x30\x00\x94\xF8\x2A\x10\x08\x44\x00\xE0\x06\xE0\x70\x43\xB8\x42\xDA\xD9\x6D\x1C\xED\xB2\x02\x2D\xBE\xD3\x00\x20\x0A\xB0\xBD\xE8\xF0\x81\x02\x21\x40\x46\x6F\xF7\x8A\xFC\x01\x46\x00\x98\x40\x08\x6F\xF7\x14\xFE\x00\x28\xEC\xDB\x00\x98\x41\x46\x80\x08\x40\x00\x6F\xF7\x04\xFE\x40\x08\xE9\xE7\x00\x00\xFC\x26\x20\x00\x08\x27\x20\x00\xA0\x1C\x20\x00\x9C\x1C\x20\x00\xA4\x1C\x20\x00\xE0\x31\x0D\x00\x04\x27\x20\x00\x3C\x4C\xFC\xFF\xB6\x32\x21\x00\x99\x08\x00\x74\x2B\x0D\x00\xF8\x5B\x20\x00\x03\x01\xCA\x01\x2C\x11\x0D\x00\xF0\xB5\xF3\x48\x02\x78\x02\x2A\x5C\xD1\x04\x21\x00\x24\x4F\xF4\xCA\x00\x01\x64\xC0\xF8\xB0\x41\x49\x1C\x08\x29\xF9\xD3\xC1\x68\x41\xF0\x02\x01\xC1\x60\x04\x64\xD0\xF8\x04\x52\xE9\x49\x0F\x27\x4B\x78\x4F\xEA\x83\x0C\x0B\x79\x07\xFA\x0C\xF6\x9B\x00\x9F\x40\x3E\x43\xB5\x43\x8E\x78\x4F\x79\x06\xFA\x0C\xF6\x9F\x40\x3E\x43\x2E\x43\x04\x64\xC0\xF8\x00\x62\xC3\x68\x23\xF0\x02\x03\xC3\x60\x0B\x78\x9D\x08\x05\x64\x46\x6C\x9D\x07\xED\x0E\x4F\xF0\xFF\x0C\x0C\xFA\x05\xF7\xBE\x43\x11\x27\xAF\x40\x37\x43\x47\x64\x04\x64\x42\xEA\x03\x13\x43\xF4\x80\x63\xC0\xF8\x18\x32\xC9\x78\x8B\x08\x03\x64\x45\x6C\x8B\x07\xDB\x0E\x0C\xFA\x03\xFC\x02\x26\x25\xEA\x0C\x05\x9E\x40\x2E\x43\x46\x64\x04\x64\x42\xEA\x01\x11\x41\xF4\x80\x31\xC0\xF8\x1C\x12\x4F\xF0\x01\x11\xC0\xF8\x20\x12\x01\x21\xC0\xF8\x24\x12\xF0\xBD\x03\x01\x54\xF2\x11\x0D\x00\x10\xB5\x84\xF7\x97\xFF\xFF\xF7\x98\xFF\xC0\x48\xC1\x49\x00\x22\x02\x61\x0B\x68\x43\xF0\x40\x03\x0B\x60\xBE\x4C\xFC\xFF\xB1\x33\x21\x00\x49\xC9\x69\xC9\x06\x15\xD5\x01\x21\x81\x71\xBC\x4B\xC2\x71\x42\x7A\x1A\x70\x00\x7A\x20\xB1\xBA\x48\x02\x69\x42\xF4\x00\x62\x02\x61\x4F\xF4\xCA\x00\x01\x64\xD0\xF8\x80\x11\x41\xF0\x20\x01\xC0\xF8\x80\x11\x10\xBD\x03\x01\xFA\x01\x42\x12\x0D\x00\x2D\xE9\xF0\x5F\xB0\x49\xC9\x69\xCA\x06\x72\xD5\xAC\x4E\xAA\x4A\xDF\xF8\xC0\x92\xAE\x4F\xDF\xF8\xB0\xA2\xDF\xF8\xB8\xB2\x4F\xF4\xCA\x04\x00\x25\x30\x61\x98\xB3\x02\x26\x16\x70\x84\xF7\x60\xFE\xD9\xF8\x00\x00\x84\xF7\xBB\xFE\x84\xF7\x7A\xFE\xFF\xF7\x55\xFF\x25\x64\xD4\xF8\x1C\x02\x40\xF4\x80\x70\xC4\xF8\x1C\x02\x38\x69\x0B\xF1\x30\x04\x20\xF4\x00\x60\x38\x61\x8A\xF8\x00\x50\x01\x27\x27\x70\x47\xF2\x30\x50\xAB\xF8\x36\x00\x0B\xF1\x98\x01\x4F\xF0\x00\x00\x6F\xF7\x50\xFD\xA5\x80\x66\x70\x40\xF2\xE2\x40\x20\x81\x84\xF8\x48\x50\x47\xF2\x4E\x00\x60\x81\x84\xF8\x49\x70\x2C\xE0\xFF\xE7\x01\xF0\x07\x01\x90\x46\x11\x70\x84\xF7\x29\xFE\xD9\xF8\x00\x00\x84\xF7\x84\xFE\x84\xF7\x43\xFE\xFF\xF7\x1E\xFF\x98\xF8\x00\x00\x07\x28\x07\xD1\xE0\x68\x20\xF0\x70\x00\xE0\x60\x4C\xFC\xFF\xAC\x34\x21\x00\xE0\x68\x20\xF0\x04\x00\xE0\x60\x25\x64\xD4\xF8\x1C\x02\x20\xF4\x80\x70\xC4\xF8\x1C\x02\x71\x7A\x8A\xF8\x00\x10\x30\x7A\x18\xB1\x38\x69\x40\xF4\x00\x60\x38\x61\x8B\xF8\x30\x50\xBD\xE8\xF0\x5F\x8E\xF7\xC1\xB8\xBD\xE8\xF0\x9F\x03\x01\x7A\x38\x13\x0D\x00\x70\xB5\x4F\xF4\xCA\x05\x00\x22\x68\x69\xA9\x69\x75\x4B\x1B\x68\x9B\x02\x2C\xD4\x89\x02\x2A\xD5\x80\x02\x28\xD5\x4F\xF4\x00\x10\x68\x61\x2C\x6D\x4F\xF0\xFF\x36\xE0\x07\x01\xD0\xC5\xF8\xE0\x60\xA0\x07\x14\xD5\xD5\xF8\xE4\x00\xC5\xF8\xE4\x60\x10\xF4\x7E\x4F\x00\xD0\x01\x22\x62\x49\xC9\x69\xC9\x06\x03\xD5\x80\x06\x01\xD5\x42\xF0\x02\x02\x1A\xB1\x02\x21\x00\x20\x85\xF7\xB0\xF8\xE0\x03\x01\xD5\xC5\xF8\x20\x61\xA0\x03\x01\xD5\xC5\xF8\x24\x61\xBD\xE8\x70\x40\x85\xF7\xB1\xB8\x03\x01\x3E\xAE\x13\x0D\x00\x70\xB5\x81\x78\xC4\x78\x5A\x4D\x4F\xF4\xCA\x00\x01\x29\x02\xD0\x02\x29\x10\xD1\x02\xE0\x00\x6E\x28\x60\x0C\xE0\x40\x6E\x68\x60\xE0\x07\x01\xD0\x8A\xF7\x01\xFC\xA0\x07\x04\xD5\x68\x68\xC0\xF3\x40\x10\xFF\xF7\x2F\xFF\x01\x20\x70\xBD\x03\x01\xC0\x01\xE8\x4C\xFC\xFF\xA7\x35\x21\x00\x13\x0D\x00\x2D\xE9\xF0\x41\x44\x4D\x00\x24\x45\x4F\xA8\x79\x26\x46\x4F\xF4\xCA\x08\xC0\xB1\xE8\x79\x40\x1C\xC0\xB2\xE8\x71\x03\x28\x12\xD1\xAE\x71\xEE\x71\xF8\x69\xC0\x06\x0D\xD5\xD8\xF8\x60\x20\x42\x49\x0A\x60\xD8\xF8\x64\x00\x48\x60\x80\x06\x04\xD5\x02\x22\x11\x46\x00\x20\x85\xF7\x64\xF8\xF8\x69\xC0\x06\x35\xD5\x28\x69\x48\xB1\xA9\x7A\x3A\x48\x49\x1C\x01\xF0\x0F\x01\xA9\x72\x90\xF8\x33\x20\xFE\x2A\x16\xD0\xAE\x81\x36\x4D\x28\x68\xC0\xF3\x80\x10\xA0\x42\x22\xD0\x73\xF7\xFE\xFF\x29\x68\x04\xF0\x01\x02\x21\xF0\x40\x01\x41\xEA\x82\x11\x29\x60\xC8\xF8\x60\x11\xBD\xE8\xF0\x41\x73\xF7\xF4\xBF\x90\xF8\x34\x20\x01\x20\x00\xFA\x01\xF0\xA9\x89\x12\xB1\x08\x43\xA8\x81\x01\xE0\x81\x43\xA9\x81\xA8\x89\x4C\xF7\x14\xF8\x08\x28\xD8\xD9\x01\x24\xD6\xE7\xBD\xE8\xF0\x81\x03\x01\x36\xA4\x14\x0D\x00\x21\x49\x09\x78\x00\x29\x13\xD0\x1A\x49\x91\xF8\x30\x10\x00\x29\x0E\xD0\x12\x49\x09\x69\x00\x29\x0A\xD1\x1A\x4A\x00\xF0\x01\x00\x11\x68\x21\xF0\x10\x01\x41\xEA\x00\x10\x18\x49\x10\x60\x08\x60\x70\x47\x03\x01\x6A\x4C\xFC\xFF\xA2\x36\x21\x00\xD6\x14\x0D\x00\x17\x48\x00\x68\x50\xB1\xAF\xF2\xED\x21\x01\x60\x0E\x49\x0A\x68\x22\xF4\x00\x12\x0A\x60\xAF\xF2\xB7\x11\x81\x61\xAF\xF2\x45\x10\x10\x49\x08\x60\x70\x47\x7B\x1C\x20\x00\x64\x2B\x0D\x00\x90\x1C\x20\x00\x10\x1E\x20\x00\x04\x23\x20\x00\xF8\x3F\x20\x00\xAC\x1C\x20\x00\xF8\x5B\x20\x00\x88\x1C\x20\x00\xB4\x1C\x20\x00\x9C\x5B\x20\x00\xBC\x1C\x20\x00\x6C\x24\x20\x00\x60\x01\x65\x00\x04\x1D\x20\x00\x84\x1C\x20\x00\x03\x01\xF0\x03\x3C\x15\x0D\x00\x2D\xE9\xF8\x4F\x7E\x4F\x05\x46\x4F\xF0\x00\x08\x38\x68\x20\xB9\x28\x78\x00\x28\x7E\xD1\x73\xF7\xAB\xF8\x73\xF7\x80\xFF\x00\x90\x78\x48\x22\x21\x01\x60\x4F\xF4\x46\x19\x00\x26\xC9\xF8\x00\x62\x04\x21\xC9\xF8\x04\x12\x4F\xF4\x48\x14\x26\x66\xC9\xF8\x00\x60\x32\x20\x4B\xF7\xC6\xFF\x70\x48\xE0\x65\x4F\xF4\x45\x11\x4F\xF0\x80\x0B\xC1\xF8\x0C\xB0\xC8\x20\x4B\xF7\xBB\xFF\x28\x78\x4F\xF4\xCA\x0A\x4F\xF4\xC0\x04\xE0\xB1\xC4\xF8\xBC\x61\x67\x48\x06\x60\xD4\xF8\xFC\x02\x20\xF0\x0C\x00\xC4\xF8\xFC\x02\x38\x68\x48\xB1\x0A\xF5\xB0\x70\x01\x69\x21\xF0\x01\x4C\xFC\xFF\x9D\x37\x21\x00\x01\x01\x61\x01\x68\x21\xF0\x01\x01\x01\x60\x00\x98\x73\xF7\x46\xFF\x28\x78\x34\x46\xD0\xB3\x98\xE0\x00\x20\x88\xF7\xD8\xFC\x01\x21\x0A\xF5\xB0\x70\x39\x60\x02\x69\x42\xF0\x01\x02\x02\x61\x02\x68\x42\xF0\x01\x02\x02\x60\x48\x46\xC9\xF8\x00\x62\xC9\xF8\x04\xB2\xEA\x78\x00\x2A\xD4\xF8\xFC\x22\x02\xD0\x42\xF0\x0C\x02\x03\xE0\x22\xF0\x0C\x02\x42\xF0\x08\x02\xC4\xF8\xFC\x22\x49\x4A\x89\x46\x11\x60\x69\x78\x47\x4A\x89\x1E\x08\x32\x11\x60\x69\x78\x89\x1E\x12\x1F\x11\x60\x44\x49\x01\x60\x00\x20\x4F\xF4\x7A\x73\x4F\xF4\x45\x12\x01\x46\x40\x1C\x99\x42\x01\xE0\x67\xE0\x0E\xE0\x02\xD8\xD1\x68\x09\x06\xF5\xD5\x4F\xF4\x48\x10\x4F\xF4\x00\x31\x01\x66\xC8\x20\x4B\xF7\x51\xFF\xC4\xF8\xBC\x91\xAE\xE7\xE0\xB2\xA9\x78\x40\xF0\x01\x00\x60\xF3\x07\x04\x06\x29\x19\xD2\xDF\xE8\x01\xF0\x03\x07\x0E\x27\x2A\x2E\x20\xF0\x1C\x00\x18\x30\x0E\xE0\xC4\xF3\x07\x20\x40\xF0\x01\x00\x60\xF3\x0F\x24\x09\xE0\xC4\xF3\x07\x21\x41\xF0\x01\x01\x61\xF3\x0F\x24\x40\xF0\x02\x00\x60\xF3\x07\x04\xE9\x78\xC4\xF3\x07\x20\x61\xF3\x83\x00\x4C\xFC\xFF\x98\x38\x21\x00\x60\xF3\x0F\x24\x28\x79\x07\x28\x0F\xD8\x00\x06\x80\x0D\x40\x42\x40\xB2\x11\xE0\x20\xF0\xE0\x00\xEB\xE7\x20\xF0\xE0\x00\x20\x30\xE7\xE7\x20\xF0\xE0\x00\xA0\x30\xE3\xE7\x08\x28\x02\xD0\x09\x28\x05\xD0\x08\xE0\x95\xF9\x05\x00\x81\xF7\xEC\xF8\x02\xE0\xA8\x79\x80\xF7\x80\xFD\x80\x46\x08\xF0\xFF\x01\x11\x48\x98\xF7\x4E\xFA\x0B\x48\x04\x60\x28\x78\x20\xB1\x38\x68\x10\xB1\x72\xF7\x41\xFE\x3E\x60\x01\x20\xBD\xE8\xF8\x8F\x03\x01\x30\x28\x17\x0D\x00\x10\xB5\x14\x46\x0C\x30\xFF\xF7\x05\xFF\x00\x28\x01\xD1\x12\x20\x60\x71\x10\xBD\x78\x2B\x0D\x00\xC0\x04\x41\x00\x00\x02\x0C\x00\x10\x84\x31\x00\x01\x00\x80\x00\x0C\x01\x60\x00\x03\x01\x24\x54\x17\x0D\x00\x10\xB5\x88\xF7\x54\xFC\x88\xF7\x45\xFC\x04\x48\x01\x68\x41\xF0\x01\x01\x01\x60\xBD\xE8\x10\x40\x88\xF7\xF7\xBB\x04\x2C\x20\x00\x03\x01\xB8\x01\x74\x17\x0D\x00\x2D\xE9\xF0\x41\x0D\x46\x26\x49\xDF\xF8\x98\xC0\x00\x23\x89\x78\x1C\xF8\x03\x40\xA1\x42\x03\xD8\x5C\x1E\x06\x2B\x04\xD2\x06\xE0\x5B\x1C\xDB\xB2\x06\x2B\xF3\xD3\x05\x23\x04\x24\x02\xE0\x0B\xB9\x01\x4C\xFC\xFF\x93\x39\x21\x00\x23\x00\x24\x1C\x4E\x05\xEB\x85\x05\x80\xB1\x1B\x48\xC3\xEB\x03\x17\x07\x44\x2F\x44\x17\x44\x97\xF8\xA2\x70\xF7\x60\xC4\xEB\x04\x17\x38\x44\x28\x44\x10\x44\x90\xF8\xA2\x00\x11\xE0\x14\x48\x03\xEB\x83\x07\x00\xEB\xC7\x07\x2F\x44\x17\x44\x97\xF8\x6D\x71\xF7\x60\x04\xEB\x84\x07\x00\xEB\xC7\x00\x28\x44\x10\x44\x90\xF8\x6D\x01\xB0\x60\x1C\xF8\x03\x00\x70\x60\x1C\xF8\x04\x00\x30\x60\x05\x48\x54\xF7\x1C\xFC\xFF\x28\x00\xD9\xFF\x20\xBD\xE8\xF0\x81\xBD\x1E\x20\x00\x10\x13\x20\x00\x2C\x51\x20\x00\xEB\x15\x20\x00\x16\x13\x20\x00\x03\x01\xC2\x04\x28\x18\x0D\x00\x2D\xE9\xF0\x4F\x87\xB0\x00\x26\x04\x46\x05\x96\x90\xF8\xD2\x00\xFE\xF7\xE6\xFD\x80\x46\x8D\xF7\xE5\xF9\x94\xF8\xD2\x70\x04\xA9\x1E\x37\x38\x46\x62\xF7\xE2\xF8\xDF\xF8\x4C\xB3\x05\x00\x0A\xD0\x04\x98\x00\xEB\x40\x01\xDB\xF8\x00\x00\x00\xEB\x81\x00\x06\x60\x46\x60\x86\x60\x03\xE0\x04\xA8\x62\xF7\xBC\xF8\xF0\xB3\x08\x20\x8D\xF8\x0A\x00\x4F\xF0\x01\x0A\x8D\xF8\x0B\xA0\x8D\xF8\x07\x70\x94\xF8\xD0\x00\xAD\xF8\x00\x60\x8D\xF8\x08\x00\xAD\xF8\x02\x60\x4C\xFC\xFF\x8E\x3A\x21\x00\x62\xF7\xB7\xF9\x8D\xF8\x09\x00\xB4\xF8\x4C\x00\x4F\xF0\x02\x09\x40\x1C\x20\xF0\x01\x00\x80\xB2\xAD\xF8\x04\x00\x02\x28\x01\xD2\xAD\xF8\x04\x90\xB4\xF8\x4E\x00\xBD\xF8\x04\x10\x40\x1C\x20\xF0\x01\x00\x88\x42\x01\xD9\x40\x1A\x05\x90\x94\xF8\xD2\x00\xA8\xF7\xE4\xF9\x05\x99\x6F\xF0\x01\x02\x08\x44\x05\x90\xB4\xF8\x48\x10\x02\xEB\x41\x02\x82\x42\x03\xD8\x48\x00\x00\xE0\x12\xE0\x80\x1E\x8D\xF8\x06\x00\x94\xF8\xD1\x00\xB0\xB1\x00\x2D\x7E\xD0\xB4\xF8\xC8\x00\xAD\xF8\x00\x00\xB4\xF8\xCA\x00\xAD\xF8\x02\x00\x94\xF8\xD5\x00\x89\xE0\x00\x23\x6B\x22\x40\xF2\xA1\x31\x9F\x48\x72\xF7\xDA\xFF\x07\xB0\xBD\xE8\xF0\x8F\x01\x27\x5C\xF7\x49\xFE\x18\xB1\x60\xF7\x22\xFF\x00\xB9\x00\x27\xB4\xF8\x44\x00\x40\x05\x05\xD5\xB8\xF8\x00\x00\x10\xB1\xAD\xF8\x02\x00\x09\xE0\xB4\xF8\x4A\x00\x3B\x46\x42\x00\xB4\xF8\x48\x00\x41\x00\x68\x46\x62\xF7\x28\xFA\xBD\xF8\x02\x00\x01\x28\x0A\xD9\x8D\x49\x49\x68\x40\x1E\xB1\xFB\xF0\xF2\x00\xFB\x12\x10\x20\xF0\x01\x00\xAD\xF8\x00\x00\x94\xF8\xD2\x00\x05\xAA\x69\x46\xA8\xF7\xAD\xF9\x48\x4C\xFC\xFF\x89\x3B\x21\x00\xBB\xB4\xF8\x44\x00\x40\x05\x19\xD5\xB8\xF8\x00\x00\xB0\xB1\x4A\x46\x21\x46\x68\x46\xCD\xF8\x0C\x90\x62\xF7\x19\xFB\xD0\xB9\x52\x46\x21\x46\x68\x46\xCD\xF8\x0C\xA0\x62\xF7\x11\xFB\x90\xB9\x32\x46\x21\x46\x68\x46\x03\x96\x62\xF7\x0A\xFB\x58\xB9\x03\xA9\x68\x46\x62\xF7\xD0\xF9\x30\xB9\xAD\xF8\x00\x60\xB4\xF8\x4A\x00\x40\x00\xAD\xF8\x02\x00\xBD\xF8\x00\x00\x5D\xB1\xA4\xF8\xC8\x00\xBD\xF8\x02\x00\xA4\xF8\xCA\x00\x9D\xF8\x09\x00\x84\xF8\xD5\x00\x17\xE0\x0A\xE0\xA4\xF8\xC4\x00\xBD\xF8\x02\x00\xA4\xF8\xC6\x00\x9D\xF8\x09\x00\x84\xF8\xD4\x00\x0B\xE0\xB4\xF8\xC4\x00\xAD\xF8\x00\x00\xB4\xF8\xC6\x00\xAD\xF8\x02\x00\x94\xF8\xD4\x00\x8D\xF8\x09\x00\x04\x98\xDB\xF8\x00\x10\x00\xEB\x40\x02\x01\xEB\x82\x00\x00\x9A\x02\x60\x01\x9A\x42\x60\x02\x9A\x82\x60\x00\x2D\x7F\xF4\x6B\xAF\x04\x98\x00\xEB\x40\x00\x01\xEB\x80\x00\x80\x79\x84\xF8\xD6\x00\x61\xE7\x03\x01\xCA\x02\x66\x1A\x0D\x00\x2D\xE9\xF0\x4F\x05\x46\x90\xF8\xD2\x00\x8B\xB0\x8A\x46\x90\x46\x9B\x46\x1E\x30\x04\xA9\x61\xF7\xCA\xFF\x00\x28\x78\xD0\x8D\xF7\x4C\xFC\xFF\x84\x3C\x21\x00\xC2\xF8\x04\x98\x00\xEB\x40\x01\x44\x48\x00\x68\x00\xEB\x81\x01\x08\x68\x00\x90\x48\x68\x01\x90\x88\x68\x02\x90\x0C\x68\x06\x94\x48\x68\x07\x90\x88\x68\x08\x90\x00\x20\x08\x60\x48\x60\x88\x60\x05\xA9\x68\x46\x62\xF7\x44\xFD\xB5\xF8\x4E\x20\xB5\xF8\x4C\x10\x68\x46\x63\xF7\x65\xF8\x02\x25\x4F\xF0\x00\x09\x20\x0C\x4F\x46\x09\x90\xBA\xF8\x02\x00\x09\x99\x40\x04\x00\x0C\xAD\xF8\x02\x00\x81\x42\x05\xD1\x05\x98\x85\x42\x02\xD2\x4F\xF0\x00\x09\x40\xE0\x00\x26\xB8\xF1\x00\x0F\x01\xD0\x00\x24\x1E\xE0\x03\xA9\x68\x46\x62\xF7\x37\xF9\x01\x28\x1A\xD1\x03\x98\xA8\x42\x17\xD1\x4F\xF0\x01\x09\x29\xE0\x0B\xEB\x84\x00\xBD\xF8\x02\x10\x00\x68\xB0\xFB\xF1\xF2\x01\xFB\x12\x00\xAD\xF8\x00\x00\x03\xA9\x68\x46\x62\xF7\x07\xFD\x03\x98\xA8\x42\xEA\xD0\x64\x1C\x44\x45\xEA\xD3\xBD\xF8\x02\x00\x80\x1E\x80\xB2\xAD\xF8\x02\x00\xBA\xF8\x00\x10\xB0\xEB\x41\x0F\x02\xD3\x76\x1C\x0C\x2E\xCB\xD3\x7F\x1C\x6D\x1E\x03\x2F\xB7\xD3\xB9\xF1\x00\x0F\x04\xD0\x14\x98\x03\x99\x01\x60\x03\xE0\x10\xE0\x14\x99\x00\x20\x08\x60\x04\x98\x00\x4C\xFC\xFF\x7F\x3D\x21\x00\xEB\x40\x01\x06\x48\x00\x68\x00\xEB\x81\x00\x06\x99\x01\x60\x07\x99\x41\x60\x08\x99\x81\x60\x48\x46\x0B\xB0\xC6\xE6\x00\x00\x50\x31\x20\x00\x07\x00\x02\x00\x00\xA0\x32\x00\x03\x01\x94\x03\xAC\x1B\x0D\x00\x2D\xE9\xF8\x4F\x00\x24\x26\x46\x4F\xF0\x01\x09\x84\xF7\x5C\xFE\x05\x46\x4F\xF7\x83\xFD\x5A\x4F\x38\x68\x00\xF0\xE0\x01\x59\x48\x02\x78\x02\xF0\x1F\x02\x11\x43\x39\x60\x39\x1F\x0A\x68\x43\x78\x02\xF0\xE0\x02\x03\xF0\x1F\x03\x1A\x43\x0A\x60\x3A\x1D\x13\x68\x90\xF8\x02\xC0\x03\xF0\xE0\x03\x0C\xF0\x1F\x0C\x43\xEA\x0C\x03\x13\x60\x4D\x4A\x13\x68\x90\xF8\x03\xC0\x03\xF0\xE0\x03\x0C\xF0\x1F\x0C\x43\xEA\x0C\x03\x13\x60\xDF\xF8\x1C\xA1\x0A\xF1\x08\x0A\xDA\xF8\x00\xC0\x00\x79\x0C\xF0\xE0\x0C\x00\xF0\x1F\x00\x4C\xEA\x00\x0C\xCA\xF8\x00\xC0\x38\x68\xDF\xF8\xF4\xC0\x00\xF0\x1F\x00\x0C\xF1\x54\x0C\x0C\xF1\x04\x08\x03\x28\x03\xD3\x80\x1E\xCC\xF8\x00\x00\x04\xE0\x00\x23\xCC\xF8\x00\x30\x18\xB1\x40\x1E\xC8\xF8\x00\x00\x01\xE0\xC8\xF8\x00\x30\xED\xB3\x04\x2D\x49\xD0\x10\x68\x00\xF0\x1F\x00\x08\x30\xDA\xF8\x4C\xFC\xFF\x7A\x3E\x21\x00\x00\x20\x60\xF3\x04\x02\xCA\xF8\x00\x20\x2D\x4B\x40\x33\x1A\x68\x00\xF0\x10\x00\x22\xF0\x10\x02\x02\x43\x1A\x60\x45\xB3\x03\x2D\x37\xD0\x08\x68\x04\x2D\x00\xD0\x80\x1E\x38\x60\x33\xF7\xD8\xFB\x00\x28\x3E\xD0\x6A\x46\x02\x21\x6E\x20\x33\xF7\xA3\xFB\xBD\xF8\x00\x00\xC1\xB2\x41\xEA\x10\x20\x01\x06\x01\xD5\x4F\xF0\xFF\x39\x00\xF0\x7F\x00\x00\xFB\x09\xF0\x40\xB2\x00\x28\x29\xD0\x19\x4A\x02\xEB\x84\x01\x91\xF9\x00\x30\x83\x42\x1A\xDC\x01\xE0\x0C\xE0\x0F\xE0\x91\xF9\x01\x10\x81\x42\x13\xDD\x6D\xB1\x04\x2D\x0B\xD0\x02\xEB\x84\x00\x90\xF9\x02\x60\x0F\xE0\x10\x68\x00\xF0\x1F\x00\xB5\xE7\x08\x68\x40\x1E\xC8\xE7\x02\xEB\x84\x00\x90\xF9\x03\x60\x03\xE0\x64\x1C\xE4\xB2\x09\x2C\xDA\xD3\x38\x68\x30\x44\xC0\xB2\x38\x60\xBD\xE8\xF8\x8F\x00\x00\x10\x04\x60\x00\x9C\x07\x20\x00\x00\x07\x60\x00\xAF\x30\x0D\x00\x03\x01\x1A\x3C\x1D\x0D\x00\x2F\x48\x01\x68\x2F\x48\x01\x60\x2F\x49\x09\x68\x41\x60\x2F\x49\x49\x68\x81\x60\x70\x47\x03\x01\x1A\x52\x1D\x0D\x00\x2E\x48\x01\x68\x2A\x48\x01\x60\x2D\x49\x09\x68\x41\x60\x29\x4C\xFC\xFF\x75\x3F\x21\x00\x49\x09\x68\x81\x60\x70\x47\x03\x01\x84\x01\x68\x1D\x0D\x00\x70\xB5\x2A\x48\x06\x26\x00\x25\x80\x68\x29\x4C\x01\x7C\x22\x29\x2E\xD0\x08\xDC\x01\x29\x10\xD0\x06\x29\x19\xD0\x10\x29\x25\xD0\x21\x29\x06\xD1\x27\xE0\x28\x29\x17\xD0\x2A\x29\x1B\xD0\x2B\x29\x1C\xD0\x25\x60\xBD\xE8\x70\x40\xD7\xE7\x90\xF8\xA9\x00\x1C\xE0\xFF\xF7\xC8\xFF\x26\x60\x70\xBD\xFF\xF7\xCF\xFF\x25\x60\x70\xBD\x90\xF8\x39\x00\x03\x28\xF7\xD1\xF2\xE7\x40\x8F\x43\xF2\x06\x31\x08\x42\xF1\xD0\xEC\xE7\x90\xF8\x60\x00\x06\xE0\x40\x6A\xE4\xE7\x90\xF8\x65\x00\x01\xE0\x90\xF8\x59\x00\x01\x28\xE4\xD1\xDF\xE7\x03\x01\x38\xE8\x1D\x0D\x00\x10\xB5\x88\xF7\x79\xF9\x54\xF7\xB7\xF8\xBD\xE8\x10\x40\x4A\xF7\xB3\xBA\x00\x00\x0C\x08\x20\x00\x68\x01\x60\x00\x14\x08\x20\x00\xD4\x30\x0D\x00\x08\x08\x20\x00\x10\x08\x20\x00\x00\x3F\x20\x00\x64\x08\x64\x00\x03\x01\x16\x1C\x1E\x0D\x00\x10\xB5\xC8\x4A\xC8\x49\xC9\x48\x53\xF7\x82\xFF\xC8\x49\x08\x70\x10\xBD\x03\x01\x16\x2E\x1E\x0D\x00\xC5\x49\xC7\x48\xDC\x39\xC8\x60\xC7\x49\x00\xF5\x98\x60\x08\x60\x70\x4C\xFC\xFF\x70\x40\x21\x00\x47\x03\x01\x2C\x40\x1E\x0D\x00\xC5\x4A\xC6\x4B\x01\x28\x03\xD0\x02\x28\x09\xD1\x18\x88\x06\xE0\x10\x68\x18\x80\x48\x78\x01\x28\x03\xD0\x43\xF6\x02\x10\x10\x60\x70\x47\x43\xF6\x0E\x10\xFA\xE7\x03\x01\x48\x68\x1E\x0D\x00\x10\xB5\xBB\x4A\xBC\x4C\x08\x32\x40\xF6\xA2\x63\x01\x28\x03\xD0\x02\x28\x12\xD1\x20\x88\x0F\xE0\x10\x68\x80\xB2\x20\x80\x49\x78\x01\x29\x0B\xD0\xAD\x49\xDC\x39\xC9\x88\xC1\xF5\x80\x51\x89\xB2\x61\xF3\x1F\x10\x40\xF0\x08\x00\x10\x60\x10\xBD\x10\x68\x63\xF3\x1F\x10\xF7\xE7\x03\x01\x70\xAC\x1E\x0D\x00\x70\xB5\xA4\x4A\xA4\x4B\xA9\x4C\x12\x78\xDC\x3B\x02\xEB\x82\x02\x03\xEB\xC2\x02\xA8\x4D\x52\x7D\x94\x3C\xA8\x4E\x4F\xF4\xC0\x03\x01\x28\x09\xD0\x02\x28\x06\xD1\x48\x78\x01\x28\x1A\xD0\x30\x88\x20\x60\x01\x20\x58\x60\x70\xBD\x20\x68\x80\xB2\x30\x80\xD3\xF8\x04\x61\x2E\x60\x49\x78\x01\x29\x09\xD0\x48\xF2\xFF\x01\x08\x40\x02\xF0\x7F\x01\x40\xEA\x01\x20\x20\x60\x00\x20\x58\x60\xC3\xF8\x04\x21\x70\xBD\x28\x68\xC3\xF8\x04\x01\x70\xBD\x03\x01\x3C\x18\x1F\x0D\x00\x10\xB5\x94\x49\x94\x4B\x4C\xFC\xFF\x6B\x41\x21\x00\x95\x4A\x95\x4C\x01\x28\x06\xD0\x02\x28\x03\xD1\x18\x68\x08\x60\x20\x68\x10\x60\x10\xBD\x08\x68\x18\x60\x10\x68\x20\x60\x08\x68\x20\xF0\x3F\x00\x40\xF0\x48\x00\x08\x60\x10\x68\x20\xF0\x02\x00\xEF\xE7\x03\x01\x24\x50\x1F\x0D\x00\x8A\x4A\x4F\xF4\xC0\x01\x01\x28\x04\xD0\x02\x28\x01\xD1\x10\x68\x88\x61\x70\x47\x88\x69\x10\x60\x88\x69\x20\xF0\x02\x00\xF7\xE7\x03\x01\x46\x70\x1F\x0D\x00\x4F\xF4\xC0\x02\x01\x28\x06\xD0\x02\x28\x14\xD1\xD2\xF8\xFC\x02\x20\xF0\x0C\x00\x0D\xE0\x48\x78\x01\x28\x0D\xD0\x00\x28\x0A\xD1\x88\x78\x01\x28\x08\xD0\xD2\xF8\xFC\x02\x20\xF0\x0C\x00\x40\xF0\x08\x00\xC2\xF8\xFC\x02\x70\x47\xD2\xF8\xFC\x02\x40\xF0\x0C\x00\xF7\xE7\x03\x01\x30\xB2\x1F\x0D\x00\x69\x4A\x72\x4B\x18\x32\x01\x28\x03\xD0\x02\x28\x0A\xD1\x18\x68\x07\xE0\x10\x68\x18\x60\x48\x78\x01\x28\x10\x68\x03\xD0\x40\xF4\x80\x40\x10\x60\x70\x47\x20\xF4\x80\x40\xFA\xE7\x03\x01\x30\xDE\x1F\x0D\x00\x69\x4B\x69\x4A\x01\x28\x03\xD0\x02\x28\x0A\xD1\x18\x68\x07\xE0\x10\x68\x18\x60\x48\x78\x01\x28\x10\x68\x03\xD0\x40\xF4\x80\x4C\xFC\xFF\x66\x42\x21\x00\x60\x10\x60\x70\x47\x4F\xF6\xFF\x31\x08\x40\xF9\xE7\x03\x01\x24\x0A\x20\x0D\x00\x5A\x49\x5F\x4A\x1C\x39\x01\x28\x04\xD0\x02\x28\x01\xD1\x10\x68\x08\x60\x70\x47\x08\x68\x10\x60\x08\x68\x00\xF0\x03\x00\xF7\xE7\x03\x01\x98\x01\x2A\x20\x0D\x00\x2D\xE9\xF0\x41\x58\x4F\x55\x4E\x01\x28\x18\xD0\x02\x28\x14\xD1\x30\x68\x39\x68\x20\xF4\x00\x70\x21\xF4\x00\x51\x40\xF4\x80\x74\x41\xF4\x80\x45\x34\x60\x3D\x60\x32\x20\x72\xF7\xCF\xFF\x24\xF4\x80\x70\x25\xF4\x80\x41\x30\x60\x39\x60\xBD\xE8\xF0\x81\x48\x78\x01\x28\x16\xD0\x30\x68\x39\x68\x20\xF4\x00\x70\x40\xF4\x80\x70\x21\xF4\x00\x51\x41\xF4\x80\x41\x30\x60\x39\x60\x40\xF4\x00\x70\x41\xF4\x00\x51\x30\x60\x39\x60\xBD\xE8\xF0\x41\xC8\x20\x72\xF7\xAD\xBF\x4F\xF4\x80\x40\x38\x60\x30\x68\x4F\xF6\xFF\x41\x08\x40\x30\x60\x4F\xF4\xC0\x40\x38\x60\x30\x68\x80\xB2\x40\xF4\x40\x70\x30\x60\xD2\xE7\x03\x01\x5C\xBE\x20\x0D\x00\x30\xB5\x25\x4A\x25\x4B\x33\x4D\x34\x4C\x7C\x3A\x60\x33\x01\x28\x09\xD0\x02\x28\x06\xD1\x48\x78\x01\x28\x03\xD1\x28\x68\x10\x60\x20\x68\x18\x60\x4C\xFC\xFF\x61\x43\x21\x00\x30\xBD\x10\x68\x28\x60\x18\x68\x20\x60\x48\x78\x01\x28\xF7\xD1\x13\x48\x13\x4C\xC9\x78\x00\x78\xDC\x3C\x00\xEB\x80\x00\x04\xEB\xC0\x00\x29\xB1\x01\x29\x03\xD0\x80\x8C\x10\x60\x00\x20\xE6\xE7\xC0\x8A\xFA\xE7\x03\x01\x8E\x01\x16\x21\x0D\x00\x1E\x4A\x20\x4B\x74\x3A\x01\x28\x03\xD0\x02\x28\x09\xD1\x18\x88\x06\xE0\x10\x68\x18\x80\x48\x78\x01\x28\x03\xD0\x4F\xF4\x00\x60\x10\x60\x70\x47\x25\x20\xFB\xE7\x00\x00\xA0\x1E\x20\x00\x2C\x11\x20\x00\x2C\x2E\x0D\x00\xB4\x2B\x20\x00\x7C\x2B\x0D\x00\xBC\x2B\x20\x00\xAC\x06\x41\x00\x28\x10\x20\x00\x26\x10\x20\x00\x2C\x10\x20\x00\x24\x10\x20\x00\xDC\x04\x60\x00\x44\x10\x20\x00\x64\x06\x60\x00\x48\x10\x20\x00\x30\x10\x20\x00\x34\x10\x20\x00\x38\x10\x20\x00\xE8\x07\x41\x00\x4C\x10\x20\x00\xFC\x04\x41\x00\x3C\x10\x20\x00\x40\x10\x20\x00\x2A\x10\x20\x00\x03\x01\x90\x01\xA0\x21\x0D\x00\x02\x46\x00\x20\x11\x2A\x3A\xD2\xDF\xE8\x02\xF0\x09\x34\x32\x2B\x29\x25\x0B\x30\x0D\x30\x32\x29\x34\x34\x25\x25\x37\x00\x5B\xF7\x8C\xB8\x5A\xF7\xC0\xBF\x17\x4A\x13\x68\x6F\xF3\x0F\x4C\xFC\xFF\x5C\x44\x21\x00\x03\x42\xF8\x90\x39\x05\x29\x0F\xD2\xDF\xE8\x01\xF0\x0F\x03\x0F\x0F\x0F\x00\x02\xF1\x7C\x02\x51\x69\x48\xF6\x88\x03\x41\xEA\x03\x01\x51\x61\x4F\xF0\xBB\x31\x11\x60\x70\x47\x0B\x49\xD1\x67\x70\x47\x5A\xF7\xB4\xBF\x09\xB1\x5A\xF7\xE5\xBF\x5B\xF7\x03\xB8\x02\x20\x70\x47\x5A\xF7\xB8\xBF\x08\x46\x5B\xF7\x1C\xB8\x5A\xF7\xCC\xBF\x01\x20\x70\x47\x00\x00\x90\x00\x32\x00\xB9\xB9\xBB\xB9\x03\x01\x4A\x2C\x22\x0D\x00\x04\x28\x1E\xD1\x22\x49\x21\x48\x08\x60\x23\x49\x21\x48\x08\x60\x23\x49\x22\x48\x08\x60\x24\x49\x22\x48\x08\x60\x24\x49\x23\x48\x88\x60\x24\x49\x4F\xF0\xFF\x30\x88\x60\x23\x48\x00\x69\x01\x05\x22\x48\x01\xD5\x01\x21\x00\xE0\x00\x21\x01\x70\x21\x49\x20\x48\x48\x60\x00\x20\x70\x47\x03\x01\x0C\x72\x22\x0D\x00\x04\x21\x08\x20\x5B\xF7\x85\xB8\x03\x01\x0C\x7A\x22\x0D\x00\x03\x21\x08\x20\x5B\xF7\x81\xB8\x03\x01\x92\x01\x82\x22\x0D\x00\x10\xB5\xAF\xF2\x5B\x00\x1A\x49\x08\x60\xFF\xF7\xCF\xFD\x1A\x48\x19\x49\x81\x64\x1A\x49\xC0\xF8\x68\x11\xAF\xF2\x25\x01\x18\x48\x41\x60\xAF\xF2\x35\x01\x81\x60\x49\x4C\xFC\xFF\x57\x45\x21\x00\xF7\x7D\xFB\x16\x48\x16\x49\x00\x78\x08\x70\x10\xBD\xE1\x23\x0D\x00\x88\x23\x20\x00\x39\x24\x0D\x00\xC4\x23\x20\x00\x3D\x24\x0D\x00\xFC\x25\x20\x00\x19\x23\x0D\x00\x54\x32\x20\x00\x09\x29\x0D\x00\x78\xD3\x20\x00\x10\x82\x20\x00\xF8\x3F\x20\x00\x6C\x2B\x0D\x00\xA5\x0A\x0D\x00\xE4\x5C\x20\x00\xB4\x39\x20\x00\x67\x24\x0D\x00\x18\x52\x20\x00\x4D\x04\x0D\x00\x0C\x32\x0D\x00\x04\x23\x20\x00\x6D\x2B\x0D\x00\x03\x01\x0C\x10\x23\x0D\x00\x31\x49\x00\x7B\x08\x70\x70\x47\x03\x01\xCC\x01\x18\x23\x0D\x00\x30\xB4\x00\x24\x0C\x60\x2F\x4C\x05\x2B\x53\xD0\x06\xDC\x01\x2B\x50\xD0\x02\x2B\x4E\xD0\x03\x2B\x4C\xD1\x06\xE0\x06\x2B\x49\xD0\x08\x2B\x08\xD0\x3F\x2B\x45\xD1\x11\xE0\x03\x2A\x42\xD1\x25\x68\x0D\x60\x64\x68\x3A\xE0\x17\x2A\x05\xD0\x1C\x2A\x3A\xD1\x25\x6B\x0D\x60\x64\x6B\x32\xE0\x25\x6C\x0D\x60\x64\x6C\x2E\xE0\x25\x2A\x21\xD0\x08\xDC\x14\x2A\x22\xD0\x19\x2A\x10\xD0\x1A\x2A\x12\xD0\x24\x2A\x27\xD1\x13\xE0\x85\x2A\x1D\xD0\xE9\x2A\x22\xD0\xA2\xF5\x80\x75\x45\x3D\x1E\xD1\xA5\x68\x0D\x60\xE4\x68\x16\xE0\x25\x4C\xFC\xFF\x52\x46\x21\x00\x69\x0D\x60\x64\x69\x12\xE0\xA5\x69\x0D\x60\xE4\x69\x0E\xE0\x25\x6A\x0D\x60\x64\x6A\x0A\xE0\xA5\x6A\x0D\x60\xE4\x6A\x06\xE0\xA5\x6B\x0D\x60\xE4\x6B\x02\xE0\xA5\x6C\x0D\x60\xE4\x6C\x4C\x60\x0C\x68\x00\x2C\x02\xD1\x30\xBC\x49\xF7\x29\xBE\x30\xBC\x70\x47\x00\x00\xDD\x30\x0D\x00\x5C\x30\x0D\x00\x03\x01\x5C\xE0\x23\x0D\x00\x10\xB5\x04\x46\x01\x29\x02\xD0\x02\x29\x1B\xD0\x1C\xE0\xA4\xF5\xE0\x40\x0A\x38\x0F\xD1\x89\xF7\x97\xFF\x0C\x49\x0C\x48\x84\xF7\xE1\xFA\x0A\x48\x0B\x49\x00\x88\x01\xEB\x80\x00\x01\x68\x07\x48\x88\x47\x00\x24\x08\xE0\xA4\xF5\xE0\x40\x06\x38\x04\xD1\xFE\xF7\xE3\xFF\x01\xE0\x8C\xF7\xC2\xFC\x20\x46\x10\xBD\xA4\x23\x20\x00\x0C\x60\x20\x00\x3C\x92\x08\x00\x03\x01\x08\x38\x24\x0D\x00\x00\x20\x70\x47\x03\x01\x1C\x3C\x24\x0D\x00\x08\x7B\x42\x08\x00\x20\x7F\x2A\x03\xD0\x07\x2A\x01\xD1\x01\x4A\x8A\x60\x70\x47\xF1\x09\x0D\x00\x03\x01\x16\x54\x24\x0D\x00\x2E\x28\x01\xD3\x01\x20\x70\x47\x1C\x4A\x42\xF8\x20\x10\x00\x20\x70\x47\x03\x01\x82\x01\x66\x24\x0D\x00\x10\xB5\x1A\x49\x04\x20\xFF\xF7\x4C\xFC\xFF\x4D\x47\x21\x00\xF2\xFF\x19\x49\x93\x20\x08\x60\x19\x48\xCF\x21\x01\x60\x4F\xF0\xE6\x01\x41\x60\x81\x60\x4F\xF0\x17\x01\xC1\x60\x4F\xF0\x40\x01\x01\x61\x4F\xF0\x01\x01\x41\x61\x4F\xF0\xF2\x02\x82\x61\x4F\xF0\xCE\x02\xC2\x61\x4F\xF0\xD0\x02\x02\x62\x4F\xF0\xE8\x02\x82\x64\x4F\xF0\xC8\x02\x40\xF8\x90\x2C\x4F\xF0\xEC\x02\x40\xF8\x8C\x2C\x40\xF8\x88\x1C\x07\x49\x4F\xF0\x04\x00\x08\x60\x4F\xF0\x00\x00\x10\xBD\x58\x15\x21\x00\xE5\x24\x0D\x00\x4C\x0D\x42\x00\x94\x01\x42\x00\x7C\x37\x42\x00\x03\x01\xA0\x08\xE4\x24\x0D\x00\x2D\xE9\xF7\x4F\x07\x46\xDF\x48\xDF\xF8\x74\xA3\x00\x68\x07\xF5\x7A\x44\x00\xF0\x03\x02\x4F\xF4\x7A\x70\x44\x43\xDA\x48\xDF\xF8\x6C\x93\x52\x1C\x05\x68\x04\xEB\x55\x00\xB0\xFB\xF5\xF6\x06\xFB\x05\xF0\x80\x46\xC9\xF8\x00\x00\xD5\x48\x05\xFB\x02\xF1\x90\xF8\x00\xB0\x01\xFB\x0B\xF0\x88\xF7\x8E\xFD\x00\x22\xD1\x4B\x88\xF7\x5D\xFB\x00\x22\xD0\x4B\x88\xF7\x01\xFC\x00\x22\xCF\x4B\x88\xF7\x85\xFE\x88\xF7\x53\xFD\xCE\x49\x08\x80\xCE\x48\x80\x68\x4F\xF4\x80\x42\xC0\xF3\x13\x00\xA5\xFB\x00\x01\x80\x18\x41\x4C\xFC\xFF\x48\x48\x21\x00\xF1\x00\x01\xC2\x0B\xC9\x48\x42\xEA\x41\x42\x02\x60\x4F\xF4\x48\x10\x00\x68\xC6\x49\xC0\xF3\x02\x10\x4F\xF0\x01\x0C\x02\x23\x70\xB3\x01\x28\x2E\xD0\x02\x28\x2E\xD0\x03\x28\x2E\xD0\x04\x28\x2E\xD0\x05\x28\x2E\xD0\x06\x28\x2E\xD0\xC1\xF8\x00\xC0\x08\x68\xBC\x4B\x04\xFB\x00\xF1\x01\xEB\x52\x01\xB1\xFB\xF2\xF1\x02\xFB\x01\xF2\x02\xEB\x50\x02\xB2\xFB\xF0\xF0\x18\x60\x00\x1B\x00\xD5\x40\x42\xB5\x4A\x12\x68\x90\x42\x1B\xD8\xB8\xEB\x04\x00\x00\xD5\x40\x42\x90\x42\x15\xD8\x00\x20\xB1\x42\x10\xD9\x18\x60\x10\xE0\x0B\x60\xDC\xE7\x03\x20\x08\xE0\x04\x20\x06\xE0\x06\x20\x04\xE0\x08\x20\x02\xE0\x10\x20\x00\xE0\x18\x20\x08\x60\xCF\xE7\xC9\xF8\x00\x00\xDD\xE9\x01\x06\x88\xF7\x20\xFD\xA4\x4B\x00\x22\x88\xF7\x75\xFD\x89\x46\x80\x46\x07\xF5\x7A\x40\x4F\xF4\x7A\x71\x48\x43\x88\xF7\x13\xFD\x4B\x46\x42\x46\x01\x2E\x0B\xD0\x88\xF7\x10\xFE\x88\xF7\xDE\xFC\x01\x46\x9A\x48\x02\x68\x9A\x48\x94\x42\x04\xD3\x1E\x22\x2D\xE0\x88\xF7\xD4\xFA\xF2\xE7\x97\x4A\x12\x68\x94\x42\x01\xD3\x23\x22\x24\xE0\x95\x4A\x12\x68\x94\x42\x4C\xFC\xFF\x43\x49\x21\x00\x01\xD3\x28\x22\x1E\xE0\x93\x4A\x12\x68\x94\x42\x01\xD3\x2D\x22\x18\xE0\x91\x4A\x12\x68\x94\x42\x01\xD3\x46\x22\x12\xE0\x8F\x4A\x12\x68\x94\x42\x01\xD3\x50\x22\x0C\xE0\x8D\x4A\x12\x68\x94\x42\x01\xD3\x5A\x22\x06\xE0\x8B\x4A\x12\x68\x94\x42\x01\xD3\x64\x22\x00\xE0\x6E\x22\x02\x60\x0A\x22\xB1\xFB\xF2\xF1\x86\x4A\xD0\xF8\x00\x80\x01\xFB\x08\xF1\x12\x78\x88\x00\x00\x21\x91\x46\xAE\xF7\x43\xFF\x82\x4B\x6A\x00\x1B\x68\x5F\x00\x38\x18\x41\xF1\x00\x03\xD9\x03\x41\xEA\x50\x41\xC0\x03\x40\x19\x41\xF1\x00\x01\x00\x23\x58\xF7\xD0\xFE\xA0\xFB\x05\x36\x01\xFB\x05\x61\x00\x22\x00\xFB\x02\x11\x9A\x0B\x42\xEA\x81\x42\x89\x0B\xD5\x1B\x61\xF1\x00\x06\x73\x49\x08\x60\x73\x48\x31\x46\x05\x60\x28\x46\x88\xF7\xB2\xFC\x00\x22\x5A\x4B\x88\xF7\x6E\xFA\x00\x22\x59\x4B\x88\xF7\x12\xFB\x88\xF7\x68\xFC\x6C\x49\x00\xFB\x0B\xF0\x40\x1C\x40\x08\x08\x60\x0A\x21\xB8\xFB\xF1\xF2\x00\x23\x31\x46\x28\x46\x58\xF7\xA2\xFE\x04\x27\x27\xFA\x09\xF7\xFB\x17\x3A\x46\x58\xF7\x9B\xFE\x63\x49\x07\x46\x08\x60\x00\x1B\x00\xD5\x40\x42\xDF\x4C\xFC\xFF\x3E\x4A\x21\x00\xF8\x84\x81\x4F\xF0\x09\x0B\x81\x46\x5A\x46\x88\xF8\x00\xB0\x00\x23\x28\x46\x31\x46\x58\xF7\x88\xFE\x80\x08\x40\xEA\x81\x70\xC0\x1B\x00\xD5\x40\x42\x58\x49\x0C\x68\xA0\x42\x21\xD2\x08\x22\x88\xF8\x00\x20\x00\x23\x28\x46\x31\x46\x58\xF7\x76\xFE\x80\x08\x40\xEA\x81\x70\xC0\x1B\x00\xD5\x40\x42\xA0\x42\x11\xD2\x0A\x22\x88\xF8\x00\x20\x00\x23\x28\x46\x31\x46\x58\xF7\x66\xFE\x80\x08\x40\xEA\x81\x70\xC0\x1B\x00\xD5\x40\x42\xA0\x42\x01\xD2\x88\xF8\x00\xB0\x98\xF8\x00\x20\x00\x23\x28\x46\x31\x46\x58\xF7\x55\xFE\x4D\x08\x4F\xEA\x30\x04\x41\x48\x52\x46\x00\x23\x04\x60\x40\x48\x00\x19\x45\xF1\x00\x01\x58\xF7\x48\xFE\x3E\x49\x1F\x28\x08\x60\x01\xD9\x1F\x20\x08\x60\x02\x46\x00\x23\x20\x46\x29\x46\x58\xF7\x3C\xFE\x04\x46\x39\x48\x00\x21\xC9\x05\x04\x60\x4F\xEA\xC9\x50\x65\x08\x41\xEA\x59\x21\x40\x19\x41\xF1\x00\x01\x22\x46\x00\x23\x58\xF7\x2B\xFE\x32\x49\x22\x46\x00\x23\x08\x60\x4F\xF0\xE0\x50\x00\x21\x28\x18\x41\xF1\x25\x01\x58\xF7\x1F\xFE\x2D\x49\x22\x46\x00\x23\x08\x60\x4F\xF0\xA8\x40\x00\x21\x28\x18\x4C\xFC\xFF\x39\x4B\x21\x00\x41\xF1\x6F\x01\x58\xF7\x13\xFE\x28\x49\x08\x60\x01\x20\xBD\xE8\xFE\x8F\x00\x80\xBB\x00\x18\x37\x42\x00\xFC\x0F\x21\x00\xE8\x11\x21\x00\xA8\x11\x21\x00\x80\x84\x1E\x41\x80\x84\x2E\x41\x00\x00\xF0\x3F\xAC\x11\x21\x00\x00\x10\x32\x00\x10\x12\x21\x00\x0C\x12\x21\x00\x08\x12\x21\x00\x20\x13\x21\x00\x00\x40\x8F\x40\xB8\x11\x21\x00\xF4\x11\x21\x00\xBC\x11\x21\x00\xC0\x11\x21\x00\xC4\x11\x21\x00\xC8\x11\x21\x00\xCC\x11\x21\x00\xD0\x11\x21\x00\xD4\x11\x21\x00\xA9\x11\x21\x00\xD8\x11\x21\x00\xDC\x11\x21\x00\xEC\x11\x21\x00\xFC\x11\x21\x00\xB0\x11\x21\x00\xAA\x11\x21\x00\xE0\x11\x21\x00\xB4\x11\x21\x00\x00\xC0\x5D\x00\xF8\x11\x21\x00\xE4\x11\x21\x00\xF0\x11\x21\x00\x00\x12\x21\x00\x04\x12\x21\x00\x03\x01\x0C\x00\x29\x0D\x00\x01\x21\x81\x70\x59\xF7\x84\xB9\x03\x01\x20\x08\x29\x0D\x00\x04\x28\x03\xD0\x03\x28\x07\xD3\x5B\xF7\x51\xBC\x4F\xF4\x48\x11\x4F\xF4\x00\x50\xC8\x65\xF7\xE7\x70\x47\x00\x00\x03\x01\x80\x01\x24\x29\x0D\x00\x2D\xE9\xF0\x41\x1A\x48\x00\x68\xC0\x07\x2E\xD0\x19\x48\x01\x68\x41\xF0\x01\x4C\xFC\xFF\x34\x4C\x21\x00\x01\x01\x60\x17\x4F\x7C\x3F\x38\x68\x40\xF0\x80\x00\x38\x60\x15\x4E\x01\x20\x30\x60\x48\xF7\x16\xFB\x3D\x68\x25\xF0\x80\x00\x38\x60\x0F\x48\x74\x38\x01\x68\x41\xF0\x20\x01\x01\x60\x01\x68\x21\xF0\x20\x01\x01\x60\x00\x24\x04\xE0\x30\x20\x48\xF7\x6F\xFA\x04\xF1\x01\x04\x30\x68\x80\x07\x01\xD4\x32\x2C\xF5\xD3\x45\xF0\x80\x00\x38\x60\x00\x20\x30\x60\xBD\xE8\xF0\x81\x00\x00\x60\x18\x20\x00\x7C\x08\x64\x00\xB4\x04\x32\x00\x03\x01\x88\x01\xA0\x29\x0D\x00\x30\xB5\x1B\x4C\x24\x78\x01\x2C\x07\xD1\xB0\xF5\xE1\x3F\x07\xD0\x18\x4C\x25\x68\x45\xF0\x01\x05\x25\x60\x17\x4C\xA0\x42\x01\xD8\x16\x4C\x00\xE0\x16\x4C\xB4\xFB\xF0\xF0\x10\x28\x0C\xDB\xC4\x17\x00\xEB\x14\x74\x25\x11\x24\xF0\x0F\x04\x04\x1B\x18\x68\x20\xF0\x08\x00\x40\xF0\x80\x00\x06\xE0\x05\x46\x18\x68\x00\x24\x20\xF0\x80\x00\x40\xF0\x08\x00\x18\x60\xC5\xF5\x80\x70\x10\x60\x04\xEB\xD4\x70\x40\x10\x22\x1A\x42\xEA\x00\x10\x08\x60\x30\xBD\x00\x00\xDC\x30\x0D\x00\x1C\x04\x36\x00\x60\xE3\x16\x00\x00\x36\x6E\x01\x00\x6C\xDC\x02\x03\x01\x72\x24\x2A\x0D\x4C\xFC\xFF\x2F\x4D\x21\x00\x00\xD0\xF8\xD8\x20\x05\x46\x00\x21\x90\x47\x48\x4E\x48\x4C\x05\xF1\xB0\x09\x48\x46\x80\xF7\x29\xFA\x07\x46\xB0\x78\x08\xB3\x72\xF7\x0A\xFD\x80\x46\x20\x78\xC1\x06\x07\xD5\x40\xF0\x08\x00\x20\x70\x72\xF7\xEC\xFA\x3F\x49\x08\x60\x10\xE0\x40\xF0\x10\x00\x20\x70\x3D\x48\x72\xF7\xB7\xFB\xB1\x78\x43\xF2\xD4\x00\x41\x43\x3A\x48\x72\xF7\x89\xFB\x20\x78\x20\xF0\x08\x00\x20\x70\x40\x46\x72\xF7\xEE\xFC\xD5\xF8\xD8\x20\x39\x46\x28\x46\x90\x47\xD1\xE7\x03\x01\x18\x92\x2A\x0D\x00\x2F\x48\x10\xB5\x40\x79\x18\xB1\x30\xF7\x26\xFA\x00\x28\x00\xD0\x01\x20\x10\xBD\x03\x01\xC2\x01\xA6\x2A\x0D\x00\x2D\xE9\xF0\x41\xDF\xF8\xB4\x80\x0E\x46\x98\xF8\x00\x00\xF0\xB3\xE6\xB3\xC0\x07\x3A\xD0\x71\x68\x06\xF1\x08\x00\xA1\xF5\xE0\x42\x84\x3A\x0F\xD1\x45\x88\x04\x46\x05\xF1\x09\x00\x72\xF7\xB3\xFD\x07\x46\x2A\x46\x21\x1D\x09\x30\x72\xF7\xA1\xFE\x3C\x46\x47\xF2\x3F\x00\x1D\xE0\xA1\xF5\xE0\x42\x41\x3A\x1F\xD1\x05\x46\xFD\xF7\xB3\xFF\x07\x00\x1A\xD0\x28\x78\x13\x28\x17\xD0\x68\x78\x00\x1D\x42\xF7\x36\xFB\x69\x78\xA0\xF1\x08\x4C\xFC\xFF\x2A\x4E\x21\x00\x04\x89\x1C\x41\x80\x20\xF8\x04\x7B\x6A\x78\x29\x46\x92\x1C\x72\xF7\x81\xFE\x47\xF2\x82\x00\x60\x60\x58\xF7\x94\xFE\x21\x46\x30\xF7\x16\xFB\x00\xE0\x09\xE0\x98\xF8\x00\x00\x40\x07\x05\xD5\x30\x46\x72\xF7\x35\xFE\x00\x20\xBD\xE8\xF0\x81\x01\x20\xFB\xE7\x00\x00\xC4\x18\x20\x00\x16\x1D\x20\x00\x1C\x1D\x20\x00\xF0\x50\x20\x00\xDD\x30\x0D\x00\x10\x01\x0F\x00\x28\xDB\x03\x00\x92\xF0\x6A\xBB\x00\x00\x00\x02\x0D\x00\x10\x01\x0F\x01\xBC\x92\x07\x00\x56\xF0\xA8\xBF\x00\x00\x10\x02\x0D\x00\x10\x01\x0F\x02\x04\x89\x07\x00\x57\xF0\x89\xBC\x00\x00\x1A\x02\x0D\x00\x10\x01\x0F\x03\xCC\x2A\x07\x00\x5D\xF0\xAC\xBB\x00\x00\x28\x02\x0D\x00\x10\x01\x0F\x04\x70\x27\x04\x00\x8D\xF0\x5E\xBD\x00\x00\x30\x02\x0D\x00\x10\x01\x0F\x05\xCC\x54\x03\x00\x02\x21\x00\xE0\x00\x00\x00\x00\x00\x00\x10\x01\x0F\x06\x9C\x7B\x07\x00\x58\xF0\x4C\xBB\x00\x00\x38\x02\x0D\x00\x10\x01\x0F\x07\x64\x70\x06\x00\x69\xF0\x4A\xBA\x00\x00\xFC\x04\x0D\x00\x10\x01\x0F\x08\xE0\x00\x02\x00\xB0\xF0\xAE\xB8\x00\x00\x40\x02\x0D\x00\x10\x01\x0F\x09\x4C\xFC\xFF\x25\x4F\x21\x00\xB8\xBB\x02\x00\xA4\xF0\x4C\xBB\x00\x00\x54\x02\x0D\x00\x10\x01\x0F\x0A\x78\x3A\x00\x00\x01\x20\x20\xB9\x00\x00\x00\x00\x00\x00\x10\x01\x0F\x0B\x20\x6C\x05\x00\x79\xF0\x28\xBB\x00\x00\x74\x02\x0D\x00\x10\x01\x0F\x0C\x20\x65\x06\x00\x0C\x20\x50\x43\x00\x00\x00\x00\x00\x00\x10\x01\x0F\x0D\xE0\x9B\x06\x00\x66\xF0\x1C\xBF\x00\x00\x1C\x0A\x0D\x00\x10\x01\x0F\x0E\x1C\xA1\x06\x00\x66\xF0\xB2\xB8\x00\x00\x84\x02\x0D\x00\x10\x01\x0F\x0F\x90\x33\x04\x00\x8C\xF0\x7E\xBF\x00\x00\x90\x02\x0D\x00\x10\x01\x0F\x10\xCC\xEF\x03\x00\x91\xF0\x78\xBD\x00\x00\xC0\x0A\x0D\x00\x10\x01\x0F\x11\x20\x74\x07\x00\x58\xF0\x3C\xBF\x00\x00\x9C\x02\x0D\x00\x10\x01\x0F\x12\x24\x20\x03\x00\x9E\xF0\xF4\xBE\x00\x00\x10\x0E\x0D\x00\x10\x01\x0F\x13\x6C\x20\x03\x00\x9E\xF0\xF7\xBE\x00\x00\x5E\x0E\x0D\x00\x06\x01\x04\x9C\x0F\x0D\x00\x10\x01\x0F\x14\x14\xFD\x06\x00\x61\xF0\x4F\xB9\x00\x00\xB6\x0F\x0D\x00\x10\x01\x0F\x15\xA8\x67\x05\x00\x7A\xF0\x7C\xBE\x00\x00\xA4\x14\x0D\x00\x06\x01\x04\xD6\x14\x0D\x00\x10\x01\x0F\x16\x84\x1B\x02\x4C\xFC\xFF\x20\x50\x21\x00\x00\xAE\xF0\x8E\xBB\x00\x00\xA4\x02\x0D\x00\x10\x01\x0F\x17\x4C\x40\x03\x00\x9D\xF0\xEC\xBB\x00\x00\x28\x18\x0D\x00\x10\x01\x0F\x18\xD0\x4B\x03\x00\x9B\xF0\x6C\xBB\x00\x00\xAC\x02\x0D\x00\x10\x01\x0F\x19\x74\x4D\x03\x00\x9B\xF0\x9E\xBA\x00\x00\xB4\x02\x0D\x00\x10\x01\x0F\x1A\xEC\x17\x02\x00\xB0\xF0\xDE\xB9\x00\x00\xAC\x1B\x0D\x00\x10\x01\x0F\x1B\x38\xC7\x01\x00\xB3\xF0\xC2\xBD\x00\x00\xC0\x02\x0D\x00\x10\x01\x0F\x1C\x10\x44\x00\x00\xCD\xF0\xEA\xBC\x00\x00\xE8\x1D\x0D\x00\x10\x01\x0F\x1D\x84\xD3\x02\x00\xA4\xF0\x0C\xBF\x00\x00\xA0\x21\x0D\x00\x10\x01\x0F\x1E\xF0\xD2\x02\x00\xA2\xF0\xEA\xBF\x00\x00\xC8\x02\x0D\x00\x06\x01\x04\x82\x22\x0D\x00\x10\x01\x0F\x1F\xF4\xD7\x08\x00\x42\xF0\x72\xBD\x00\x00\xDC\x02\x0D\x00\x10\x01\x0F\x20\xF0\xAF\x01\x00\xB7\xF0\x98\xBC\x00\x00\x24\x29\x0D\x00\x10\x01\x0F\x21\x64\x39\x08\x00\x4F\xF0\x1C\xB8\x00\x00\xA0\x29\x0D\x00\x10\x01\x0F\x22\xE8\x70\x07\x00\x59\xF0\xFE\xB8\x00\x00\xE8\x02\x0D\x00\x10\x01\x0F\x23\x54\x2F\x00\x00\xCD\xF0\xD0\xB9\x00\x00\xF8\x02\x0D\x4C\xFC\x2C\x1B\x51\x21\x00\x00\x10\x01\x0F\x24\xE0\x31\x00\x00\xCD\xF0\x8E\xB8\x00\x00\x00\x03\x0D\x00\x10\x01\x0F\x25\xFC\xB5\x01\x00\xB4\xF0\x8C\xBE\x00\x00\x18\x03\x0D\x00\xFE\x00\x00\x4C\xFC\xFF\x64\x2B\x0D\x00\x01\x02\x04\x00\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x01\x65\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x60\x01\x65\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\xC0\x04\x41\x00\x00\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xAD\x1E\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\xBC\x01\x60\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x21\xB6\x02\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x20\x00\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x1C\x00\x60\x00\x40\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x18\x00\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x14\x00\x60\x00\xF0\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xC0\x04\x41\x00\x01\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x2C\x00\x60\x00\x30\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x24\x00\x60\x00\xFF\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x19\x1F\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\xE8\x02\x60\x4C\xFC\xFF\x5F\x2C\x0D\x00\x00\x40\x00\x00\x00\xF0\x00\x00\x00\x00\x00\x00\x00\x64\x04\x41\x00\xBA\x40\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x60\x04\x41\x00\xC0\x50\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x41\x1E\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x34\x06\x41\x00\x80\x18\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x60\x01\x60\x00\x55\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x30\x04\x41\x00\xE9\x02\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xDC\x06\x41\x00\xF1\x82\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xC0\x04\x41\x00\x21\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x88\x04\x41\x00\x00\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xB3\x1F\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\xDF\x1F\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x51\x1F\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x9C\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xA0\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xA4\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x4C\xFC\xFF\x5A\x2D\x0D\x00\x00\x00\xA8\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xAC\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xC8\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xCC\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xD0\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xD4\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xD8\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x69\x1E\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x81\xB7\x02\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\xF0\x00\x64\x00\x01\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xE4\x00\x64\x00\x0C\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xE0\x00\x64\x00\x30\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFC\x02\x60\x00\x01\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xBC\x01\x60\x00\x01\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xAD\x1E\x0D\x00\xBC\xBC\xBC\xBC\x43\x4C\xFC\xFF\x55\x2E\x0D\x00\x43\x43\x43\x00\x00\x00\x00\x0C\x01\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x0B\x20\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x60\x01\x65\x00\x01\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x70\x01\x65\x00\x01\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xF8\x00\x64\x00\xDF\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xC8\x00\x64\x00\x18\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x20\x00\x60\x00\xBE\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x1C\x00\x60\x00\xFF\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x18\x00\x60\x00\x0F\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x14\x00\x60\x00\xFF\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x24\x00\x60\x00\xFF\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x2C\x00\x60\x00\x30\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xDC\x04\x60\x00\x08\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xE8\x04\x41\x00\x02\xC2\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x64\x04\x41\x00\xBA\x40\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x34\x06\x41\x00\x4C\xFC\xFF\x50\x2F\x0D\x00\x00\x48\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xE8\x02\x60\x00\x45\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xB3\x1F\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\xDF\x1F\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x41\x1E\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x69\x1E\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x17\x21\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x2B\x20\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\xC0\x04\x41\x00\x21\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xBF\x20\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x71\x1F\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\xF0\x00\x64\x00\x01\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xE4\x00\x64\x00\x0C\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xE0\x00\x64\x00\x30\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0B\xA0\x02\x00\x1D\x1E\x0D\x00\x39\xA0\x02\x00\x57\xA0\x02\x4C\xFC\x65\x4B\x30\x0D\x00\x00\xD3\xA0\x02\x00\x7B\xA1\x02\x00\xB5\xA1\x02\x00\xC5\xA2\x02\x00\x6D\x07\x0D\x00\x03\x00\x00\x00\x6D\x06\x0D\x00\x0A\x00\x06\x00\x21\x08\x0D\x00\x06\x00\x09\x00\xB7\x08\x0D\x00\x04\x00\x08\x00\xB7\x09\x0D\x00\x04\x00\x06\x00\xC9\x09\x0D\x00\x03\x00\x07\x00\xC5\x07\x0D\x00\x00\x00\x0E\x00\x29\x17\x0D\x00\x0A\x00\x06\x00\xD5\x07\x0D\x00\x23\x00\x00\x00\x11\x23\x0D\x00\x04\x00\x06\x00\x4C\xFC\x05\xDD\x30\x0D\x00\x00\x4C\xFC\x05\xDC\x30\x0D\x00\x00\x4C\xFC\x0C\xD4\x30\x0D\x00\x10\x00\x00\x00\x0F\x00\x00\x00\x4C\xFC\x28\xAF\x30\x0D\x00\x52\x66\xFC\xFC\x3E\x52\xFD\xFD\x2A\x3E\xFE\xFE\x16\x2A\xFF\xFF\x02\x16\x00\x00\xEE\x02\x01\x01\xDA\xEE\x02\x02\xC6\xDA\x03\x03\xB2\xC6\x04\x04\x4C\xFC\x05\xAE\x30\x0D\x00\x01\x4C\xFC\x05\xAD\x30\x0D\x00\x28\x4C\xFC\x05\xAC\x30\x0D\x00\x01\x4E\xFC\x04\xFF\xFF\xFF\xFF";
// Kontakt.io iBeacon - Advertising packet structure
// Byte offset Default value Description Properties
// 0 0x02 Data length – 2 bytes constant preamble
// 1 0x01 Data type – flags constant preamble
// 2 0x06 LE and BR/EDR flag constant preamble
// 3 0x1a Data length – 26 bytes constant preamble
// 4 0xff Data type - manufacturer specific data constant preamble
// 5 0x4c Manufacturer data constant preamble
// 6 0x00 Manufacturer data constant preamble
// 7 0x02 Manufacturer data constant preamble
// 8 0x15 Manufacturer data constant preamble
// 9 0xf7 Proximity UUID 1st byte set user UUID
// 10 0x82 Proximity UUID 2nd byte set user UUID
// 11 0x6d Proximity UUID 3rd byte set user UUID
// 12 0xa6 Proximity UUID 4th byte set user UUID
// 13 0x4f Proximity UUID 5th byte set user UUID
// 14 0xa2 Proximity UUID 6th byte set user UUID
// 15 0x4e Proximity UUID 7th byte set user UUID
// 16 0x98 Proximity UUID 8th byte set user UUID
// 17 0x80 Proximity UUID 9th byte set user UUID
// 18 0x24 Proximity UUID 10th byte set user UUID
// 19 0xbc Proximity UUID 11th byte set user UUID
// 20 0x5b Proximity UUID 12th byte set user UUID
// 21 0x71 Proximity UUID 13th byte set user UUID
// 22 0xe0 Proximity UUID 14th byte set user UUID
// 23 0x89 Proximity UUID 15th byte set user UUID
// 24 0x3e Proximity UUID 16th byte set user UUID
// 25 xx* Major 1st byte set major value
// 26 xx* Major 2nd byte set major value
// 27 xx* Minor 1st byte set minor value
// 28 xx* Minor 2nd byte set minor value
// 29 0xb3 Signal power (calibrated RSSI@1m) signal power value
// iBeacon Constants
enum I_BEACON {
LENGTH = 30,
NO_PRE_LENGTH = 27,
PREAMBLE = "\x02\x01\x06", // Flags Prefix
DATA_LENGTH = "\x1A", // Payload Length
MFG_TYPE = "\xFF", // Custom Manufacturer Packet
MFG_ID_APPLE = "\x4C\x00", // Apple
SUB_TYPE = "\x02", // iBeacon
SUB_TYPE_LENGTH = "\x15", // Sub packet length (UUID, major, minor, power)
MAX_ADVERT_LEN = 31,
MIN_ADVERT_MS = 100,
MAX_ADVERT_MS = 100,
SCAN_INTERVAL_MS = 100,
SCAN_WINDOW_MS = 100,
ERROR_ADVERT_LEN = "BLE advert too long",
ERROR_SCAN_LEN = "BLE advert scan too long"
}
enum BEACON_TYPE {
ADV_IND, // 0 Connectable undirected advertisement
ADV_DIRECT_IND, // 1 Connectable directed advertisement
ADV_SCAN_IND, // 2 Scannable undirected advertisement
ADV_NONCONN_IND, // 3 Non-connectable undirected advertisement
SCAN_RSP // 4 Scan response
}
// iBeacon Application
class iBeacon {
_bt = null;
_active = null;
_uuid = null;
_currResp = null;
_filters = null;
_onIBeacon = null;
_onBeaconResp = null;
constructor(uuid, active) {
_uuid = uuid;
_active = active;
_filters = [];
_bootBLE();
}
function advertise(maj, min, pwr, resp = null) {
_currResp = resp;
local advert = _createIBeacon(_uuid, maj, min, pwr);
_advertise(advert, I_BEACON.MIN_ADVERT_MS, resp);
}
function scan(filter, onIBeacon, onBeaconResp = null) {
// Set callback for iBeacon
_onIBeacon = onIBeacon;
// Set callback for iBeacon device state update
_onBeaconResp = onBeaconResp;
// Add filter
if (filter != null) _filters.push(filter);
// Start scan with filters
_startScan(_filters, _active, _scanCB.bindenv(this));
}
function createGateWayFilter(major, minor, minRSSI) {
local data = format("%s%s", I_BEACON.DATA_LENGTH, I_BEACON.MFG_TYPE) +
I_BEACON.MFG_ID_APPLE +
format("%s%s", I_BEACON.SUB_TYPE, I_BEACON.SUB_TYPE_LENGTH) +
_uuid + major + minor;
return { "data" : data,
"minrssi" : minRSSI,
"cb" : _iBeaconFilterCb.bindenv(this) };
}
function createUUIDFilter(minRSSI) {
local data = format("%s%s", I_BEACON.DATA_LENGTH, I_BEACON.MFG_TYPE) +
I_BEACON.MFG_ID_APPLE +
format("%s%s", I_BEACON.SUB_TYPE, I_BEACON.SUB_TYPE_LENGTH) +
_uuid;
return { "data" : data,
"minrssi" : minRSSI,
"cb" : _iBeaconFilterCb.bindenv(this) };
}
function getCurrResp() {
return _currResp;
}
function stopAdvertising() {
_bt.stopadvertise();
}
// I-Beacon Helpers
// --------------------------------------------------
function _createIBeacon(uuid, major, minor, pwr) {
local advert = blob(I_BEACON.LENGTH);
advert.writestring(format("%s%s%s", I_BEACON.PREAMBLE, I_BEACON.DATA_LENGTH, I_BEACON.MFG_TYPE));
advert.writestring(I_BEACON.MFG_ID_APPLE);
advert.writestring(format("%s%s", I_BEACON.SUB_TYPE, I_BEACON.SUB_TYPE_LENGTH));
advert.writestring(uuid);
advert.writestring(major);
advert.writestring(minor);
advert.writen(pwr, 'c');
return advert;
}
function _createScanRespFilter(mac) {
return { "address" : mac,
"type" : BEACON_TYPE.SCAN_RSP,
"cb" : _scanRespCB.bindenv(this) };
}
function _iBeaconFilterCb(advert) {
// If there is also a scan response, add filter if we don't have one
local mac = advert.address;
local type = advert.type;
if (type == BEACON_TYPE.ADV_SCAN_IND) {
local haveRespFilter = false;
foreach(filter in _filters) {
if ("address" in filter && filter.address == mac) {
haveRespFilter = true;
break;
}
}
if (!haveRespFilter) {
// Add filter for response
_filters.push(_createScanRespFilter(mac));
// Restart scan with updated filters
_startScan(_filters, _active, _scanCB.bindenv(this));
}
}
if (_onIBeacon != null) {
// Verify iBeacon and pass to parsed beacon to callback
local beacon = {
"mac" : mac,
"rssi" : advert.rssi,
"ts" : time(),
};
local payload = advert.data;
local payloadLen = payload.len();
// Verify packet length, and set pointer to start of UUID
if (I_BEACON.LENGTH == payloadLen) {
payload.seek(9, 'b');
} else if (I_BEACON.NO_PRE_LENGTH == payloadLen) {
payload.seek(6, 'b');
} else {
return;
}
local advertUUID = payload.readblob(16);
local majMin = payload.readblob(4);
local pwr = payload.readn('c');
if (crypto.equals(_uuid, advertUUID)) {
beacon.uuid <- advertUUID
beacon.major <- majMin.readstring(2);
beacon.minor <- majMin.readstring(2);
beacon.pwr <- pwr;
_onIBeacon(beacon);
}
}
}
function _scanRespCB(advert) {
// Byte 1 & 2 - major
// Byte 3 & 4 - minor
// Byte 5 - LED State
// Byte 6 - ALS Event
local payload = advert.data;
local payloadLen = payload.len();
// Check that the payload is the expected length
if (payloadLen == 2) {
_respFromDevice(advert.address, payload)
} else if (payloadLen == 6) {
_respFromGateway(advert.address, payload);
} else {
server.log(payload);
}
}
function _respFromGateway(mac, payload) {
// Byte 1 & 2 - major
// Byte 3 & 4 - minor
// Byte 5 - LED State
// Byte 6 - ALS Event
payload.seek(0, 'b');
local majMin = payload.readblob(4);
local resp = {
"mac" : mac,
"ts" : time(),
"major" : majMin.readstring(2),
"minor" : majMin.readstring(2),
"ledState" : payload.readn('b'),
"alsEvent" : payload.readn('b')
}
if (_onBeaconResp) _onBeaconResp(resp);
}
function _respFromDevice(mac, payload) {
// Byte 1 - LED State
// Byte 2 - ALS Event
payload.seek(0, 'b');
local resp = {
"mac" : mac,
"ts" : time(),
"ledState" : payload.readn('b'),
"alsEvent" : payload.readn('b')
}
if (_onBeaconResp) _onBeaconResp(resp);
}
function _scanCB(adverts) {
foreach (advert in adverts) {
local cbIdx = advert.rule;
if (cbIdx < _filters.len() && "cb" in _filters[cbIdx]) {
_filters[cbIdx]["cb"](advert);
}
}
}
// BLE Helpers
// --------------------------------------------------
function _bootBLE() {
// Configure BLE Pins To Default State
BLE_REG_ON.configure(DIGITAL_OUT, 0);
BLE_LPO.configure(DIGITAL_OUT, 0);
BLE_UART_TX.configure(DIGITAL_OUT, 1);
BLE_UART_RX.configure(DIGITAL_IN_PULLDOWN);
// Setting BT_REG_ON high to power on the Bluetooth half of the 43438.
BLE_REG_ON.write(1);
// Give pin a moment to change pin state
imp.sleep(0.1);
// Open BT connection gets it ready to use.
// This operation BLOCKS and takes about 1.5 seconds
_bt = hardware.bluetooth.open(BLE_UART, BLE_FIRMWARE);
}
// Shuts off 43438 and frees up memeory used by BLE stack
function _shutdownBLE() {
// Don't shutdown if
if (_bt == null) return;
_bt.close();
_bt = null;
BLE_REG_ON.write(0);
}
function _advertise(advert, advertInterval = null, scan = null) {
if (advert.len() > I_BEACON.MAX_ADVERT_LEN) throw I_BEACON.ERROR_ADVERT_LEN;
local min = I_BEACON.MIN_ADVERT_MS;
local max = I_BEACON.MAX_ADVERT_MS;
if (advertInterval != null) {
min = advertInterval;
max = advertInterval;
}
if (scan != null) {
if (scan.len() > I_BEACON.MAX_ADVERT_LEN) throw I_BEACON.ERROR_SCAN_LEN;
_bt.startadvertise(advert, min, max, scan);
} else {
_bt.startadvertise(advert, min, max);
}
}
function _startScan(filters, active, cb) {
// Set scan filters
if (filters != null) _bt.setscanfilter(filters);
_bt.setscanparams(active, I_BEACON.SCAN_INTERVAL_MS, I_BEACON.SCAN_WINDOW_MS);
_bt.startscan(cb);
}
function _stopScan() {
_bt.stopscan()
}
}
// DevSimulator:
// Checks LX level
// Tracks LED state
class DevSimulator {
static LX_THRESHOLD = 3000;
static READING_TIMER = 5;
ledState = null;
alsEvent = null;
constructor() {
ledState = 0;
_checkLXLevel();
}
function getState() {
return {
"led" : ledState,
"als" : alsEvent,
}
}
function setLED(state) {
ledState = state;
}
function _checkLXLevel() {
alsEvent = (hardware.lightlevel() > LX_THRESHOLD);
imp.wakeup(READING_TIMER, _checkLXLevel.bindenv(this));
}
}
// RUNTIME
// -------------------------------------------------------------------------------
server.log("Device running...");
server.log(imp.getsoftwareversion());
imp.enableblinkup(true);
// Generate with random generator ie https://www.uuidgenerator.net/
const UUID = "\x75\xa1\x6d\x1a\xc9\xd9\x4a\x1a\x8a\x9a\x7f\x5b\x52\xc7\xb8\xd5";
const MAJOR = "\x00\x01";
const MINOR = "\x00\x04";
// Expected rssi at 1m
const POWER = -60;
const MIN_RSSI = -90;
const GATEWAY_MAJOR = "\x00\x00";
const GATEWAY_MINOR = "\x00\x00";
const LOOP_TIMER = 10;
// Initialize BLE iBeacon class with uuid and active scanning enabled
ble <- iBeacon(UUID, true);
dev <- DevSimulator();
function advertLoop() {
local state = dev.getState();
local scanResp = format("%c%c", state.led, (state.als) ? 1 : 0);
// Update advert
if (ble.getCurrResp() != scanResp) ble.advertise(MAJOR, MINOR, POWER, scanResp);
imp.wakeup(LOOP_TIMER, advertLoop);
}
function onBeaconResp(resp) {
// Check if response was pointed at this device
if (resp.major == MAJOR && resp.minor == MINOR && "ledState" in resp) {
dev.setLED(resp.ledState);
}
}
// Start scan for gateway beacons
ble.scan(ble.createGateWayFilter(GATEWAY_MAJOR, GATEWAY_MINOR, MIN_RSSI), null, onBeaconResp);
// Start broadcasting iBeacon
advertLoop();
// iBeacon Bi-Directional Gateway Application
// Map hardware pins to global variables
BLE_REG_ON <- hardware.pinJ;
BLE_LPO <- hardware.pinE;
BLE_UART_TX <- hardware.pinF;
BLE_UART_RX <- hardware.pinG;
BLE_UART <- hardware.uartFGJH;
// BLE FIRMWARE
// Firmware is a string or blob containing Broadcom-proprietary firmware
// which is softloaded into the 43438 on boot. This is approximately
// 16KB in size.
// _wiced_3_4_0_43438a1_37_4mhz
const BLE_FIRMWARE = "\x4C\xFC\x46\x00\x17\x21\x00\x42\x52\x43\x4D\x63\x66\x67\x53\x00\x00\x00\x00\x32\x00\x00\x00\x01\x01\x04\x18\x92\x00\x00\x00\x03\x06\xAC\x1F\x12\xA1\x43\x43\x00\x01\x1C\x42\x17\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFE\x00\x00\x4C\xFC\xFF\x42\x17\x21\x00\x42\x52\x43\x4D\x63\x66\x67\x44\x00\x00\x00\x00\xF1\x39\x00\x00\x03\x03\x22\x42\x43\x4D\x34\x33\x34\x33\x41\x31\x20\x55\x41\x52\x54\x20\x33\x37\x2E\x34\x20\x4D\x48\x7A\x20\x77\x6C\x62\x67\x61\x5F\x72\x65\x66\x00\x16\x03\x02\x1C\x00\x02\x01\x98\x03\x08\x01\x32\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x32\x00\xFF\x0F\x00\x00\x62\x08\x00\x00\x70\x00\x64\x00\x80\x00\x00\x00\x80\x00\x00\x00\xAC\x00\x32\x00\xFF\xFF\xFF\x01\x00\x00\x2F\x00\x8C\x00\x32\x00\x00\xF0\xFF\x0F\x00\x10\x11\x01\x78\x00\x32\x00\xFF\xFF\xFF\xFF\xB9\xB8\xB8\xB8\x60\x2C\x20\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x10\x01\x32\x00\x00\x00\xFF\xFF\x00\x00\x18\x18\x6C\x01\x60\x00\xFF\xFF\xFF\xFF\x0B\x00\x00\x00\x70\x01\x60\x00\xFF\xFF\xFF\xFF\x10\x00\x00\x00\x74\x01\x60\x00\xFF\xFF\xFF\xFF\x15\x00\x00\x00\x78\x01\x60\x00\xFF\xFF\xFF\xFF\x19\x00\x00\x00\x7C\x01\x60\x00\xFF\xFF\x00\x00\x1D\x00\x00\x00\x84\x01\x60\x00\xFF\xFF\xFF\xFF\x21\x00\x00\x00\x60\x06\x41\x00\xFF\xFF\x00\x00\x33\x03\x00\x00\x64\x06\x41\x00\xFF\xFF\x00\x00\x29\x4C\xFC\xFF\x3D\x18\x21\x00\x3A\x00\x00\x64\x06\x41\x00\xFF\xFF\x00\x00\x29\x3A\x00\x00\x68\x06\x41\x00\xFF\xFF\x00\x00\x68\x05\x00\x00\x6C\x06\x41\x00\xFF\xFF\x00\x00\xA8\x30\x00\x00\x70\x06\x41\x00\xFF\xFF\x00\x00\xE8\x3E\x00\x00\x74\x06\x41\x00\xFF\xFF\x00\x00\x1C\x32\x00\x00\x78\x06\x41\x00\xFF\xFF\x00\x00\xBB\x33\x00\x00\x7C\x06\x41\x00\xFF\xFF\x00\x00\x30\x09\x00\x00\x40\x01\x41\x00\xFF\xFF\x00\x00\x10\x05\x00\x00\x44\x01\x41\x00\xFF\xFF\x00\x00\x09\x09\x00\x00\x4C\x01\x41\x00\xFF\xFF\x00\x00\x09\x08\x00\x00\x50\x01\x41\x00\xFF\xFF\x00\x00\x0F\x07\x00\x00\x54\x01\x41\x00\xFF\xFF\x00\x00\x05\x08\x00\x00\x5C\x01\x41\x00\xFF\xFF\x00\x00\x0E\x09\x00\x00\x60\x01\x41\x00\xFF\xFF\x00\x00\x05\x09\x00\x00\x64\x01\x41\x00\xFF\xFF\x00\x00\x10\x0A\x00\x00\xE0\x06\x41\x00\xFF\xFF\x00\x00\x71\x20\x00\x00\x9C\x01\x60\x00\xFF\x00\x00\x00\x03\x00\x00\x00\x64\x01\x60\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x09\x01\x04\x02\x01\x00\x00\x22\x03\x02\x01\x00\xF0\x01\x28\x04\x00\x00\x00\x20\x15\x32\x00\xFF\xFF\xFA\xFF\xD9\x03\x3E\xFE\x28\x4C\xFC\xFF\x38\x19\x21\x00\x15\x32\x00\x00\x00\x7F\xFE\x34\x10\x28\x02\x2C\x09\x64\x00\x0E\x00\x00\x00\x0C\x00\x00\x00\xF0\x01\x28\x01\x00\x00\x00\x20\x15\x32\x00\xFF\xFF\xFA\xFF\xDD\x03\x3E\xFE\x28\x15\x32\x00\x00\x00\x7F\xFE\x34\x10\x28\x02\x2C\x09\x64\x00\x0E\x00\x00\x00\x0C\x00\x00\x00\xF0\x01\x28\x02\x00\x00\x00\x20\x15\x32\x00\xFF\xFF\xFA\xFF\xD9\x03\x3E\xFE\x28\x15\x32\x00\x00\x00\x7F\xFE\x34\x10\x28\x02\x2C\x09\x64\x00\x0E\x00\x00\x00\x0C\x00\x00\x00\xF0\x01\xA0\x01\x03\x00\x00\x00\x10\x15\x32\x00\x00\x00\x00\x00\xF0\xF0\xF0\x00\x14\x15\x32\x00\x00\x00\x00\x00\xF0\xF0\xF0\x00\x18\x15\x32\x00\x00\x00\x00\x00\xF0\xF0\xF0\x00\x1C\x15\x32\x00\x00\x00\x00\x00\x4C\x4C\x00\x00\x20\x15\x32\x00\xFF\xFF\xFA\xFF\xDD\x03\x3E\xFE\x24\x15\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x15\x32\x00\x00\x00\x7F\xFE\x34\x10\x28\x02\x34\x15\x32\x00\x00\x00\x00\x00\xF0\x00\x00\x00\x38\x15\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x15\x32\x00\x00\x00\x00\x00\xCA\x06\x00\x00\x2C\x09\x64\x00\x0E\x00\x00\x00\x0C\x00\x00\x00\xF8\x00\x4C\xFC\xFF\x33\x1A\x21\x00\x64\x00\x51\x00\x00\x00\x10\x00\x00\x00\x78\x08\x64\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x07\xB5\x03\x04\x06\x0A\x23\x3C\x5A\x6E\x7D\x05\x38\x04\x88\x04\x9C\x04\x88\x04\xD8\x04\x74\x04\xC4\x04\xD8\x04\xC4\x04\x14\x05\xB0\x04\x00\x05\x14\x05\x00\x05\x50\x05\xF6\x04\x46\x05\x5A\x05\x46\x05\x96\x05\x3C\x05\x8C\x05\xA0\x05\x8C\x05\xDC\x05\x82\x05\xD2\x05\xE6\x05\xD2\x05\x22\x06\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\xA8\x02\xA8\x02\xA8\x02\xA8\x02\xA8\x02\xE4\x02\xE4\x02\xE4\x02\xE4\x02\xE4\x02\x20\x03\x20\x03\x20\x03\x20\x03\x20\x03\x66\x03\x66\x03\x66\x03\x66\x03\x66\x03\xAC\x03\xAC\x03\xAC\x03\xAC\x03\xAC\x03\xF2\x03\xF2\x03\xF2\x03\xF2\x03\xF2\x03\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x06\x00\x00\x00\x60\x00\x05\x9C\x02\xFF\xA0\x02\xFF\xA4\x02\xFF\xA8\x02\xFF\xAC\x02\xFF\x00\x00\x60\x00\x05\xC8\x02\xFF\xCC\x02\xFF\xD0\x02\xFF\xD4\x02\xFF\xD8\x02\xFF\x00\x00\x60\x00\x05\x88\x03\xFF\x8C\x03\xFF\x90\x03\xFF\x94\x03\xFF\x98\x03\xFF\x00\x00\x60\x00\x05\x9C\x03\xFF\xA0\x03\x4C\xFC\xFF\x2E\x1B\x21\x00\xFF\xA4\x03\xFF\xA8\x03\xFF\xAC\x03\xFF\x00\x00\x60\x00\x05\x80\x03\xFF\x84\x03\xFF\xA0\x06\xFF\xB4\x02\xFF\x38\x07\xFF\x00\x00\x60\x00\x03\xA4\x06\xFF\x5C\x06\xFF\x98\x06\xFF\x4C\x4C\x4C\x4C\x4C\x41\x41\x41\x41\x41\x85\x85\x85\x85\x84\xA6\xA5\xA5\xA5\xA5\xA4\xF4\x18\x03\xFA\x65\x03\xCC\x5F\x5F\x5F\x5F\x5F\x4D\x4D\x4D\x4D\x4D\x84\x84\x84\x84\x83\xA5\xA4\xA4\xA4\xA4\xA4\xF4\x1A\x03\xFA\x66\x03\xCC\x6C\x6C\x6C\x6C\x6C\x58\x58\x58\x58\x58\x84\x84\x84\x84\x83\xA5\xA4\xA4\xA4\xA4\xA4\xF4\x1F\x03\xFA\x66\x03\xCC\x85\x85\x85\x85\x85\x69\x69\x69\x69\x69\x84\x84\x84\x84\x83\xA5\xA4\xA4\xA4\xA4\xA4\xF4\x1F\x03\xFA\x66\x03\xCC\x99\x99\x99\x99\x99\x74\x74\x74\x74\x74\x84\x84\x84\x84\x83\xA5\xA4\xA4\xA4\xA4\xA4\xF4\x1F\x03\xFA\x67\x03\xCC\xB3\xB3\xB3\xB3\xB3\x82\x82\x82\x82\x82\x84\x84\x84\x84\x83\xA5\xA4\xA4\xA4\xA4\xA4\xF4\x1F\x03\xFA\x67\x23\xFF\x01\x07\xB5\x03\x00\x06\x0A\x23\x3C\x5A\x6E\x7D\x05\x5C\x03\x3E\x03\x48\x03\x5C\x03\x48\x03\x98\x03\x7A\x03\x84\x03\x98\x03\x84\x03\xD4\x03\xB6\x03\xC0\x03\x4C\xFC\xFF\x29\x1C\x21\x00\xD4\x03\xC0\x03\x1A\x04\xFC\x03\x06\x04\x1A\x04\x06\x04\x60\x04\x42\x04\x4C\x04\x60\x04\x4C\x04\xA6\x04\x88\x04\x92\x04\xA6\x04\x92\x04\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x44\x02\x30\x02\x26\x02\x12\x02\x1C\x02\x80\x02\x6C\x02\x62\x02\x4E\x02\x58\x02\xBC\x02\xA8\x02\x9E\x02\x8A\x02\x94\x02\x02\x03\xEE\x02\xE4\x02\xD0\x02\xDA\x02\x48\x03\x34\x03\x2A\x03\x16\x03\x20\x03\x8E\x03\x7A\x03\x70\x03\x5C\x03\x66\x03\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x06\x00\x00\x00\x60\x00\x05\x9C\x02\xFF\xA0\x02\xFF\xA4\x02\xFF\xA8\x02\xFF\xAC\x02\xFF\x00\x00\x60\x00\x05\xC8\x02\xFF\xCC\x02\xFF\xD0\x02\xFF\xD4\x02\xFF\xD8\x02\xFF\x00\x00\x60\x00\x05\x88\x03\xFF\x8C\x03\xFF\x90\x03\xFF\x94\x03\xFF\x98\x03\xFF\x00\x00\x60\x00\x05\x9C\x03\xFF\xA0\x03\xFF\xA4\x03\xFF\xA8\x03\xFF\xAC\x03\xFF\x00\x00\x60\x00\x05\x80\x03\xFF\x84\x03\xFF\xA0\x06\xFF\xB4\x02\xFF\x38\x07\xFF\x00\x00\x60\x00\x03\xA4\x06\xFF\x5C\x06\xFF\x98\x06\xFF\x43\x39\x37\x37\x38\x38\x35\x35\x36\x35\x88\x86\x86\x86\x85\xA8\xA6\x4C\xFC\xFF\x24\x1D\x21\x00\xA6\xA6\xA4\xA4\xF4\x18\x03\xFA\x65\x03\xCC\x4C\x45\x41\x42\x43\x40\x3C\x3B\x3B\x3C\x88\x86\x86\x86\x85\xA8\xA6\xA6\xA6\xA4\xA4\xF4\x1A\x03\xFA\x66\x03\xCC\x5C\x52\x52\x52\x52\x4B\x47\x47\x47\x47\x88\x86\x86\x86\x85\xA8\xA6\xA6\xA6\xA4\xA4\xF4\x1F\x03\xFA\x66\x03\xCC\x6A\x63\x5F\x5F\x64\x57\x53\x52\x52\x53\x88\x86\x86\x86\x85\xA8\xA6\xA6\xA6\xA4\xA4\xF4\x1F\x03\xFA\x66\x03\xCC\x7C\x71\x6E\x6E\x71\x61\x5D\x5C\x5C\x5D\x88\x86\x86\x86\x85\xA8\xA6\xA6\xA6\xA4\xA4\xF4\x1F\x03\xFA\x67\x03\xCC\x8C\x81\x7F\x7F\x81\x6F\x68\x67\x67\x68\x88\x86\x86\x86\x85\xA8\xA6\xA6\xA6\xA4\xA4\xF4\x1F\x03\xFA\x67\x23\xFF\x02\x07\x7F\x04\x06\x05\x38\x04\x88\x04\x9C\x04\x88\x04\xD8\x04\x74\x04\xC4\x04\xD8\x04\xC4\x04\x14\x05\xB0\x04\x00\x05\x14\x05\x00\x05\x50\x05\xF6\x04\x46\x05\x5A\x05\x46\x05\x96\x05\x3C\x05\x8C\x05\xA0\x05\x8C\x05\xDC\x05\x82\x05\xD2\x05\xE6\x05\xD2\x05\x22\x06\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x01\x00\x00\x00\x60\x00\x05\x9C\x02\xFF\xA0\x02\xFF\xA4\x02\xFF\xA8\x02\xFF\xAC\x02\xFF\x4C\xFC\xFF\x1F\x1E\x21\x00\x4C\x4C\x4C\x4C\x4C\x5F\x5F\x5F\x5F\x5F\x6C\x6C\x6C\x6C\x6C\x85\x85\x85\x85\x85\x99\x99\x99\x99\x99\xB3\xB3\xB3\xB3\xB3\x02\x07\x7F\x00\x06\x05\x5C\x03\x3E\x03\x48\x03\x5C\x03\x48\x03\x98\x03\x7A\x03\x84\x03\x98\x03\x84\x03\xD4\x03\xB6\x03\xC0\x03\xD4\x03\xC0\x03\x1A\x04\xFC\x03\x06\x04\x1A\x04\x06\x04\x60\x04\x42\x04\x4C\x04\x60\x04\x4C\x04\xA6\x04\x88\x04\x92\x04\xA6\x04\x92\x04\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x14\xFF\x01\x00\x00\x00\x60\x00\x05\x9C\x02\xFF\xA0\x02\xFF\xA4\x02\xFF\xA8\x02\xFF\xAC\x02\xFF\x43\x39\x37\x37\x38\x4C\x45\x41\x42\x43\x5C\x53\x52\x52\x52\x6A\x63\x5F\x5F\x64\x7C\x71\x6E\x6E\x71\x8C\x81\x7F\x7F\x81\x00\x07\x04\x3F\x00\x00\x00\x03\x01\xC4\x01\x08\x0A\x20\x00\x08\x08\x00\x00\x04\x04\x00\x00\x10\x10\x00\x00\x08\x08\x00\x00\x18\x18\x00\x00\x28\x28\x00\x00\x20\x20\x00\x00\x2C\x2C\x00\x00\x28\x28\x00\x00\x30\x30\x00\x00\x41\x41\x00\x00\x34\x34\x00\x00\x49\x49\x00\x00\x20\x20\x01\x01\x50\x50\x00\x00\x24\x24\x01\x01\x58\x58\x00\x00\x40\x40\x01\x01\x8A\x8A\x00\x00\x4C\xFC\xFF\x1A\x1F\x21\x00\x60\x60\x01\x01\x8B\x8B\x00\x00\x64\x64\x01\x01\x8C\x8C\x00\x00\x60\x60\x02\x02\x8D\x8D\x00\x00\x64\x64\x02\x02\x8E\x8E\x00\x00\x68\x68\x02\x02\x8F\x8F\x00\x00\x6C\x6C\x02\x02\x96\x96\x00\x00\x70\x70\x02\x02\xA5\xA5\x00\x00\x50\x50\x03\x03\xA6\xA6\x00\x00\x54\x54\x03\x03\xDD\xDD\x00\x00\x74\x74\x03\x03\xE5\xE5\x00\x00\x78\x78\x03\x03\xED\xED\x00\x00\x98\x98\x03\x03\xEE\xEE\x00\x00\xFC\xFC\x03\x03\xEF\xEF\x00\x00\xBC\xBC\x03\x03\xEF\xEF\x00\x00\xBC\xBC\x03\x03\x03\x01\x64\xC8\x0A\x20\x00\x40\x00\x00\x01\x40\x00\x00\x01\x40\x00\x00\x01\x40\x00\x00\x01\x40\x00\x00\x01\x41\x00\x04\x01\x49\x00\x24\x01\x50\x00\x40\x01\x58\x00\x60\x01\x52\x00\x48\x01\x53\x00\x4C\x01\x54\x00\x50\x01\x55\x00\x54\x01\x56\x00\x58\x01\x57\x00\x5C\x01\x66\x00\x98\x01\x6E\x00\xB8\x01\x76\x00\xD8\x01\x7E\x00\xF8\x01\x7F\x00\xFC\x01\x7F\x00\xFC\x01\x7F\x00\xFC\x01\x7F\x00\xFC\x01\x7F\x00\xFC\x01\x03\x01\x3A\x28\x0B\x20\x00\x01\x00\x00\x01\x00\x00\x05\x00\x00\x0D\x00\x00\x1D\x00\x00\x0E\x00\x00\x1E\x00\x00\x3E\x00\x00\x0F\x4C\xFC\xFF\x15\x20\x21\x00\x00\x00\x1F\x00\x00\x3F\x00\x00\x7F\x00\x00\xFF\x00\x00\xFF\x00\x00\xFF\x00\x00\xFF\x00\x00\xFF\x00\x00\xFF\x00\x00\x03\x01\x05\x08\x08\x20\x00\x06\x03\x01\x05\x0C\x08\x20\x00\x05\x03\x01\x05\x10\x08\x20\x00\x0B\x03\x01\x05\x14\x08\x20\x00\x0A\x04\x07\x98\x01\x04\x32\x1F\x00\x00\x1D\x00\x00\x1C\x01\x00\x1A\x02\x00\x17\x02\x00\x15\x12\x00\x13\x55\x00\x11\x64\x00\x0F\x11\x00\x0E\x03\x00\x0D\x14\x00\x0B\x50\x00\x0A\x64\x00\x09\x23\x00\x08\x23\x00\x07\x03\x00\x07\x16\x00\x06\x15\x00\x05\x13\x00\x05\x16\x00\x04\x13\x00\x04\x26\x00\x04\x19\x00\x03\x05\x00\x03\x08\x00\x03\x2A\x00\x02\x03\x00\x02\x16\x00\x02\x09\x00\x02\x2B\x00\x02\x3D\x00\x02\x3F\x00\x01\x02\x00\x01\x15\x00\x01\x18\x00\x01\x3A\x00\x01\x1D\x00\x01\x1F\x00\x01\x8F\x00\x01\xEF\x00\x01\x3F\x01\x01\x8F\x01\x01\xCF\x01\x01\x0F\x02\x01\x4F\x02\x01\x7F\x02\x01\xAF\x02\x01\xCF\x02\x01\x00\x00\x01\x00\x00\x04\x07\x98\x01\x00\x32\x1F\x00\x00\x1D\x00\x00\x1C\x01\x00\x1A\x02\x00\x17\x02\x00\x15\x12\x00\x13\x55\x00\x11\x64\x00\x0F\x11\x00\x0E\x4C\xFC\xFF\x10\x21\x21\x00\x03\x00\x0D\x14\x00\x0B\x50\x00\x0A\x64\x00\x09\x23\x00\x08\x23\x00\x07\x03\x00\x07\x16\x00\x06\x15\x00\x05\x13\x00\x05\x16\x00\x04\x13\x00\x04\x26\x00\x04\x19\x00\x03\x05\x00\x03\x08\x00\x03\x2A\x00\x02\x03\x00\x02\x16\x00\x02\x09\x00\x02\x2B\x00\x02\x3D\x00\x02\x3F\x00\x01\x02\x00\x01\x15\x00\x01\x18\x00\x01\x3A\x00\x01\x1D\x00\x01\x1F\x00\x01\x8F\x00\x01\xEF\x00\x01\x3F\x01\x01\x8F\x01\x01\xCF\x01\x01\x0F\x02\x01\x4F\x02\x01\x7F\x02\x01\xAF\x02\x01\xCF\x02\x01\x00\x00\x01\x00\x00\x03\x07\x2B\x01\x00\x00\x00\x01\x00\x00\x00\x00\x14\x0A\x00\x04\x00\x00\x00\x00\x00\x00\x0A\x02\xFE\x0B\xE4\xFE\x1C\x01\xE4\xFE\x1C\x01\x0A\x02\xFE\x0B\xF1\xFF\x0F\x00\xF1\xFF\x0F\x00\x0F\x03\x28\x02\x78\x14\x7F\x5A\x00\x14\x02\x14\x1E\x00\x02\x03\x00\x1E\xAA\x33\x19\x05\xCF\x00\x80\x0A\x92\x00\x00\x00\x00\x07\x00\x00\xA2\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x05\x18\x13\x21\x00\x90\x03\x01\x0C\xDC\x1D\x20\x00\x01\x01\x30\x00\x02\x0A\x0A\x00\x03\x01\x05\x48\x2C\x20\x00\x01\x03\x01\x05\x24\x33\x20\x00\x00\x03\x4C\xFC\xFF\x0B\x22\x21\x00\x01\x05\x4E\x05\x20\x00\x00\x03\x01\x14\x00\x02\x0D\x00\x8F\xB0\x00\x24\x01\x48\xC4\x61\x6D\xF7\x90\xBC\x00\x3F\x20\x00\x03\x01\x0E\x10\x02\x0D\x00\x10\x22\xA8\xF7\x9D\xFD\xA9\xF7\x53\xB8\x03\x01\x12\x1A\x02\x0D\x00\x02\xD5\x20\x46\x00\xF0\x81\xF8\xA8\xF7\xCF\xBB\x00\x00\x03\x01\x0C\x28\x02\x0D\x00\x00\xF0\xDE\xF8\x10\xBD\x00\x00\x03\x01\x0C\x30\x02\x0D\x00\x73\xF7\xC0\xFC\x72\xF7\xA6\xBA\x03\x01\x0C\x38\x02\x0D\x00\x00\xF0\xF4\xF8\x10\xBD\x00\x00\x03\x01\x18\x40\x02\x0D\x00\x20\x46\x29\x46\x00\xF0\xF8\xF9\x08\xB1\x4F\xF7\x57\xBF\x4F\xF7\x69\xBF\x00\x00\x03\x01\x24\x54\x02\x0D\x00\x04\x70\x7D\xF7\xA6\xFC\x5E\xF7\x57\xFD\x5B\xF7\x11\xFD\x5B\xF7\x67\xFD\x00\xF0\xF6\xF8\x4F\xF4\xC0\x20\x00\x21\x5B\xF7\xAE\xBC\x03\x01\x14\x74\x02\x0D\x00\x15\x7F\x06\x2D\x01\xD0\xC2\xF8\x1A\x40\x86\xF7\xD1\xBC\x00\x00\x03\x01\x10\x84\x02\x0D\x00\xE8\x60\x01\x20\xA8\x76\x99\xF7\x49\xBF\x00\x00\x03\x01\x10\x90\x02\x0D\x00\xC8\xF8\x08\x10\x00\xF0\xDE\xFB\x73\xF7\x7C\xB8\x03\x01\x0C\x9C\x02\x0D\x00\x00\xF0\x88\xFC\x4C\xFC\xFF\x06\x23\x21\x00\xBD\xE8\xF0\x81\x03\x01\x0C\xA4\x02\x0D\x00\x01\xF0\x66\xFA\xBD\xE8\xF0\x81\x03\x01\x0C\xAC\x02\x0D\x00\xBD\xE8\xF0\x4F\x01\xF0\xD9\xBB\x03\x01\x10\xB4\x02\x0D\x00\x62\xF7\xAF\xFD\xAD\xF8\x0C\x00\x64\xF7\x5C\xBD\x03\x01\x0C\xC0\x02\x0D\x00\x01\xF0\x52\xFD\x70\xBD\x00\x00\x03\x01\x18\xC8\x02\x0D\x00\x01\x20\x60\xF3\x0F\x24\x04\xF0\xFE\x00\x5C\xF7\xBE\xFF\x5D\xF7\x14\xB8\x00\x00\x03\x01\x10\xDC\x02\x0D\x00\x28\x46\x02\xF0\x0F\xFB\xBD\xE8\xF0\x81\x00\x00\x03\x01\x14\xE8\x02\x0D\x00\x20\x46\x02\x49\x32\xF7\xF3\xFE\xA6\xF7\xFD\xBE\x25\x2A\x0D\x00\x03\x01\x0C\xF8\x02\x0D\x00\x02\xF0\xCB\xFB\x32\xF7\x2C\xBE\x03\x01\x1C\x00\x03\x0D\x00\x04\x46\x0D\x46\x02\xF0\xCF\xFB\x10\xB1\x02\x4A\x32\xF7\x6B\xBF\x70\xBD\x00\x00\xC4\x18\x20\x00\x03\x01\x10\x18\x03\x0D\x00\x02\x28\x01\xD9\x4B\xF7\x70\xB9\x4B\xF7\x71\xB9\x03\x01\xC8\x01\x24\x03\x0D\x00\x2D\xE9\xF0\x47\x04\x46\x90\xF8\xD2\x00\x00\xF0\x6B\xF8\x06\x46\xB4\xF8\x48\x00\xB4\xF8\x4A\x10\x88\x42\x03\xD0\x94\xF8\x20\x21\xA8\xF7\xB2\xFA\x45\x00\x35\x80\x4A\x4C\xFC\xFF\x01\x24\x21\x00\xD0\xB4\xF8\x22\x11\x20\x46\x64\xF7\xEF\xFD\x82\x46\x20\x6C\x00\x26\x20\xF4\x80\x20\x4F\xF6\xFF\x79\x20\x64\x04\xEB\x46\x07\xB7\xF8\x28\x01\x48\x45\x37\xD0\x41\x00\x50\x46\x70\xF7\x3E\xFB\xB0\xFB\xF5\xF1\x80\x46\x05\xFB\x11\x80\xA7\xF8\x28\x01\x5F\xEA\x48\x10\x15\xD4\x94\xF8\xD2\x00\x66\xF7\x5C\xFD\x40\x01\x20\xD5\x4F\xF0\x80\x60\xB0\xFB\xF5\xF1\x69\x43\x40\x46\x70\xF7\xAD\xFC\xB0\xFB\xF5\xF1\x05\xFB\x11\x01\xA7\xF8\x28\x11\x40\x01\x10\xD5\xB7\xF8\x28\x01\x02\x23\x2A\x46\x00\x21\x64\xF7\x41\xFA\xA7\xF8\x28\x01\x01\x20\xB0\x40\x21\x6C\xC0\xF3\x00\x00\x41\xEA\x80\x40\x20\x64\x76\x1C\x06\x2E\xC1\xD3\xBD\xE8\xF0\x87\x03\x01\x24\xE8\x03\x0D\x00\x05\x48\x00\x68\x00\x06\x04\xD5\x04\x48\x01\x68\x21\xF0\x02\x01\x01\x60\x00\xF0\x2C\xB8\x00\x00\xFC\x32\x20\x00\x6C\x01\x32\x00\x03\x01\x20\x08\x04\x0D\x00\x04\x49\x09\x78\x88\x42\x03\xD2\x03\x49\x01\xEB\x40\x00\x70\x47\x00\x20\x70\x47\x49\x29\x20\x00\xE0\x30\x0D\x00\x03\x01\x2C\x24\x04\x0D\x00\x06\x4A\x12\x78\x3A\xB1\x06\x4A\x12\x68\x92\x05\x05\xD5\x05\x4C\xFC\xFF\xFC\x24\x21\x00\x4A\x12\x78\x00\x2A\x01\xD0\x80\xF8\x56\x10\x70\x47\xAC\x30\x0D\x00\xFC\x32\x20\x00\xF3\x32\x20\x00\x03\x01\x0E\x4C\x04\x0D\x00\x1F\x48\x00\x21\x01\x60\x08\x46\x70\x47\x03\x01\xAA\x01\x56\x04\x0D\x00\x70\xB5\x1D\x4D\x28\x68\x00\x28\x33\xD0\x1C\x49\x1D\x4C\x09\x78\x22\x78\x51\x43\x74\xF7\xC1\xFF\x00\x20\xFF\x22\x29\x68\x03\xE0\x01\xEB\x00\x13\x40\x1C\x1A\x71\x23\x78\x98\x42\xF8\xD3\x15\x48\x01\x24\x01\x78\x15\x48\x00\x68\x00\xF8\x01\x1B\x14\x49\x08\x60\x14\x49\x0A\x78\x02\x70\x13\x48\x02\x78\x13\x48\x00\x68\x00\xF8\x01\x2B\x12\x4A\x10\x60\x0B\x78\x04\xEB\x43\x03\x03\x70\x10\x68\x10\x4A\x09\x78\x12\x78\xBD\xE8\x70\x40\x10\x44\xFF\x22\xA4\xF7\xF8\xBA\x70\xBD\x00\x00\xA2\x34\x20\x00\xA8\x34\x20\x00\x99\x34\x20\x00\x98\x34\x20\x00\x68\x33\x20\x00\xAC\x34\x20\x00\xB0\x34\x20\x00\x9E\x34\x20\x00\x69\x33\x20\x00\xB4\x34\x20\x00\xB8\x34\x20\x00\x9B\x34\x20\x00\x03\x01\xC0\x02\xFC\x04\x0D\x00\x2D\xE9\xF7\x4F\x82\xB0\x04\x00\x18\xD0\xB4\xF8\x50\x10\xB4\xF8\x4E\x00\x0D\x1A\x95\x42\x00\xD9\x15\x46\x28\x4C\xFC\xFF\xF7\x25\x21\x00\x44\xA4\xF8\x4E\x00\x20\x6C\xA9\x46\x28\x44\x20\x64\x61\x6A\x04\xF1\x10\x00\x4F\xF0\x00\x0A\x00\x90\x51\xB9\x83\xF7\x01\xF9\x18\xB1\x00\x20\x05\xB0\xBD\xE8\xF0\x8F\x20\x69\x60\x62\xC4\xF8\x2C\xA0\xD4\xF8\x24\x80\x04\xF1\x55\x0B\x57\xE0\xB4\xF8\x4C\x10\xE0\x6A\x0E\x1A\xAE\x42\x00\xD9\x2E\x46\xA1\x69\x08\xF1\x0C\x07\x38\x44\x0B\x68\x32\x46\x03\x99\x98\x47\x03\x90\x94\xF8\x54\x00\x30\xB1\xE0\x6A\x32\x46\xC1\x19\x58\x46\x96\xF7\x57\xFD\x08\xE0\x94\xF8\x55\x00\x28\xB1\xE0\x6A\x32\x46\xC1\x19\x58\x46\x96\xF7\x35\xFD\xE0\x6A\xAD\x1B\x30\x44\xE0\x62\xB4\xF8\x4C\x10\x88\x42\x2C\xD1\x40\x46\x83\xF7\xC0\xF8\x04\xF1\x08\x01\x40\x46\x83\xF7\xB7\xF8\xC4\xF8\x2C\xA0\x00\x98\x83\xF7\xBB\xF8\xD8\xB1\xC4\xF8\x24\xA0\x5D\xB1\xB4\xF8\x4E\x00\xA9\xEB\x05\x09\xA0\xEB\x05\x00\xA4\xF8\x4E\x00\x20\x6C\xA0\xEB\x05\x00\x20\x64\xE0\x69\xB4\xF8\x4E\x20\x81\x68\xD9\xB1\xC1\x8B\xCB\x06\x18\xD5\xC1\xF3\x01\x03\x01\x2B\x06\xD0\x08\xE0\x20\x69\x60\x62\x80\x46\x00\x2D\xA5\xD1\xEC\xE7\x83\x8B\x93\x42\x04\xD9\x8B\x07\x08\xD1\x4C\xFC\xFF\xF2\x26\x21\x00\x83\x8B\x93\x42\x05\xD3\x21\xF0\x10\x01\xC1\x83\x82\x68\x81\x69\x90\x47\xA0\x69\xC1\x8B\x41\xF0\x10\x01\xC1\x83\x20\x46\x96\xF7\xC0\xFB\x48\x46\x80\xE7\x03\x01\x38\x38\x06\x0D\x00\x70\xB5\x05\x46\x08\x46\x01\x26\x90\xF8\xA3\x00\xB5\xF8\x0B\x40\xA9\x7A\x40\x09\x00\x22\x48\xF7\xD3\xFD\x00\x28\x09\xD0\x40\x88\xA0\x42\x00\xD2\x04\x46\x2A\x7A\x21\x46\x30\x46\x4F\xF7\x3E\xF9\x01\x20\x70\xBD\x03\x01\x84\x02\x6C\x06\x0D\x00\x2D\xE9\xF0\x4F\x87\xB0\x17\x46\x00\xF1\x09\x04\x53\xF7\x6E\xFF\x74\xF7\x16\xF8\x74\xF7\xEB\xFE\x06\x90\x01\x20\x89\xF7\x84\xFC\x47\x4D\x28\x69\x40\xF0\x01\x00\x28\x61\x28\x68\x40\xF0\x01\x00\x28\x60\x4F\xF4\x48\x1B\xDB\xF8\x00\x00\x42\x4E\x00\x90\x30\x68\x01\x90\x41\x48\x00\x68\x02\x90\x56\xF8\xB8\x0C\xDF\xF8\xFC\x90\x03\x90\xD9\xF8\x00\x00\xDF\xF8\xF8\x80\x04\x90\xD8\xF8\x00\x00\x4F\xF0\x00\x0A\x05\x90\xCB\xF8\x00\xA0\x4F\xF0\x64\x00\x4C\xF7\x18\xFF\x01\x20\x30\x60\x34\x48\xD4\xF8\x06\x10\x01\x60\xE0\x78\x40\xF0\x80\x00\x46\xF8\xB8\x0C\x4F\xF4\xC0\x41\xC8\xF8\x00\x10\xC8\x20\x4C\xFC\xFF\xED\x27\x21\x00\x4C\xF7\x06\xFF\xA0\x88\x40\xF4\x00\x51\xC9\xF8\x00\x10\x41\xF2\x88\x30\x4C\xF7\xFD\xFE\xA1\x88\xC9\xF8\x00\x10\xC8\xF8\x00\xA0\x00\x98\xCB\xF8\x00\x00\x01\x98\x30\x60\x22\x49\x02\x98\x08\x60\x03\x98\x46\xF8\xB8\x0C\x04\x98\xC9\xF8\x00\x00\x05\x98\xC8\xF8\x00\x00\x89\xF7\x52\xFC\x28\x69\x20\xF0\x01\x00\x28\x61\x28\x68\x20\xF0\x01\x00\x28\x60\x06\x98\x74\xF7\x84\xFE\x53\xF7\x1B\xFF\x87\xF8\x05\xA0\x0E\x20\x38\x70\x07\xB0\xBD\xE8\xF0\x8F\x03\x01\x5C\x6C\x07\x0D\x00\x10\xB5\x04\x46\x00\x21\x13\x20\x81\xF7\x51\xFC\x11\x49\x00\x22\xC1\xE9\x0A\x22\x8E\xF7\x44\xFA\x73\xF7\xC7\xF9\x18\xB1\xBD\xE8\x10\x40\x8B\xF7\xF5\xBF\x01\x20\x5B\xF7\xF5\xF9\xB4\xF8\x09\x00\x00\x21\x32\xF7\x53\xFF\xBD\xE8\x10\x40\x00\xF0\xD5\xBF\x00\x00\x60\x01\x65\x00\xBC\x01\x60\x00\x9C\x04\x32\x00\xA0\x04\x32\x00\xFC\x04\x41\x00\x18\x41\x20\x00\x03\x01\x14\xC4\x07\x0D\x00\x12\x48\x81\x68\xC2\xF8\x06\x10\xC0\x68\xC2\xF8\x0A\x00\x70\x47\x03\x01\x50\xD4\x07\x0D\x00\x70\xB5\x0F\x4C\x0E\x46\x00\xF1\x09\x05\xA1\x69\x31\xB1\xB0\xF8\x4C\xFC\xFF\xE8\x28\x21\x00\x09\x00\xBD\xE8\x70\x40\x0C\x21\x32\xF7\x2C\xBF\x09\x48\x73\xF7\x99\xFB\xAB\xF7\x02\xFB\x08\x48\xA5\x61\xC4\xE9\x02\x04\x05\x48\x73\xF7\x96\xFB\x00\x20\x30\x70\x70\xBD\x00\x00\x10\x82\x20\x00\xF4\xEF\x20\x00\x88\x29\x20\x00\x63\x85\x01\x00\x03\x01\x9A\x01\x20\x08\x0D\x00\x2D\xE9\xF0\x41\x00\xF1\x09\x01\x05\x7B\x40\x7B\x4E\x79\x10\x72\x95\x71\xC0\xF3\x41\x01\x14\x46\x00\xF0\x01\x07\xD6\x71\x03\x29\x05\xD0\x29\x06\x05\xD5\x11\x20\x50\x71\xBD\xE8\xF0\x81\x12\x20\xFA\xE7\x04\x2D\x01\xD2\x60\x49\x01\xE0\x5F\x49\x09\x1D\xAB\x07\x4F\xEA\xD3\x6C\x0A\x68\xFF\x23\x03\xFA\x0C\xF3\x9A\x43\x00\xFA\x0C\xF0\x10\x43\x59\x4A\x08\x60\x10\x68\x4F\xEA\x85\x03\x4F\xF0\x0F\x01\x01\xFA\x03\xF1\x20\xEA\x01\x00\x10\x60\x87\xF0\x01\x02\x4F\xF0\x00\x01\x28\x46\x91\xF7\x27\xFE\x27\xB1\x28\x46\x91\xF7\x14\xFE\xC6\xB2\x03\xE0\x31\x46\x28\x46\x91\xF7\x00\xFE\xE6\x71\x00\x20\x60\x71\xC9\xE7\x03\x01\x2C\xB6\x08\x0D\x00\x70\xB5\x00\xF1\x09\x05\x00\x7B\x02\x21\x14\x46\xB1\xEB\xD0\x0F\x02\xD8\x30\x20\x50\x71\x70\xBD\x91\xF7\x4C\xFC\xFF\xE3\x29\x21\x00\xFC\xFD\xE0\x71\xE8\x78\xA0\x71\x00\x20\x60\x71\x70\xBD\x03\x01\x2A\xDE\x08\x0D\x00\x10\xB5\x04\x46\x74\xF7\xBA\xFD\x3E\x4A\xD2\xF8\x00\x11\x14\xB1\x41\xF4\x00\x01\x01\xE0\x21\xF4\x00\x01\xC2\xF8\x00\x11\xBD\xE8\x10\x40\x74\xF7\xAF\xBD\x03\x01\x4E\x04\x09\x0D\x00\x70\xB5\x04\x46\x0D\x46\x74\xF7\xA6\xFD\x35\x4B\x01\x46\xD3\xF8\x94\x20\x24\xB1\x01\x2C\x05\xD0\x02\x2C\x06\xD0\x09\xE0\x22\xF0\x01\x02\x06\xE0\x42\xF0\x03\x02\x03\xE0\x22\xF0\x02\x00\x40\xF0\x80\x02\x22\xF4\x70\x10\x0D\xB1\x00\xF5\x80\x20\xC3\xF8\x94\x00\xBD\xE8\x70\x40\x08\x46\x74\xF7\x8A\xBD\x03\x01\x2C\x4E\x09\x0D\x00\x10\xB5\x24\x4C\x38\xB1\x00\x20\x62\xF7\x78\xF8\x20\x68\x40\xF0\x04\x00\x20\x60\x10\xBD\x20\x68\x20\xF0\x04\x00\x20\x60\xBD\xE8\x10\x40\x00\x20\x62\xF7\x05\xB9\x03\x01\x44\x76\x09\x0D\x00\x10\xB5\x04\x46\x1B\x48\x02\x78\x5A\xB1\x01\x2A\x17\xD1\x21\x46\x01\x20\xFF\xF7\xBC\xFF\x4F\xF0\x00\x00\x54\xB1\x5F\xF7\x99\xFE\x09\xE0\x21\x46\x00\x20\xFF\xF7\xB2\xFF\x20\x46\xBD\xE8\x10\x40\xD2\xE7\x5F\xF7\xB9\xFE\x20\x46\xBD\x4C\xFC\xFF\xDE\x2A\x21\x00\xE8\x10\x40\x94\xE7\x10\xBD\x03\x01\x16\xB6\x09\x0D\x00\x0D\x49\x02\x7B\xC8\x7C\x62\xF3\x86\x10\xC8\x74\xC0\xF3\x80\x10\xD6\xE7\x03\x01\x2C\xC8\x09\x0D\x00\x08\x48\xC0\x7C\xC0\xF3\x80\x10\x90\x71\x00\x20\x50\x71\x70\x47\x68\x00\x32\x00\x88\x00\x32\x00\x00\x20\x35\x00\x00\x10\x35\x00\x60\x2C\x20\x00\x18\x41\x20\x00\x03\x01\x30\xF0\x09\x0D\x00\x10\xB5\x04\x46\x00\x6D\x48\xB1\x07\x4A\xB4\xF8\x9C\x10\x40\xF2\x71\x23\x12\x78\x5A\x43\x51\x43\x74\xF7\xBF\xFB\x20\x46\xBD\xE8\x10\x40\x4E\xF7\x8B\xBF\x00\x00\x37\x31\x20\x00\x03\x01\x3C\x1C\x0A\x0D\x00\x10\xB5\x09\x4C\x20\x21\x09\x48\x9A\xF7\xAB\xFB\x08\x48\x74\xF7\xD5\xFB\x20\x46\x6A\xF7\xD9\xFC\x08\xB1\x8E\xF7\x0B\xFE\x05\x49\x8B\x20\x08\x60\x10\xBD\x00\x00\xC8\xD9\x20\x00\x88\x60\x20\x00\xA8\x60\x20\x00\xEC\x8A\x31\x00\x03\x01\x0E\x54\x0A\x0D\x00\x11\x48\x00\x21\xC0\xE9\x0C\x11\x70\x47\x03\x01\x4A\x5E\x0A\x0D\x00\x70\xB5\x00\x22\x0F\x4D\x10\x46\x11\x46\x53\x23\x4B\x43\x05\xEB\x83\x03\xDC\x69\xE6\x02\x0A\xD5\x93\xF8\x9B\x60\x04\x2E\x06\xD0\xC4\xF3\x4C\xFC\xFF\xD9\x2B\x21\x00\xC4\x04\x08\x2C\x02\xD1\xB3\xF8\x64\x00\x52\x1C\x49\x1C\x0B\x29\xEA\xDB\x01\x2A\x00\xD0\x00\x20\x70\xBD\x00\x00\x18\x41\x20\x00\x68\x42\x20\x00\x03\x01\x20\xA4\x0A\x0D\x00\x05\x48\x10\xB5\x80\x7B\x20\xB9\x8E\xF7\x95\xF8\x08\xB1\x02\x20\x10\xBD\x00\x20\x10\xBD\x00\x00\xF8\x5B\x20\x00\x03\x01\xF4\x01\xC0\x0A\x0D\x00\x70\xB5\x32\x4D\x28\x68\x80\x7B\x70\xF7\x95\xF9\x29\x68\xC9\x6E\x70\xF7\x19\xF9\x29\x68\x2E\x4E\x2E\x4B\x91\xF8\xED\x20\xC2\xB1\x91\xF8\xE5\x20\x9A\xB9\x2C\x4C\xD1\xF8\xC8\x20\x24\x68\x22\x42\x06\xD0\x91\xF8\x94\x40\x24\x06\x09\xD4\x34\x78\xA0\x42\x06\xD8\x26\x48\x27\x4C\x00\x68\x24\x68\x20\x43\x02\x42\x01\xD0\x9C\x78\x00\xE0\x5C\x78\x91\xF8\xE5\x00\x18\xB1\x18\x5C\xA0\x42\x00\xD9\x04\x46\x20\x48\x00\x68\x00\x07\x00\xD5\xDC\x78\xD1\xF8\xC0\x00\x40\x1C\x16\xD0\x88\x7B\x70\xF7\x5E\xF9\x29\x68\xD1\xF8\xC0\x10\x70\xF7\xE9\xF8\x18\x49\x00\x28\x07\xDB\x2A\x68\x4F\xF0\xFF\x30\xC2\xF8\xC0\x00\x3F\x20\x08\x70\x03\xE0\x08\x78\x84\x42\x00\xD2\x04\x46\x70\x78\x40\xB1\x45\x2C\x06\xD1\x28\x68\x4C\xFC\xFF\xD4\x2C\x21\x00\x90\xF8\xA8\x00\x4F\xF7\xCF\xF9\x00\xB1\x0F\x24\x21\x46\x28\x68\x6B\xF7\xF8\xFB\x0A\x48\x00\x78\x85\xF8\x34\x00\x70\xBD\x00\x00\xF0\x6E\x20\x00\xAD\x30\x0D\x00\x30\x24\x20\x00\x00\x26\x20\x00\xB4\x30\x20\x00\x2C\x24\x20\x00\x38\x1E\x20\x00\x18\x24\x20\x00\x20\x24\x20\x00\x03\x01\xE4\x04\xB0\x0B\x0D\x00\x2D\xE9\xF0\x41\x04\x46\x81\x7B\x4F\xF4\x46\x18\x08\xF5\x00\x70\x01\x60\x41\x68\x21\xF0\x80\x01\x41\x60\x87\x48\x00\x68\x30\xB9\x86\x48\x90\xF8\x30\x00\x10\xB1\x6F\xF7\xD0\xFB\x78\xB1\x20\x46\x6A\xF7\xE5\xFB\x00\x21\x20\x46\x6A\xF7\x96\xFF\x94\xF8\x61\x10\x80\xB2\x8A\x1C\x82\x42\x0D\xD8\x40\x1A\x87\xB2\x11\xE0\xA0\x7B\x9A\xF7\xB2\xFD\xA0\x7B\x9A\xF7\x58\xFE\x40\xF2\x71\x21\xB0\xFB\xF1\xF0\xEB\xE7\x94\xF8\x62\x20\x8A\x42\x71\xD8\x82\x42\x6F\xD8\x02\x27\x00\x26\x84\xF8\x60\x60\xA0\x7B\x70\xF7\xE9\xF8\x80\x1C\x20\xF0\x01\x00\x81\xB2\x94\xF8\x5B\x00\x90\xB1\xB4\xF8\x50\x00\x47\xF6\xFF\x72\x08\x1A\x21\x8D\x08\x1A\x20\xF0\x01\x00\x80\xB2\x81\x1E\x91\x42\x00\xD3\x02\x20\xB8\x42\x00\xD3\x38\x46\x60\x4C\xFC\xFF\xCF\x2D\x21\x00\x85\x7D\xE0\xA0\x8D\x40\xB1\x62\x4B\x22\x68\x1B\x68\x9A\x42\x09\xD1\x60\x4A\x12\x68\x12\x07\x05\xD5\x20\x8D\xB8\x42\x00\xD2\x07\x46\x67\x85\x6C\xE0\x22\x8D\xBA\x42\x00\xD2\x17\x46\x67\x85\xB4\xF8\x50\x20\x03\x23\x89\x1A\xCA\x17\x01\xEB\x12\x72\x22\xF0\x0F\x02\x89\x1A\x8D\xB2\x94\xF8\x62\x10\x02\x29\x09\xD0\x03\xFA\x05\xF1\x94\xF8\x58\x20\x89\xB2\x32\xB3\x31\xEA\x00\x00\x06\xD0\x30\xE0\x01\x20\xA8\x40\x84\xF8\x58\x60\x81\xB2\x1C\xE0\x4A\x4A\x94\xF8\x59\x00\x12\x78\x90\x42\x14\xD2\x94\xF8\x5A\x00\x02\x28\x00\xD3\x7D\xB1\x6F\xF7\xE3\xFA\x94\xF8\x59\x00\x40\x1C\x84\xF8\x59\x00\x00\x2D\x03\xD1\x14\xF8\x5A\x0F\x40\x1C\x20\x70\xBD\xE8\xF0\x81\x18\xE0\x84\xF8\x58\x60\x00\x20\x04\xEB\x40\x02\x92\x8D\x31\xEA\x02\x02\x02\xD1\x40\x1C\x10\x28\xF6\xD3\x10\x28\x0A\xD0\x84\xF8\x60\x00\x94\xF8\x60\x00\x02\x26\x04\xEB\x40\x00\x4F\xF6\xFF\x72\x80\x8D\x12\xE0\xBD\xE8\xF0\x41\x6F\xF7\xB8\xBA\x03\xFA\x05\xF1\x01\x43\xAD\x1C\x88\xB2\x05\xF0\x0F\x05\x03\xFA\x05\xF1\x89\xB2\x90\x42\x10\xD0\x81\x43\x0E\xD0\xB6\x1C\x4C\xFC\xFF\xCA\x2E\x21\x00\xB7\x42\xEE\xD8\x61\x8D\x40\xF2\x71\x22\x01\xFB\x02\xF0\x94\xF8\x5C\x20\x42\xB1\x49\x1C\x61\x85\x22\x49\x05\xE0\xB7\x42\x00\xD2\x3E\x46\x66\x85\xEE\xE7\x1F\x49\x09\x88\x08\x44\x1F\x49\x08\x60\x04\xF1\x56\x04\xD8\xF8\x88\x00\x61\x7A\xA2\x7A\x01\xEB\x10\x31\x01\xF0\x10\x00\x11\x44\x01\xF0\x0F\x01\x40\xEA\x01\x00\x14\xF8\x56\x19\x09\xB1\x80\xF0\x10\x00\x15\x49\x0A\x68\x22\xF0\x1F\x02\x02\x43\x0A\x60\x13\x48\x90\xF9\x06\x00\x81\xF7\x86\xFD\x00\x21\xA9\xF7\xC7\xF8\x94\xF8\x57\x00\x00\x21\x6F\xF7\x9C\xF8\x6F\xF7\x44\xFC\x00\x28\x8D\xD1\x32\x20\xA0\x74\x8A\xE7\x00\x00\x74\x2B\x0D\x00\xF8\x5B\x20\x00\xE4\x30\x20\x00\x38\x1E\x20\x00\xED\x30\x20\x00\xF2\x30\x20\x00\xF0\x30\x20\x00\x0C\x8B\x31\x00\xAC\x86\x31\x00\x4B\x1E\x20\x00\x03\x01\x52\x10\x0E\x0D\x00\x70\xB5\x27\x49\x25\x4C\x09\x78\x00\x29\x1D\xD0\x08\x30\x01\x22\xE1\x8B\x82\x40\x23\x48\x11\x43\xE1\x83\x90\xF8\x30\x00\x2E\x25\x98\xB1\x21\x49\xB4\xF9\x1C\x00\x09\x78\x88\x42\x06\xDC\x40\x42\x88\x42\x03\xDC\x94\xF8\x36\x00\x00\x28\x05\xD0\x20\x46\x4C\xFC\xFF\xC5\x2F\x21\x00\x61\xF7\xD6\xF8\x00\x28\x00\xD0\xA5\x74\x70\xBD\xA0\x8B\xF4\xE7\x03\x01\x62\x5E\x0E\x0D\x00\x70\xB5\x12\x4C\x01\x22\x82\x40\xE1\x8B\x04\xEB\x40\x00\x11\x43\xE1\x83\x00\x21\x41\x84\x0F\x48\x2E\x25\x90\xF8\x30\x00\x98\xB1\x0E\x49\xB4\xF9\x1C\x00\x09\x78\x88\x42\x06\xDC\x40\x42\x88\x42\x03\xDC\x94\xF8\x36\x00\x00\x28\x05\xD0\x20\x46\x61\xF7\xB0\xF8\x00\x28\x00\xD0\xA5\x74\x70\xBD\xA0\x8B\xF4\xE7\x00\x00\x9C\x5B\x20\x00\x1F\x23\x20\x00\xF8\x5B\x20\x00\x20\x23\x20\x00\x03\x01\xE4\x01\xBC\x0E\x0D\x00\x70\xB5\x04\x46\x6A\xF7\x1A\xFE\x00\x26\x01\x25\x58\xB1\x8E\x48\x00\x21\x06\x70\x20\x46\x9F\xF7\xB7\xF8\x20\x46\x9F\xF7\xF7\xF8\x84\xF8\x5B\x50\x70\xBD\x20\x46\x6A\xF7\xE5\xFF\x00\x28\xF9\xD0\x20\x46\xE1\x8B\x9F\xF7\xA8\xF8\xA0\x7B\x6F\xF7\x7E\xFF\xA1\x69\x6F\xF7\x03\xFF\xE1\x8B\x89\x1E\x88\x42\x0C\xD8\x20\x46\x9E\xF7\x03\xFF\x7E\x49\x08\x60\x7E\x49\x08\x60\x7E\x48\x05\x60\x6F\xF7\x55\xFF\x7D\x49\x08\x60\x94\xF8\x5B\x00\x98\xB1\x5D\xF7\x94\xFE\x4C\xF7\xBF\xFA\x01\x28\x0B\xD1\x20\x46\x5D\xF7\x34\xFB\x4C\xFC\xFF\xC0\x30\x21\x00\x38\xB1\x94\xF8\x6F\x00\x20\xB1\x84\xF8\x6E\x50\x20\x46\x9D\xF7\x7E\xFE\x84\xF8\x5B\x60\x94\xF8\x6B\x00\xE8\xB9\x94\xF8\x28\x00\x01\x28\x0D\xD0\x94\xF8\x24\x00\x94\xF8\x2C\x10\xC0\xF3\x02\x00\xC1\xF3\x02\x01\x88\x42\x03\xD1\x94\xF8\x29\x00\x02\x28\x0B\xD0\x20\x46\x5D\xF7\x11\xFB\x38\xB1\x94\xF8\x6F\x00\x20\xB1\x84\xF8\x6E\x50\x20\x46\x9D\xF7\x5B\xFE\x20\x46\xBD\xE8\x70\x40\x9F\xF7\x17\xB8\x03\x01\x1E\x9C\x0F\x0D\x00\x10\xB5\x5F\x48\x5D\x4C\x2C\x22\x04\x60\x5E\x49\x20\x46\x89\xF7\xEF\xFD\xAF\xF2\xF3\x00\x60\x60\x10\xBD\x03\x01\xFA\x02\xB6\x0F\x0D\x00\x2D\xE9\xF0\x41\x5A\x49\x8A\xB0\x04\x46\x09\x68\x00\x29\x7E\xD1\x58\x48\x90\xF8\x30\x10\x00\x29\x79\xD0\xD0\xF8\xC0\x10\x19\xB9\xD0\xF8\xC4\x00\x00\x28\x7A\xD0\xE0\x7B\x01\x28\x77\xD0\xA0\x89\x00\x28\x74\xD1\x94\xF8\x69\x00\x94\xF8\x68\x10\x40\x1A\xC7\xB2\xA0\x7B\x6F\xF7\xFD\xFE\x01\x21\x6F\xF7\xFB\xFC\x20\xF0\x01\x08\xA0\x69\x40\x00\x02\x90\xE0\x7B\x30\xB9\x94\xF8\x30\x00\x41\x00\x02\x98\x6F\xF7\x46\xFC\x02\x90\x00\x25\x03\x95\x94\xF8\x2A\x00\x4C\xFC\xFF\xBB\x31\x21\x00\x41\x00\x02\x98\x6F\xF7\x3D\xFC\xCD\xE9\x06\x05\xA0\x7B\x08\xA9\x6F\xF7\x00\xFF\xA0\x7B\x08\xAB\x02\x46\x02\xA9\x6F\xF7\x7F\xFD\xA0\x7B\x08\xAB\x02\x46\x06\xA9\x6F\xF7\x79\xFD\xDD\xE9\x02\x01\xCD\xE9\x00\x01\xDD\xE9\x06\x01\xCD\xE9\x04\x01\xE0\x8B\x68\x43\x41\x00\x00\x98\x6F\xF7\x1D\xFC\x00\x90\xE0\x8B\x68\x43\x41\x00\x04\x98\x6F\xF7\x16\xFC\x00\x26\x04\x90\x1A\xE0\x04\xA9\x68\x46\x9E\xF7\xAE\xFD\x38\xB3\x04\xF1\x2A\x04\xA0\x79\x21\x78\x08\x44\x4F\xEA\x40\x01\x00\x98\x6F\xF7\x04\xFC\x00\x90\xA0\x79\x14\xF8\x2A\x19\x08\x44\x41\x00\x04\x98\x6F\xF7\xFB\xFB\x76\x1C\xF6\xB2\x04\x90\x94\xF8\x30\x00\x94\xF8\x2A\x10\x08\x44\x00\xE0\x06\xE0\x70\x43\xB8\x42\xDA\xD9\x6D\x1C\xED\xB2\x02\x2D\xBE\xD3\x00\x20\x0A\xB0\xBD\xE8\xF0\x81\x02\x21\x40\x46\x6F\xF7\x8A\xFC\x01\x46\x00\x98\x40\x08\x6F\xF7\x14\xFE\x00\x28\xEC\xDB\x00\x98\x41\x46\x80\x08\x40\x00\x6F\xF7\x04\xFE\x40\x08\xE9\xE7\x00\x00\xFC\x26\x20\x00\x08\x27\x20\x00\xA0\x1C\x20\x00\x9C\x1C\x20\x00\xA4\x1C\x20\x00\xE0\x31\x0D\x00\x04\x27\x20\x00\x3C\x4C\xFC\xFF\xB6\x32\x21\x00\x99\x08\x00\x74\x2B\x0D\x00\xF8\x5B\x20\x00\x03\x01\xCA\x01\x2C\x11\x0D\x00\xF0\xB5\xF3\x48\x02\x78\x02\x2A\x5C\xD1\x04\x21\x00\x24\x4F\xF4\xCA\x00\x01\x64\xC0\xF8\xB0\x41\x49\x1C\x08\x29\xF9\xD3\xC1\x68\x41\xF0\x02\x01\xC1\x60\x04\x64\xD0\xF8\x04\x52\xE9\x49\x0F\x27\x4B\x78\x4F\xEA\x83\x0C\x0B\x79\x07\xFA\x0C\xF6\x9B\x00\x9F\x40\x3E\x43\xB5\x43\x8E\x78\x4F\x79\x06\xFA\x0C\xF6\x9F\x40\x3E\x43\x2E\x43\x04\x64\xC0\xF8\x00\x62\xC3\x68\x23\xF0\x02\x03\xC3\x60\x0B\x78\x9D\x08\x05\x64\x46\x6C\x9D\x07\xED\x0E\x4F\xF0\xFF\x0C\x0C\xFA\x05\xF7\xBE\x43\x11\x27\xAF\x40\x37\x43\x47\x64\x04\x64\x42\xEA\x03\x13\x43\xF4\x80\x63\xC0\xF8\x18\x32\xC9\x78\x8B\x08\x03\x64\x45\x6C\x8B\x07\xDB\x0E\x0C\xFA\x03\xFC\x02\x26\x25\xEA\x0C\x05\x9E\x40\x2E\x43\x46\x64\x04\x64\x42\xEA\x01\x11\x41\xF4\x80\x31\xC0\xF8\x1C\x12\x4F\xF0\x01\x11\xC0\xF8\x20\x12\x01\x21\xC0\xF8\x24\x12\xF0\xBD\x03\x01\x54\xF2\x11\x0D\x00\x10\xB5\x84\xF7\x97\xFF\xFF\xF7\x98\xFF\xC0\x48\xC1\x49\x00\x22\x02\x61\x0B\x68\x43\xF0\x40\x03\x0B\x60\xBE\x4C\xFC\xFF\xB1\x33\x21\x00\x49\xC9\x69\xC9\x06\x15\xD5\x01\x21\x81\x71\xBC\x4B\xC2\x71\x42\x7A\x1A\x70\x00\x7A\x20\xB1\xBA\x48\x02\x69\x42\xF4\x00\x62\x02\x61\x4F\xF4\xCA\x00\x01\x64\xD0\xF8\x80\x11\x41\xF0\x20\x01\xC0\xF8\x80\x11\x10\xBD\x03\x01\xFA\x01\x42\x12\x0D\x00\x2D\xE9\xF0\x5F\xB0\x49\xC9\x69\xCA\x06\x72\xD5\xAC\x4E\xAA\x4A\xDF\xF8\xC0\x92\xAE\x4F\xDF\xF8\xB0\xA2\xDF\xF8\xB8\xB2\x4F\xF4\xCA\x04\x00\x25\x30\x61\x98\xB3\x02\x26\x16\x70\x84\xF7\x60\xFE\xD9\xF8\x00\x00\x84\xF7\xBB\xFE\x84\xF7\x7A\xFE\xFF\xF7\x55\xFF\x25\x64\xD4\xF8\x1C\x02\x40\xF4\x80\x70\xC4\xF8\x1C\x02\x38\x69\x0B\xF1\x30\x04\x20\xF4\x00\x60\x38\x61\x8A\xF8\x00\x50\x01\x27\x27\x70\x47\xF2\x30\x50\xAB\xF8\x36\x00\x0B\xF1\x98\x01\x4F\xF0\x00\x00\x6F\xF7\x50\xFD\xA5\x80\x66\x70\x40\xF2\xE2\x40\x20\x81\x84\xF8\x48\x50\x47\xF2\x4E\x00\x60\x81\x84\xF8\x49\x70\x2C\xE0\xFF\xE7\x01\xF0\x07\x01\x90\x46\x11\x70\x84\xF7\x29\xFE\xD9\xF8\x00\x00\x84\xF7\x84\xFE\x84\xF7\x43\xFE\xFF\xF7\x1E\xFF\x98\xF8\x00\x00\x07\x28\x07\xD1\xE0\x68\x20\xF0\x70\x00\xE0\x60\x4C\xFC\xFF\xAC\x34\x21\x00\xE0\x68\x20\xF0\x04\x00\xE0\x60\x25\x64\xD4\xF8\x1C\x02\x20\xF4\x80\x70\xC4\xF8\x1C\x02\x71\x7A\x8A\xF8\x00\x10\x30\x7A\x18\xB1\x38\x69\x40\xF4\x00\x60\x38\x61\x8B\xF8\x30\x50\xBD\xE8\xF0\x5F\x8E\xF7\xC1\xB8\xBD\xE8\xF0\x9F\x03\x01\x7A\x38\x13\x0D\x00\x70\xB5\x4F\xF4\xCA\x05\x00\x22\x68\x69\xA9\x69\x75\x4B\x1B\x68\x9B\x02\x2C\xD4\x89\x02\x2A\xD5\x80\x02\x28\xD5\x4F\xF4\x00\x10\x68\x61\x2C\x6D\x4F\xF0\xFF\x36\xE0\x07\x01\xD0\xC5\xF8\xE0\x60\xA0\x07\x14\xD5\xD5\xF8\xE4\x00\xC5\xF8\xE4\x60\x10\xF4\x7E\x4F\x00\xD0\x01\x22\x62\x49\xC9\x69\xC9\x06\x03\xD5\x80\x06\x01\xD5\x42\xF0\x02\x02\x1A\xB1\x02\x21\x00\x20\x85\xF7\xB0\xF8\xE0\x03\x01\xD5\xC5\xF8\x20\x61\xA0\x03\x01\xD5\xC5\xF8\x24\x61\xBD\xE8\x70\x40\x85\xF7\xB1\xB8\x03\x01\x3E\xAE\x13\x0D\x00\x70\xB5\x81\x78\xC4\x78\x5A\x4D\x4F\xF4\xCA\x00\x01\x29\x02\xD0\x02\x29\x10\xD1\x02\xE0\x00\x6E\x28\x60\x0C\xE0\x40\x6E\x68\x60\xE0\x07\x01\xD0\x8A\xF7\x01\xFC\xA0\x07\x04\xD5\x68\x68\xC0\xF3\x40\x10\xFF\xF7\x2F\xFF\x01\x20\x70\xBD\x03\x01\xC0\x01\xE8\x4C\xFC\xFF\xA7\x35\x21\x00\x13\x0D\x00\x2D\xE9\xF0\x41\x44\x4D\x00\x24\x45\x4F\xA8\x79\x26\x46\x4F\xF4\xCA\x08\xC0\xB1\xE8\x79\x40\x1C\xC0\xB2\xE8\x71\x03\x28\x12\xD1\xAE\x71\xEE\x71\xF8\x69\xC0\x06\x0D\xD5\xD8\xF8\x60\x20\x42\x49\x0A\x60\xD8\xF8\x64\x00\x48\x60\x80\x06\x04\xD5\x02\x22\x11\x46\x00\x20\x85\xF7\x64\xF8\xF8\x69\xC0\x06\x35\xD5\x28\x69\x48\xB1\xA9\x7A\x3A\x48\x49\x1C\x01\xF0\x0F\x01\xA9\x72\x90\xF8\x33\x20\xFE\x2A\x16\xD0\xAE\x81\x36\x4D\x28\x68\xC0\xF3\x80\x10\xA0\x42\x22\xD0\x73\xF7\xFE\xFF\x29\x68\x04\xF0\x01\x02\x21\xF0\x40\x01\x41\xEA\x82\x11\x29\x60\xC8\xF8\x60\x11\xBD\xE8\xF0\x41\x73\xF7\xF4\xBF\x90\xF8\x34\x20\x01\x20\x00\xFA\x01\xF0\xA9\x89\x12\xB1\x08\x43\xA8\x81\x01\xE0\x81\x43\xA9\x81\xA8\x89\x4C\xF7\x14\xF8\x08\x28\xD8\xD9\x01\x24\xD6\xE7\xBD\xE8\xF0\x81\x03\x01\x36\xA4\x14\x0D\x00\x21\x49\x09\x78\x00\x29\x13\xD0\x1A\x49\x91\xF8\x30\x10\x00\x29\x0E\xD0\x12\x49\x09\x69\x00\x29\x0A\xD1\x1A\x4A\x00\xF0\x01\x00\x11\x68\x21\xF0\x10\x01\x41\xEA\x00\x10\x18\x49\x10\x60\x08\x60\x70\x47\x03\x01\x6A\x4C\xFC\xFF\xA2\x36\x21\x00\xD6\x14\x0D\x00\x17\x48\x00\x68\x50\xB1\xAF\xF2\xED\x21\x01\x60\x0E\x49\x0A\x68\x22\xF4\x00\x12\x0A\x60\xAF\xF2\xB7\x11\x81\x61\xAF\xF2\x45\x10\x10\x49\x08\x60\x70\x47\x7B\x1C\x20\x00\x64\x2B\x0D\x00\x90\x1C\x20\x00\x10\x1E\x20\x00\x04\x23\x20\x00\xF8\x3F\x20\x00\xAC\x1C\x20\x00\xF8\x5B\x20\x00\x88\x1C\x20\x00\xB4\x1C\x20\x00\x9C\x5B\x20\x00\xBC\x1C\x20\x00\x6C\x24\x20\x00\x60\x01\x65\x00\x04\x1D\x20\x00\x84\x1C\x20\x00\x03\x01\xF0\x03\x3C\x15\x0D\x00\x2D\xE9\xF8\x4F\x7E\x4F\x05\x46\x4F\xF0\x00\x08\x38\x68\x20\xB9\x28\x78\x00\x28\x7E\xD1\x73\xF7\xAB\xF8\x73\xF7\x80\xFF\x00\x90\x78\x48\x22\x21\x01\x60\x4F\xF4\x46\x19\x00\x26\xC9\xF8\x00\x62\x04\x21\xC9\xF8\x04\x12\x4F\xF4\x48\x14\x26\x66\xC9\xF8\x00\x60\x32\x20\x4B\xF7\xC6\xFF\x70\x48\xE0\x65\x4F\xF4\x45\x11\x4F\xF0\x80\x0B\xC1\xF8\x0C\xB0\xC8\x20\x4B\xF7\xBB\xFF\x28\x78\x4F\xF4\xCA\x0A\x4F\xF4\xC0\x04\xE0\xB1\xC4\xF8\xBC\x61\x67\x48\x06\x60\xD4\xF8\xFC\x02\x20\xF0\x0C\x00\xC4\xF8\xFC\x02\x38\x68\x48\xB1\x0A\xF5\xB0\x70\x01\x69\x21\xF0\x01\x4C\xFC\xFF\x9D\x37\x21\x00\x01\x01\x61\x01\x68\x21\xF0\x01\x01\x01\x60\x00\x98\x73\xF7\x46\xFF\x28\x78\x34\x46\xD0\xB3\x98\xE0\x00\x20\x88\xF7\xD8\xFC\x01\x21\x0A\xF5\xB0\x70\x39\x60\x02\x69\x42\xF0\x01\x02\x02\x61\x02\x68\x42\xF0\x01\x02\x02\x60\x48\x46\xC9\xF8\x00\x62\xC9\xF8\x04\xB2\xEA\x78\x00\x2A\xD4\xF8\xFC\x22\x02\xD0\x42\xF0\x0C\x02\x03\xE0\x22\xF0\x0C\x02\x42\xF0\x08\x02\xC4\xF8\xFC\x22\x49\x4A\x89\x46\x11\x60\x69\x78\x47\x4A\x89\x1E\x08\x32\x11\x60\x69\x78\x89\x1E\x12\x1F\x11\x60\x44\x49\x01\x60\x00\x20\x4F\xF4\x7A\x73\x4F\xF4\x45\x12\x01\x46\x40\x1C\x99\x42\x01\xE0\x67\xE0\x0E\xE0\x02\xD8\xD1\x68\x09\x06\xF5\xD5\x4F\xF4\x48\x10\x4F\xF4\x00\x31\x01\x66\xC8\x20\x4B\xF7\x51\xFF\xC4\xF8\xBC\x91\xAE\xE7\xE0\xB2\xA9\x78\x40\xF0\x01\x00\x60\xF3\x07\x04\x06\x29\x19\xD2\xDF\xE8\x01\xF0\x03\x07\x0E\x27\x2A\x2E\x20\xF0\x1C\x00\x18\x30\x0E\xE0\xC4\xF3\x07\x20\x40\xF0\x01\x00\x60\xF3\x0F\x24\x09\xE0\xC4\xF3\x07\x21\x41\xF0\x01\x01\x61\xF3\x0F\x24\x40\xF0\x02\x00\x60\xF3\x07\x04\xE9\x78\xC4\xF3\x07\x20\x61\xF3\x83\x00\x4C\xFC\xFF\x98\x38\x21\x00\x60\xF3\x0F\x24\x28\x79\x07\x28\x0F\xD8\x00\x06\x80\x0D\x40\x42\x40\xB2\x11\xE0\x20\xF0\xE0\x00\xEB\xE7\x20\xF0\xE0\x00\x20\x30\xE7\xE7\x20\xF0\xE0\x00\xA0\x30\xE3\xE7\x08\x28\x02\xD0\x09\x28\x05\xD0\x08\xE0\x95\xF9\x05\x00\x81\xF7\xEC\xF8\x02\xE0\xA8\x79\x80\xF7\x80\xFD\x80\x46\x08\xF0\xFF\x01\x11\x48\x98\xF7\x4E\xFA\x0B\x48\x04\x60\x28\x78\x20\xB1\x38\x68\x10\xB1\x72\xF7\x41\xFE\x3E\x60\x01\x20\xBD\xE8\xF8\x8F\x03\x01\x30\x28\x17\x0D\x00\x10\xB5\x14\x46\x0C\x30\xFF\xF7\x05\xFF\x00\x28\x01\xD1\x12\x20\x60\x71\x10\xBD\x78\x2B\x0D\x00\xC0\x04\x41\x00\x00\x02\x0C\x00\x10\x84\x31\x00\x01\x00\x80\x00\x0C\x01\x60\x00\x03\x01\x24\x54\x17\x0D\x00\x10\xB5\x88\xF7\x54\xFC\x88\xF7\x45\xFC\x04\x48\x01\x68\x41\xF0\x01\x01\x01\x60\xBD\xE8\x10\x40\x88\xF7\xF7\xBB\x04\x2C\x20\x00\x03\x01\xB8\x01\x74\x17\x0D\x00\x2D\xE9\xF0\x41\x0D\x46\x26\x49\xDF\xF8\x98\xC0\x00\x23\x89\x78\x1C\xF8\x03\x40\xA1\x42\x03\xD8\x5C\x1E\x06\x2B\x04\xD2\x06\xE0\x5B\x1C\xDB\xB2\x06\x2B\xF3\xD3\x05\x23\x04\x24\x02\xE0\x0B\xB9\x01\x4C\xFC\xFF\x93\x39\x21\x00\x23\x00\x24\x1C\x4E\x05\xEB\x85\x05\x80\xB1\x1B\x48\xC3\xEB\x03\x17\x07\x44\x2F\x44\x17\x44\x97\xF8\xA2\x70\xF7\x60\xC4\xEB\x04\x17\x38\x44\x28\x44\x10\x44\x90\xF8\xA2\x00\x11\xE0\x14\x48\x03\xEB\x83\x07\x00\xEB\xC7\x07\x2F\x44\x17\x44\x97\xF8\x6D\x71\xF7\x60\x04\xEB\x84\x07\x00\xEB\xC7\x00\x28\x44\x10\x44\x90\xF8\x6D\x01\xB0\x60\x1C\xF8\x03\x00\x70\x60\x1C\xF8\x04\x00\x30\x60\x05\x48\x54\xF7\x1C\xFC\xFF\x28\x00\xD9\xFF\x20\xBD\xE8\xF0\x81\xBD\x1E\x20\x00\x10\x13\x20\x00\x2C\x51\x20\x00\xEB\x15\x20\x00\x16\x13\x20\x00\x03\x01\xC2\x04\x28\x18\x0D\x00\x2D\xE9\xF0\x4F\x87\xB0\x00\x26\x04\x46\x05\x96\x90\xF8\xD2\x00\xFE\xF7\xE6\xFD\x80\x46\x8D\xF7\xE5\xF9\x94\xF8\xD2\x70\x04\xA9\x1E\x37\x38\x46\x62\xF7\xE2\xF8\xDF\xF8\x4C\xB3\x05\x00\x0A\xD0\x04\x98\x00\xEB\x40\x01\xDB\xF8\x00\x00\x00\xEB\x81\x00\x06\x60\x46\x60\x86\x60\x03\xE0\x04\xA8\x62\xF7\xBC\xF8\xF0\xB3\x08\x20\x8D\xF8\x0A\x00\x4F\xF0\x01\x0A\x8D\xF8\x0B\xA0\x8D\xF8\x07\x70\x94\xF8\xD0\x00\xAD\xF8\x00\x60\x8D\xF8\x08\x00\xAD\xF8\x02\x60\x4C\xFC\xFF\x8E\x3A\x21\x00\x62\xF7\xB7\xF9\x8D\xF8\x09\x00\xB4\xF8\x4C\x00\x4F\xF0\x02\x09\x40\x1C\x20\xF0\x01\x00\x80\xB2\xAD\xF8\x04\x00\x02\x28\x01\xD2\xAD\xF8\x04\x90\xB4\xF8\x4E\x00\xBD\xF8\x04\x10\x40\x1C\x20\xF0\x01\x00\x88\x42\x01\xD9\x40\x1A\x05\x90\x94\xF8\xD2\x00\xA8\xF7\xE4\xF9\x05\x99\x6F\xF0\x01\x02\x08\x44\x05\x90\xB4\xF8\x48\x10\x02\xEB\x41\x02\x82\x42\x03\xD8\x48\x00\x00\xE0\x12\xE0\x80\x1E\x8D\xF8\x06\x00\x94\xF8\xD1\x00\xB0\xB1\x00\x2D\x7E\xD0\xB4\xF8\xC8\x00\xAD\xF8\x00\x00\xB4\xF8\xCA\x00\xAD\xF8\x02\x00\x94\xF8\xD5\x00\x89\xE0\x00\x23\x6B\x22\x40\xF2\xA1\x31\x9F\x48\x72\xF7\xDA\xFF\x07\xB0\xBD\xE8\xF0\x8F\x01\x27\x5C\xF7\x49\xFE\x18\xB1\x60\xF7\x22\xFF\x00\xB9\x00\x27\xB4\xF8\x44\x00\x40\x05\x05\xD5\xB8\xF8\x00\x00\x10\xB1\xAD\xF8\x02\x00\x09\xE0\xB4\xF8\x4A\x00\x3B\x46\x42\x00\xB4\xF8\x48\x00\x41\x00\x68\x46\x62\xF7\x28\xFA\xBD\xF8\x02\x00\x01\x28\x0A\xD9\x8D\x49\x49\x68\x40\x1E\xB1\xFB\xF0\xF2\x00\xFB\x12\x10\x20\xF0\x01\x00\xAD\xF8\x00\x00\x94\xF8\xD2\x00\x05\xAA\x69\x46\xA8\xF7\xAD\xF9\x48\x4C\xFC\xFF\x89\x3B\x21\x00\xBB\xB4\xF8\x44\x00\x40\x05\x19\xD5\xB8\xF8\x00\x00\xB0\xB1\x4A\x46\x21\x46\x68\x46\xCD\xF8\x0C\x90\x62\xF7\x19\xFB\xD0\xB9\x52\x46\x21\x46\x68\x46\xCD\xF8\x0C\xA0\x62\xF7\x11\xFB\x90\xB9\x32\x46\x21\x46\x68\x46\x03\x96\x62\xF7\x0A\xFB\x58\xB9\x03\xA9\x68\x46\x62\xF7\xD0\xF9\x30\xB9\xAD\xF8\x00\x60\xB4\xF8\x4A\x00\x40\x00\xAD\xF8\x02\x00\xBD\xF8\x00\x00\x5D\xB1\xA4\xF8\xC8\x00\xBD\xF8\x02\x00\xA4\xF8\xCA\x00\x9D\xF8\x09\x00\x84\xF8\xD5\x00\x17\xE0\x0A\xE0\xA4\xF8\xC4\x00\xBD\xF8\x02\x00\xA4\xF8\xC6\x00\x9D\xF8\x09\x00\x84\xF8\xD4\x00\x0B\xE0\xB4\xF8\xC4\x00\xAD\xF8\x00\x00\xB4\xF8\xC6\x00\xAD\xF8\x02\x00\x94\xF8\xD4\x00\x8D\xF8\x09\x00\x04\x98\xDB\xF8\x00\x10\x00\xEB\x40\x02\x01\xEB\x82\x00\x00\x9A\x02\x60\x01\x9A\x42\x60\x02\x9A\x82\x60\x00\x2D\x7F\xF4\x6B\xAF\x04\x98\x00\xEB\x40\x00\x01\xEB\x80\x00\x80\x79\x84\xF8\xD6\x00\x61\xE7\x03\x01\xCA\x02\x66\x1A\x0D\x00\x2D\xE9\xF0\x4F\x05\x46\x90\xF8\xD2\x00\x8B\xB0\x8A\x46\x90\x46\x9B\x46\x1E\x30\x04\xA9\x61\xF7\xCA\xFF\x00\x28\x78\xD0\x8D\xF7\x4C\xFC\xFF\x84\x3C\x21\x00\xC2\xF8\x04\x98\x00\xEB\x40\x01\x44\x48\x00\x68\x00\xEB\x81\x01\x08\x68\x00\x90\x48\x68\x01\x90\x88\x68\x02\x90\x0C\x68\x06\x94\x48\x68\x07\x90\x88\x68\x08\x90\x00\x20\x08\x60\x48\x60\x88\x60\x05\xA9\x68\x46\x62\xF7\x44\xFD\xB5\xF8\x4E\x20\xB5\xF8\x4C\x10\x68\x46\x63\xF7\x65\xF8\x02\x25\x4F\xF0\x00\x09\x20\x0C\x4F\x46\x09\x90\xBA\xF8\x02\x00\x09\x99\x40\x04\x00\x0C\xAD\xF8\x02\x00\x81\x42\x05\xD1\x05\x98\x85\x42\x02\xD2\x4F\xF0\x00\x09\x40\xE0\x00\x26\xB8\xF1\x00\x0F\x01\xD0\x00\x24\x1E\xE0\x03\xA9\x68\x46\x62\xF7\x37\xF9\x01\x28\x1A\xD1\x03\x98\xA8\x42\x17\xD1\x4F\xF0\x01\x09\x29\xE0\x0B\xEB\x84\x00\xBD\xF8\x02\x10\x00\x68\xB0\xFB\xF1\xF2\x01\xFB\x12\x00\xAD\xF8\x00\x00\x03\xA9\x68\x46\x62\xF7\x07\xFD\x03\x98\xA8\x42\xEA\xD0\x64\x1C\x44\x45\xEA\xD3\xBD\xF8\x02\x00\x80\x1E\x80\xB2\xAD\xF8\x02\x00\xBA\xF8\x00\x10\xB0\xEB\x41\x0F\x02\xD3\x76\x1C\x0C\x2E\xCB\xD3\x7F\x1C\x6D\x1E\x03\x2F\xB7\xD3\xB9\xF1\x00\x0F\x04\xD0\x14\x98\x03\x99\x01\x60\x03\xE0\x10\xE0\x14\x99\x00\x20\x08\x60\x04\x98\x00\x4C\xFC\xFF\x7F\x3D\x21\x00\xEB\x40\x01\x06\x48\x00\x68\x00\xEB\x81\x00\x06\x99\x01\x60\x07\x99\x41\x60\x08\x99\x81\x60\x48\x46\x0B\xB0\xC6\xE6\x00\x00\x50\x31\x20\x00\x07\x00\x02\x00\x00\xA0\x32\x00\x03\x01\x94\x03\xAC\x1B\x0D\x00\x2D\xE9\xF8\x4F\x00\x24\x26\x46\x4F\xF0\x01\x09\x84\xF7\x5C\xFE\x05\x46\x4F\xF7\x83\xFD\x5A\x4F\x38\x68\x00\xF0\xE0\x01\x59\x48\x02\x78\x02\xF0\x1F\x02\x11\x43\x39\x60\x39\x1F\x0A\x68\x43\x78\x02\xF0\xE0\x02\x03\xF0\x1F\x03\x1A\x43\x0A\x60\x3A\x1D\x13\x68\x90\xF8\x02\xC0\x03\xF0\xE0\x03\x0C\xF0\x1F\x0C\x43\xEA\x0C\x03\x13\x60\x4D\x4A\x13\x68\x90\xF8\x03\xC0\x03\xF0\xE0\x03\x0C\xF0\x1F\x0C\x43\xEA\x0C\x03\x13\x60\xDF\xF8\x1C\xA1\x0A\xF1\x08\x0A\xDA\xF8\x00\xC0\x00\x79\x0C\xF0\xE0\x0C\x00\xF0\x1F\x00\x4C\xEA\x00\x0C\xCA\xF8\x00\xC0\x38\x68\xDF\xF8\xF4\xC0\x00\xF0\x1F\x00\x0C\xF1\x54\x0C\x0C\xF1\x04\x08\x03\x28\x03\xD3\x80\x1E\xCC\xF8\x00\x00\x04\xE0\x00\x23\xCC\xF8\x00\x30\x18\xB1\x40\x1E\xC8\xF8\x00\x00\x01\xE0\xC8\xF8\x00\x30\xED\xB3\x04\x2D\x49\xD0\x10\x68\x00\xF0\x1F\x00\x08\x30\xDA\xF8\x4C\xFC\xFF\x7A\x3E\x21\x00\x00\x20\x60\xF3\x04\x02\xCA\xF8\x00\x20\x2D\x4B\x40\x33\x1A\x68\x00\xF0\x10\x00\x22\xF0\x10\x02\x02\x43\x1A\x60\x45\xB3\x03\x2D\x37\xD0\x08\x68\x04\x2D\x00\xD0\x80\x1E\x38\x60\x33\xF7\xD8\xFB\x00\x28\x3E\xD0\x6A\x46\x02\x21\x6E\x20\x33\xF7\xA3\xFB\xBD\xF8\x00\x00\xC1\xB2\x41\xEA\x10\x20\x01\x06\x01\xD5\x4F\xF0\xFF\x39\x00\xF0\x7F\x00\x00\xFB\x09\xF0\x40\xB2\x00\x28\x29\xD0\x19\x4A\x02\xEB\x84\x01\x91\xF9\x00\x30\x83\x42\x1A\xDC\x01\xE0\x0C\xE0\x0F\xE0\x91\xF9\x01\x10\x81\x42\x13\xDD\x6D\xB1\x04\x2D\x0B\xD0\x02\xEB\x84\x00\x90\xF9\x02\x60\x0F\xE0\x10\x68\x00\xF0\x1F\x00\xB5\xE7\x08\x68\x40\x1E\xC8\xE7\x02\xEB\x84\x00\x90\xF9\x03\x60\x03\xE0\x64\x1C\xE4\xB2\x09\x2C\xDA\xD3\x38\x68\x30\x44\xC0\xB2\x38\x60\xBD\xE8\xF8\x8F\x00\x00\x10\x04\x60\x00\x9C\x07\x20\x00\x00\x07\x60\x00\xAF\x30\x0D\x00\x03\x01\x1A\x3C\x1D\x0D\x00\x2F\x48\x01\x68\x2F\x48\x01\x60\x2F\x49\x09\x68\x41\x60\x2F\x49\x49\x68\x81\x60\x70\x47\x03\x01\x1A\x52\x1D\x0D\x00\x2E\x48\x01\x68\x2A\x48\x01\x60\x2D\x49\x09\x68\x41\x60\x29\x4C\xFC\xFF\x75\x3F\x21\x00\x49\x09\x68\x81\x60\x70\x47\x03\x01\x84\x01\x68\x1D\x0D\x00\x70\xB5\x2A\x48\x06\x26\x00\x25\x80\x68\x29\x4C\x01\x7C\x22\x29\x2E\xD0\x08\xDC\x01\x29\x10\xD0\x06\x29\x19\xD0\x10\x29\x25\xD0\x21\x29\x06\xD1\x27\xE0\x28\x29\x17\xD0\x2A\x29\x1B\xD0\x2B\x29\x1C\xD0\x25\x60\xBD\xE8\x70\x40\xD7\xE7\x90\xF8\xA9\x00\x1C\xE0\xFF\xF7\xC8\xFF\x26\x60\x70\xBD\xFF\xF7\xCF\xFF\x25\x60\x70\xBD\x90\xF8\x39\x00\x03\x28\xF7\xD1\xF2\xE7\x40\x8F\x43\xF2\x06\x31\x08\x42\xF1\xD0\xEC\xE7\x90\xF8\x60\x00\x06\xE0\x40\x6A\xE4\xE7\x90\xF8\x65\x00\x01\xE0\x90\xF8\x59\x00\x01\x28\xE4\xD1\xDF\xE7\x03\x01\x38\xE8\x1D\x0D\x00\x10\xB5\x88\xF7\x79\xF9\x54\xF7\xB7\xF8\xBD\xE8\x10\x40\x4A\xF7\xB3\xBA\x00\x00\x0C\x08\x20\x00\x68\x01\x60\x00\x14\x08\x20\x00\xD4\x30\x0D\x00\x08\x08\x20\x00\x10\x08\x20\x00\x00\x3F\x20\x00\x64\x08\x64\x00\x03\x01\x16\x1C\x1E\x0D\x00\x10\xB5\xC8\x4A\xC8\x49\xC9\x48\x53\xF7\x82\xFF\xC8\x49\x08\x70\x10\xBD\x03\x01\x16\x2E\x1E\x0D\x00\xC5\x49\xC7\x48\xDC\x39\xC8\x60\xC7\x49\x00\xF5\x98\x60\x08\x60\x70\x4C\xFC\xFF\x70\x40\x21\x00\x47\x03\x01\x2C\x40\x1E\x0D\x00\xC5\x4A\xC6\x4B\x01\x28\x03\xD0\x02\x28\x09\xD1\x18\x88\x06\xE0\x10\x68\x18\x80\x48\x78\x01\x28\x03\xD0\x43\xF6\x02\x10\x10\x60\x70\x47\x43\xF6\x0E\x10\xFA\xE7\x03\x01\x48\x68\x1E\x0D\x00\x10\xB5\xBB\x4A\xBC\x4C\x08\x32\x40\xF6\xA2\x63\x01\x28\x03\xD0\x02\x28\x12\xD1\x20\x88\x0F\xE0\x10\x68\x80\xB2\x20\x80\x49\x78\x01\x29\x0B\xD0\xAD\x49\xDC\x39\xC9\x88\xC1\xF5\x80\x51\x89\xB2\x61\xF3\x1F\x10\x40\xF0\x08\x00\x10\x60\x10\xBD\x10\x68\x63\xF3\x1F\x10\xF7\xE7\x03\x01\x70\xAC\x1E\x0D\x00\x70\xB5\xA4\x4A\xA4\x4B\xA9\x4C\x12\x78\xDC\x3B\x02\xEB\x82\x02\x03\xEB\xC2\x02\xA8\x4D\x52\x7D\x94\x3C\xA8\x4E\x4F\xF4\xC0\x03\x01\x28\x09\xD0\x02\x28\x06\xD1\x48\x78\x01\x28\x1A\xD0\x30\x88\x20\x60\x01\x20\x58\x60\x70\xBD\x20\x68\x80\xB2\x30\x80\xD3\xF8\x04\x61\x2E\x60\x49\x78\x01\x29\x09\xD0\x48\xF2\xFF\x01\x08\x40\x02\xF0\x7F\x01\x40\xEA\x01\x20\x20\x60\x00\x20\x58\x60\xC3\xF8\x04\x21\x70\xBD\x28\x68\xC3\xF8\x04\x01\x70\xBD\x03\x01\x3C\x18\x1F\x0D\x00\x10\xB5\x94\x49\x94\x4B\x4C\xFC\xFF\x6B\x41\x21\x00\x95\x4A\x95\x4C\x01\x28\x06\xD0\x02\x28\x03\xD1\x18\x68\x08\x60\x20\x68\x10\x60\x10\xBD\x08\x68\x18\x60\x10\x68\x20\x60\x08\x68\x20\xF0\x3F\x00\x40\xF0\x48\x00\x08\x60\x10\x68\x20\xF0\x02\x00\xEF\xE7\x03\x01\x24\x50\x1F\x0D\x00\x8A\x4A\x4F\xF4\xC0\x01\x01\x28\x04\xD0\x02\x28\x01\xD1\x10\x68\x88\x61\x70\x47\x88\x69\x10\x60\x88\x69\x20\xF0\x02\x00\xF7\xE7\x03\x01\x46\x70\x1F\x0D\x00\x4F\xF4\xC0\x02\x01\x28\x06\xD0\x02\x28\x14\xD1\xD2\xF8\xFC\x02\x20\xF0\x0C\x00\x0D\xE0\x48\x78\x01\x28\x0D\xD0\x00\x28\x0A\xD1\x88\x78\x01\x28\x08\xD0\xD2\xF8\xFC\x02\x20\xF0\x0C\x00\x40\xF0\x08\x00\xC2\xF8\xFC\x02\x70\x47\xD2\xF8\xFC\x02\x40\xF0\x0C\x00\xF7\xE7\x03\x01\x30\xB2\x1F\x0D\x00\x69\x4A\x72\x4B\x18\x32\x01\x28\x03\xD0\x02\x28\x0A\xD1\x18\x68\x07\xE0\x10\x68\x18\x60\x48\x78\x01\x28\x10\x68\x03\xD0\x40\xF4\x80\x40\x10\x60\x70\x47\x20\xF4\x80\x40\xFA\xE7\x03\x01\x30\xDE\x1F\x0D\x00\x69\x4B\x69\x4A\x01\x28\x03\xD0\x02\x28\x0A\xD1\x18\x68\x07\xE0\x10\x68\x18\x60\x48\x78\x01\x28\x10\x68\x03\xD0\x40\xF4\x80\x4C\xFC\xFF\x66\x42\x21\x00\x60\x10\x60\x70\x47\x4F\xF6\xFF\x31\x08\x40\xF9\xE7\x03\x01\x24\x0A\x20\x0D\x00\x5A\x49\x5F\x4A\x1C\x39\x01\x28\x04\xD0\x02\x28\x01\xD1\x10\x68\x08\x60\x70\x47\x08\x68\x10\x60\x08\x68\x00\xF0\x03\x00\xF7\xE7\x03\x01\x98\x01\x2A\x20\x0D\x00\x2D\xE9\xF0\x41\x58\x4F\x55\x4E\x01\x28\x18\xD0\x02\x28\x14\xD1\x30\x68\x39\x68\x20\xF4\x00\x70\x21\xF4\x00\x51\x40\xF4\x80\x74\x41\xF4\x80\x45\x34\x60\x3D\x60\x32\x20\x72\xF7\xCF\xFF\x24\xF4\x80\x70\x25\xF4\x80\x41\x30\x60\x39\x60\xBD\xE8\xF0\x81\x48\x78\x01\x28\x16\xD0\x30\x68\x39\x68\x20\xF4\x00\x70\x40\xF4\x80\x70\x21\xF4\x00\x51\x41\xF4\x80\x41\x30\x60\x39\x60\x40\xF4\x00\x70\x41\xF4\x00\x51\x30\x60\x39\x60\xBD\xE8\xF0\x41\xC8\x20\x72\xF7\xAD\xBF\x4F\xF4\x80\x40\x38\x60\x30\x68\x4F\xF6\xFF\x41\x08\x40\x30\x60\x4F\xF4\xC0\x40\x38\x60\x30\x68\x80\xB2\x40\xF4\x40\x70\x30\x60\xD2\xE7\x03\x01\x5C\xBE\x20\x0D\x00\x30\xB5\x25\x4A\x25\x4B\x33\x4D\x34\x4C\x7C\x3A\x60\x33\x01\x28\x09\xD0\x02\x28\x06\xD1\x48\x78\x01\x28\x03\xD1\x28\x68\x10\x60\x20\x68\x18\x60\x4C\xFC\xFF\x61\x43\x21\x00\x30\xBD\x10\x68\x28\x60\x18\x68\x20\x60\x48\x78\x01\x28\xF7\xD1\x13\x48\x13\x4C\xC9\x78\x00\x78\xDC\x3C\x00\xEB\x80\x00\x04\xEB\xC0\x00\x29\xB1\x01\x29\x03\xD0\x80\x8C\x10\x60\x00\x20\xE6\xE7\xC0\x8A\xFA\xE7\x03\x01\x8E\x01\x16\x21\x0D\x00\x1E\x4A\x20\x4B\x74\x3A\x01\x28\x03\xD0\x02\x28\x09\xD1\x18\x88\x06\xE0\x10\x68\x18\x80\x48\x78\x01\x28\x03\xD0\x4F\xF4\x00\x60\x10\x60\x70\x47\x25\x20\xFB\xE7\x00\x00\xA0\x1E\x20\x00\x2C\x11\x20\x00\x2C\x2E\x0D\x00\xB4\x2B\x20\x00\x7C\x2B\x0D\x00\xBC\x2B\x20\x00\xAC\x06\x41\x00\x28\x10\x20\x00\x26\x10\x20\x00\x2C\x10\x20\x00\x24\x10\x20\x00\xDC\x04\x60\x00\x44\x10\x20\x00\x64\x06\x60\x00\x48\x10\x20\x00\x30\x10\x20\x00\x34\x10\x20\x00\x38\x10\x20\x00\xE8\x07\x41\x00\x4C\x10\x20\x00\xFC\x04\x41\x00\x3C\x10\x20\x00\x40\x10\x20\x00\x2A\x10\x20\x00\x03\x01\x90\x01\xA0\x21\x0D\x00\x02\x46\x00\x20\x11\x2A\x3A\xD2\xDF\xE8\x02\xF0\x09\x34\x32\x2B\x29\x25\x0B\x30\x0D\x30\x32\x29\x34\x34\x25\x25\x37\x00\x5B\xF7\x8C\xB8\x5A\xF7\xC0\xBF\x17\x4A\x13\x68\x6F\xF3\x0F\x4C\xFC\xFF\x5C\x44\x21\x00\x03\x42\xF8\x90\x39\x05\x29\x0F\xD2\xDF\xE8\x01\xF0\x0F\x03\x0F\x0F\x0F\x00\x02\xF1\x7C\x02\x51\x69\x48\xF6\x88\x03\x41\xEA\x03\x01\x51\x61\x4F\xF0\xBB\x31\x11\x60\x70\x47\x0B\x49\xD1\x67\x70\x47\x5A\xF7\xB4\xBF\x09\xB1\x5A\xF7\xE5\xBF\x5B\xF7\x03\xB8\x02\x20\x70\x47\x5A\xF7\xB8\xBF\x08\x46\x5B\xF7\x1C\xB8\x5A\xF7\xCC\xBF\x01\x20\x70\x47\x00\x00\x90\x00\x32\x00\xB9\xB9\xBB\xB9\x03\x01\x4A\x2C\x22\x0D\x00\x04\x28\x1E\xD1\x22\x49\x21\x48\x08\x60\x23\x49\x21\x48\x08\x60\x23\x49\x22\x48\x08\x60\x24\x49\x22\x48\x08\x60\x24\x49\x23\x48\x88\x60\x24\x49\x4F\xF0\xFF\x30\x88\x60\x23\x48\x00\x69\x01\x05\x22\x48\x01\xD5\x01\x21\x00\xE0\x00\x21\x01\x70\x21\x49\x20\x48\x48\x60\x00\x20\x70\x47\x03\x01\x0C\x72\x22\x0D\x00\x04\x21\x08\x20\x5B\xF7\x85\xB8\x03\x01\x0C\x7A\x22\x0D\x00\x03\x21\x08\x20\x5B\xF7\x81\xB8\x03\x01\x92\x01\x82\x22\x0D\x00\x10\xB5\xAF\xF2\x5B\x00\x1A\x49\x08\x60\xFF\xF7\xCF\xFD\x1A\x48\x19\x49\x81\x64\x1A\x49\xC0\xF8\x68\x11\xAF\xF2\x25\x01\x18\x48\x41\x60\xAF\xF2\x35\x01\x81\x60\x49\x4C\xFC\xFF\x57\x45\x21\x00\xF7\x7D\xFB\x16\x48\x16\x49\x00\x78\x08\x70\x10\xBD\xE1\x23\x0D\x00\x88\x23\x20\x00\x39\x24\x0D\x00\xC4\x23\x20\x00\x3D\x24\x0D\x00\xFC\x25\x20\x00\x19\x23\x0D\x00\x54\x32\x20\x00\x09\x29\x0D\x00\x78\xD3\x20\x00\x10\x82\x20\x00\xF8\x3F\x20\x00\x6C\x2B\x0D\x00\xA5\x0A\x0D\x00\xE4\x5C\x20\x00\xB4\x39\x20\x00\x67\x24\x0D\x00\x18\x52\x20\x00\x4D\x04\x0D\x00\x0C\x32\x0D\x00\x04\x23\x20\x00\x6D\x2B\x0D\x00\x03\x01\x0C\x10\x23\x0D\x00\x31\x49\x00\x7B\x08\x70\x70\x47\x03\x01\xCC\x01\x18\x23\x0D\x00\x30\xB4\x00\x24\x0C\x60\x2F\x4C\x05\x2B\x53\xD0\x06\xDC\x01\x2B\x50\xD0\x02\x2B\x4E\xD0\x03\x2B\x4C\xD1\x06\xE0\x06\x2B\x49\xD0\x08\x2B\x08\xD0\x3F\x2B\x45\xD1\x11\xE0\x03\x2A\x42\xD1\x25\x68\x0D\x60\x64\x68\x3A\xE0\x17\x2A\x05\xD0\x1C\x2A\x3A\xD1\x25\x6B\x0D\x60\x64\x6B\x32\xE0\x25\x6C\x0D\x60\x64\x6C\x2E\xE0\x25\x2A\x21\xD0\x08\xDC\x14\x2A\x22\xD0\x19\x2A\x10\xD0\x1A\x2A\x12\xD0\x24\x2A\x27\xD1\x13\xE0\x85\x2A\x1D\xD0\xE9\x2A\x22\xD0\xA2\xF5\x80\x75\x45\x3D\x1E\xD1\xA5\x68\x0D\x60\xE4\x68\x16\xE0\x25\x4C\xFC\xFF\x52\x46\x21\x00\x69\x0D\x60\x64\x69\x12\xE0\xA5\x69\x0D\x60\xE4\x69\x0E\xE0\x25\x6A\x0D\x60\x64\x6A\x0A\xE0\xA5\x6A\x0D\x60\xE4\x6A\x06\xE0\xA5\x6B\x0D\x60\xE4\x6B\x02\xE0\xA5\x6C\x0D\x60\xE4\x6C\x4C\x60\x0C\x68\x00\x2C\x02\xD1\x30\xBC\x49\xF7\x29\xBE\x30\xBC\x70\x47\x00\x00\xDD\x30\x0D\x00\x5C\x30\x0D\x00\x03\x01\x5C\xE0\x23\x0D\x00\x10\xB5\x04\x46\x01\x29\x02\xD0\x02\x29\x1B\xD0\x1C\xE0\xA4\xF5\xE0\x40\x0A\x38\x0F\xD1\x89\xF7\x97\xFF\x0C\x49\x0C\x48\x84\xF7\xE1\xFA\x0A\x48\x0B\x49\x00\x88\x01\xEB\x80\x00\x01\x68\x07\x48\x88\x47\x00\x24\x08\xE0\xA4\xF5\xE0\x40\x06\x38\x04\xD1\xFE\xF7\xE3\xFF\x01\xE0\x8C\xF7\xC2\xFC\x20\x46\x10\xBD\xA4\x23\x20\x00\x0C\x60\x20\x00\x3C\x92\x08\x00\x03\x01\x08\x38\x24\x0D\x00\x00\x20\x70\x47\x03\x01\x1C\x3C\x24\x0D\x00\x08\x7B\x42\x08\x00\x20\x7F\x2A\x03\xD0\x07\x2A\x01\xD1\x01\x4A\x8A\x60\x70\x47\xF1\x09\x0D\x00\x03\x01\x16\x54\x24\x0D\x00\x2E\x28\x01\xD3\x01\x20\x70\x47\x1C\x4A\x42\xF8\x20\x10\x00\x20\x70\x47\x03\x01\x82\x01\x66\x24\x0D\x00\x10\xB5\x1A\x49\x04\x20\xFF\xF7\x4C\xFC\xFF\x4D\x47\x21\x00\xF2\xFF\x19\x49\x93\x20\x08\x60\x19\x48\xCF\x21\x01\x60\x4F\xF0\xE6\x01\x41\x60\x81\x60\x4F\xF0\x17\x01\xC1\x60\x4F\xF0\x40\x01\x01\x61\x4F\xF0\x01\x01\x41\x61\x4F\xF0\xF2\x02\x82\x61\x4F\xF0\xCE\x02\xC2\x61\x4F\xF0\xD0\x02\x02\x62\x4F\xF0\xE8\x02\x82\x64\x4F\xF0\xC8\x02\x40\xF8\x90\x2C\x4F\xF0\xEC\x02\x40\xF8\x8C\x2C\x40\xF8\x88\x1C\x07\x49\x4F\xF0\x04\x00\x08\x60\x4F\xF0\x00\x00\x10\xBD\x58\x15\x21\x00\xE5\x24\x0D\x00\x4C\x0D\x42\x00\x94\x01\x42\x00\x7C\x37\x42\x00\x03\x01\xA0\x08\xE4\x24\x0D\x00\x2D\xE9\xF7\x4F\x07\x46\xDF\x48\xDF\xF8\x74\xA3\x00\x68\x07\xF5\x7A\x44\x00\xF0\x03\x02\x4F\xF4\x7A\x70\x44\x43\xDA\x48\xDF\xF8\x6C\x93\x52\x1C\x05\x68\x04\xEB\x55\x00\xB0\xFB\xF5\xF6\x06\xFB\x05\xF0\x80\x46\xC9\xF8\x00\x00\xD5\x48\x05\xFB\x02\xF1\x90\xF8\x00\xB0\x01\xFB\x0B\xF0\x88\xF7\x8E\xFD\x00\x22\xD1\x4B\x88\xF7\x5D\xFB\x00\x22\xD0\x4B\x88\xF7\x01\xFC\x00\x22\xCF\x4B\x88\xF7\x85\xFE\x88\xF7\x53\xFD\xCE\x49\x08\x80\xCE\x48\x80\x68\x4F\xF4\x80\x42\xC0\xF3\x13\x00\xA5\xFB\x00\x01\x80\x18\x41\x4C\xFC\xFF\x48\x48\x21\x00\xF1\x00\x01\xC2\x0B\xC9\x48\x42\xEA\x41\x42\x02\x60\x4F\xF4\x48\x10\x00\x68\xC6\x49\xC0\xF3\x02\x10\x4F\xF0\x01\x0C\x02\x23\x70\xB3\x01\x28\x2E\xD0\x02\x28\x2E\xD0\x03\x28\x2E\xD0\x04\x28\x2E\xD0\x05\x28\x2E\xD0\x06\x28\x2E\xD0\xC1\xF8\x00\xC0\x08\x68\xBC\x4B\x04\xFB\x00\xF1\x01\xEB\x52\x01\xB1\xFB\xF2\xF1\x02\xFB\x01\xF2\x02\xEB\x50\x02\xB2\xFB\xF0\xF0\x18\x60\x00\x1B\x00\xD5\x40\x42\xB5\x4A\x12\x68\x90\x42\x1B\xD8\xB8\xEB\x04\x00\x00\xD5\x40\x42\x90\x42\x15\xD8\x00\x20\xB1\x42\x10\xD9\x18\x60\x10\xE0\x0B\x60\xDC\xE7\x03\x20\x08\xE0\x04\x20\x06\xE0\x06\x20\x04\xE0\x08\x20\x02\xE0\x10\x20\x00\xE0\x18\x20\x08\x60\xCF\xE7\xC9\xF8\x00\x00\xDD\xE9\x01\x06\x88\xF7\x20\xFD\xA4\x4B\x00\x22\x88\xF7\x75\xFD\x89\x46\x80\x46\x07\xF5\x7A\x40\x4F\xF4\x7A\x71\x48\x43\x88\xF7\x13\xFD\x4B\x46\x42\x46\x01\x2E\x0B\xD0\x88\xF7\x10\xFE\x88\xF7\xDE\xFC\x01\x46\x9A\x48\x02\x68\x9A\x48\x94\x42\x04\xD3\x1E\x22\x2D\xE0\x88\xF7\xD4\xFA\xF2\xE7\x97\x4A\x12\x68\x94\x42\x01\xD3\x23\x22\x24\xE0\x95\x4A\x12\x68\x94\x42\x4C\xFC\xFF\x43\x49\x21\x00\x01\xD3\x28\x22\x1E\xE0\x93\x4A\x12\x68\x94\x42\x01\xD3\x2D\x22\x18\xE0\x91\x4A\x12\x68\x94\x42\x01\xD3\x46\x22\x12\xE0\x8F\x4A\x12\x68\x94\x42\x01\xD3\x50\x22\x0C\xE0\x8D\x4A\x12\x68\x94\x42\x01\xD3\x5A\x22\x06\xE0\x8B\x4A\x12\x68\x94\x42\x01\xD3\x64\x22\x00\xE0\x6E\x22\x02\x60\x0A\x22\xB1\xFB\xF2\xF1\x86\x4A\xD0\xF8\x00\x80\x01\xFB\x08\xF1\x12\x78\x88\x00\x00\x21\x91\x46\xAE\xF7\x43\xFF\x82\x4B\x6A\x00\x1B\x68\x5F\x00\x38\x18\x41\xF1\x00\x03\xD9\x03\x41\xEA\x50\x41\xC0\x03\x40\x19\x41\xF1\x00\x01\x00\x23\x58\xF7\xD0\xFE\xA0\xFB\x05\x36\x01\xFB\x05\x61\x00\x22\x00\xFB\x02\x11\x9A\x0B\x42\xEA\x81\x42\x89\x0B\xD5\x1B\x61\xF1\x00\x06\x73\x49\x08\x60\x73\x48\x31\x46\x05\x60\x28\x46\x88\xF7\xB2\xFC\x00\x22\x5A\x4B\x88\xF7\x6E\xFA\x00\x22\x59\x4B\x88\xF7\x12\xFB\x88\xF7\x68\xFC\x6C\x49\x00\xFB\x0B\xF0\x40\x1C\x40\x08\x08\x60\x0A\x21\xB8\xFB\xF1\xF2\x00\x23\x31\x46\x28\x46\x58\xF7\xA2\xFE\x04\x27\x27\xFA\x09\xF7\xFB\x17\x3A\x46\x58\xF7\x9B\xFE\x63\x49\x07\x46\x08\x60\x00\x1B\x00\xD5\x40\x42\xDF\x4C\xFC\xFF\x3E\x4A\x21\x00\xF8\x84\x81\x4F\xF0\x09\x0B\x81\x46\x5A\x46\x88\xF8\x00\xB0\x00\x23\x28\x46\x31\x46\x58\xF7\x88\xFE\x80\x08\x40\xEA\x81\x70\xC0\x1B\x00\xD5\x40\x42\x58\x49\x0C\x68\xA0\x42\x21\xD2\x08\x22\x88\xF8\x00\x20\x00\x23\x28\x46\x31\x46\x58\xF7\x76\xFE\x80\x08\x40\xEA\x81\x70\xC0\x1B\x00\xD5\x40\x42\xA0\x42\x11\xD2\x0A\x22\x88\xF8\x00\x20\x00\x23\x28\x46\x31\x46\x58\xF7\x66\xFE\x80\x08\x40\xEA\x81\x70\xC0\x1B\x00\xD5\x40\x42\xA0\x42\x01\xD2\x88\xF8\x00\xB0\x98\xF8\x00\x20\x00\x23\x28\x46\x31\x46\x58\xF7\x55\xFE\x4D\x08\x4F\xEA\x30\x04\x41\x48\x52\x46\x00\x23\x04\x60\x40\x48\x00\x19\x45\xF1\x00\x01\x58\xF7\x48\xFE\x3E\x49\x1F\x28\x08\x60\x01\xD9\x1F\x20\x08\x60\x02\x46\x00\x23\x20\x46\x29\x46\x58\xF7\x3C\xFE\x04\x46\x39\x48\x00\x21\xC9\x05\x04\x60\x4F\xEA\xC9\x50\x65\x08\x41\xEA\x59\x21\x40\x19\x41\xF1\x00\x01\x22\x46\x00\x23\x58\xF7\x2B\xFE\x32\x49\x22\x46\x00\x23\x08\x60\x4F\xF0\xE0\x50\x00\x21\x28\x18\x41\xF1\x25\x01\x58\xF7\x1F\xFE\x2D\x49\x22\x46\x00\x23\x08\x60\x4F\xF0\xA8\x40\x00\x21\x28\x18\x4C\xFC\xFF\x39\x4B\x21\x00\x41\xF1\x6F\x01\x58\xF7\x13\xFE\x28\x49\x08\x60\x01\x20\xBD\xE8\xFE\x8F\x00\x80\xBB\x00\x18\x37\x42\x00\xFC\x0F\x21\x00\xE8\x11\x21\x00\xA8\x11\x21\x00\x80\x84\x1E\x41\x80\x84\x2E\x41\x00\x00\xF0\x3F\xAC\x11\x21\x00\x00\x10\x32\x00\x10\x12\x21\x00\x0C\x12\x21\x00\x08\x12\x21\x00\x20\x13\x21\x00\x00\x40\x8F\x40\xB8\x11\x21\x00\xF4\x11\x21\x00\xBC\x11\x21\x00\xC0\x11\x21\x00\xC4\x11\x21\x00\xC8\x11\x21\x00\xCC\x11\x21\x00\xD0\x11\x21\x00\xD4\x11\x21\x00\xA9\x11\x21\x00\xD8\x11\x21\x00\xDC\x11\x21\x00\xEC\x11\x21\x00\xFC\x11\x21\x00\xB0\x11\x21\x00\xAA\x11\x21\x00\xE0\x11\x21\x00\xB4\x11\x21\x00\x00\xC0\x5D\x00\xF8\x11\x21\x00\xE4\x11\x21\x00\xF0\x11\x21\x00\x00\x12\x21\x00\x04\x12\x21\x00\x03\x01\x0C\x00\x29\x0D\x00\x01\x21\x81\x70\x59\xF7\x84\xB9\x03\x01\x20\x08\x29\x0D\x00\x04\x28\x03\xD0\x03\x28\x07\xD3\x5B\xF7\x51\xBC\x4F\xF4\x48\x11\x4F\xF4\x00\x50\xC8\x65\xF7\xE7\x70\x47\x00\x00\x03\x01\x80\x01\x24\x29\x0D\x00\x2D\xE9\xF0\x41\x1A\x48\x00\x68\xC0\x07\x2E\xD0\x19\x48\x01\x68\x41\xF0\x01\x4C\xFC\xFF\x34\x4C\x21\x00\x01\x01\x60\x17\x4F\x7C\x3F\x38\x68\x40\xF0\x80\x00\x38\x60\x15\x4E\x01\x20\x30\x60\x48\xF7\x16\xFB\x3D\x68\x25\xF0\x80\x00\x38\x60\x0F\x48\x74\x38\x01\x68\x41\xF0\x20\x01\x01\x60\x01\x68\x21\xF0\x20\x01\x01\x60\x00\x24\x04\xE0\x30\x20\x48\xF7\x6F\xFA\x04\xF1\x01\x04\x30\x68\x80\x07\x01\xD4\x32\x2C\xF5\xD3\x45\xF0\x80\x00\x38\x60\x00\x20\x30\x60\xBD\xE8\xF0\x81\x00\x00\x60\x18\x20\x00\x7C\x08\x64\x00\xB4\x04\x32\x00\x03\x01\x88\x01\xA0\x29\x0D\x00\x30\xB5\x1B\x4C\x24\x78\x01\x2C\x07\xD1\xB0\xF5\xE1\x3F\x07\xD0\x18\x4C\x25\x68\x45\xF0\x01\x05\x25\x60\x17\x4C\xA0\x42\x01\xD8\x16\x4C\x00\xE0\x16\x4C\xB4\xFB\xF0\xF0\x10\x28\x0C\xDB\xC4\x17\x00\xEB\x14\x74\x25\x11\x24\xF0\x0F\x04\x04\x1B\x18\x68\x20\xF0\x08\x00\x40\xF0\x80\x00\x06\xE0\x05\x46\x18\x68\x00\x24\x20\xF0\x80\x00\x40\xF0\x08\x00\x18\x60\xC5\xF5\x80\x70\x10\x60\x04\xEB\xD4\x70\x40\x10\x22\x1A\x42\xEA\x00\x10\x08\x60\x30\xBD\x00\x00\xDC\x30\x0D\x00\x1C\x04\x36\x00\x60\xE3\x16\x00\x00\x36\x6E\x01\x00\x6C\xDC\x02\x03\x01\x72\x24\x2A\x0D\x4C\xFC\xFF\x2F\x4D\x21\x00\x00\xD0\xF8\xD8\x20\x05\x46\x00\x21\x90\x47\x48\x4E\x48\x4C\x05\xF1\xB0\x09\x48\x46\x80\xF7\x29\xFA\x07\x46\xB0\x78\x08\xB3\x72\xF7\x0A\xFD\x80\x46\x20\x78\xC1\x06\x07\xD5\x40\xF0\x08\x00\x20\x70\x72\xF7\xEC\xFA\x3F\x49\x08\x60\x10\xE0\x40\xF0\x10\x00\x20\x70\x3D\x48\x72\xF7\xB7\xFB\xB1\x78\x43\xF2\xD4\x00\x41\x43\x3A\x48\x72\xF7\x89\xFB\x20\x78\x20\xF0\x08\x00\x20\x70\x40\x46\x72\xF7\xEE\xFC\xD5\xF8\xD8\x20\x39\x46\x28\x46\x90\x47\xD1\xE7\x03\x01\x18\x92\x2A\x0D\x00\x2F\x48\x10\xB5\x40\x79\x18\xB1\x30\xF7\x26\xFA\x00\x28\x00\xD0\x01\x20\x10\xBD\x03\x01\xC2\x01\xA6\x2A\x0D\x00\x2D\xE9\xF0\x41\xDF\xF8\xB4\x80\x0E\x46\x98\xF8\x00\x00\xF0\xB3\xE6\xB3\xC0\x07\x3A\xD0\x71\x68\x06\xF1\x08\x00\xA1\xF5\xE0\x42\x84\x3A\x0F\xD1\x45\x88\x04\x46\x05\xF1\x09\x00\x72\xF7\xB3\xFD\x07\x46\x2A\x46\x21\x1D\x09\x30\x72\xF7\xA1\xFE\x3C\x46\x47\xF2\x3F\x00\x1D\xE0\xA1\xF5\xE0\x42\x41\x3A\x1F\xD1\x05\x46\xFD\xF7\xB3\xFF\x07\x00\x1A\xD0\x28\x78\x13\x28\x17\xD0\x68\x78\x00\x1D\x42\xF7\x36\xFB\x69\x78\xA0\xF1\x08\x4C\xFC\xFF\x2A\x4E\x21\x00\x04\x89\x1C\x41\x80\x20\xF8\x04\x7B\x6A\x78\x29\x46\x92\x1C\x72\xF7\x81\xFE\x47\xF2\x82\x00\x60\x60\x58\xF7\x94\xFE\x21\x46\x30\xF7\x16\xFB\x00\xE0\x09\xE0\x98\xF8\x00\x00\x40\x07\x05\xD5\x30\x46\x72\xF7\x35\xFE\x00\x20\xBD\xE8\xF0\x81\x01\x20\xFB\xE7\x00\x00\xC4\x18\x20\x00\x16\x1D\x20\x00\x1C\x1D\x20\x00\xF0\x50\x20\x00\xDD\x30\x0D\x00\x10\x01\x0F\x00\x28\xDB\x03\x00\x92\xF0\x6A\xBB\x00\x00\x00\x02\x0D\x00\x10\x01\x0F\x01\xBC\x92\x07\x00\x56\xF0\xA8\xBF\x00\x00\x10\x02\x0D\x00\x10\x01\x0F\x02\x04\x89\x07\x00\x57\xF0\x89\xBC\x00\x00\x1A\x02\x0D\x00\x10\x01\x0F\x03\xCC\x2A\x07\x00\x5D\xF0\xAC\xBB\x00\x00\x28\x02\x0D\x00\x10\x01\x0F\x04\x70\x27\x04\x00\x8D\xF0\x5E\xBD\x00\x00\x30\x02\x0D\x00\x10\x01\x0F\x05\xCC\x54\x03\x00\x02\x21\x00\xE0\x00\x00\x00\x00\x00\x00\x10\x01\x0F\x06\x9C\x7B\x07\x00\x58\xF0\x4C\xBB\x00\x00\x38\x02\x0D\x00\x10\x01\x0F\x07\x64\x70\x06\x00\x69\xF0\x4A\xBA\x00\x00\xFC\x04\x0D\x00\x10\x01\x0F\x08\xE0\x00\x02\x00\xB0\xF0\xAE\xB8\x00\x00\x40\x02\x0D\x00\x10\x01\x0F\x09\x4C\xFC\xFF\x25\x4F\x21\x00\xB8\xBB\x02\x00\xA4\xF0\x4C\xBB\x00\x00\x54\x02\x0D\x00\x10\x01\x0F\x0A\x78\x3A\x00\x00\x01\x20\x20\xB9\x00\x00\x00\x00\x00\x00\x10\x01\x0F\x0B\x20\x6C\x05\x00\x79\xF0\x28\xBB\x00\x00\x74\x02\x0D\x00\x10\x01\x0F\x0C\x20\x65\x06\x00\x0C\x20\x50\x43\x00\x00\x00\x00\x00\x00\x10\x01\x0F\x0D\xE0\x9B\x06\x00\x66\xF0\x1C\xBF\x00\x00\x1C\x0A\x0D\x00\x10\x01\x0F\x0E\x1C\xA1\x06\x00\x66\xF0\xB2\xB8\x00\x00\x84\x02\x0D\x00\x10\x01\x0F\x0F\x90\x33\x04\x00\x8C\xF0\x7E\xBF\x00\x00\x90\x02\x0D\x00\x10\x01\x0F\x10\xCC\xEF\x03\x00\x91\xF0\x78\xBD\x00\x00\xC0\x0A\x0D\x00\x10\x01\x0F\x11\x20\x74\x07\x00\x58\xF0\x3C\xBF\x00\x00\x9C\x02\x0D\x00\x10\x01\x0F\x12\x24\x20\x03\x00\x9E\xF0\xF4\xBE\x00\x00\x10\x0E\x0D\x00\x10\x01\x0F\x13\x6C\x20\x03\x00\x9E\xF0\xF7\xBE\x00\x00\x5E\x0E\x0D\x00\x06\x01\x04\x9C\x0F\x0D\x00\x10\x01\x0F\x14\x14\xFD\x06\x00\x61\xF0\x4F\xB9\x00\x00\xB6\x0F\x0D\x00\x10\x01\x0F\x15\xA8\x67\x05\x00\x7A\xF0\x7C\xBE\x00\x00\xA4\x14\x0D\x00\x06\x01\x04\xD6\x14\x0D\x00\x10\x01\x0F\x16\x84\x1B\x02\x4C\xFC\xFF\x20\x50\x21\x00\x00\xAE\xF0\x8E\xBB\x00\x00\xA4\x02\x0D\x00\x10\x01\x0F\x17\x4C\x40\x03\x00\x9D\xF0\xEC\xBB\x00\x00\x28\x18\x0D\x00\x10\x01\x0F\x18\xD0\x4B\x03\x00\x9B\xF0\x6C\xBB\x00\x00\xAC\x02\x0D\x00\x10\x01\x0F\x19\x74\x4D\x03\x00\x9B\xF0\x9E\xBA\x00\x00\xB4\x02\x0D\x00\x10\x01\x0F\x1A\xEC\x17\x02\x00\xB0\xF0\xDE\xB9\x00\x00\xAC\x1B\x0D\x00\x10\x01\x0F\x1B\x38\xC7\x01\x00\xB3\xF0\xC2\xBD\x00\x00\xC0\x02\x0D\x00\x10\x01\x0F\x1C\x10\x44\x00\x00\xCD\xF0\xEA\xBC\x00\x00\xE8\x1D\x0D\x00\x10\x01\x0F\x1D\x84\xD3\x02\x00\xA4\xF0\x0C\xBF\x00\x00\xA0\x21\x0D\x00\x10\x01\x0F\x1E\xF0\xD2\x02\x00\xA2\xF0\xEA\xBF\x00\x00\xC8\x02\x0D\x00\x06\x01\x04\x82\x22\x0D\x00\x10\x01\x0F\x1F\xF4\xD7\x08\x00\x42\xF0\x72\xBD\x00\x00\xDC\x02\x0D\x00\x10\x01\x0F\x20\xF0\xAF\x01\x00\xB7\xF0\x98\xBC\x00\x00\x24\x29\x0D\x00\x10\x01\x0F\x21\x64\x39\x08\x00\x4F\xF0\x1C\xB8\x00\x00\xA0\x29\x0D\x00\x10\x01\x0F\x22\xE8\x70\x07\x00\x59\xF0\xFE\xB8\x00\x00\xE8\x02\x0D\x00\x10\x01\x0F\x23\x54\x2F\x00\x00\xCD\xF0\xD0\xB9\x00\x00\xF8\x02\x0D\x4C\xFC\x2C\x1B\x51\x21\x00\x00\x10\x01\x0F\x24\xE0\x31\x00\x00\xCD\xF0\x8E\xB8\x00\x00\x00\x03\x0D\x00\x10\x01\x0F\x25\xFC\xB5\x01\x00\xB4\xF0\x8C\xBE\x00\x00\x18\x03\x0D\x00\xFE\x00\x00\x4C\xFC\xFF\x64\x2B\x0D\x00\x01\x02\x04\x00\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x01\x65\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x60\x01\x65\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\xC0\x04\x41\x00\x00\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xAD\x1E\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\xBC\x01\x60\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x21\xB6\x02\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x20\x00\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x1C\x00\x60\x00\x40\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x18\x00\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x14\x00\x60\x00\xF0\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xC0\x04\x41\x00\x01\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x2C\x00\x60\x00\x30\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x24\x00\x60\x00\xFF\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x19\x1F\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\xE8\x02\x60\x4C\xFC\xFF\x5F\x2C\x0D\x00\x00\x40\x00\x00\x00\xF0\x00\x00\x00\x00\x00\x00\x00\x64\x04\x41\x00\xBA\x40\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x60\x04\x41\x00\xC0\x50\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x41\x1E\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x34\x06\x41\x00\x80\x18\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x60\x01\x60\x00\x55\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x30\x04\x41\x00\xE9\x02\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xDC\x06\x41\x00\xF1\x82\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xC0\x04\x41\x00\x21\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x88\x04\x41\x00\x00\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xB3\x1F\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\xDF\x1F\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x51\x1F\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x9C\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xA0\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xA4\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x4C\xFC\xFF\x5A\x2D\x0D\x00\x00\x00\xA8\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xAC\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xC8\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xCC\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xD0\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xD4\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xD8\x02\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x69\x1E\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x81\xB7\x02\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\xF0\x00\x64\x00\x01\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xE4\x00\x64\x00\x0C\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xE0\x00\x64\x00\x30\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFC\x02\x60\x00\x01\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xBC\x01\x60\x00\x01\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xAD\x1E\x0D\x00\xBC\xBC\xBC\xBC\x43\x4C\xFC\xFF\x55\x2E\x0D\x00\x43\x43\x43\x00\x00\x00\x00\x0C\x01\x60\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x0B\x20\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x60\x01\x65\x00\x01\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x70\x01\x65\x00\x01\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xF8\x00\x64\x00\xDF\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xC8\x00\x64\x00\x18\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x20\x00\x60\x00\xBE\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x1C\x00\x60\x00\xFF\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x18\x00\x60\x00\x0F\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x14\x00\x60\x00\xFF\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x24\x00\x60\x00\xFF\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x2C\x00\x60\x00\x30\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xDC\x04\x60\x00\x08\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xE8\x04\x41\x00\x02\xC2\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x64\x04\x41\x00\xBA\x40\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x34\x06\x41\x00\x4C\xFC\xFF\x50\x2F\x0D\x00\x00\x48\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xE8\x02\x60\x00\x45\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xB3\x1F\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\xDF\x1F\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x41\x1E\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x69\x1E\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x17\x21\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x2B\x20\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\xC0\x04\x41\x00\x21\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xBF\x20\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\x71\x1F\x0D\x00\xBC\xBC\xBC\xBC\x43\x43\x43\x43\x00\x00\x00\x00\xF0\x00\x64\x00\x01\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xE4\x00\x64\x00\x0C\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\xE0\x00\x64\x00\x30\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0B\xA0\x02\x00\x1D\x1E\x0D\x00\x39\xA0\x02\x00\x57\xA0\x02\x4C\xFC\x65\x4B\x30\x0D\x00\x00\xD3\xA0\x02\x00\x7B\xA1\x02\x00\xB5\xA1\x02\x00\xC5\xA2\x02\x00\x6D\x07\x0D\x00\x03\x00\x00\x00\x6D\x06\x0D\x00\x0A\x00\x06\x00\x21\x08\x0D\x00\x06\x00\x09\x00\xB7\x08\x0D\x00\x04\x00\x08\x00\xB7\x09\x0D\x00\x04\x00\x06\x00\xC9\x09\x0D\x00\x03\x00\x07\x00\xC5\x07\x0D\x00\x00\x00\x0E\x00\x29\x17\x0D\x00\x0A\x00\x06\x00\xD5\x07\x0D\x00\x23\x00\x00\x00\x11\x23\x0D\x00\x04\x00\x06\x00\x4C\xFC\x05\xDD\x30\x0D\x00\x00\x4C\xFC\x05\xDC\x30\x0D\x00\x00\x4C\xFC\x0C\xD4\x30\x0D\x00\x10\x00\x00\x00\x0F\x00\x00\x00\x4C\xFC\x28\xAF\x30\x0D\x00\x52\x66\xFC\xFC\x3E\x52\xFD\xFD\x2A\x3E\xFE\xFE\x16\x2A\xFF\xFF\x02\x16\x00\x00\xEE\x02\x01\x01\xDA\xEE\x02\x02\xC6\xDA\x03\x03\xB2\xC6\x04\x04\x4C\xFC\x05\xAE\x30\x0D\x00\x01\x4C\xFC\x05\xAD\x30\x0D\x00\x28\x4C\xFC\x05\xAC\x30\x0D\x00\x01\x4E\xFC\x04\xFF\xFF\xFF\xFF";
// Kontakt.io iBeacon - Advertising packet structure
// Byte offset Default value Description Properties
// 0 0x02 Data length – 2 bytes constant preamble
// 1 0x01 Data type – flags constant preamble
// 2 0x06 LE and BR/EDR flag constant preamble
// 3 0x1a Data length – 26 bytes constant preamble
// 4 0xff Data type - manufacturer specific data constant preamble
// 5 0x4c Manufacturer data constant preamble
// 6 0x00 Manufacturer data constant preamble
// 7 0x02 Manufacturer data constant preamble
// 8 0x15 Manufacturer data constant preamble
// 9 0xf7 Proximity UUID 1st byte set user UUID
// 10 0x82 Proximity UUID 2nd byte set user UUID
// 11 0x6d Proximity UUID 3rd byte set user UUID
// 12 0xa6 Proximity UUID 4th byte set user UUID
// 13 0x4f Proximity UUID 5th byte set user UUID
// 14 0xa2 Proximity UUID 6th byte set user UUID
// 15 0x4e Proximity UUID 7th byte set user UUID
// 16 0x98 Proximity UUID 8th byte set user UUID
// 17 0x80 Proximity UUID 9th byte set user UUID
// 18 0x24 Proximity UUID 10th byte set user UUID
// 19 0xbc Proximity UUID 11th byte set user UUID
// 20 0x5b Proximity UUID 12th byte set user UUID
// 21 0x71 Proximity UUID 13th byte set user UUID
// 22 0xe0 Proximity UUID 14th byte set user UUID
// 23 0x89 Proximity UUID 15th byte set user UUID
// 24 0x3e Proximity UUID 16th byte set user UUID
// 25 xx* Major 1st byte set major value
// 26 xx* Major 2nd byte set major value
// 27 xx* Minor 1st byte set minor value
// 28 xx* Minor 2nd byte set minor value
// 29 0xb3 Signal power (calibrated RSSI@1m) signal power value
// iBeacon Constants
enum I_BEACON {
LENGTH = 30,
NO_PRE_LENGTH = 27,
PREAMBLE = "\x02\x01\x06", // Flags Prefix
DATA_LENGTH = "\x1A", // Payload Length
MFG_TYPE = "\xFF", // Custom Manufacturer Packet
MFG_ID_APPLE = "\x4C\x00", // Apple
SUB_TYPE = "\x02", // iBeacon
SUB_TYPE_LENGTH = "\x15", // Sub packet length (UUID, major, minor, power)
MAX_ADVERT_LEN = 31,
MIN_ADVERT_MS = 100,
MAX_ADVERT_MS = 100,
SCAN_INTERVAL_MS = 100,
SCAN_WINDOW_MS = 100,
ERROR_ADVERT_LEN = "BLE advert too long",
ERROR_SCAN_LEN = "BLE advert scan too long"
}
enum BEACON_TYPE {
ADV_IND, // 0 Connectable undirected advertisement
ADV_DIRECT_IND, // 1 Connectable directed advertisement
ADV_SCAN_IND, // 2 Scannable undirected advertisement
ADV_NONCONN_IND, // 3 Non-connectable undirected advertisement
SCAN_RSP // 4 Scan response
}
// iBeacon Application
class iBeacon {
_bt = null;
_active = null;
_uuid = null;
_currResp = null;
_filters = null;
_onIBeacon = null;
_onBeaconResp = null;
constructor(uuid, active) {
_uuid = uuid;
_active = active;
_filters = [];
_bootBLE();
}
function advertise(maj, min, pwr, resp = null) {
_currResp = resp;
local advert = _createIBeacon(_uuid, maj, min, pwr);
_advertise(advert, I_BEACON.MIN_ADVERT_MS, resp);
}
function scan(filter, onIBeacon, onBeaconResp = null) {
// Set callback for iBeacon
_onIBeacon = onIBeacon;
// Set callback for iBeacon device state update
_onBeaconResp = onBeaconResp;
// Add filter
if (filter != null) _filters.push(filter);
// Start scan with filters
_startScan(_filters, _active, _scanCB.bindenv(this));
}
function createGateWayFilter(major, minor, minRSSI) {
local data = format("%s%s", I_BEACON.DATA_LENGTH, I_BEACON.MFG_TYPE) +
I_BEACON.MFG_ID_APPLE +
format("%s%s", I_BEACON.SUB_TYPE, I_BEACON.SUB_TYPE_LENGTH) +
_uuid + major + minor;
return { "data" : data,
"minrssi" : minRSSI,
"cb" : _iBeaconFilterCb.bindenv(this) };
}
function createUUIDFilter(minRSSI) {
local data = format("%s%s", I_BEACON.DATA_LENGTH, I_BEACON.MFG_TYPE) +
I_BEACON.MFG_ID_APPLE +
format("%s%s", I_BEACON.SUB_TYPE, I_BEACON.SUB_TYPE_LENGTH) +
_uuid;
return { "data" : data,
"minrssi" : minRSSI,
"cb" : _iBeaconFilterCb.bindenv(this) };
}
function getCurrResp() {
return _currResp;
}
function stopAdvertising() {
_bt.stopadvertise();
}
// I-Beacon Helpers
// --------------------------------------------------
function _createIBeacon(uuid, major, minor, pwr) {
local advert = blob(I_BEACON.LENGTH);
advert.writestring(format("%s%s%s", I_BEACON.PREAMBLE, I_BEACON.DATA_LENGTH, I_BEACON.MFG_TYPE));
advert.writestring(I_BEACON.MFG_ID_APPLE);
advert.writestring(format("%s%s", I_BEACON.SUB_TYPE, I_BEACON.SUB_TYPE_LENGTH));
advert.writestring(uuid);
advert.writestring(major);
advert.writestring(minor);
advert.writen(pwr, 'c');
return advert;
}
function _createScanRespFilter(mac) {
return { "address" : mac,
"type" : BEACON_TYPE.SCAN_RSP,
"cb" : _scanRespCB.bindenv(this) };
}
function _iBeaconFilterCb(advert) {
// If there is also a scan response, add filter if we don't have one
local mac = advert.address;
local type = advert.type;
if (type == BEACON_TYPE.ADV_SCAN_IND) {
local haveRespFilter = false;
foreach(filter in _filters) {
if ("address" in filter && filter.address == mac) {
haveRespFilter = true;
break;
}
}
if (!haveRespFilter) {
// Add filter for response
_filters.push(_createScanRespFilter(mac));
// Restart scan with updated filters
_startScan(_filters, _active, _scanCB.bindenv(this));
}
}
if (_onIBeacon != null) {
// Verify iBeacon and pass to parsed beacon to callback
local beacon = {
"mac" : mac,
"rssi" : advert.rssi,
"ts" : time(),
};
local payload = advert.data;
local payloadLen = payload.len();
// Verify packet length, and set pointer to start of UUID
if (I_BEACON.LENGTH == payloadLen) {
payload.seek(9, 'b');
} else if (I_BEACON.NO_PRE_LENGTH == payloadLen) {
payload.seek(6, 'b');
} else {
return;
}
local advertUUID = payload.readblob(16);
local majMin = payload.readblob(4);
local pwr = payload.readn('c');
if (crypto.equals(_uuid, advertUUID)) {
beacon.uuid <- advertUUID
beacon.major <- majMin.readstring(2);
beacon.minor <- majMin.readstring(2);
beacon.pwr <- pwr;
_onIBeacon(beacon);
}
}
}
function _scanRespCB(advert) {
// Byte 1 & 2 - major
// Byte 3 & 4 - minor
// Byte 5 - LED State
// Byte 6 - ALS Event
local payload = advert.data;
local payloadLen = payload.len();
// Check that the payload is the expected length
if (payloadLen == 2) {
_respFromDevice(advert.address, payload)
} else if (payloadLen == 6) {
_respFromGateway(advert.address, payload);
} else {
server.log(payload);
}
}
function _respFromGateway(mac, payload) {
// Byte 1 & 2 - major
// Byte 3 & 4 - minor
// Byte 5 - LED State
// Byte 6 - ALS Event
payload.seek(0, 'b');
local majMin = payload.readblob(4);
local resp = {
"mac" : mac,
"ts" : time(),
"major" : majMin.readstring(2),
"minor" : majMin.readstring(2),
"ledState" : payload.readn('b'),
"alsEvent" : payload.readn('b')
}
if (_onBeaconResp) _onBeaconResp(resp);
}
function _respFromDevice(mac, payload) {
// Byte 1 - LED State
// Byte 2 - ALS Event
payload.seek(0, 'b');
local resp = {
"mac" : mac,
"ts" : time(),
"ledState" : payload.readn('b'),
"alsEvent" : payload.readn('b')
}
if (_onBeaconResp) _onBeaconResp(resp);
}
function _scanCB(adverts) {
foreach (advert in adverts) {
local cbIdx = advert.rule;
if (cbIdx < _filters.len() && "cb" in _filters[cbIdx]) {
_filters[cbIdx]["cb"](advert);
}
}
}
// BLE Helpers
// --------------------------------------------------
function _bootBLE() {
// Configure BLE Pins To Default State
BLE_REG_ON.configure(DIGITAL_OUT, 0);
BLE_LPO.configure(DIGITAL_OUT, 0);
BLE_UART_TX.configure(DIGITAL_OUT, 1);
BLE_UART_RX.configure(DIGITAL_IN_PULLDOWN);
// Setting BT_REG_ON high to power on the Bluetooth half of the 43438.
BLE_REG_ON.write(1);
// Give pin a moment to change pin state
imp.sleep(0.1);
// Open BT connection gets it ready to use.
// This operation BLOCKS and takes about 1.5 seconds
_bt = hardware.bluetooth.open(BLE_UART, BLE_FIRMWARE);
}
// Shuts off 43438 and frees up memeory used by BLE stack
function _shutdownBLE() {
// Don't shutdown if
if (_bt == null) return;
_bt.close();
_bt = null;
BLE_REG_ON.write(0);
}
function _advertise(advert, advertInterval = null, scan = null) {
if (advert.len() > I_BEACON.MAX_ADVERT_LEN) throw I_BEACON.ERROR_ADVERT_LEN;
local min = I_BEACON.MIN_ADVERT_MS;
local max = I_BEACON.MAX_ADVERT_MS;
if (advertInterval != null) {
min = advertInterval;
max = advertInterval;
}
if (scan != null) {
if (scan.len() > I_BEACON.MAX_ADVERT_LEN) throw I_BEACON.ERROR_SCAN_LEN;
_bt.startadvertise(advert, min, max, scan);
} else {
_bt.startadvertise(advert, min, max);
}
}
function _startScan(filters, active, cb) {
// Set scan filters
if (filters != null) _bt.setscanfilter(filters);
_bt.setscanparams(active, I_BEACON.SCAN_INTERVAL_MS, I_BEACON.SCAN_WINDOW_MS);
_bt.startscan(cb);
}
function _stopScan() {
_bt.stopscan()
}
}
// Monitor Application
// -------------------------------------------------------------------------------
const LED_TOGGLE_TIMER = 30;
const LED_ADVERT_TIMER = 1;
const INACTIVE_CHECK = 5;
const INACTIVE_EXPIRE = 30;
const GATEWAY_MAJOR = "\x00\x00";
const GATEWAY_MINOR = "\x00\x00";
// Expected rssi at 1m
const POWER = -60;
const MIN_RSSI = -90;
// Monitor:
// Track devices by major, minor id's
// If ALS event changes state for a device log
// Toggle LED every 30sec
class Monitor {
ble = null;
beacons = null;
devs = null;
constructor(_ble) {
beacons = {};
ble = _ble;
cleanupLoop();
imp.wakeup(LED_TOGGLE_TIMER, toggleDevsLED.bindenv(this));
// Start scan for gateway beacons
ble.scan(ble.createUUIDFilter(MIN_RSSI), onIBeacon.bindenv(this), onIBeaconResp.bindenv(this));
}
function toggleDevsLED() {
server.log("toggling LED state");
devs = [];
foreach(mac, info in beacons) {
devs.push(mac);
}
ledLoop();
}
function ledLoop() {
if (devs.len() > 0) {
local mac = devs.remove(0);
// start advert
if (mac in beacons) {
local dev = beacons[mac];
if ("state" in dev) {
local currState = dev.state;
local scanResp = dev.major + dev.minor + format("%c%c",
(currState.ledState) ? 0 : 1,
currState.alsEvent);
ble.advertise(GATEWAY_MAJOR, GATEWAY_MINOR, POWER, scanResp);
}
}
imp.wakeup(LED_ADVERT_TIMER, ledLoop.bindenv(this));
} else {
// stop adverts
ble.stopAdvertising();
imp.wakeup(LED_TOGGLE_TIMER, toggleDevsLED.bindenv(this));
}
}
function cleanupLoop() {
removeInactive();
imp.wakeup(INACTIVE_CHECK, cleanupLoop.bindenv(this));
}
function onIBeacon(iBeacon) {
if ("mac" in iBeacon) {
if (iBeacon.mac in beacons) {
local dev = beacons[iBeacon.mac];
foreach(k, v in iBeacon) {
dev[k] <- v;
}
} else {
server.log("New device found: ");
foreach(k, v in iBeacon) {
server.log(k + ": " + v);
}
beacons[iBeacon.mac] <- iBeacon;
}
}
}
function onIBeaconResp(resp) {
if ("mac" in resp && resp.mac in beacons) {
// Log state changes
if ("state" in beacons[resp.mac]) {
local currState = beacons[resp.mac]["state"];
if (currState.alsEvent != resp.alsEvent) server.log("Change in ALS state: " + resp.alsEvent);
if (currState.ledState != resp.ledState) server.log("Change in LED state: " + resp.ledState);
} else {
foreach(k, v in resp) {
server.log(k + ": " + v);
}
}
// Update device state
beacons[resp.mac]["state"] <- resp;
}
}
function removeInactive() {
local now = time();
foreach(mac, iBeacon in beacons) {
local lastSeen = now - iBeacon.ts;
if (lastSeen >= INACTIVE_EXPIRE) {
beacons.rawdelete(mac);
}
}
}
}
// RUNTIME
// -------------------------------------------------------------------------------
server.log("Device running...");
server.log(imp.getsoftwareversion());
imp.enableblinkup(true);
// Generate with random generator ie https://www.uuidgenerator.net/
const UUID = "\x75\xa1\x6d\x1a\xc9\xd9\x4a\x1a\x8a\x9a\x7f\x5b\x52\xc7\xb8\xd5";
// Initialize BLE iBeacon class with uuid and active scanning enabled
ble <- iBeacon(UUID, true);
Monitor(ble);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment