Created
November 9, 2023 20:24
-
-
Save vtvz/5397b937507578a3ab23bff156e35bc7 to your computer and use it in GitHub Desktop.
OpenAI Lyrics Analysis
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/env node | |
// Use the openai package from npm to call ChatGPT | |
import OpenAI from "openai"; | |
import fs from "fs"; | |
// Create a new instance of the openai client with our API key | |
const openai = new OpenAI({ | |
apiKey: process.env.OPENAI_KEY, | |
}); | |
const model = "gpt-3.5-turbo"; | |
// const model = "gpt-4"; | |
const file = "without-me"; | |
// const file = "slim-shady"; | |
// Base64 encoded https://genius.com/Eminem-the-real-slim-shady-lyrics | |
const text = atob(fs.readFileSync(file.".txt")); | |
const makeRequest = async (model) => { | |
return await openai.chat.completions.create({ | |
model: model, | |
messages: [ | |
{ | |
role: "user", | |
content: `Analyze the following lyrics`, | |
}, | |
{ | |
role: "user", | |
content: text, | |
}, | |
], | |
functions: [ | |
{ | |
name: "lyrict_analyze", | |
parameters: { | |
type: "object", | |
properties: { | |
is_explicit: { | |
type: "boolean", | |
description: "Do these lyrics have explicit content or profanity", | |
}, | |
explicit_markers: { | |
type: "array", | |
items: { | |
type: "string", | |
enum: [ | |
"sexual_content", | |
"explicit_language", | |
"drugs_references", | |
], | |
}, | |
description: "All reasons why lyrics considered as explicit", | |
}, | |
explicit_explanation: { | |
type: "string", | |
description: | |
"Detailed explanation about exact topics contained in lyrics why they considered profane or explicit", | |
}, | |
explicit_words: { | |
type: "array", | |
items: { | |
type: "string", | |
}, | |
description: | |
"A complete list of all unique words are considered explicit or profane in these lyrics in lowercase", | |
}, | |
short_meaning: { | |
type: "string", | |
maxLength: 500, | |
minLength: 100, | |
description: | |
"A brief description of the song lyrics not longer than five hundred characters", | |
}, | |
}, | |
required: [ | |
"is_explicit", | |
"explicit_markers", | |
"explicit_explanation", | |
"explicit_words", | |
"short_meaning", | |
], | |
}, | |
}, | |
], | |
function_call: { name: "lyrict_analyze" }, | |
}); | |
}; | |
const results = []; | |
for (let i = 0; i < 30; i++) { | |
const start = new Date().valueOf(); | |
const gptResponse = await makeRequest(model); | |
const functionCall = gptResponse.choices[0].message.function_call; | |
const json = JSON.parse(functionCall.arguments); | |
const res = new Date().valueOf() - start; | |
json.duration = res; | |
results.push(json); | |
console.log(i); | |
console.log(json); | |
} | |
fs.writeFileSync(`${file}-${model}.json`, JSON.stringify(results)); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "openai-test", | |
"type": "module", | |
"version": "1.0.0", | |
"description": "", | |
"main": "index.js", | |
"scripts": { | |
"test": "echo \"Error: no test specified\" && exit 1" | |
}, | |
"author": "", | |
"license": "ISC", | |
"dependencies": { | |
"openai": "^4.14.0" | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/env node | |
import fs from "fs"; | |
const model = "gpt-3.5-turbo"; | |
// const model = "gpt-4"; | |
const file = "without-me"; | |
// const file = "slim-shady"; | |
const percent = (input, all) => Math.round((100 * input) / all) + "%"; | |
let res = []; | |
res = JSON.parse(fs.readFileSync(`${file}-${model}.json`)); | |
let len = res.length; | |
let positive = res.filter((item) => item.is_explicit).length; | |
let all_words = res.map((item) => item.explicit_words).flat(); | |
let unique_words = new Set(all_words); | |
console.log("Model:", model); | |
console.log("Attempts:", len); | |
console.log("Positive results:", positive, percent(positive, len)); | |
let meaning = res | |
.map((item) => item.short_meaning.length) | |
.filter((item) => item <= 500).length; | |
console.log("Meaning less then 500 chars:", percent(meaning, len)); | |
let duration = | |
res.map((item) => item.duration).reduce((a, b) => a + b, 0) / res.length; | |
console.log("Avg duration", Math.round(duration), "ms"); | |
let all_markers = res.map((item) => item.explicit_markers).flat(); | |
let unique_markers = new Set(all_markers); | |
console.log("Statistics per marker:"); | |
let usage_markers = {}; | |
for (let unique_marker of unique_markers) { | |
usage_markers[unique_marker] = percent( | |
all_markers.filter((word) => word == unique_marker).length, | |
positive, | |
); | |
} | |
console.table(usage_markers); | |
console.log("Statistics per profane word:"); | |
let usage_words = {}; | |
for (let unique_word of unique_words) { | |
usage_words[unique_word] = percent( | |
all_words.filter((word) => word == unique_word).length, | |
positive, | |
); | |
} | |
console.table(usage_words); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
W0ludHJvXQpNYXkgSSBoYXZlIHlvdXIgYXR0ZW50aW9uLCBwbGVhc2U/Ck1heSBJIGhhdmUgeW91ciBhdHRlbnRpb24sIHBsZWFzZT8KV2lsbCB0aGUgcmVhbCBTbGltIFNoYWR5IHBsZWFzZSBzdGFuZCB1cD8KSSByZXBlYXQKV2lsbCB0aGUgcmVhbCBTbGltIFNoYWR5IHBsZWFzZSBzdGFuZCB1cD8KV2UncmUgZ29ubmEgaGF2ZSBhIHByb2JsZW0gaGVyZQoKW1ZlcnNlIDFdClknYWxsIGFjdCBsaWtlIHlvdSBuZXZlciBzZWVuIGEgd2hpdGUgcGVyc29uIGJlZm9yZQpKYXdzIGFsbCBvbiB0aGUgZmxvb3IgbGlrZSBQYW0sIGxpa2UgVG9tbXkganVzdCBidXJzdCBpbiB0aGUgZG9vcgpBbmQgc3RhcnRlZCB3aG9vcGluJyBoZXIgYXNzIHdvcnNlIHRoYW4gYmVmb3JlClRoZXkgZmlyc3Qgd2VyZSBkaXZvcmNlZCwgdGhyb3dpbicgaGVyIG92ZXIgZnVybml0dXJlIChBZ2ghKQpJdCdzIHRoZSByZXR1cm4gb2YgdGhlICJPaCwgd2FpdCwgbm8gd2F5LCB5b3UncmUga2lkZGluZwpIZSBkaWRuJ3QganVzdCBzYXkgd2hhdCBJIHRoaW5rIGhlIGRpZCwgZGlkIGhlPyIKQW5kIERyLiBEcmUgc2FpZApOb3RoaW5nLCB5b3UgaWRpb3RzLCBEci4gRHJlJ3MgZGVhZCwgaGUncyBsb2NrZWQgaW4gbXkgYmFzZW1lbnQgKEhhLWhhISkKRmVtaW5pc3Qgd29tZW4gbG92ZSBFbWluZW0KIkNoaWNrYS1jaGlja2EtY2hpY2thLCBTbGltIFNoYWR5LCBJJ20gc2ljayBvZiBoaW0KTG9vayBhdCBoaW0sIHdhbGtpbicgYXJvdW5kLCBncmFiYmluJyBoaXMgeW91LWtub3ctd2hhdApGbGlwcGluJyB0aGUgeW91LWtub3ctd2hvLCIgIlllYWgsIGJ1dCBoZSdzIHNvIGN1dGUgdGhvdWdoIgpZZWFoLCBJIHByb2JhYmx5IGdvdCBhIGNvdXBsZSBvZiBzY3Jld3MgdXAgaW4gbXkgaGVhZCBsb29zZQpCdXQgbm8gd29yc2UgdGhhbiB3aGF0J3MgZ29pbicgb24gaW4geW91ciBwYXJlbnRzJyBiZWRyb29tcwpTb21ldGltZXMgSSB3YW5uYSBnZXQgb24gVFYgYW5kIGp1c3QgbGV0IGxvb3NlCkJ1dCBjYW4ndCwgYnV0IGl0J3MgY29vbCBmb3IgVG9tIEdyZWVuIHRvIGh1bXAgYSBkZWFkIG1vb3NlCiJNeSBidW0gaXMgb24geW91ciBsaXBzLCBteSBidW0gaXMgb24geW91ciBsaXBzIgpBbmQgaWYgSSdtIGx1Y2t5LCB5b3UgbWlnaHQganVzdCBnaXZlIGl0IGEgbGl0dGxlIGtpc3MKQW5kIHRoYXQncyB0aGUgbWVzc2FnZSB0aGF0IHdlIGRlbGl2ZXIgdG8gbGl0dGxlIGtpZHMKQW5kIGV4cGVjdCB0aGVtIG5vdCB0byBrbm93IHdoYXQgYSB3b21hbidzIGNsaXRvcmlzIGlzCk9mIGNvdXJzZSwgdGhleSdyZSBnb25uYSBrbm93IHdoYXQgaW50ZXJjb3Vyc2UgaXMKQnkgdGhlIHRpbWUgdGhleSBoaXQgZm91cnRoIGdyYWRlIHRoZXkndmUgZ290IHRoZSBEaXNjb3ZlcnkgQ2hhbm5lbCwgZG9uJ3QgdGhleT8KV2UgYWluJ3Qgbm90aGluJyBidXQgbWFtbWFsc+KAlApXZWxsLCBzb21lIG9mIHVzIGNhbm5pYmFscyB3aG8gY3V0IG90aGVyIHBlb3BsZSBvcGVuIGxpa2UgY2FudGFsb3VwZXMKQnV0IGlmIHdlIGNhbiBodW1wIGRlYWQgYW5pbWFscyBhbmQgYW50ZWxvcGVzClRoZW4gdGhlcmUncyBubyByZWFzb24gdGhhdCBhIG1hbiBhbmQgYW5vdGhlciBtYW4gY2FuJ3QgZWxvcGUKQnV0IGlmIHlvdSBmZWVsIGxpa2UgSSBmZWVsLCBJIGdvdCB0aGUgYW50aWRvdGUKV29tZW4sIHdhdmUgeW91ciBwYW50eWhvc2UsIHNpbmcgdGhlIGNob3J1cywgYW5kIGl0IGdvZXMKWW91IG1pZ2h0IGFsc28gbGlrZQpXaXRob3V0IE1lCkVtaW5lbQrigIt2YW1waXJlCk9saXZpYSBSb2RyaWdvCklzIEl0IE92ZXIgTm93PyAoVGF5bG9y4oCZcyBWZXJzaW9uKSBbRnJvbSBUaGUgVmF1bHRdClRheWxvciBTd2lmdApbQ2hvcnVzXQpJJ20gU2xpbSBTaGFkeSwgeWVzLCBJJ20gdGhlIHJlYWwgU2hhZHkKQWxsIHlvdSBvdGhlciBTbGltIFNoYWR5cyBhcmUganVzdCBpbWl0YXRpbmcKU28gd29uJ3QgdGhlIHJlYWwgU2xpbSBTaGFkeSBwbGVhc2Ugc3RhbmQgdXAKUGxlYXNlIHN0YW5kIHVwLCBwbGVhc2Ugc3RhbmQgdXA/CidDYXVzZSBJJ20gU2xpbSBTaGFkeSwgeWVzLCBJJ20gdGhlIHJlYWwgU2hhZHkKQWxsIHlvdSBvdGhlciBTbGltIFNoYWR5cyBhcmUganVzdCBpbWl0YXRpbmcKU28gd29uJ3QgdGhlIHJlYWwgU2xpbSBTaGFkeSBwbGVhc2Ugc3RhbmQgdXAKUGxlYXNlIHN0YW5kIHVwLCBwbGVhc2Ugc3RhbmQgdXA/CgpbVmVyc2UgMl0KV2lsbCBTbWl0aCBkb24ndCBnb3R0YSBjdXNzIGluIGhpcyByYXBzIHRvIHNlbGwgcmVjb3JkcyAoTm9wZSkKV2VsbCwgSSBkbywgc28gZnVjayBoaW0sIGFuZCBmdWNrIHlvdSB0b28KWW91IHRoaW5rIEkgZ2l2ZSBhIGRhbW4gYWJvdXQgYSBHUkFNTVk/CkhhbGYgb2YgeW91IGNyaXRpY3MgY2FuJ3QgZXZlbiBzdG9tYWNoIG1lLCBsZXQgYWxvbmUgc3RhbmQgbWUKIkJ1dCBTbGltLCB3aGF0IGlmIHlvdSB3aW4/IFdvdWxkbid0IGl0IGJlIHdlaXJkPyIKV2h5PyBTbyB5b3UgZ3V5cyBjb3VsZCBqdXN0IGxpZSB0byBnZXQgbWUgaGVyZT8KU28geW91IGNhbiBzaXQgbWUgaGVyZSBuZXh0IHRvIEJyaXRuZXkgU3BlYXJzPwpZbywgc2hpdCwgQ2hyaXN0aW5hIEFndWlsZXJhIGJldHRlciBzd2l0Y2ggbWUgY2hhaXJzClNvIEkgY2FuIHNpdCBuZXh0IHRvIENhcnNvbiBEYWx5IGFuZCBGcmVkIER1cnN0CkFuZCBoZWFyICdlbSBhcmd1ZSBvdmVyIHdobyBzaGUgZ2F2ZSBoZWFkIHRvIGZpcnN0CkxpdHRsZSBiaXRjaCBwdXQgbWUgb24gYmxhc3Qgb24gTVRWCiJZZWFoLCBoZSdzIGN1dGUsIGJ1dCBJIHRoaW5rIGhlJ3MgbWFycmllZCB0byBLaW0sIGhlZS1oZWUiCkkgc2hvdWxkIGRvd25sb2FkIGhlciBhdWRpbyBvbiBNUDMKQW5kIHNob3cgdGhlIHdob2xlIHdvcmxkIGhvdyB5b3UgZ2F2ZSBFbWluZW0gVkQgKEFnaCEpCkknbSBzaWNrIG9mIHlvdSBsaXR0bGUgZ2lybCBhbmQgYm95IGdyb3VwcywgYWxsIHlvdSBkbyBpcyBhbm5veSBtZQpTbyBJIGhhdmUgYmVlbiBzZW50IGhlcmUgdG8gZGVzdHJveSB5b3UKQW5kIHRoZXJlJ3MgYSBtaWxsaW9uIG9mIHVzIGp1c3QgbGlrZSBtZQpXaG8gY3VzcyBsaWtlIG1lLCB3aG8ganVzdCBkb24ndCBnaXZlIGEgZnVjayBsaWtlIG1lCldobyBkcmVzcyBsaWtlIG1lLCB3YWxrLCB0YWxrIGFuZCBhY3QgbGlrZSBtZQpBbmQganVzdCBtaWdodCBiZSB0aGUgbmV4dCBiZXN0IHRoaW5nLCBidXQgbm90IHF1aXRlIG1lCltDaG9ydXNdCidDYXVzZSBJJ20gU2xpbSBTaGFkeSwgeWVzLCBJJ20gdGhlIHJlYWwgU2hhZHkKQWxsIHlvdSBvdGhlciBTbGltIFNoYWR5cyBhcmUganVzdCBpbWl0YXRpbmcKU28gd29uJ3QgdGhlIHJlYWwgU2xpbSBTaGFkeSBwbGVhc2Ugc3RhbmQgdXAKUGxlYXNlIHN0YW5kIHVwLCBwbGVhc2Ugc3RhbmQgdXA/CidDYXVzZSBJJ20gU2xpbSBTaGFkeSwgeWVzLCBJJ20gdGhlIHJlYWwgU2hhZHkKQWxsIHlvdSBvdGhlciBTbGltIFNoYWR5cyBhcmUganVzdCBpbWl0YXRpbmcKU28gd29uJ3QgdGhlIHJlYWwgU2xpbSBTaGFkeSBwbGVhc2Ugc3RhbmQgdXAKUGxlYXNlIHN0YW5kIHVwLCBwbGVhc2Ugc3RhbmQgdXA/CgpbVmVyc2UgM10KSSdtIGxpa2UgYSBoZWFkIHRyaXAgdG8gbGlzdGVuIHRvICdjYXVzZSBJJ20gb25seSBnaXZpbicgeW91ClRoaW5ncyB5b3Ugam9rZSBhYm91dCB3aXRoIHlvdXIgZnJpZW5kcyBpbnNpZGUgeW91ciBsaXZpbicgcm9vbQpUaGUgb25seSBkaWZmZXJlbmNlIGlzIEkgZ290IHRoZSBiYWxscyB0byBzYXkgaXQgaW4gZnJvbnQgb2YgeSdhbGwKQW5kIEkgZG9uJ3QgZ290dGEgYmUgZmFsc2Ugb3Igc3VnYXJjb2F0IGl0IGF0IGFsbApJIGp1c3QgZ2V0IG9uIHRoZSBtaWMgYW5kIHNwaXQgaXQKQW5kIHdoZXRoZXIgeW91IGxpa2UgdG8gYWRtaXQgaXQgKEVyciksIEkganVzdCBzaGl0IGl0CkJldHRlciB0aGFuIG5pbmV0eSBwZXJjZW50IG9mIHlvdSByYXBwZXJzIG91dCBjYW4KVGhlbiB5b3Ugd29uZGVyOiAiSG93IGNhbiBraWRzIGVhdCB1cCB0aGVzZSBhbGJ1bXMgbGlrZSBWYWxpdW1zPyIKSXQncyBmdW5ueSwgJ2NhdXNlIGF0IHRoZSByYXRlIEknbSBnb2luJywgd2hlbiBJJ20gdGhpcnR5CkknbGwgYmUgdGhlIG9ubHkgcGVyc29uIGluIHRoZSBudXJzaW4nIGhvbWUgZmxpcnRpbmcKUGluY2hpbicgbnVyc2UncyBhc3NlcyB3aGVuIEknbSBqYWNraW5nIG9mZiB3aXRoIEplcmdlbnMKQW5kIEknbSBqZXJraW5nLCBidXQgdGhpcyB3aG9sZSBiYWcgb2YgVmlhZ3JhIGlzbid0IHdvcmtpbmcKQW5kIGV2ZXJ5IHNpbmdsZSBwZXJzb24gaXMgYSBTbGltIFNoYWR5IGx1cmtpbicKSGUgY291bGQgYmUgd29ya2luZyBhdCBCdXJnZXIgS2luZywgc3BpdHRpbicgb24geW91ciBvbmlvbiByaW5ncyAoQ2gsIHB1aCkKT3IgaW4gdGhlIHBhcmtpbicgbG90LCBjaXJjbGluZywgc2NyZWFtaW5nLCAiSSBkb24ndCBnaXZlIGEgZnVjayEiCldpdGggaGlzIHdpbmRvd3MgZG93biBhbmQgaGlzIHN5c3RlbSB1cApTbyB3aWxsIHRoZSByZWFsIFNoYWR5IHBsZWFzZSBzdGFuZCB1cApBbmQgcHV0IG9uZSBvZiB0aG9zZSBmaW5nZXJzIG9uIGVhY2ggaGFuZCB1cD8KQW5kIGJlIHByb3VkIHRvIGJlIG91dHRhIHlvdXIgbWluZCBhbmQgb3V0dGEgY29udHJvbApBbmQgb25lIG1vcmUgdGltZSwgbG91ZCBhcyB5b3UgY2FuLCBob3cgZG9lcyBpdCBnbz8KW0Nob3J1c10KSSdtIFNsaW0gU2hhZHksIHllcywgSSdtIHRoZSByZWFsIFNoYWR5CkFsbCB5b3Ugb3RoZXIgU2xpbSBTaGFkeXMgYXJlIGp1c3QgaW1pdGF0aW5nClNvIHdvbid0IHRoZSByZWFsIFNsaW0gU2hhZHkgcGxlYXNlIHN0YW5kIHVwClBsZWFzZSBzdGFuZCB1cCwgcGxlYXNlIHN0YW5kIHVwPwonQ2F1c2UgSSdtIFNsaW0gU2hhZHksIHllcywgSSdtIHRoZSByZWFsIFNoYWR5CkFsbCB5b3Ugb3RoZXIgU2xpbSBTaGFkeXMgYXJlIGp1c3QgaW1pdGF0aW5nClNvIHdvbid0IHRoZSByZWFsIFNsaW0gU2hhZHkgcGxlYXNlIHN0YW5kIHVwClBsZWFzZSBzdGFuZCB1cCwgcGxlYXNlIHN0YW5kIHVwPwonQ2F1c2UgSSdtIFNsaW0gU2hhZHksIHllcywgSSdtIHRoZSByZWFsIFNoYWR5CkFsbCB5b3Ugb3RoZXIgU2xpbSBTaGFkeXMgYXJlIGp1c3QgaW1pdGF0aW5nClNvIHdvbid0IHRoZSByZWFsIFNsaW0gU2hhZHkgcGxlYXNlIHN0YW5kIHVwClBsZWFzZSBzdGFuZCB1cCwgcGxlYXNlIHN0YW5kIHVwPwonQ2F1c2UgSSdtIFNsaW0gU2hhZHksIHllcywgSSdtIHRoZSByZWFsIFNoYWR5CkFsbCB5b3Ugb3RoZXIgU2xpbSBTaGFkeXMgYXJlIGp1c3QgaW1pdGF0aW5nClNvIHdvbid0IHRoZSByZWFsIFNsaW0gU2hhZHkgcGxlYXNlIHN0YW5kIHVwClBsZWFzZSBzdGFuZCB1cCwgcGxlYXNlIHN0YW5kIHVwPwoKW091dHJvXQpIYS1oYQpJIGd1ZXNzIHRoZXJlJ3MgYSBTbGltIFNoYWR5IGluIGFsbCBvZiB1cwpGdWNrIGl0LCBsZXQncyBhbGwgc3RhbmQgdXA= |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
W0ludHJvOiBPYmllIFRyaWNlXQpPYmllIFRyaWNlLCByZWFsIG5hbWUsIG5vIGdpbW1pY2tzClJh4oCULCAqcmVjb3JkIHNjcmF0Y2gqCgpbUmVmcmFpbiAxOiBFbWluZW1dClR3byB0cmFpbGVyLXBhcmsgZ2lybHMgZ28gcm91bmQgdGhlIG91dHNpZGUKUm91bmQgdGhlIG91dHNpZGUsIHJvdW5kIHRoZSBvdXRzaWRlClR3byB0cmFpbGVyLXBhcmsgZ2lybHMgZ28gcm91bmQgdGhlIG91dHNpZGUKUm91bmQgdGhlIG91dHNpZGUsIHJvdW5kIHRoZSBvdXRzaWRlCldvbyEgKE9vaCwgb29oKQoKW1JlZnJhaW4gMjogRW1pbmVtXQpHdWVzcyB3aG8ncyBiYWNrLCBiYWNrIGFnYWluPwpTaGFkeSdzIGJhY2ssIHRlbGwgYSBmcmllbmQKR3Vlc3Mgd2hvJ3MgYmFjaz8gR3Vlc3Mgd2hvJ3MgYmFjaz8KR3Vlc3Mgd2hvJ3MgYmFjaz8gR3Vlc3Mgd2hvJ3MgYmFjaz8KR3Vlc3Mgd2hvJ3MgYmFjaz8gR3Vlc3Mgd2hvJ3MgYmFjaz8KR3Vlc3Mgd2hvJ3MgYmFjaz8KKERhLWRhLWRhLCBkYSwgZGEsIGRhLCBkYSwgZGEsIGRhKQooRGEtZGEtZGEsIGRhLCBkYSwgZGEsIGRhKQoKW1ZlcnNlIDE6IEVtaW5lbV0KSSd2ZSBjcmVhdGVkIGEgbW9uc3RlcgonQ2F1c2Ugbm9ib2R5IHdhbnRzIHRvIHNlZSBNYXJzaGFsbCBubyBtb3JlLCB0aGV5IHdhbnQgU2hhZHksIEknbSBjaG9wcGVkIGxpdmVyCldlbGwsIGlmIHlvdSB3YW50IFNoYWR5LCB0aGlzIGlzIHdoYXQgSSdsbCBnaXZlIHlhCkEgbGl0dGxlIGJpdCBvZiB3ZWVkIG1peGVkIHdpdGggc29tZSBoYXJkIGxpcXVvcgpTb21lIHZvZGthIHRoYXQnbGwganVtcC1zdGFydCBteSBoZWFydCBxdWlja2VyClRoYW4gYSBzaG9jayB3aGVuIEkgZ2V0IHNob2NrZWQgYXQgdGhlIGhvc3BpdGFsCkJ5IHRoZSBkb2N0b3Igd2hlbiBJJ20gbm90IGNvb3BlcmF0aW5nCldoZW4gSSdtIHJvY2tpbicgdGhlIHRhYmxlIHdoaWxlIGhlJ3Mgb3BlcmF0aW5nIChIZXkhKQpZb3Ugd2FpdGVkIHRoaXMgbG9uZywgbm93IHN0b3AgZGViYXRpbmcKJ0NhdXNlIEknbSBiYWNrLCBJJ20gb24gdGhlIHJhZyBhbmQgb3Z1bGF0aW5nCkkga25vdyB0aGF0IHlvdSBnb3QgYSBqb2IsIE1zLiBDaGVuZXkKQnV0IHlvdXIgaHVzYmFuZCdzIGhlYXJ0IHByb2JsZW0ncyBjb21wbGljYXRpbmcKU28gdGhlIEZDQyB3b24ndCBsZXQgbWUgYmUKT3IgbGV0IG1lIGJlIG1lLCBzbyBsZXQgbWUgc2VlClRoZXkgdHJpZWQgdG8gc2h1dCBtZSBkb3duIG9uIE1UVgpCdXQgaXQgZmVlbHMgc28gZW1wdHkgd2l0aG91dCBtZQpTbyBjb21lIG9uIGFuZCBkaXAsIGJ1bSBvbiB5b3VyIGxpcHMKRnVjayB0aGF0LCBjdW0gb24geW91ciBsaXBzIGFuZCBzb21lIG9uIHlvdXIgdGl0cwpBbmQgZ2V0IHJlYWR5LCAnY2F1c2UgdGhpcyBzaGl0J3MgYWJvdXQgdG8gZ2V0IGhlYXZ5CkkganVzdCBzZXR0bGVkIGFsbCBteSBsYXdzdWl0cyAoRnVjayB5b3UsIERlYmJpZSEpCllvdSBtaWdodCBhbHNvIGxpa2UKVGhlIFJlYWwgU2xpbSBTaGFkeQpFbWluZW0K4oCcU2x1dCHigJ0gKFRheWxvcuKAmXMgVmVyc2lvbikgW0Zyb20gVGhlIFZhdWx0XQpUYXlsb3IgU3dpZnQKTG9zZSBZb3Vyc2VsZgpFbWluZW0KW0Nob3J1czogRW1pbmVtXQpOb3csIHRoaXMgbG9va3MgbGlrZSBhIGpvYiBmb3IgbWUKU28gZXZlcnlib2R5LCBqdXN0IGZvbGxvdyBtZQonQ2F1c2Ugd2UgbmVlZCBhIGxpdHRsZSBjb250cm92ZXJzeQonQ2F1c2UgaXQgZmVlbHMgc28gZW1wdHkgd2l0aG91dCBtZQpJIHNhaWQgdGhpcyBsb29rcyBsaWtlIGEgam9iIGZvciBtZQpTbyBldmVyeWJvZHksIGp1c3QgZm9sbG93IG1lCidDYXVzZSB3ZSBuZWVkIGEgbGl0dGxlIGNvbnRyb3ZlcnN5CidDYXVzZSBpdCBmZWVscyBzbyBlbXB0eSB3aXRob3V0IG1lCgpbVmVyc2UgMjogRW1pbmVtXQpMaXR0bGUgaGVsbGlvbnMsIGtpZHMgZmVlbGluZyByZWJlbGxpb3VzCkVtYmFycmFzc2VkLCB0aGVpciBwYXJlbnRzIHN0aWxsIGxpc3RlbiB0byBFbHZpcwpUaGV5IHN0YXJ0IGZlZWxpbicgbGlrZSBwcmlzb25lcnMsIGhlbHBsZXNzCidUaWwgc29tZW9uZSBjb21lcyBhbG9uZyBvbiBhIG1pc3Npb24gYW5kIHllbGxzLCAiQml0Y2ghIgpBIHZpc2lvbmFyeSwgdmlzaW9uIGlzIHNjYXJ5CkNvdWxkIHN0YXJ0IGEgcmV2b2x1dGlvbiwgcG9sbHV0aW4nIHRoZSBhaXJ3YXZlcwpBIHJlYmVsLCBzbyBqdXN0IGxldCBtZSByZXZlbCBhbmQgYmFzawpJbiB0aGUgZmFjdCB0aGF0IEkgZ290IGV2ZXJ5b25lIGtpc3NpbicgbXkgYXNzCkFuZCBpdCdzIGEgZGlzYXN0ZXIsIHN1Y2ggYSBjYXRhc3Ryb3BoZQpGb3IgeW91IHRvIHNlZSBzbyBkYW1uIG11Y2ggb2YgbXkgYXNzLCB5b3UgYXNrZWQgZm9yIG1lPwpXZWxsLCBJJ20gYmFjaywgZGEtbmEtbmEtbmEsIG5hLW5hLW5hLW5hLW5hLW5hCkZpeCB5b3VyIGJlbnQgYW50ZW5uYSwgdHVuZSBpdCBpbiwgYW5kIHRoZW4gSSdtIGdvbm5hCkVudGVyIGluIGFuZCB1cCB1bmRlciB5b3VyIHNraW4gbGlrZSBhIHNwbGludGVyClRoZSBjZW50ZXIgb2YgYXR0ZW50aW9uLCBiYWNrIGZvciB0aGUgd2ludGVyCkknbSBpbnRlcmVzdGluZywgdGhlIGJlc3QgdGhpbmcgc2luY2Ugd3Jlc3RsaW5nCkluZmVzdGluZyBpbiB5b3VyIGtpZCdzIGVhcnMgYW5kIG5lc3RpbmcKVGVzdGluZywgIkF0dGVudGlvbiwgcGxlYXNlIgpGZWVsIHRoZSB0ZW5zaW9uIHNvb24gYXMgc29tZW9uZSBtZW50aW9ucyBtZQpIZXJlJ3MgbXkgdGVuIGNlbnRzLCBteSB0d28gY2VudHMgaXMgZnJlZQpBIG51aXNhbmNlLCB3aG8gc2VudD8gWW91IHNlbnQgZm9yIG1lPwpbQ2hvcnVzOiBFbWluZW1dCk5vdywgdGhpcyBsb29rcyBsaWtlIGEgam9iIGZvciBtZQpTbyBldmVyeWJvZHksIGp1c3QgZm9sbG93IG1lCidDYXVzZSB3ZSBuZWVkIGEgbGl0dGxlIGNvbnRyb3ZlcnN5CidDYXVzZSBpdCBmZWVscyBzbyBlbXB0eSB3aXRob3V0IG1lCkkgc2FpZCB0aGlzIGxvb2tzIGxpa2UgYSBqb2IgZm9yIG1lClNvIGV2ZXJ5Ym9keSwganVzdCBmb2xsb3cgbWUKJ0NhdXNlIHdlIG5lZWQgYSBsaXR0bGUgY29udHJvdmVyc3kKJ0NhdXNlIGl0IGZlZWxzIHNvIGVtcHR5IHdpdGhvdXQgbWUKCltWZXJzZSAzOiBFbWluZW1dCkEgdGlza2V0LCBhIHRhc2tldCwgSSdsbCBnbyB0aXQtZm9yLXRhdCB3aXQnCkFueWJvZHkgd2hvJ3MgdGFsa2luJywgIlRoaXMgc2hpdCwgdGhhdCBzaGl0IgpDaHJpcyBLaXJrcGF0cmljaywgeW91IGNhbiBnZXQgeW91ciBhc3Mga2lja2VkCldvcnNlIHRoYW4gdGhlbSBsaXR0bGUgTGltcCBCaXpraXQgYmFzdGFyZHMKQW5kIE1vYnk/IFlvdSBjYW4gZ2V0IHN0b21wZWQgYnkgT2JpZQpZb3UgdGhpcnR5LXNpeC15ZWFyLW9sZCBiYWxkLWhlYWRlZCBmYWcsIGJsb3cgbWUKWW91IGRvbid0IGtub3cgbWUsIHlvdSdyZSB0b28gb2xkLCBsZXQgZ28KSXQncyBvdmVyLCBub2JvZHkgbGlzdGVucyB0byB0ZWNobm8KTm93LCBsZXQncyBnbywganVzdCBnaXZlIG1lIHRoZSBzaWduYWwKSSdsbCBiZSB0aGVyZSB3aXRoIGEgd2hvbGUgbGlzdCBmdWxsIG9mIG5ldyBpbnN1bHRzCkkndmUgYmVlbiBkb3BlLCBzdXNwZW5zZWZ1bCB3aXRoIGEgcGVuY2lsCkV2ZXIgc2luY2UgUHJpbmNlIHR1cm5lZCBoaW1zZWxmIGludG8gYSBzeW1ib2wKQnV0LCBzb21ldGltZXMsIHRoZSBzaGl0IGp1c3Qgc2VlbXMKRXZlcnlib2R5IG9ubHkgd2FudHMgdG8gZGlzY3VzcyBtZQpTbyB0aGlzIG11c3QgbWVhbiBJJ20gZGlzZ3VzdGluZwpCdXQgaXQncyBqdXN0IG1lLCBJJ20ganVzdCBvYnNjZW5lIChZZWFoKQpUaG91Z2ggSSdtIG5vdCB0aGUgZmlyc3Qga2luZyBvZiBjb250cm92ZXJzeQpJIGFtIHRoZSB3b3JzdCB0aGluZyBzaW5jZSBFbHZpcyBQcmVzbGV5ClRvIGRvIEJsYWNrIG11c2ljIHNvIHNlbGZpc2hseQpBbmQgdXNlIGl0IHRvIGdldCBteXNlbGYgd2VhbHRoeSAoSGV5ISkKVGhlcmUncyBhIGNvbmNlcHQgdGhhdCB3b3JrcwpUd2VudHkgbWlsbGlvbiBvdGhlciB3aGl0ZSByYXBwZXJzIGVtZXJnZQpCdXQgbm8gbWF0dGVyIGhvdyBtYW55IGZpc2ggaW4gdGhlIHNlYQpJdCdkIGJlIHNvIGVtcHR5IHdpdGhvdXQgbWUKW0Nob3J1czogRW1pbmVtXQpOb3csIHRoaXMgbG9va3MgbGlrZSBhIGpvYiBmb3IgbWUKU28gZXZlcnlib2R5LCBqdXN0IGZvbGxvdyBtZQonQ2F1c2Ugd2UgbmVlZCBhIGxpdHRsZSBjb250cm92ZXJzeQonQ2F1c2UgaXQgZmVlbHMgc28gZW1wdHkgd2l0aG91dCBtZQpJIHNhaWQgdGhpcyBsb29rcyBsaWtlIGEgam9iIGZvciBtZQpTbyBldmVyeWJvZHksIGp1c3QgZm9sbG93IG1lCidDYXVzZSB3ZSBuZWVkIGEgbGl0dGxlIGNvbnRyb3ZlcnN5CidDYXVzZSBpdCBmZWVscyBzbyBlbXB0eSB3aXRob3V0IG1lCgpbT3V0cm86IEVtaW5lbV0KSHVtLCBkZWktZGVpLCBsYS1sYQpMYS1sYSwgbGEtbGEtbGEKTGEtbGEsIGxhLWxhLWxhCkxhLWxhLCBsYS1sYQpIdW0sIGRlaS1kZWksIGxhLWxhCkxhLWxhLCBsYS1sYS1sYQpMYS1sYSwgbGEtbGEtbGEKTGEtbGEsIGxhLWxhCktpZHMh |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment