{"$:/DefaultTiddlers":"cwp_public","$:/GoogleAnalyticsAccount":"afc-base-theme","$:/GoogleAnalyticsMeasurementID":"afc-base-theme","$:/ImportImage--111771515":"cwp_public","$:/SiteSubtitle":"cwp_public","$:/SiteTitle":"cwp_public","$:/_AFC/AboveStory/Logo":"afc-base-theme","$:/_AFC/EditDraftInfoSegment":"afc-base-theme","$:/_AFC/Fonts/UseFonts":"afc-base-theme","$:/_AFC/Macros/Image":"afc-base-theme","$:/_AFC/Macros/YouTube":"afc-base-theme","$:/_AFC/Palette":"afc-base-theme","$:/_AFC/SideButtons":"cwp_public","$:/_AFC/SideButtons/Styles":"cwp_public","$:/_AFC/Startup/ConfigurePreview":"afc-base-theme","$:/_AFC/Styles/Bubbles":"afc-base-theme","$:/_AFC/Styles/DocLinks":"afc-base-theme","$:/_AFC/Styles/FadedSidebar":"afc-base-theme","$:/_AFC/Styles/HideEditButton":"afc-base-theme","$:/_AFC/Styles/Overrides":"afc-base-theme","$:/_AFC/Styles/TopMenu":"afc-base-theme","$:/_AFC/SurveyBanner":"afc-base-theme","$:/_AFC/SurveyBanner/Styles":"afc-base-theme","$:/_AFC/TagDropdown/NewHere":"afc-base-theme","$:/_AFC/TagNavigation/Styles":"afc-base-theme","$:/_AFC/TagNavigationMacro":"afc-base-theme","$:/_AFC/TiddlerInfo/Text":"afc-base-theme","$:/_AFC/consent-banner/buttons/login":"afc-base-theme","$:/_AFC/grey-wordmark.svg":"afc-base-theme","$:/_CWP/Palette":"cwp-theme","$:/_CWP/Styles/LooserMargins":"cwp-theme","$:/_Macros/ImageLink":"afc-base-theme","$:/_Macros/LinkDoc":"afc-base-theme","$:/_Macros/LinkPDF":"afc-base-theme","$:/_Macros/Video":"afc-base-theme","$:/_Menu/About":"cwp_public","$:/_Menu/CWP":"cwp_public","$:/_Menu/Finding Out":"cwp_public","$:/_Menu/Helping":"cwp_public","$:/_Menu/Home":"cwp_public","$:/_Menu/More":"cwp_public","$:/_Menu/Navigating":"cwp_public","$:/_Menu/Partnerships":"cwp_public","$:/_Menu/Partnerships/Sites":"cwp_public","$:/_Menu/Partnerships/Sites/DropDown":"cwp_public","$:/_Menu/Private":"cwp-theme","$:/_Menu/Service Development":"cwp_public","$:/_Menu/Supervising":"cwp_public","$:/_Menu/TOC":"cwp_public","$:/_Menu/Training":"cwp_public","$:/config/Manager/Filter":"cwp_public","$:/config/Manager/Order":"cwp_public","$:/config/Manager/RecentTags":"cwp_public","$:/config/Manager/Sort":"cwp_public","$:/config/Manager/Tag":"cwp_public","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all":"cwp_public","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/control-panel":"cwp_public","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all":"cwp_public","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home":"cwp_public","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import":"cwp_public","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-tiddler":"cwp_public","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette":"cwp_public","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview":"cwp_public","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/save-wiki":"cwp_public","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all":"cwp_public","$:/config/RelinkOnRename":"cwp_public","$:/config/ViewToolbarButtons/Visibility/$:/plugins/federatial/print/button":"afc-base-theme","$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/contents":"afc-base-theme","$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server":"afc-base-theme","$:/config/plugins/tiddlywiki/consent-banner/greeting-message":"afc-base-theme","$:/core/ui/MoreSideBar/Drafts":"afc-base-theme","$:/core/ui/SideBar/Tools":"cwp_public","$:/core/ui/ViewTemplate/subtitle":"afc-base-theme","$:/favicon.ico":"cwp_public","$:/language/SideBar/Open/Caption":"cwp_public","$:/language/SideBar/Recent/Caption":"cwp_public","$:/palette":"cwp_public","$:/plugins/federatial/print/button":"afc-base-theme","$:/plugins/federatial/print/styles":"afc-base-theme","$:/plugins/federatial/print/template":"afc-base-theme","$:/plugins/federatial/print/template/inner":"afc-base-theme","$:/plugins/federatial/print/window":"afc-base-theme","$:/plugins/federatial/xememex/status-button":"afc-base-theme","$:/plugins/tiddlywiki/comments":"cwp-theme","$:/plugins/tiddlywiki/comments/sidebar":"cwp_public","$:/plugins/tiddlywiki/consent-banner":"afc-base-theme","$:/plugins/tiddlywiki/googleanalytics":"afc-base-theme","$:/plugins/tiddlywiki/menubar":"afc-base-theme","$:/tags/MenuBar":"cwp_public","$:/tags/Static/TopMenu":"cwp_public","$:/tags/TopMenu":"cwp_public","$:/tags/ViewTemplate":"afc-base-theme","$:/theme":"cwp_public","$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint":"emhp-cwp-shared_public","$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth":"cwp_public","$:/themes/tiddlywiki/vanilla/metrics/storyright":"cwp_public","$:/themes/tiddlywiki/vanilla/metrics/storywidth":"cwp_public","$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth":"cwp_public","$:/themes/tiddlywiki/vanilla/options/sidebarlayout":"cwp_public","$:/themes/tiddlywiki/vanilla/settings/backgroundimage":"cwp_public","$:/view":"cwp_public","10 Top Tips for Working Remotely":"emhp-cwp-shared_public","A Child Explains Anxiety":"emhp-cwp-shared_public","A child describes ADHD":"emhp-cwp-shared_public","About":"cwp_public","Academic sources of behavioural activation":"emhp-cwp-shared_public","Access to CWP services: London Audit 2018":"cwp_public","Active Listening":"cwp_public","Activity Monitoring -practice tips":"emhp-cwp-shared_public","Activity planning":"emhp-cwp-shared_public","Additional Adolescent Anxiety Manual":"cwp_public","Adolescent Anxiety":"cwp_public","Adolescent Anxiety - Manual":"cwp_public","Adolescent anxiety manual: COVID-19 adaptions":"emhp-cwp-shared_public","Adult IAPT Manual 2018":"emhp-cwp-shared_public","Advice from Cohort 1 CWPs to new trainees":"cwp_public","After a Suicide: a Toolkit for Schools":"emhp-cwp-shared_public","Agreeing a future plan":"cwp_public","Aims and principles of the brief parenting intervention":"cwp_public","Alternative Session Plans for Behaviour Problems":"emhp-cwp-shared_public","Animation Explaining Anxiety due to COVID-19 Lockdown":"emhp-cwp-shared_public","Animation: Transition from year 6 during a pandemic":"emhp-cwp-shared_public","Anxiety":"cwp_public","Anxiety in young people: a brief overview":"emhp-cwp-shared_public","Anxiety practice":"cwp_public","Anxiety skills":"emhp-cwp-shared_public","Anxiety: Explaining anxiety to children and parents":"cwp_public","App Reviews":"cwp_public","Asking for help: what's it like?":"emhp-cwp-shared_public","Assessing for Parenting Intervention (Behaviour Problems)":"cwp_public","Assessment":"cwp_public","Assessment of anxiety: key points":"emhp-cwp-shared_public","Assessment structure.png":"cwp_public","Assessment: Key Questions to Ask":"emhp-cwp-shared_public","Audit Age Distribution.PNG":"cwp_public","Audit Age distribution.PNG":"cwp_public","Audit Descriptive Scores_GBO .PNG":"cwp_public","Audit Ethnicity.PNG":"cwp_public","Audit GBO's graph.PNG":"cwp_public","Audit Gender.PNG":"cwp_public","Audit RCADS_table.PNG":"cwp_public","Audit SDQ Means.PNG":"cwp_public","Audit SDQ graph.PNG":"cwp_public","Audit ethnic distribution.PNG":"cwp_public","Audit of the CWP Programme in London and the South East":"cwp_public","Autism Spectrum Disorder (ASD) and Mental health":"cwp_public","Autistic Spectrum Disorder (ASD)":"cwp_public","BAME Inclusion: A Reflection Through the Lens of a White British Male":"cwp_public","BBC Bitesize: COVID-19 Articles":"emhp-cwp-shared_public","Barriers to Digital Forms of Help":"cwp_public","Behaviour Intervention- Translated Versions":"emhp-cwp-shared_public","Behaviour Problems":"cwp_public","Behaviour Problems - Manual":"cwp_public","Behaviour Problems Overview":"emhp-cwp-shared_public","Behaviour Problems Practice":"cwp_public","Behaviour Problems Research":"emhp-cwp-shared_public","Behaviour Problems Session Material":"emhp-cwp-shared_public","Behaviour Problems Session Plans":"cwp_public","Behaviour Problems: Resources":"emhp-cwp-shared_public","Behaviour problems manual: COVID-19 adaptions":"emhp-cwp-shared_public","Behavioural Principles in managing anxiety":"emhp-cwp-shared_public","Behavioural activation":"emhp-cwp-shared_public","Being a safe practitioner with guided self help":"cwp_public","Brain creative and logic - Pixabay.jpg":"cwp_public","Breathing techniques":"cwp_public","Brief Behavioural Activation - practice tips":"emhp-cwp-shared_public","Brief Guide to Goals and GBO":"cwp_public","Building a Therapeutic Alliance":"emhp-cwp-shared_public","Building a back up team":"cwp_public","COVID-19 Resources":"emhp-cwp-shared_public","CWP Intervention GBO Outcomes: London Audit 2018":"cwp_public","CWP Intervention RCADS Outcomes : London Audit 2018":"cwp_public","CWP Intervention SDQ Outcomes : London Audit 2018":"cwp_public","CWP National Curriculum - Module 1":"cwp_public","CWP National Curriculum - Module 2":"cwp_public","CWP National Curriculum - Module 3":"cwp_public","CWP National Curriculum: Overview":"cwp_public","CWP National Implementation Group":"cwp_public","CWP Partnerships":"cwp_public","CWP Service Satisfaction: London Audit 2018":"cwp_public","CWP Site Information":"cwp_public","CWP brochure":"cwp_public","CWP library":"cwp_public","CWP pathway":"cwp_public","CWP site map":"cwp_public","CWP site map.PNG":"cwp_public","CWP-EMHP Library":"emhp-cwp-shared_public","Calm Time for Non-Adherence to Commands":"emhp-cwp-shared_public","Case examples":"cwp_public","Case examples and role play discussion":"cwp_public","Caution.jpg":"cwp_public","Changes in adolescence":"emhp-cwp-shared_public","Checking in about the previous session":"cwp_public","Child Anxiety":"cwp_public","Child Anxiety - Manual":"cwp_public","Child Anxiety Book- Translated Versions":"cwp_public","Child Anxiety: Book":"cwp_public","Child and Adolescent Development":"cwp_public","Child anxiety manual: COVID-19 adaptations":"emhp-cwp-shared_public","Child anxiety workshops for parents":"emhp-cwp-shared_public","Child mental health and medical diagnosis":"emhp-cwp-shared_public","Child protection assessment framework.PNG":"cwp_public","Child vs. parent focused work":"emhp-cwp-shared_public","Child/Adolescent Mental Health Problems":"cwp_public","Cognitive Principles in managing anxiety":"emhp-cwp-shared_public","Cohort 1 Lecture summaries":"cwp_public","Collaborative working":"cwp_public","Comment by 'elladennison' on 'CWP Intervention Outcomes: London Audit 2018'":"cwp_public","Comment by 'elladennison' on 'Outcome measures'":"cwp_public","Comment by 'elladennison' on 'Translation of Original Materials'":"cwp_public","Comment by 'mariannemcgowan' on 'draft by Shayo'":"cwp_public","Comment by 'peterf' on 'How to tag tiddlers'":"cwp_public","Common barriers in GSH sessions":"emhp-cwp-shared_public","Common mental health problems":"emhp-cwp-shared_public","Completing the RCADS":"emhp-cwp-shared_public","Computerised Therapies for Anxiety and Depression":"emhp-cwp-shared_public","Consent and video recording":"cwp_public","Consent for Working Remotely":"emhp-cwp-shared_public","Contact us":"cwp_public","Contents":"cwp_public","Converting parental concerns into goals":"cwp_public","Copyright":"emhp-cwp-shared_public","Copyright Guidance":"emhp-cwp-shared_public","Copyright matters":"emhp-cwp-shared_public","Core Approach for Behaviour Problems":"emhp-cwp-shared_public","Core Competencies for CWP Practitioners":"cwp_public","Core Intervention Manuals":"cwp_public","Core Outcome Measures & Feedback Tools":"emhp-cwp-shared_public","Core components of parent training":"cwp_public","Coronavirus: A book for children":"emhp-cwp-shared_public","Course Assessment of SSDLs":"cwp_public","Course Handbook 2018/19":"cwp_public","Creative Commons licence":"emhp-cwp-shared_public","Cultural Competency":"cwp_public","Culture?":"cwp_public","Deciding on what you want to change":"emhp-cwp-shared_public","Delivering therapy online power point":"emhp-cwp-shared_public","Demographics of CWP service users: London Audit 2018":"cwp_public","Developing the Guide":"cwp_public","Diary keeping and daily monitoring of activity":"emhp-cwp-shared_public","Differences between the CWP and EMHP":"cwp_public","Direction arrows with converse shoe - Pixabay.jpg":"cwp_public","Discussing Technology Use and Failure":"emhp-cwp-shared_public","Disorder Specific Interventions":"emhp-cwp-shared_public","Diversity":"cwp_public","Diversity Inclusive Assessment Resources":"cwp_public","Diversity: An Overview":"cwp_public","Diversity: Exploring Stereotypes":"cwp_public","Diversity: Practice Points":"cwp_public","Dog Poo Analogy":"emhp-cwp-shared_public","Draft Images":"cwp_public","Draft by Marianne":"cwp_public","Draft of '$:/_Menu/Navigating' by elladennison":"cwp_public","Draft of 'Adolescent Anxiety - Manual' by elladennison":"cwp_public","Draft of 'Engagement' by tiamckoy":"cwp_public","Draft of 'Exam stress' by mariannemcgowan":"cwp_public","Draft of 'Homepage 2.0' by charlottehepburn":"cwp_public","Draft of 'Manual Editing Guide' by sarahthompson":"cwp_public","Draft of 'Nine Components of Guided Self Help' by tiamckoy":"cwp_public","Draft of 'Video Equipment Guidance' by tiamckoy":"cwp_public","Draft of 'draft by Shayo' by sarahthompson":"cwp_public","Draft pages":"cwp_public","EMHP":"cwp_public","EMHP modules":"cwp_public","ESQ Young person reported responses.PNG":"cwp_public","ESQ parent reported responses.PNG":"cwp_public","Eating Disorders: Recognising and Referring":"cwp_public","Education Resources":"cwp_public","Engagement":"cwp_public","Engagement and First Meetings":"emhp-cwp-shared_public","Engagement and Shared Decision Making":"cwp_public","Enquiring about strengths":"cwp_public","Epistemic trust and social learning":"cwp_public","Equality":"cwp_public","Equality Wordcloud.png":"cwp_public","Evaluating self help materials":"cwp_public","Evaluating the Quality of Self Help Materials":"emhp-cwp-shared_public","Evidence for low intensity self help approaches":"cwp_public","Exam stress":"emhp-cwp-shared_public","Example- Supermarket Bread":"emhp-cwp-shared_public","Exclusion criteria for CWP":"cwp_public","Expectations for Recording Sessions":"emhp-cwp-shared_public","Experience of Service Questionnaire (ESQ)":"cwp_public","Experiential and cultural aspects of anxiety":"emhp-cwp-shared_public","Fear Thermometer":"emhp-cwp-shared_public","Finding Out":"cwp_public","Finding OutContents":"cwp_public","Follow up after the end of the intervention":"cwp_public","Formatting Pages in AFNCCF Manuals":"emhp-cwp-shared_public","Four key mental health needs addressed by CWPs":"cwp_public","Funding and Finance information":"cwp_public","Future in Mind":"cwp_public","GBO guidance Notes FINAL March 2019.pdf":"cwp_public","GBO-HIT":"cwp_public","GSH Skills for Assessment":"cwp_public","General Support Resources":"emhp-cwp-shared_public","Generic mental health assessment":"emhp-cwp-shared_public","Giving SSDL session feedback on POD":"cwp_public","Goal Based Outcome Training videos":"cwp_public","Goal-Based Outcomes (GBO)":"cwp_public","Goal-Oriented Practice":"cwp_public","Guidance on Using the ‘Shared Bag’":"cwp_public","Guide to presenting difficulties for CWPs":"cwp_public","Guide to selecting CWP cases":"cwp_public","Guided Self Help":"cwp_public","Guided Self Help General Structure":"emhp-cwp-shared_public","Guided Self Help knowledge":"cwp_public","Guided Self Help practice":"cwp_public","Guided Self Help skills":"cwp_public","Guidelines on how to edit this manual":"cwp_public","Habituation Principle":"emhp-cwp-shared_public","Helping":"cwp_public","Helping: Adolescents Anxiety":"cwp_public","Helping: Behaviour Problems":"cwp_public","Helping: Child Anxiety":"cwp_public","Helping: Low Mood":"cwp_public","Helping: Supplementary Material":"cwp_public","Helping: Working Remotely":"emhp-cwp-shared_public","Home":"cwp_public","HomeContents":"cwp_public","Hot Cross Bun.png":"emhp-cwp-shared_public","Hot cross bun.jpg":"cwp_public","How Pages Open in the Wiki Guide":"cwp_public","How common are anxiety problems":"cwp_public","How common are behaviour problems?":"emhp-cwp-shared_public","How common is low mood?":"emhp-cwp-shared_public","How many days a week will I supervise CWPs?":"cwp_public","How many young people will CWPs be expected to see?":"cwp_public","How to Access Google Documents":"cwp_public","How to Conduct Assessments":"cwp_public","How to Give Feedback":"cwp_public","How to Print":"cwp_public","How to Use POD":"cwp_public","How to Use and Understand 'Tags'":"cwp_public","How to add a PDF link":"cwp_public","How to add a new tiddler":"cwp_public","How to add a picture":"cwp_public","How to add colour":"cwp_public","How to centre a title, phrase or image":"cwp_public","How to edit and delete tiddlers":"cwp_public","How to embed a video":"cwp_public","How to help young people manage exam stress":"emhp-cwp-shared_public","How to login":"cwp_public","How to resize a picture":"cwp_public","How we Get Wiki Guide Feedback":"cwp_public","How will we know if our CWPs are seeing the correct cases?":"cwp_public","IPT-A":"emhp-cwp-shared_public","Inclusion":"emhp-cwp-shared_public","Initial contact checklist":"emhp-cwp-shared_public","Internet Safety Toolkit":"emhp-cwp-shared_public","Intersectionality":"cwp_public","Intersectionality - Belonging to More Than One Group.png":"cwp_public","Intervention for Anxiety: key practice points":"cwp_public","Interventions":"cwp_public","Interviewing Parents":"emhp-cwp-shared_public","Introduction to child mental health problems":"emhp-cwp-shared_public","Introduction to the CWP Programme in 2017":"cwp_public","Introduction to the CWP training":"cwp_public","Introduction to the theory of behaviour change":"cwp_public","Invitation for feedback":"cwp_public","Involving parents":"cwp_public","Jargon Buster":"cwp_public","Job Role":"cwp_public","Join the Largest MDT Ad.png":"cwp_public","Jungle Analogy":"emhp-cwp-shared_public","Key Documents: CWP Programme":"cwp_public","Larking about":"cwp_public","Leadership Training":"cwp_public","Learning about the impact of behaviour on mood":"emhp-cwp-shared_public","Learning about the problem":"cwp_public","Learning through practice":"cwp_public","Length of CWP Interventions: London Audit 2018":"cwp_public","Literature emphasising the role of parents":"emhp-cwp-shared_public","Logical Consequences Guidelines":"cwp_public","Low Mood":"cwp_public","Low Mood - Manual":"cwp_public","Low Mood - Sessions Overview":"cwp_public","Low Mood Manual- previous versions":"cwp_public","Low Mood Manual: COVID-19 Adaptions":"cwp_public","Low Mood Practice Activities":"cwp_public","Low Mood Session Material":"emhp-cwp-shared_public","Low Mood knowledge":"emhp-cwp-shared_public","Low Mood practice":"cwp_public","Low intensity interventions:evidence and NICE guidance":"cwp_public","Low mood: Handouts for CYP":"cwp_public","Low mood: Handouts for parents":"cwp_public","MainMenu":"cwp_public","Maintaining Boundaries":"emhp-cwp-shared_public","Making commands effective":"emhp-cwp-shared_public","Making praise effective":"cwp_public","Making sense of things":"emhp-cwp-shared_public","Managing Risk":"cwp_public","Managing Risk on the Telephone":"cwp_public","Managing role as team leader/supervisor":"cwp_public","Manual Editing Guide":"cwp_public","Measuring CWP Outcomes in South West England":"cwp_public","Measuring attachment: the Strange situation":"emhp-cwp-shared_public","Measuring recovery and reliable recovery":"cwp_public","Measuring reliable change":"cwp_public","Mental Health Toolkit for schools":"emhp-cwp-shared_public","Mental Health and Wellbeing":"emhp-cwp-shared_public","Mental health services dataset (MHSDS)":"cwp_public","Mental health: in our own words":"emhp-cwp-shared_public","More":"cwp_public","MoreContents":"cwp_public","Motivational Interviewing":"emhp-cwp-shared_public","NSPCC 'brain builders'":"emhp-cwp-shared_public","Nadiya: Anxiety and Me":"emhp-cwp-shared_public","National CWP Implementation Group (Basecamp)":"cwp_public","National CWP Outcomes Report 2019":"cwp_public","National Guidance on the CWP Curriculum: key sections from the Headline Plan (December 2016)":"cwp_public","Nine Components of Guided Self Help":"emhp-cwp-shared_public","Non-text Based Materials":"emhp-cwp-shared_public","Notes on national analyzer":"cwp_public","Number of cases for CWPs during training":"cwp_public","OIPM87BY4FN-culture.jpg":"cwp_public","ORS/CORS":"emhp-cwp-shared_public","Outcome measures":"cwp_public","Outcome monitoring":"cwp_public","Outcomes":"cwp_public","Outcomes - technical bits":"emhp-cwp-shared_public","Outcomes for Cohort 1 CWP":"cwp_public","Outcomes practice":"cwp_public","Outcomes research":"emhp-cwp-shared_public","Overcoming Adolescent Anxiety - Overview":"emhp-cwp-shared_public","Overcoming anxiety and guided self help: Cathy Creswell":"emhp-cwp-shared_public","POD":"cwp_public","Parent and Carer Guide to Mental Health":"emhp-cwp-shared_public","Parent work: trying out new things":"cwp_public","Parenting Techniques and handouts":"cwp_public","Parents":"cwp_public","Participation":"cwp_public","Partnerships":"cwp_public","PatternLanding.svg":"cwp_public","PatternYoungPerson.svg":"cwp_public","Peer Support Resources":"cwp_public","Planning Content Tagging":"cwp_public","Poster UCLpic.jpg":"cwp_public","Practical tips for parents to help children with emotional symptoms":"emhp-cwp-shared_public","Practice as process of change for CWPs and YP":"cwp_public","Preparing for Calm Time Effectively":"emhp-cwp-shared_public","Primary to Secondary Transitions":"cwp_public","Problem Solving":"emhp-cwp-shared_public","Problem solving anticipated problems":"cwp_public","Progressive Muscle Relaxation":"cwp_public","Psychoeducation":"cwp_public","Psychoeducation Core Knowledge":"cwp_public","Psychoeducation Materials for Schools":"emhp-cwp-shared_public","Psychoeducation Resources":"cwp_public","Psychoeducation Workshops":"cwp_public","Psychoeducation: Videos":"cwp_public","QQQ.png":"cwp_public","RCADS":"cwp_public","Reaching their Goals":"cwp_public","Reading Well: Books on Prescription List":"emhp-cwp-shared_public","Recognising diversity":"emhp-cwp-shared_public","Red Riding Hood: Flight or Fight":"emhp-cwp-shared_public","Relaxation techniques":"emhp-cwp-shared_public","Relaxing lion.jpg":"cwp_public","Relevant Government Policy to CWP":"cwp_public","Resources for partnerships":"cwp_public","Resources for specific partnerships":"cwp_public","Review":"cwp_public","Reviewing goals":"cwp_public","Reviewing life activities and interests":"emhp-cwp-shared_public","Risk and Safety Assessment":"cwp_public","Risk assessment and management":"cwp_public","Role Plays":"cwp_public","Routines Around the Home.png":"emhp-cwp-shared_public","SDQ":"emhp-cwp-shared_public","SMART Goals":"cwp_public","Safeguarding":"cwp_public","Safeguarding guidance: London Child Protection Procedures":"cwp_public","Safeguarding/ Risk Assessment for Remote Working":"emhp-cwp-shared_public","Safeguarding: Being a safe practitioner":"cwp_public","Selective Ignoring Guidelines":"cwp_public","Self Help Materials":"cwp_public","Self Help Materials for Adolescent Anxiety":"cwp_public","Self Help Materials for Low Mood":"emhp-cwp-shared_public","Self Help Materials: Apps":"emhp-cwp-shared_public","Self Help Materials: Books":"emhp-cwp-shared_public","Self Help Materials: Videos":"emhp-cwp-shared_public","Self Help Materials: Websites":"emhp-cwp-shared_public","Self Help materials: Online Counselling/Therapy":"emhp-cwp-shared_public","Self help materials":"cwp_public","Separation anxiety in a toddler":"emhp-cwp-shared_public","Service Development":"cwp_public","Service Development Resources":"cwp_public","Session 0 for Adolescents: General Assessment":"cwp_public","Session 0 for Younger Children: General Assessment":"cwp_public","Session 1 - Overcoming Child Anxiety":"cwp_public","Session 1: Guided Self Help for Behaviour Problems":"cwp_public","Session 1: Overcoming Adolescent Anxiety":"cwp_public","Session 1: Overcoming Low Mood":"emhp-cwp-shared_public","Session 1: Overcoming low mood":"cwp_public","Session 2 - Overcoming Child Anxiety":"cwp_public","Session 2: Guided Self Help for Behaviour Problems":"cwp_public","Session 2: Overcoming Adolescent Anxiety":"cwp_public","Session 2: Overcoming Low Mood":"emhp-cwp-shared_public","Session 3 - Overcoming Child Anxiety":"cwp_public","Session 3: Guided Self Help for Behaviour Problems":"cwp_public","Session 3: Overcoming Adolescent Anxiety":"cwp_public","Session 3: Overcoming Low Mood":"emhp-cwp-shared_public","Session 4,5,6 - Overcoming Child Anxiety":"cwp_public","Session 4-6: Overcoming Adolescent Anxiety":"cwp_public","Session 4: Guided Self Help for Behaviour Problems":"cwp_public","Session 4: Overcoming Low Mood":"emhp-cwp-shared_public","Session 5: Guided Self Help for Behaviour Problems":"cwp_public","Session 6: Guided Self Help for Behaviour Problems":"cwp_public","Session 7 - Overcoming Child Anxiety":"cwp_public","Session 7: Guided Self Help for Behaviour Problems":"cwp_public","Session 7: Overcoming Adolescent Anxiety":"cwp_public","Session 8 - Overcoming Child Anxiety":"cwp_public","Session 8:  Overcoming Low Mood":"emhp-cwp-shared_public","Session 8: Overcoming Adolescent Anxiety":"cwp_public","Session Feedback Questionnaire":"cwp_public","Session Feedback Questionnaire (SFQ)":"cwp_public","Session Overview for Behaviour Problems":"cwp_public","Session Overview for Child Anxiety":"cwp_public","Session Overview for Overcoming Adolescent Anxiety":"cwp_public","Session Plans for Behaviour Problems":"cwp_public","Session Plans for Overcoming Adolescent Anxiety":"cwp_public","Session Plans for Overcoming Low Mood":"cwp_public","Session Rating Scale":"cwp_public","Session plans for overcoming low mood (Tower Hamlets material)":"cwp_public","Sessions 5-7: Overcoming Low Mood":"emhp-cwp-shared_public","Setting Goals":"cwp_public","Setting Up a Practice":"emhp-cwp-shared_public","Setting up  new CWP service":"cwp_public","Setting up Remote Working with Clients":"emhp-cwp-shared_public","Setting up and Protecting the Space for Remote Working":"emhp-cwp-shared_public","Shared Decision Making":"cwp_public","Short course: Supporting low mood during the pandemic":"emhp-cwp-shared_public","Should CWPs be given time within the service for study/self-directed learning?":"cwp_public","Site Information:Equipment":"cwp_public","Site Information:Key Contacts":"cwp_public","Site Information:Outcomes Data collection":"cwp_public","Site information: Course related information":"cwp_public","Site information: Supervision":"cwp_public","Site visits and support":"cwp_public","SiteIcon":"cwp_public","Skills Workshop Days":"cwp_public","Sleep disturbance":"cwp_public","Social GGRRAAACCEEESSS.png":"cwp_public","Social Graces Model V1.png":"cwp_public","Socratic technique":"emhp-cwp-shared_public","Spence Child Anxiety Scale":"cwp_public","Spoon/Fork Theory to Explain Mental Health":"emhp-cwp-shared_public","Staff Burnout":"cwp_public","Steering Groups":"cwp_public","Steps model":"cwp_public","Strengths and Limitations of Social Graces Model V1.png":"cwp_public","Strengths and Limitations of Social Graces Model V5.jpg":"cwp_public","Strengths and Limitations of Social Graces Model V6.png":"cwp_public","Strengths and Limitations of Social Graces Model.png":"cwp_public","Stress":"cwp_public","Study Skills":"emhp-cwp-shared_public","Summarising":"cwp_public","Supervising":"cwp_public","Supervising CWPs":"cwp_public","SupervisingContents":"cwp_public","Supervision and risk":"cwp_public","Supervisor role in skills workshop":"cwp_public","Supervisors Core Information":"cwp_public","Supervisors Q&A":"cwp_public","Supervisors Resources":"cwp_public","Supervisors Training":"cwp_public","Supporting children and young people with worries about COVID-19":"emhp-cwp-shared_public","Survey of the Mental Health of Children and Young People in England, 2017":"emhp-cwp-shared_public","TAMHS study findings":"cwp_public","THRIVE Framework for system change":"emhp-cwp-shared_public","THRIVE framework.PNG":"emhp-cwp-shared_public","TableOfContents":"cwp_public","Talking about ethnicity dos and donts.png":"cwp_public","Talking about ethnicity... dos and donts.png":"cwp_public","Teaching":"cwp_public","Teaching check-in":"cwp_public","Template CWP Job Plan":"cwp_public","The  Practitioner Role in guided self help":"emhp-cwp-shared_public","The 'Adolescent Brain'":"emhp-cwp-shared_public","The CAMHS System":"cwp_public","The CWP BAME INCLUSION GROUP LOGO x 4.png":"cwp_public","The CWP online guide":"cwp_public","The CYP IAPT Programme":"cwp_public","The Children's Wellbeing Practitioner BAME Inclusion Group":"cwp_public","The Cultural Iceberg.png":"cwp_public","The Cycle of Change":"cwp_public","The Dinosaur Programme":"cwp_public","The Hot Cross Bun Technique":"cwp_public","The Importance of Feedback":"emhp-cwp-shared_public","The Incredible Years programme":"cwp_public","The Polish Community - Bars, Barriers and Solutions to Engagement":"cwp_public","The Principles of Guided Self Help":"cwp_public","The Role of CWPs":"cwp_public","The SEND Framework":"cwp_public","The Slot Machine Analogy":"cwp_public","The Social Graces Model":"cwp_public","The anxiety equation":"emhp-cwp-shared_public","The basic pattern of sessions for guided self help":"cwp_public","The basic stance for guided self help":"cwp_public","The choice process":"emhp-cwp-shared_public","The clinician/parent dynamic":"emhp-cwp-shared_public","The evidence base for parent training":"emhp-cwp-shared_public","The helping process":"cwp_public","The impact of Racism on Mental Health.png":"cwp_public","The impact of literacy on wellbeing":"emhp-cwp-shared_public","The purpose of guided self help":"cwp_public","The tagging system":"cwp_public","Theory of Behavioural Change":"cwp_public","Therapeutic Alliance":"cwp_public","Thrive Model.png":"cwp_public","Tips for Completing Activity Log":"emhp-cwp-shared_public","Tips for noticing low mood in young people":"emhp-cwp-shared_public","Tips for teaching staff for CWP programme":"cwp_public","Tower Hamlets Low Mood: Session 0":"cwp_public","Tower Hamlets Low Mood: Session 1":"cwp_public","Tower Hamlets Low Mood: Session 2":"cwp_public","Tower Hamlets Low Mood: Session 3":"cwp_public","Tower Hamlets Low Mood: Session 4":"cwp_public","Tower Hamlets Low Mood: Session 5-7":"cwp_public","Tower Hamlets Low Mood: Session 8":"cwp_public","Training":"cwp_public","Training ideas for CWPs/ EMHPs":"cwp_public","Translation of Original Materials":"cwp_public","Transtheoretical model of behaviour change.PNG":"emhp-cwp-shared_public","Tripartite model (Therapeutic alliance).PNG":"cwp_public","Trying out new things":"cwp_public","Types of Help for Online Working":"emhp-cwp-shared_public","Types of behavioural activation":"emhp-cwp-shared_public","Types of problems referred to CWP services: London Audit 2018":"cwp_public","Types of support in your back up team":"cwp_public","UCL Teaching Days (Fridays)":"cwp_public","Understanding trauma: key concepts":"emhp-cwp-shared_public","Useful training sites for CWP practitioners":"cwp_public","User Guide":"cwp_public","Using Feedback and Outcome Tools":"emhp-cwp-shared_public","Using GSH Resources Remotely":"emhp-cwp-shared_public","Using Outcome Measures and Getting Client Feedback":"emhp-cwp-shared_public","Using POD to produce site reports":"cwp_public","Using Zoom":"emhp-cwp-shared_public","Using supervision when its not working":"cwp_public","Using the Search Bar":"cwp_public","Validating":"cwp_public","Vending Machine Metaphor":"emhp-cwp-shared_public","Video":"cwp_public","Video Equipment Guidance":"cwp_public","Video: The Turtle Technique":"emhp-cwp-shared_public","Video: Using ABC":"emhp-cwp-shared_public","Video: Using the Attention Table":"emhp-cwp-shared_public","Videoing Sessions":"cwp_public","Videos: Autistic Spectrum Disorder (ASD)":"cwp_public","Visualisation":"cwp_public","Ways of describing common mental health problems":"emhp-cwp-shared_public","Welcome Tower Hamlets":"cwp_public","What advice would you have given yourself at the start of the course?":"cwp_public","What are 'mild/moderate' mental health problems?":"emhp-cwp-shared_public","What components should an effective parenting intervention include":"emhp-cwp-shared_public","What does a Web Page Link Look Like":"cwp_public","What is 'Tier 3' CAMHS?":"cwp_public","What is ADHD?":"emhp-cwp-shared_public","What is Anxiety?":"emhp-cwp-shared_public","What is BAME?":"cwp_public","What is Cultural Identity?":"cwp_public","What is Culture?":"cwp_public","What is Low mood?":"emhp-cwp-shared_public","What is Psychoeducation?":"emhp-cwp-shared_public","What is Racism?":"cwp_public","What is Third Culture?":"cwp_public","What is a 'low intensity' intervention?":"emhp-cwp-shared_public","What is a Behaviour Problem?":"emhp-cwp-shared_public","What is a CWP":"cwp_public","What is a Session 0":"cwp_public","What is an Action Learning Set?":"cwp_public","What is fight or flight?":"emhp-cwp-shared_public","What is helpful for the client?":"cwp_public","What is meant by a 'low intensity' intervention?":"cwp_public","What is panic?":"emhp-cwp-shared_public","What is self harm?":"emhp-cwp-shared_public","What is the difference between guided self help and some traditional forms of therapy?":"cwp_public","What is worry?":"emhp-cwp-shared_public","What should CWPs be doing? Scope of the role":"cwp_public","What supervisors can do to help CWPs be open and honest in supervision:":"cwp_public","What supervisors learnt in Cohort 1?":"cwp_public","What training will we attend on the course?":"cwp_public","When young people feel suicidal":"emhp-cwp-shared_public","Who is brief guided self-help parenting intervention for?":"emhp-cwp-shared_public","Why a parenting intervention?":"cwp_public","Why do therapists have different outcomes?":"cwp_public","Why is this role called Supervisor/Service Develop Lead?":"cwp_public","Wiki User Competencies":"cwp_public","Wiki User Quiz!":"cwp_public","Will CWPs be expected to assess young people before working with them?":"cwp_public","Will I always have anxiety":"emhp-cwp-shared_public","Will supervisors be expected to develop material and teach as part of the Friday co-teaching sessions?":"cwp_public","Will the supervisors receive a postgraduate certificate upon completing the course?":"cwp_public","Working with Adolescents with Anxiety":"emhp-cwp-shared_public","Working with GBO online":"emhp-cwp-shared_public","Working with Parents":"cwp_public","Working with parents with child anxiety":"emhp-cwp-shared_public","Working with parents with child/young person anxiety":"cwp_public","Working with routine outcome measures (ROMS)":"emhp-cwp-shared_public","Workshop with flipchart, pens and paper - Pixabay.jpg":"cwp_public","Young Adults Discuss Mental Health":"emhp-cwp-shared_public","Young Champions":"emhp-cwp-shared_public","Young Champions at AFNCCF":"emhp-cwp-shared_public","Young People Talk About Anxiety":"emhp-cwp-shared_public","Young People Talk About Depression":"emhp-cwp-shared_public","Young People Talk About Self Harm":"emhp-cwp-shared_public","Young People Talk About Their Experience of Anxiety":"emhp-cwp-shared_public","YoungMinds":"emhp-cwp-shared_public","_GoogleDocsIcons_docs":"afc-base-theme","_GoogleDocsIcons_sheets":"afc-base-theme","_GoogleDocsIcons_slides":"afc-base-theme","af-logo-green-new.png":"cwp_public","audit RCADS graph.JPG":"cwp_public","baby and parent hands.jpg":"cwp_public","blue pattern.jpg":"cwp_public","blur-close-up-indoors-1266003.jpg":"cwp_public","books with open book and pen.jpg":"cwp_public","books-2158737_1920.jpg":"cwp_public","books-icon.jpg":"cwp_public","books.jpg":"cwp_public","bookshelf.jpg":"cwp_public","boys running.jpg":"cwp_public","brain.jpg":"cwp_public","brain.png":"cwp_public","bubbles1.jpg":"cwp_public","cave.jpg":"cwp_public","children-in-circle - BME -.jpg":"cwp_public","children-in-circle - BME.jpg":"cwp_public","classroom picture.PNG":"cwp_public","close_up_pen_writing.jpg":"cwp_public","collab icon.jpg":"cwp_public","countryside for icon (4).jpg":"cwp_public","countryside-2371480_960_720.jpg":"cwp_public","creswell book.JPG":"cwp_public","documents icon (1).jpg":"cwp_public","draft by Shayo":"cwp_public","fonds-ecran-groupe-enfants-qui-s-amuse-10-1024x685.jpg":"cwp_public","giraffe.jpg":"cwp_public","group-diverse-kids-standing-together_53876-22754.jpg":"cwp_public","head in head small.JPG":"emhp-cwp-shared_public","head in head.JPG":"emhp-cwp-shared_public","image.png":"cwp_public","inhale-exhale.jpg":"cwp_public","joshua-ness-225844-unsplash.jpg":"cwp_public","jumbled words.jpg":"cwp_public","laptop .jpg":"cwp_public","laptop typing.jpg":"cwp_public","leaves.jpg":"cwp_public","lightbulb icon1.jpg":"cwp_public","lightbulb.jpg":"cwp_public","maintain.png":"cwp_public","man writing.jpg":"cwp_public","manc":"cwp_public","mountain river wallpaper (11).jpg":"cwp_public","pad of paper icon1.jpg":"cwp_public","pad of paper.jpg":"cwp_public","pink and orange.jpg":"cwp_public","purple pattern.jpg":"cwp_public","question mark.jpg":"cwp_public","redd-book.jpg":"cwp_public","relaxing frog.jpg":"cwp_public","ripped jeans and laptop.jpg":"cwp_public","sleep.gif":"cwp_public","sunshine-2596172_960_720.jpg":"cwp_public","sunshine.jpg":"cwp_public","typewriter icon1.jpg":"cwp_public","typewriter.jpg":"cwp_public","winnie2.gif":"cwp_public"}
{"$:/DefaultTiddlers":"\"84d1f59ae60084d4d47f9854199174e2\"","$:/GoogleAnalyticsAccount":"\"1d6a12df4239d409d489167749c0bed1\"","$:/GoogleAnalyticsMeasurementID":"\"18911c203bbfeecb9a7a5da94216ac89\"","$:/ImportImage--111771515":"\"4efa2691b969d5cfabab03d14a3641c4\"","$:/SiteSubtitle":"\"b2bbe835295b2c23095c4e4c56194d2b\"","$:/SiteTitle":"\"abf724c11e7aba7b471ab3d34a14ab1d\"","$:/_AFC/AboveStory/Logo":"\"f90abc11b7d842cf11d2e8dd07d781e5\"","$:/_AFC/EditDraftInfoSegment":"\"14b97bb8d45794bfb36bf9192951e8f5\"","$:/_AFC/Fonts/UseFonts":"\"7a194c57092242bf0f99c79bd6e28fe2\"","$:/_AFC/Macros/Image":"\"c187fbc8c037e27fd02504e25c0aa644\"","$:/_AFC/Macros/YouTube":"\"571226f519b51c4b102ca27cec59bbcf\"","$:/_AFC/Palette":"\"fd38d130d30f4c51a258cfb1425339a9\"","$:/_AFC/SideButtons":"\"9154c94715f1854ce4ef9c4d130e0a8b\"","$:/_AFC/SideButtons/Styles":"\"f1a314b4f039333302966faaa2ee0e97\"","$:/_AFC/Startup/ConfigurePreview":"\"d186a5c9b65e35420bbf7741b3c5f117\"","$:/_AFC/Styles/Bubbles":"\"78f9eee66bbb77bb10131346cb66b379\"","$:/_AFC/Styles/DocLinks":"\"406c2d60bf469bba7f5ce36c04f5ce08\"","$:/_AFC/Styles/FadedSidebar":"\"f429edacd34f19f1559a3779bc8d8dab\"","$:/_AFC/Styles/HideEditButton":"\"051c89709a3e30ce00bcd654225c25f4\"","$:/_AFC/Styles/Overrides":"\"34c7de5409fa262ece619897eb8cf27d\"","$:/_AFC/Styles/TopMenu":"\"b0cd98b814e1a1a2bea0e34aa3e2e60c\"","$:/_AFC/SurveyBanner":"\"b3015c7cf7503a0e11b08600c77311c8\"","$:/_AFC/SurveyBanner/Styles":"\"a2ccfcbd8fd68cad395e3149bf599069\"","$:/_AFC/TagDropdown/NewHere":"\"45deec1e2ad63899621dfb64b7cbe229\"","$:/_AFC/TagNavigation/Styles":"\"6db135a88329f41ed8427ff8c2ce51cb\"","$:/_AFC/TagNavigationMacro":"\"d3f8203a1a45a0fde2ef8e3faab820bf\"","$:/_AFC/TiddlerInfo/Text":"\"535865a9e975de227599cdd32f4ccc9e\"","$:/_AFC/consent-banner/buttons/login":"\"53924a18efd5ea26807b35fb2f545f68\"","$:/_AFC/grey-wordmark.svg":"\"d2b3a7add5aea8657db3bbeb3b498ae1\"","$:/_CWP/Palette":"\"bbf90c7b667cf4560123aa686da37afb\"","$:/_CWP/Styles/LooserMargins":"\"af7699510d719e8995b7d35f23087d0d\"","$:/_Macros/ImageLink":"\"3bbbf684a6393e57386fd7a0bcf1b94e\"","$:/_Macros/LinkDoc":"\"bea2d309a4d3c118bad5d5b78472977d\"","$:/_Macros/LinkPDF":"\"1833c49010a51b795109546425d87189\"","$:/_Macros/Video":"\"76773c71485bfc36f916e293e1eb17b8\"","$:/_Menu/About":"\"b795b4e5694c81156b2af849ce3f595b\"","$:/_Menu/CWP":"\"6c12942a9d1760afcf95ce5513b5e028\"","$:/_Menu/Finding Out":"\"744f854f8958faa115aec68bdf79dd96\"","$:/_Menu/Helping":"\"3a74f669e91c5e19a84661673e70e771\"","$:/_Menu/Home":"\"5eb5308abcce2326dc10971b6465cfa4\"","$:/_Menu/More":"\"691ad206e37f2c40bd63ff10534d4fd7\"","$:/_Menu/Navigating":"\"6178c8929dd3aef67058b589c0c17bfd\"","$:/_Menu/Partnerships":"\"4a9c707a9776dc912f62f4a9604a0a49\"","$:/_Menu/Partnerships/Sites":"\"fe01e205d2e954eaecdac8a6e97c9c50\"","$:/_Menu/Partnerships/Sites/DropDown":"\"2f9377cbfc38a9e9fb2a1223c7082661\"","$:/_Menu/Private":"\"50d1300bf3848fbbe2ec65e366e0b682\"","$:/_Menu/Service Development":"\"81b280fd10d15759147ee3b7dc786b03\"","$:/_Menu/Supervising":"\"9a54a89d7fa324fc07435984948d6c2b\"","$:/_Menu/TOC":"\"b4417bc2bfa180f3bcabb6f07c0a7968\"","$:/_Menu/Training":"\"4fa459fd4acb1cd7a1c2009411414d96\"","$:/config/Manager/Filter":"\"21fac38db0190e210174d8e62dd0861a\"","$:/config/Manager/Order":"\"c71a06bc790f61f4a84ffdfb4f343a19\"","$:/config/Manager/RecentTags":"\"350d688f867814b05ca5c86548f506c4\"","$:/config/Manager/Sort":"\"435723e9862ac8e246ca0134f087c8ab\"","$:/config/Manager/Tag":"\"a466e8234e8795368dddada6f731d5b8\"","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all":"\"fde0d26c677278642e53c2a707392f86\"","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/control-panel":"\"1ed54556bd141a6d701c227bf48128ec\"","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all":"\"fd23a37d96e791d43aa69cb51c31ec05\"","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home":"\"22f13d86e21f3e67fe029fd3190e9f6d\"","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import":"\"a8ad5f8836fb7b6d522f840969643eef\"","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-tiddler":"\"550ca13c5f84552bba3de416f50cdf5d\"","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette":"\"5a54dd4a0b6eeac1f1ca4b31b3a9e876\"","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview":"\"e51b1b33dae06379a14ba9ae0ce3c576\"","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/save-wiki":"\"516f50f5b06eb1d14d3c1ce090ea39fa\"","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all":"\"c1ebee8a765d718708937508232cb27d\"","$:/config/RelinkOnRename":"\"cd7a79a37e5056b87a022b550169430b\"","$:/config/ViewToolbarButtons/Visibility/$:/plugins/federatial/print/button":"\"0e15c4427b0db8bc7ab25e467aa8c0bd\"","$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/contents":"\"d86d3acf25e62ebab56871fef1e7faae\"","$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server":"\"9030fe5f447225c77631be1bd328ce71\"","$:/config/plugins/tiddlywiki/consent-banner/greeting-message":"\"135d7ecf1b4eb392c0f8a6563befb5db\"","$:/core/ui/MoreSideBar/Drafts":"\"bc8030c66ff72ad4a0d9f0000f16600d\"","$:/core/ui/SideBar/Tools":"\"ceef5fc4d12b4e59a01561d6dcddfa84\"","$:/core/ui/ViewTemplate/subtitle":"\"b0c8d4a1cfa25413f198cc963d3f4ef8\"","$:/favicon.ico":"\"396352a7da6497af7362e3549a0e0aa9\"","$:/language/SideBar/Open/Caption":"\"97d8e622dce97bb9590ef623fc729956\"","$:/language/SideBar/Recent/Caption":"\"d86a3acc555e5b8579c09ed8806c1acb\"","$:/palette":"\"f6c3570cf67d948fa1923d79f6445421\"","$:/plugins/federatial/print/button":"\"e25177d0c3d818bbe28b1a7f36bc0b4c\"","$:/plugins/federatial/print/styles":"\"2ea66bf6be0fb2a73f32ce9825fd325a\"","$:/plugins/federatial/print/template":"\"581a8671a3e18319afcd6ff8c916f21e\"","$:/plugins/federatial/print/template/inner":"\"bd9a103267a6863fbaa0fb1fbe2e66ed\"","$:/plugins/federatial/print/window":"\"968a343265c864d64a865e478bbf912a\"","$:/plugins/federatial/xememex/status-button":"\"2277ef8c8a197aef0bbd393f2a6dbfbb\"","$:/plugins/tiddlywiki/comments":"\"9e27c732ee7da173697f5b88bfab804c\"","$:/plugins/tiddlywiki/comments/sidebar":"\"ffe7e56adb0e5a43bfb46c599824405b\"","$:/plugins/tiddlywiki/consent-banner":"\"9fabdf6138d07ba9e123427fb3c50329\"","$:/plugins/tiddlywiki/googleanalytics":"\"3fb55c0cc1b173e87ed6c6d092acdec8\"","$:/plugins/tiddlywiki/menubar":"\"414c88bf626bb22343e801593cc9bb0f\"","$:/tags/MenuBar":"\"8fbe20ffa7b68b2deedbf2f0099a690d\"","$:/tags/Static/TopMenu":"\"90702d93786f39f1c4b75688db693a86\"","$:/tags/TopMenu":"\"e1702f4e6b85ab57f834a70a7d2b0209\"","$:/tags/ViewTemplate":"\"d665195bf405c0eff27ac5c2807b7287\"","$:/theme":"\"e6e0a5fbbd85fca472a03df020159739\"","$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint":"\"bcfa6153f06a2865f8c30f0c839a6422\"","$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth":"\"154da6351677368e2948813b969785af\"","$:/themes/tiddlywiki/vanilla/metrics/storyright":"\"7ba2dfc6d6c0cdc05034389df9b4ea40\"","$:/themes/tiddlywiki/vanilla/metrics/storywidth":"\"6944a32e442157eab2349969de7db79a\"","$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth":"\"0f96969e7d0b437674d8603adccc21ad\"","$:/themes/tiddlywiki/vanilla/options/sidebarlayout":"\"ab7996e4ca2f0b97e1b62fcd08f83070\"","$:/themes/tiddlywiki/vanilla/settings/backgroundimage":"\"6c687ac20050ed9cd54e7c62ac011f5e\"","$:/view":"\"f248872a2ff85b8964671cb0470fda31\"","10 Top Tips for Working Remotely":"\"254f330da313570eef2e4e5478a9fb7a\"","A Child Explains Anxiety":"\"8706e67b8ac0f17181b12b38d1d97b77\"","A child describes ADHD":"\"0886f4d59859480d05a309548164f9f6\"","About":"\"15d0d1912a4f8414399b426330c8543f\"","Academic sources of behavioural activation":"\"613454968fea3a5bcba1f4182390d66b\"","Access to CWP services: London Audit 2018":"\"3a8af7f985d7ec9be584a7a0082cb032\"","Active Listening":"\"525c960e7ab765e78193dbf8177ffc27\"","Activity Monitoring -practice tips":"\"01e1c6dbca468ad82f26a036beca00be\"","Activity planning":"\"5594b46ee227ccd9533dea38f4ee60d4\"","Additional Adolescent Anxiety Manual":"\"96101ceec10540dd9479aac91feadf57\"","Adolescent Anxiety":"\"f1a1da6cb6bfadb643e497bcd669f2a4\"","Adolescent Anxiety - Manual":"\"d35b9952d3409d2a2e3d1c9f3cc1b239\"","Adolescent anxiety manual: COVID-19 adaptions":"\"69128dc65e50d7e4dd8eabdf9d53b568\"","Adult IAPT Manual 2018":"\"dfd5c031cc67eac04b82225d558cc279\"","Advice from Cohort 1 CWPs to new trainees":"\"e0286ca2d8b282bea72b722b26a0ca1d\"","After a Suicide: a Toolkit for Schools":"\"2608ce5c350b662d389f47501f13b240\"","Agreeing a future plan":"\"8bdb7d1deb167c7316d9ffe2c668f3e7\"","Aims and principles of the brief parenting intervention":"\"9e6f67f9c414b49de7523a0de0a2872f\"","Alternative Session Plans for Behaviour Problems":"\"4c5e418477ff1c62137a794d875523d7\"","Animation Explaining Anxiety due to COVID-19 Lockdown":"\"2e37a61e1f3086fc63ca43c88ad18c80\"","Animation: Transition from year 6 during a pandemic":"\"d2aa05e660ab19d4b4c277f2c8254455\"","Anxiety":"\"c4ae5f1a8d521ec062cbc1bccb8ec174\"","Anxiety in young people: a brief overview":"\"33df7a89691b9de6a18a1cee8b13781e\"","Anxiety practice":"\"b5bf36c7b9c16ef252fdd47c1c107d99\"","Anxiety skills":"\"b17bce90e6720035451e7ee40eb6ae76\"","Anxiety: Explaining anxiety to children and parents":"\"fcc3b8b668955fd80edd2dfa245925ed\"","App Reviews":"\"885d5eb7d2bcb50157a147b49ac52048\"","Asking for help: what's it like?":"\"0067e5d3a1b164082b69fc58da593fa0\"","Assessing for Parenting Intervention (Behaviour Problems)":"\"5792ff624ff0d40fc7c6b72c8c5cb59c\"","Assessment":"\"2f3f2fda86fa7b7d984d5bc0b7be9dd9\"","Assessment of anxiety: key points":"\"f9362d9a536a874baa292bffdb0b905a\"","Assessment structure.png":"\"d8a5f7068811f69caafecfeaa6128576\"","Assessment: Key Questions to Ask":"\"c579dd4c0201721ddffd6fe779ba1c1c\"","Audit Age Distribution.PNG":"\"8c0a165dcbbc2d521104a0be8970c9ad\"","Audit Age distribution.PNG":"\"8e6a7423fca345ef6533fe9546289948\"","Audit Descriptive Scores_GBO .PNG":"\"0ef1cc051be745346b04ce33383c1bd7\"","Audit Ethnicity.PNG":"\"532220cb55675565c5b3865a0353f825\"","Audit GBO's graph.PNG":"\"ae0505a6e272d3436c25a991f0080e77\"","Audit Gender.PNG":"\"1f21269719bc4004cb6c5f09283767a1\"","Audit RCADS_table.PNG":"\"8560e62cb92ea1040779063ea2b27f12\"","Audit SDQ Means.PNG":"\"0b246d52ce09776c371a39f4d93a2562\"","Audit SDQ graph.PNG":"\"c01c893017b3433b7165bd90f30a54a6\"","Audit ethnic distribution.PNG":"\"95fea09b0c88bca242694775c5f5507f\"","Audit of the CWP Programme in London and the South East":"\"eacb05b0ed51cd44aff241c9eced4d85\"","Autism Spectrum Disorder (ASD) and Mental health":"\"c54ab936e48baad256a2c80ee1880756\"","Autistic Spectrum Disorder (ASD)":"\"2ad22790e49186b5644b29ec11c24e2a\"","BAME Inclusion: A Reflection Through the Lens of a White British Male":"\"0ea86101c98f6e56ffa278c284364474\"","BBC Bitesize: COVID-19 Articles":"\"1d27212f172dd5958d68e4d1e8c7f117\"","Barriers to Digital Forms of Help":"\"d51b80d3f57d799fe1db884f1c7a5947\"","Behaviour Intervention- Translated Versions":"\"63cccef069d53a13ebb6e036d2fe2313\"","Behaviour Problems":"\"5775aa15e29fbd63da948e2f2023c12c\"","Behaviour Problems - Manual":"\"22f6cc515a5ecbc130c340a776edfdb1\"","Behaviour Problems Overview":"\"e38224b1c17c9e5ef75f006772d1e1d9\"","Behaviour Problems Practice":"\"ffd767cece5f7a39254e9ffa86a4bf83\"","Behaviour Problems Research":"\"31371748b046d56a9faab2f74189786e\"","Behaviour Problems Session Material":"\"ee2ef5e135fb02fd6a03e8e1003e3d7a\"","Behaviour Problems Session Plans":"\"33c610eff686464cf59507c7106d2090\"","Behaviour Problems: Resources":"\"1588bf97e3eb0e1a812b79562c3a1c57\"","Behaviour problems manual: COVID-19 adaptions":"\"dbd9c91b4722893176b1408fa29357f7\"","Behavioural Principles in managing anxiety":"\"b2dad5bdcff62c08560fc7fba9d7cf10\"","Behavioural activation":"\"7cc8b36f093ad3dfd5a890f01d6f87ea\"","Being a safe practitioner with guided self help":"\"b332a7e1f73d13dfe8cac1fffa9d31fa\"","Brain creative and logic - Pixabay.jpg":"\"d176bb15830032df0e97289ea6086a1f\"","Breathing techniques":"\"5d2ae2e913c83bd6429587d4beea886d\"","Brief Behavioural Activation - practice tips":"\"2c4652efb2563ac2335b18dd4cd8115a\"","Brief Guide to Goals and GBO":"\"a24a2360cc82f9f1e225f4b04db0c036\"","Building a Therapeutic Alliance":"\"68e48d2135f55b2b3e03fc6504b898d5\"","Building a back up team":"\"c6eb6488165fb0a2630eb36f14e5e0aa\"","COVID-19 Resources":"\"68ec8effc92721736c4b8e1dcd92fe05\"","CWP Intervention GBO Outcomes: London Audit 2018":"\"a48f70286bc720099eca3895ee26c56a\"","CWP Intervention RCADS Outcomes : London Audit 2018":"\"c5bcda0644120a736c1b5083ba13af2b\"","CWP Intervention SDQ Outcomes : London Audit 2018":"\"f571d6477989a3a789c7b9edb197fa93\"","CWP National Curriculum - Module 1":"\"4af4280c66dc0f9ef3805772a8cb3fdf\"","CWP National Curriculum - Module 2":"\"966cd81801c0ed7280ac0794856b9ee1\"","CWP National Curriculum - Module 3":"\"3b93cdf61adec84c2862f54d609fc367\"","CWP National Curriculum: Overview":"\"edb43b89b7333ed2ca6d6cde9faa5f0e\"","CWP National Implementation Group":"\"1edd5503699b0e5168402016115e9d92\"","CWP Partnerships":"\"13b710770a6d7b03745b1a11000bb8cc\"","CWP Service Satisfaction: London Audit 2018":"\"6dbe9d9bf4f35a39ae2b29ab36c5a397\"","CWP Site Information":"\"a0cf455342d76253b0d302d2dcbb9e4f\"","CWP brochure":"\"91e4c5567b9f472ffa31b581aca77c18\"","CWP library":"\"53d038b446066e938e4b95165600d128\"","CWP pathway":"\"4acbbe2a229cafeb2ca21b9cb2b4cbac\"","CWP site map":"\"2b1e81f9ed0c7d9361658e1b89e8a86f\"","CWP site map.PNG":"\"66292874e3b24d9499476d3a81b1bd16\"","CWP-EMHP Library":"\"866a75008146cf8980d2d29831081b6d\"","Calm Time for Non-Adherence to Commands":"\"bd9c609574fea27a63e9da9579fc3d3a\"","Case examples":"\"5aa14deef10fd88426e11f79f8df6498\"","Case examples and role play discussion":"\"ed6af6e638e467a80761aa4c5193b80e\"","Caution.jpg":"\"e65da4d7e4d94f8e606bfb4deffb422c\"","Changes in adolescence":"\"ea0f7fff42fde0f6c3b8913e5dbbaa18\"","Checking in about the previous session":"\"a12423dc1bdd2edcf6250d722a4c34a0\"","Child Anxiety":"\"c5896d9a9a1b2a5753154b92aa090b88\"","Child Anxiety - Manual":"\"993ff75a149d1ba362b060cc237cef3d\"","Child Anxiety Book- Translated Versions":"\"a0eb69824216c8db1dcd2cfdcb83e876\"","Child Anxiety: Book":"\"fb74f8319d5d558e98bb71e3416ba819\"","Child and Adolescent Development":"\"00e1cda4771482734bcedbb1d489cf41\"","Child anxiety manual: COVID-19 adaptations":"\"43c9215ad31e32b0cdfc0d6acae0b813\"","Child anxiety workshops for parents":"\"9c97f76b03c9e22a6238d66d34e5a086\"","Child mental health and medical diagnosis":"\"626aa94016db6d59885f32b637c74f0f\"","Child protection assessment framework.PNG":"\"9b97190f8c7ed9cba9f25742697525fa\"","Child vs. parent focused work":"\"c6c31955b126227234f823c3976a15fc\"","Child/Adolescent Mental Health Problems":"\"97194d5eadab778a71ba462b5c76496c\"","Cognitive Principles in managing anxiety":"\"dd7b7d7bd41bf2ef7058b24a34d0caf7\"","Cohort 1 Lecture summaries":"\"46e26b6316f684b0fa98ebea247395dd\"","Collaborative working":"\"c19242d4d9fb90983f13c3f958ba2755\"","Comment by 'elladennison' on 'CWP Intervention Outcomes: London Audit 2018'":"\"ec18ce522c205a05b1179999227c721c\"","Comment by 'elladennison' on 'Outcome measures'":"\"11461ee75b6112d1e6913fb97ea330eb\"","Comment by 'elladennison' on 'Translation of Original Materials'":"\"b248b67dd324d5e3b4d8daad3e6b8924\"","Comment by 'mariannemcgowan' on 'draft by Shayo'":"\"7fb66392b6c3a1c5f1a93235f1f26b19\"","Comment by 'peterf' on 'How to tag tiddlers'":"\"cb95f2349257a005b63838ab56563036\"","Common barriers in GSH sessions":"\"34de3e8b7a1765f1c4d31b5d2b24711a\"","Common mental health problems":"\"c25a6f41dfe6e9ac8a10c0eebf3b3c50\"","Completing the RCADS":"\"e1be880fce641db4c225c11e2078af13\"","Computerised Therapies for Anxiety and Depression":"\"f773ef9303b782bf15713865f7a9ad69\"","Consent and video recording":"\"1e5710472bc782092256d8d21f9ccad7\"","Consent for Working Remotely":"\"1821a62215409cd7bfc41d47fec9644c\"","Contact us":"\"8662f780024c32926e021d4a1e4b6c38\"","Contents":"\"22b38e1feba1cebee73122c4eb33d92a\"","Converting parental concerns into goals":"\"2f93a060aa2eefcd0deaf5bd58b068e0\"","Copyright":"\"8b3f8d3f9d25b75c6fa68eaf1e970f7d\"","Copyright Guidance":"\"4f3d0c8de32bd9ebe3ef3c41b7f517d5\"","Copyright matters":"\"a156388d4ae55d84e2eacadbd94c4ab6\"","Core Approach for Behaviour Problems":"\"356a45573a191b92d67fd2a626fc80b5\"","Core Competencies for CWP Practitioners":"\"1bdd7ff82a4b6dd18528aab5ee59978a\"","Core Intervention Manuals":"\"adf23bb741b28c3e9fc02f6b039edf14\"","Core Outcome Measures & Feedback Tools":"\"4e801f9c193707abefe49d0fb5490eb4\"","Core components of parent training":"\"b49b99f839f433dc997f1b11a005e338\"","Coronavirus: A book for children":"\"d84c144dd9407e93c5785d8f9034786e\"","Course Assessment of SSDLs":"\"12d8323f34ae0d8f77b8a8ba82546267\"","Course Handbook 2018/19":"\"ea87e7242d29e93f4cf040731b81b028\"","Creative Commons licence":"\"bb2977e81dd602f381816026d2b8bc86\"","Cultural Competency":"\"76ccb8690811cb7b73c4b25ec6a7bb01\"","Culture?":"\"b5331808ec10d6c3f9e2e203116d8d4a\"","Deciding on what you want to change":"\"b7950b05ab3ee532ac65444fab6bef4c\"","Delivering therapy online power point":"\"58045bd63f0c76bed97ca0029eb16829\"","Demographics of CWP service users: London Audit 2018":"\"356f8c3eae95fff5f86d9d95b6eb4bba\"","Developing the Guide":"\"eb58eceeb11e3c80502ce50c3432e1fd\"","Diary keeping and daily monitoring of activity":"\"95a978475894d5168f972d1415d1a2bd\"","Differences between the CWP and EMHP":"\"78379adc1a62036d368fc44e1b646aa5\"","Direction arrows with converse shoe - Pixabay.jpg":"\"7cb929a41591bd7cafe8585b8865a097\"","Discussing Technology Use and Failure":"\"e7f857392b031e2ce0e8a93a349b704f\"","Disorder Specific Interventions":"\"98f2d3aa002440a4775589b422e28731\"","Diversity":"\"0b35c5ce7a76f213d4ea0af95d8bd2a1\"","Diversity Inclusive Assessment Resources":"\"bc608fbaf8c342fa2cf784049d50ec28\"","Diversity: An Overview":"\"3079d23ad9f150be1adb2bb0b10958e1\"","Diversity: Exploring Stereotypes":"\"2852338d1eb5cf07b5cdb614eed8ed15\"","Diversity: Practice Points":"\"6f3f00c3c6dca201b3491452c950a0e8\"","Dog Poo Analogy":"\"aa4a222f70ac5fe2feb91969a775a327\"","Draft Images":"\"73abde0d4cce74f56d7b75cc9942e2e2\"","Draft by Marianne":"\"ed689dcd5611c05d1e7968b00a3e5133\"","Draft of '$:/_Menu/Navigating' by elladennison":"\"72e7e0ca2756d4971185d5934e5d0409\"","Draft of 'Adolescent Anxiety - Manual' by elladennison":"\"40cd35cb057447ab1712476e72ca9a6b\"","Draft of 'Engagement' by tiamckoy":"\"b4cec5dfc05e298d69873d35a4a45eb4\"","Draft of 'Exam stress' by mariannemcgowan":"\"dfdda5fb578791e941b6a44055d676bf\"","Draft of 'Homepage 2.0' by charlottehepburn":"\"3bb6615507265b705888617f34c253b0\"","Draft of 'Manual Editing Guide' by sarahthompson":"\"f906babeb27580ac7f507023a79c795c\"","Draft of 'Nine Components of Guided Self Help' by tiamckoy":"\"d8f3b3cd5035002b0d6da9973ab257d3\"","Draft of 'Video Equipment Guidance' by tiamckoy":"\"bc3ade5f30300ef4b031c78b1dd14dac\"","Draft of 'draft by Shayo' by sarahthompson":"\"4b08db2c2f7ddc89db3c0fb0883efe32\"","Draft pages":"\"0501c4f66d94beb9d9a99b490fc79bd8\"","EMHP":"\"783e5b125e43e792eff194320b7757ca\"","EMHP modules":"\"faa384a82ae1d55aa0ba0c634474abc0\"","ESQ Young person reported responses.PNG":"\"7e0966ebd1dede9950db183d0549d746\"","ESQ parent reported responses.PNG":"\"46bb4119098fbf53194380173c0dee2c\"","Eating Disorders: Recognising and Referring":"\"c6a817060a722ef5c1b6249ae5a0707d\"","Education Resources":"\"ca25cafd806272b34b3e6d8b27c6104a\"","Engagement":"\"2179aae70f8c06862a5565a423374ef6\"","Engagement and First Meetings":"\"0894cfe7e47ff3f17e878e8979c115d5\"","Engagement and Shared Decision Making":"\"279133602500761f0648b237c2f21fdf\"","Enquiring about strengths":"\"bb83ff8b32aabb27020e3728039ed0bb\"","Epistemic trust and social learning":"\"981f43df91ddbacc590c1a787d9baa70\"","Equality":"\"462fea374379eda9f832aec1303d0c52\"","Equality Wordcloud.png":"\"fcdaa646fceb2d02122a40d6b554e8ff\"","Evaluating self help materials":"\"f09c58f850f43cf4059dcf6818dfa5c1\"","Evaluating the Quality of Self Help Materials":"\"c2ed18909abf0b09d078645a2da7bee5\"","Evidence for low intensity self help approaches":"\"28c0aa68109c0ab940362372cef3ba82\"","Exam stress":"\"f0efa891c7b0f93b1b86a9bd1ef9cfc9\"","Example- Supermarket Bread":"\"5f41ba8096c39294e68baab2e46cc184\"","Exclusion criteria for CWP":"\"5ab15559a986767426e850010e12d4ca\"","Expectations for Recording Sessions":"\"85f263462b5c14cbff3ad90773edf437\"","Experience of Service Questionnaire (ESQ)":"\"4b9aa3f62520c96472da1c7fba2c66bd\"","Experiential and cultural aspects of anxiety":"\"29da490627af3efa7d4d42b7d5f9dca0\"","Fear Thermometer":"\"dec21e6c7430612cfaab3f468189cda3\"","Finding Out":"\"887476116e7aa9578147af9d1e0e24d3\"","Finding OutContents":"\"4ff244870ae1804b52f182dd71508c1d\"","Follow up after the end of the intervention":"\"12e23492fe6275a57cffe21584914c96\"","Formatting Pages in AFNCCF Manuals":"\"e5e5179700e513c447e2aba8deb85e8d\"","Four key mental health needs addressed by CWPs":"\"a03a138dc165f7854e4d47e8ef2e769c\"","Funding and Finance information":"\"75d4d26d9446e6cb49acfdd868baa70f\"","Future in Mind":"\"5111293ff1357c5f34f4480badc53086\"","GBO guidance Notes FINAL March 2019.pdf":"\"26b4dfdde55263549615eb7fd11a60c3\"","GBO-HIT":"\"de63b4e94e40d896ebb428128f4566a3\"","GSH Skills for Assessment":"\"315e4c85e3c5166ab50d1576d9970173\"","General Support Resources":"\"b39bcb457182334fa14290bd289a6352\"","Generic mental health assessment":"\"a7b905af9c6c3daa74db69cbd4bd9042\"","Giving SSDL session feedback on POD":"\"23e7b367f38aea47d94658c6215644e0\"","Goal Based Outcome Training videos":"\"544da89524366ce643c489bf426d721b\"","Goal-Based Outcomes (GBO)":"\"498b017d85fff2a958a881e8b5f6b595\"","Goal-Oriented Practice":"\"2ce2b68e42bea42e708b6714a0c9bc7c\"","Guidance on Using the ‘Shared Bag’":"\"afc337f082bb98da9a5d141c547aecaf\"","Guide to presenting difficulties for CWPs":"\"ddd7a319756bde84303bcd602e93495d\"","Guide to selecting CWP cases":"\"8153ffbbc58b3617493e036a256495dd\"","Guided Self Help":"\"7196413e8f2c9e943eed98ab2b02c87a\"","Guided Self Help General Structure":"\"5b1fa58db01c3a063ca57e53b87b9114\"","Guided Self Help knowledge":"\"4bbecba4f700c6f7bdbd0dc3f11eb20c\"","Guided Self Help practice":"\"b8e8b7dfc438569d47d7e577316ff496\"","Guided Self Help skills":"\"980f5226f531dd23d97c36925a0591f5\"","Guidelines on how to edit this manual":"\"41173cf70bd4808459d4e141d0a58d15\"","Habituation Principle":"\"44d76eb62c1f546dd31b347ba637ba0f\"","Helping":"\"db39232e3d616c32235fa5d537134fd4\"","Helping: Adolescents Anxiety":"\"7ac40b947f8b0286c736b23fbb0383da\"","Helping: Behaviour Problems":"\"7aa31acb4c486764695505dd095a88e3\"","Helping: Child Anxiety":"\"1f348352fc880a7c1f2cebcda3105e6e\"","Helping: Low Mood":"\"4cf75602ec97f3815cc971c5c2d8cef5\"","Helping: Supplementary Material":"\"92486e4ddbadd08f323f6b2b90ef6cab\"","Helping: Working Remotely":"\"e95131b08585a34fda52375045f28cbc\"","Home":"\"889778e105841df6541d44abe26dabd9\"","HomeContents":"\"50f4e9d77cd4f0b9d9fd250fef9a388a\"","Hot Cross Bun.png":"\"dde84fe6a8e4fdd3d8246dc414763ebd\"","Hot cross bun.jpg":"\"09a22a783d807bf1e655787ba32bfd2e\"","How Pages Open in the Wiki Guide":"\"55569a98f7228b11bda7905679b7afe0\"","How common are anxiety problems":"\"259a805608e2f2004123231c01618504\"","How common are behaviour problems?":"\"4a348a064edaeb01e7887726d6b570e5\"","How common is low mood?":"\"3d42bf3a93401d0ec91badb5aa5bc86f\"","How many days a week will I supervise CWPs?":"\"1868a2226df186fd94619b9c665dd2e8\"","How many young people will CWPs be expected to see?":"\"1a1f59c53003210ebf3193052af94d54\"","How to Access Google Documents":"\"8ea17dc9e6eadc17d53b9733905196b8\"","How to Conduct Assessments":"\"5aa7091ce28075c4e0a47b07f36e03f4\"","How to Give Feedback":"\"5a5e380dbd983f1860c696c762b7644c\"","How to Print":"\"b794083b2d6c417bef7430ae73f437ce\"","How to Use POD":"\"81714f1141c506a825d865c5d7f39023\"","How to Use and Understand 'Tags'":"\"0afcd08d793be438086687e66cf30147\"","How to add a PDF link":"\"eaa1312dbc522bd51e841ba097f2341f\"","How to add a new tiddler":"\"60d9ab91ce0d54b6dc811b69557c5ae8\"","How to add a picture":"\"b34dfdd9eb57f4a332c0509d741bf4f5\"","How to add colour":"\"1090bdc0b7e20f047797bfe3be74ca87\"","How to centre a title, phrase or image":"\"c0bdc5e521a2781d1d2a3e70c1244b27\"","How to edit and delete tiddlers":"\"4dd44728b8d7517e7b7ad55ad75f145a\"","How to embed a video":"\"444f444a3cb834cfd3491c90dc16eea7\"","How to help young people manage exam stress":"\"cea1346f21cfadd00094128b8ea5feef\"","How to login":"\"5c900e206fdeaa19d848bdbfca8e76a6\"","How to resize a picture":"\"b1404a95daa393ec51ae12d955739b0e\"","How we Get Wiki Guide Feedback":"\"0e0b67d348341e6f9d54944b0691b949\"","How will we know if our CWPs are seeing the correct cases?":"\"efa0d8385d11781cde8956560bec1c21\"","IPT-A":"\"927af7728de1975e04ff495acffa771b\"","Inclusion":"\"037c5449d5aa490a840b9af4dc30ffb2\"","Initial contact checklist":"\"7003ef859170046089e370fef6ac6746\"","Internet Safety Toolkit":"\"18a9cece503e211a3d4c2e8fc6fb4ff4\"","Intersectionality":"\"53cd23784407548ae8496c47d728b313\"","Intersectionality - Belonging to More Than One Group.png":"\"a696dee54d10455829a3ce90e604a734\"","Intervention for Anxiety: key practice points":"\"efb43b94dac5e1707221f8ecb6699745\"","Interventions":"\"8e98ad4d535703c83baefb6d635506c8\"","Interviewing Parents":"\"f639b3216849dac60baf5f174d1cf21d\"","Introduction to child mental health problems":"\"900368586566e52033aef04a145e12ad\"","Introduction to the CWP Programme in 2017":"\"58a01787b6a12ac8c7575636c3b1a8d3\"","Introduction to the CWP training":"\"55428f9c8c73c35c49e32cd5d4452a3b\"","Introduction to the theory of behaviour change":"\"2e92cd5784ca1b0e96cd3bd355a26640\"","Invitation for feedback":"\"20b88f6c67b90dbd36aa5359f6774490\"","Involving parents":"\"17f67731d299b6d5cc0e1993b56fd048\"","Jargon Buster":"\"14d9ae47bf92907f66c08d82c982aff6\"","Job Role":"\"86a9335a6a23fee741696227cc49772a\"","Join the Largest MDT Ad.png":"\"3008084c20159ddaf3f707c22a05472c\"","Jungle Analogy":"\"69262cdc422d7337bfd6cb31c7bdc224\"","Key Documents: CWP Programme":"\"30cdc8dfee64550c984e9feea69a9fe2\"","Larking about":"\"cb0632778fdde21202009d8e10e3d0b1\"","Leadership Training":"\"9752572558c7c66936571cc650e35481\"","Learning about the impact of behaviour on mood":"\"e851fde4306e035fbb20804ab8a86cd8\"","Learning about the problem":"\"54a9ab2c5ff9839f8cafc587f79e331c\"","Learning through practice":"\"657fa3a771432591fc66ee13c5de5b5d\"","Length of CWP Interventions: London Audit 2018":"\"ffe826b730fb3d2fd2a1fe3e3c4990d2\"","Literature emphasising the role of parents":"\"b02acff4cf781558c0409778db4952f0\"","Logical Consequences Guidelines":"\"a65c521c997d8442cb759f9a10ec92c6\"","Low Mood":"\"5cdc7d1908fe077c4666dabe0d1dabb2\"","Low Mood - Manual":"\"4f8bdc03d139a44f3b55d0931d038350\"","Low Mood - Sessions Overview":"\"9fa55bba45b51ef0a673711143802f51\"","Low Mood Manual- previous versions":"\"5b4826da2d8321e4c4703f9ed8b85aa1\"","Low Mood Manual: COVID-19 Adaptions":"\"ecaa83a0e903025b5ccef71af6c15718\"","Low Mood Practice Activities":"\"d9178feeb41cabcce805d4c0c594f57a\"","Low Mood Session Material":"\"314aaed44fb41085225607d87d58a384\"","Low Mood knowledge":"\"b6da620078ca7966c0ab7f2d5005bd07\"","Low Mood practice":"\"30bb532b4e79cf11ade55c8f200a419b\"","Low intensity interventions:evidence and NICE guidance":"\"7fd9f5bbbe2499df35cccce5bc49784d\"","Low mood: Handouts for CYP":"\"7d6550a8094a93d4f2fee515087c8773\"","Low mood: Handouts for parents":"\"212b40e220e781ade83205a9740c076a\"","MainMenu":"\"798b6b894d2784b6c9aebaa4d78bf308\"","Maintaining Boundaries":"\"0fe72df08ff56c2c73a54abc4c44ac23\"","Making commands effective":"\"4fc07daac82e2518ef81d42ab6871994\"","Making praise effective":"\"e6ecc205ebb0db62f2024357554a8c47\"","Making sense of things":"\"310fbff0573144fae3b1c64f923cdc68\"","Managing Risk":"\"3441433977c9d09025decefdf84948f0\"","Managing Risk on the Telephone":"\"426680ee43450c5baf806dab55c7060d\"","Managing role as team leader/supervisor":"\"7c0af39323457b599a86933779edddf7\"","Manual Editing Guide":"\"7269716517b61b776044b66d06c3e55c\"","Measuring CWP Outcomes in South West England":"\"0b1e532760e697d6aa4b5253b65bf1b5\"","Measuring attachment: the Strange situation":"\"372029d0115697b823d70786a24b1c19\"","Measuring recovery and reliable recovery":"\"56ed0b2970d793dbece248cc8e88ebe7\"","Measuring reliable change":"\"e7c789aaaf35aaf2c1db7a662dc8c0f5\"","Mental Health Toolkit for schools":"\"1e096a58d90c17fc7fece13cd952854f\"","Mental Health and Wellbeing":"\"d4f177141c8b4715b7a02733c899f118\"","Mental health services dataset (MHSDS)":"\"865d42b5e1a0e848a3cb02bd17da4f00\"","Mental health: in our own words":"\"52e972352804f7e19865e45bca8706f9\"","More":"\"f085a6ec4a2a4aec0d9d7e5a7d21c586\"","MoreContents":"\"09c5050bdf0b676d8680588ea561d46a\"","Motivational Interviewing":"\"f8e8709725924dffdf40856d115cf9f8\"","NSPCC 'brain builders'":"\"046074886ab4322f04a3832cc318bebc\"","Nadiya: Anxiety and Me":"\"5b46931f09c53346c2a80ccd31788023\"","National CWP Implementation Group (Basecamp)":"\"41e079df557a5a258bccacbd4bed3944\"","National CWP Outcomes Report 2019":"\"8d515e2599cd4aa0e499671047d330bd\"","National Guidance on the CWP Curriculum: key sections from the Headline Plan (December 2016)":"\"9e22ad386bbb4c5dc901ba11df46c302\"","Nine Components of Guided Self Help":"\"ee65ee76c49aeb11c4eef793d9cc8b02\"","Non-text Based Materials":"\"3d9735bc1d011bb3eb8b29b0487f1ff2\"","Notes on national analyzer":"\"abb1d7fb46e97ca9cf09412a55111129\"","Number of cases for CWPs during training":"\"48596654f839e987df78a358926cd93d\"","OIPM87BY4FN-culture.jpg":"\"eff6e5a0c7cae8dc364ffb8bf37b857e\"","ORS/CORS":"\"338dad27706d94715ceb692b702f3917\"","Outcome measures":"\"7024b5b149a53154dd22f7a1ab65e97b\"","Outcome monitoring":"\"c029ead47c0fedfe30cea628ca11f992\"","Outcomes":"\"ebb96058c62a7d4d0da1ab0e8b67e40c\"","Outcomes - technical bits":"\"b323bd7c6e1f5c886e7cc474e46b3901\"","Outcomes for Cohort 1 CWP":"\"1cfd5988807d14b2b9da58ca8e96db0d\"","Outcomes practice":"\"edfd569d0f14075186a9b4c9d36d7778\"","Outcomes research":"\"ada8c603842c9f68401ae6b857221229\"","Overcoming Adolescent Anxiety - Overview":"\"63eebb899f54ead5460b8c3cccceeb01\"","Overcoming anxiety and guided self help: Cathy Creswell":"\"ebf2c0229cab9d4ad9a4676bfbbe8475\"","POD":"\"8303232de42d344b011b47d2263613a2\"","Parent and Carer Guide to Mental Health":"\"9f2eb75ee790688844733f5f341c5ef3\"","Parent work: trying out new things":"\"65ebfc95864d595ad34a14bf742f05f9\"","Parenting Techniques and handouts":"\"a328ed8c54ff2376ecfc366c35769fb5\"","Parents":"\"b59e229fb8e6488b4a665692325119b2\"","Participation":"\"c90a77b63c3d96fa0479dbdc076ceae0\"","Partnerships":"\"55d2e3da4ed77f17d68dd18287fceb63\"","PatternLanding.svg":"\"54d5a1d3673fe10b46f05439eebc8ae5\"","PatternYoungPerson.svg":"\"3684803842059d32e8bdc1fddb3d8920\"","Peer Support Resources":"\"c9d1969f21fdfc104bc5cca8693e7d95\"","Planning Content Tagging":"\"41685800345d930ddcdcd4350576b250\"","Poster UCLpic.jpg":"\"1cba8b4d9207531517d6adb56b81277c\"","Practical tips for parents to help children with emotional symptoms":"\"6e6652bc1b3158d5a0aab968f9168556\"","Practice as process of change for CWPs and YP":"\"bc02370aaf30b34c0af82837f7c130ce\"","Preparing for Calm Time Effectively":"\"018d98225aacf7959bb154ec0aa8cbb5\"","Primary to Secondary Transitions":"\"a980507379462ca80d80dfb0df79bacb\"","Problem Solving":"\"4096f05eaef86263ba667672a975f9d0\"","Problem solving anticipated problems":"\"c456c8f8c0862c9711ae40e9b31df929\"","Progressive Muscle Relaxation":"\"656e1265ae6e8cf7fce921ba7980c253\"","Psychoeducation":"\"af2e2c83657c153bb1666c2ebc83b79e\"","Psychoeducation Core Knowledge":"\"e313103c39f34451c515b49de2a29944\"","Psychoeducation Materials for Schools":"\"214e2145d7d797aae20920ff243e48f3\"","Psychoeducation Resources":"\"37f5adef96b03a398b8e9423f69fb391\"","Psychoeducation Workshops":"\"f28180ca4b39e40badf072f9cf33eb0e\"","Psychoeducation: Videos":"\"ae9a8ff9fcfb3ac7b38e7e8092c4f9d7\"","QQQ.png":"\"c7d0a86fe98525ee37eb97475f6af63b\"","RCADS":"\"942a355c35d2cbb7ba73e6278fba044c\"","Reaching their Goals":"\"2075a0bd677449e62077832aaa41a85d\"","Reading Well: Books on Prescription List":"\"cdbbade843dd3b7b005b419ca2d58ad0\"","Recognising diversity":"\"f2135533da63c319a42ef11798b6d7ec\"","Red Riding Hood: Flight or Fight":"\"42d3e923993bcf0f3c9f08650746f65e\"","Relaxation techniques":"\"2b78da516374e8c23958cfeae7813035\"","Relaxing lion.jpg":"\"aa8ed4ba4d164dc4c1c4bcc884877b3b\"","Relevant Government Policy to CWP":"\"3c8c26e136504065b8deb58642d1cf68\"","Resources for partnerships":"\"44b94ae53feb255baf84f80c9f8466f8\"","Resources for specific partnerships":"\"4c63b0e6ccf6333b846f9c2015484d7e\"","Review":"\"d4493d83239e17deaf0ed9e903b485a2\"","Reviewing goals":"\"8dd65967ea8d56eb5ecab630963df4df\"","Reviewing life activities and interests":"\"2bce2e24b1995a6d61561d8d457071e0\"","Risk and Safety Assessment":"\"3c3ae999d7d5d925ff618a762dc141d3\"","Risk assessment and management":"\"3327c4c3445ab068ca2ddc9e4edadf8c\"","Role Plays":"\"922fe55a663ed7a6b0f5577a1d778766\"","Routines Around the Home.png":"\"504477d06c5ad91f11f22e606d5a61fa\"","SDQ":"\"8f1c2e80edc487deecd9f330e18b99f9\"","SMART Goals":"\"0468b4fa7e0b936f9da6ce62be990252\"","Safeguarding":"\"a7e043fdd5219875256457d3d7a143da\"","Safeguarding guidance: London Child Protection Procedures":"\"01b3e3ab8baba6ec0c480329878587fb\"","Safeguarding/ Risk Assessment for Remote Working":"\"c76b4be9176c313eb925f261bc19e955\"","Safeguarding: Being a safe practitioner":"\"b2f04223874e4033998940bf255bf033\"","Selective Ignoring Guidelines":"\"cfb9022bdba5c240bdc2242cbf50bb47\"","Self Help Materials":"\"865a49408c4c0bff8b424a7167d4be40\"","Self Help Materials for Adolescent Anxiety":"\"3561dda3b160d55fb31b126697a1fca1\"","Self Help Materials for Low Mood":"\"3d4cce59c2359d5b21b488cf0e29c144\"","Self Help Materials: Apps":"\"586b49f570c088f9a0183a7c769f4320\"","Self Help Materials: Books":"\"984731332b7864d4340fbede2b7f7c74\"","Self Help Materials: Videos":"\"23e1f4a30541b74e64445da395f7e68c\"","Self Help Materials: Websites":"\"4e463161344ecea28c1e2f2bacb9f138\"","Self Help materials: Online Counselling/Therapy":"\"8362820f9c6fc5a5f96333ff9bf91b2a\"","Self help materials":"\"b73880082aad2668f9627cd2961486c1\"","Separation anxiety in a toddler":"\"1372bec682054c26a98bcce3bd6c563c\"","Service Development":"\"aa88ac39699f31096b1082c9205bdbbd\"","Service Development Resources":"\"9febd016caa1d168e093b9ecce8005dc\"","Session 0 for Adolescents: General Assessment":"\"8292fb78661018c4c23bad2a8d95f1bf\"","Session 0 for Younger Children: General Assessment":"\"33e67efa82cea5aa7321c10a1350d139\"","Session 1 - Overcoming Child Anxiety":"\"d6a1ec2b83ebb2820170884308dca49a\"","Session 1: Guided Self Help for Behaviour Problems":"\"a1d764da4215d0aeb707f80c85217371\"","Session 1: Overcoming Adolescent Anxiety":"\"a9e21fa55dcc4d09b9f516640f143cce\"","Session 1: Overcoming Low Mood":"\"9f88917a1c0af16973f60bb3162af338\"","Session 1: Overcoming low mood":"\"eeb13cf408e158bb7a1e346a67198985\"","Session 2 - Overcoming Child Anxiety":"\"3348d585d13fb9128b55576a4d14ad2f\"","Session 2: Guided Self Help for Behaviour Problems":"\"2dee66ece377626a065dd1b6962fd8a7\"","Session 2: Overcoming Adolescent Anxiety":"\"9b38b28bfa4540f06d603b27b249cd1b\"","Session 2: Overcoming Low Mood":"\"fc36d7ff48837cba0dfe926f74dd76eb\"","Session 3 - Overcoming Child Anxiety":"\"0c874c689169c30e5b78ec06b4974fb0\"","Session 3: Guided Self Help for Behaviour Problems":"\"81b2f5c3bfaf8176f2981f32f78a6c42\"","Session 3: Overcoming Adolescent Anxiety":"\"c5309f47f07451776cdc033efbaaad4a\"","Session 3: Overcoming Low Mood":"\"70c66fc875e87b0a7e7b4b899623d40d\"","Session 4,5,6 - Overcoming Child Anxiety":"\"c12f58dd8b6abb03bd4ace45af3999c6\"","Session 4-6: Overcoming Adolescent Anxiety":"\"dd4e1c7f4fb7fe6df0b694fde975dbf7\"","Session 4: Guided Self Help for Behaviour Problems":"\"04a016891a9fb1470191e8197d59ab21\"","Session 4: Overcoming Low Mood":"\"688985979451b7326b1a6d731b22690a\"","Session 5: Guided Self Help for Behaviour Problems":"\"0e638c30d26d2baa9f0f30fee56d0f1c\"","Session 6: Guided Self Help for Behaviour Problems":"\"2fdcc70aad9854e6f913a5219d278959\"","Session 7 - Overcoming Child Anxiety":"\"96408743266683b20183057c4bb12aeb\"","Session 7: Guided Self Help for Behaviour Problems":"\"28b5f984ded20255d9090d81c99d250d\"","Session 7: Overcoming Adolescent Anxiety":"\"646f2ac48b929b24087c4f26b2fb183f\"","Session 8 - Overcoming Child Anxiety":"\"05d3684c961f01a381ffe3c8b9b765c3\"","Session 8:  Overcoming Low Mood":"\"ab117c3868c9a5ffc46572a02b0a4572\"","Session 8: Overcoming Adolescent Anxiety":"\"2bac0ca3e26c846fda9346cbd5d4c089\"","Session Feedback Questionnaire":"\"a544dad1771de0cd91b0d52f3a69874c\"","Session Feedback Questionnaire (SFQ)":"\"f9081d8df08d08e60ed2d1751d2ba556\"","Session Overview for Behaviour Problems":"\"28d3a1f3e2e87b269a0ef1a16ac56d1e\"","Session Overview for Child Anxiety":"\"cbdf85a5c704354443822398d440839e\"","Session Overview for Overcoming Adolescent Anxiety":"\"c8c47a54bacc8f264d88e8214e4eebfe\"","Session Plans for Behaviour Problems":"\"fcac3c71f26e7172328b7ce19b7e21aa\"","Session Plans for Overcoming Adolescent Anxiety":"\"11a1cadfb1e78618430a857cee2d463d\"","Session Plans for Overcoming Low Mood":"\"eebb6d58bdd89bc5b90dbb745f06eb5d\"","Session Rating Scale":"\"54ba41633a49ecb95a7c5b119acf3f30\"","Session plans for overcoming low mood (Tower Hamlets material)":"\"910707c4bac416e9e091154d8b860043\"","Sessions 5-7: Overcoming Low Mood":"\"13a25ef23481beb232baa61cf51c512f\"","Setting Goals":"\"7a0656039a67ccbf3e3e2e5107b03f27\"","Setting Up a Practice":"\"b7c8f8690fbd87fccf5cb0933c00fa33\"","Setting up  new CWP service":"\"1ac9cc80d8fa59ddedc1abb3256c0c76\"","Setting up Remote Working with Clients":"\"a58f5353eb0cf875fb584ec1afe3cfe7\"","Setting up and Protecting the Space for Remote Working":"\"279c4cbc5dcf1262fa6238eeb3d60a71\"","Shared Decision Making":"\"3781092e5c691145a13fe8b29ea5b53d\"","Short course: Supporting low mood during the pandemic":"\"a4c40cd5c0b063a42e713fa9e58db821\"","Should CWPs be given time within the service for study/self-directed learning?":"\"42a731782cb7551873fda3f7df3d4f87\"","Site Information:Equipment":"\"db665ff3672dab17c401b019c5f1906b\"","Site Information:Key Contacts":"\"12fb325320ef97bd9af71d68b39365a6\"","Site Information:Outcomes Data collection":"\"aed707c0dd33e4746f050e777f9bbd74\"","Site information: Course related information":"\"8f75208e2f9d94936ec05cf7aaeebe7e\"","Site information: Supervision":"\"a2ddb810e36ea4f8d31f50222176f460\"","Site visits and support":"\"80f78e84344cfaecedc16c432a2d009e\"","SiteIcon":"\"2d3eb99c6e6a3b5aa9ac501abd716c20\"","Skills Workshop Days":"\"e241e02b2947b303d5283e418b38e78d\"","Sleep disturbance":"\"78655fdf99947fa8e4dd0caf7cf0c202\"","Social GGRRAAACCEEESSS.png":"\"d30dda51bdcd1c941b3eae88d18c211d\"","Social Graces Model V1.png":"\"2a41fc337aa47eb33d3076631f4f9559\"","Socratic technique":"\"6e1898a72a2e0aa75343473d3dc48a43\"","Spence Child Anxiety Scale":"\"de9491406612a9e18a319a1c74b8f9af\"","Spoon/Fork Theory to Explain Mental Health":"\"bf3cd400821187dbe7221ba68261767c\"","Staff Burnout":"\"4c87ee105c80dadcc627ecb90dfe8f28\"","Steering Groups":"\"29b5e59b4a4943a018d06e55b8e3bbfe\"","Steps model":"\"cca9585d0b4ee7f04a6cd1d1132077e4\"","Strengths and Limitations of Social Graces Model V1.png":"\"d48c0ca9a4931f2e63d3e956f285684e\"","Strengths and Limitations of Social Graces Model V5.jpg":"\"2295ef42e9f61e2a2dbafe45092a7f3e\"","Strengths and Limitations of Social Graces Model V6.png":"\"192813cbdec071e7b09e82be6e0c5bcf\"","Strengths and Limitations of Social Graces Model.png":"\"0e255a609d22b517624a9f35e2c4e3b5\"","Stress":"\"5a5d7db36c604967d2e825fa95c253be\"","Study Skills":"\"66b0787018d4648b9db10cbfa7a2365d\"","Summarising":"\"6d0e99369115b057234b189add514800\"","Supervising":"\"4607bd3aa0da4663cd14210c314fdf03\"","Supervising CWPs":"\"67a5cd0458150f1178ae14bb2ddb468a\"","SupervisingContents":"\"91657153396b2963254d2c21a4c167f2\"","Supervision and risk":"\"320203a3fa7425f592306060e1f979e6\"","Supervisor role in skills workshop":"\"56f3b0c2ecc12d76a8fc414bcb97b169\"","Supervisors Core Information":"\"838eb102febcaae2ca6267a75ba993de\"","Supervisors Q&A":"\"ce0010b08c0bb789c4a8bb5d3cec0493\"","Supervisors Resources":"\"e90c2227df33c7a5269a20d2a2005099\"","Supervisors Training":"\"7199be26c3184ba19bfdb71c9eaa07a6\"","Supporting children and young people with worries about COVID-19":"\"6e1692ac7b7566d196d8a64eb0d70bc5\"","Survey of the Mental Health of Children and Young People in England, 2017":"\"25820cd1989d28d0d88fa8d9ff01563d\"","TAMHS study findings":"\"19cb30dc832aa9aff2524b90948ef3fb\"","THRIVE Framework for system change":"\"c617e7b07cdc7ce9b6baa7bd20d16813\"","THRIVE framework.PNG":"\"ce6ff698123345bb114cf1155480e238\"","TableOfContents":"\"3ec59e62ab73626f1d117cc310680e3d\"","Talking about ethnicity dos and donts.png":"\"649f11b1dba5c6d154a2b17d3ac0e577\"","Talking about ethnicity... dos and donts.png":"\"0341bb868d51d2c0a1ca434b6df72584\"","Teaching":"\"432aec30b9d4078b13e38b88f3ba5c32\"","Teaching check-in":"\"345883baa0b9a50e18ae305b84a6bed1\"","Template CWP Job Plan":"\"f29a4e48e572d1c70fd44cdf6fecced8\"","The  Practitioner Role in guided self help":"\"14f2d60d976cf8be9dd67711aa702950\"","The 'Adolescent Brain'":"\"b21fa361cd9d1bb7e25b83b0cbddef43\"","The CAMHS System":"\"25a11d31299557e46d911d62348d5e80\"","The CWP BAME INCLUSION GROUP LOGO x 4.png":"\"d1175d9bd378a89b0e28080465e6e3dc\"","The CWP online guide":"\"729e4a3c31d2c03044768fe4fd34e04f\"","The CYP IAPT Programme":"\"283c228987d8c958e6004b379d2314cd\"","The Children's Wellbeing Practitioner BAME Inclusion Group":"\"48a3c7c9292fc56ed3d6cd71e9416202\"","The Cultural Iceberg.png":"\"d1e666a4bd5fdf80273116b00d2ee3e7\"","The Cycle of Change":"\"803cae830f95ef64fde1b0956d61efa2\"","The Dinosaur Programme":"\"cbb3cad7dff1fa09f6dfb73962d78dbe\"","The Hot Cross Bun Technique":"\"4f05d42c1229acce345d0d3b6bc32392\"","The Importance of Feedback":"\"ec107f16c2cb83988e1a94fb62371fb0\"","The Incredible Years programme":"\"3b08fd301b5eb9cd6b81c5173d77f0a6\"","The Polish Community - Bars, Barriers and Solutions to Engagement":"\"9da46c2171896377eb38c9f66e3ad075\"","The Principles of Guided Self Help":"\"7bd7d80ae6d97db1b9a63b0aba332a5c\"","The Role of CWPs":"\"6e48079a69d3734fa9a56402d8f2e99e\"","The SEND Framework":"\"f186cfd5ab28acdff4b308bfe55ddcc9\"","The Slot Machine Analogy":"\"52a08aec33c264648d92677e5bc831a2\"","The Social Graces Model":"\"66bca9f8df6b17fa1b7ed7be251e54cf\"","The anxiety equation":"\"4ae5a8453291a341dea2eec876ea3ace\"","The basic pattern of sessions for guided self help":"\"0a2433954bc1cc35ed277a10514c7076\"","The basic stance for guided self help":"\"42d0f9625156cdbc3ae707a4544de2f3\"","The choice process":"\"20a7186ecbe01b7e9736530a984be75d\"","The clinician/parent dynamic":"\"49b6df5cea855e051d4fefb11db1229d\"","The evidence base for parent training":"\"af59b1b39255e90d5fa157fe9bead26d\"","The helping process":"\"469c541b6e57d59b78efddbd5e6aebb7\"","The impact of Racism on Mental Health.png":"\"8d751239f6f32d83804fdfff0d1b6704\"","The impact of literacy on wellbeing":"\"474abb647092800faf90ac327138b6ea\"","The purpose of guided self help":"\"e65a88ebc32b7b815642b42194c4bde8\"","The tagging system":"\"57c40625e7dcac09783df0d45163d32d\"","Theory of Behavioural Change":"\"9e740d439b33454573d83556ca8ca958\"","Therapeutic Alliance":"\"adbe0049c38fa43c6d94ff8f1ad53230\"","Thrive Model.png":"\"cf4aa011b76a07dfba35383b0b0ef394\"","Tips for Completing Activity Log":"\"2e504dcacf37b41d8c8873785d6ed3fa\"","Tips for noticing low mood in young people":"\"bac5a42e1ec3e471d8da72192f728e5e\"","Tips for teaching staff for CWP programme":"\"df9551c3bf0ce3ac5c64a9588b80804d\"","Tower Hamlets Low Mood: Session 0":"\"519c237516a8eccfb971155bf33a6724\"","Tower Hamlets Low Mood: Session 1":"\"1e0929aab9f68f1c73357f0a64a45458\"","Tower Hamlets Low Mood: Session 2":"\"7771e03b6baf8b8f1852ca996b813a7d\"","Tower Hamlets Low Mood: Session 3":"\"166d95d397b63df4e994f39ec4cad9da\"","Tower Hamlets Low Mood: Session 4":"\"3ce6152e0d8b3737e8a73580ce9465e7\"","Tower Hamlets Low Mood: Session 5-7":"\"a4d68d26b502964ec7d7a497911e0d91\"","Tower Hamlets Low Mood: Session 8":"\"7988e163847b030f3e84030dea35ccf3\"","Training":"\"f23d26f1355f73560654f1192adf14b4\"","Training ideas for CWPs/ EMHPs":"\"ea313ec54c6bd6b3fae7edaaf564b097\"","Translation of Original Materials":"\"8fc398bba8868189bc661f2e220f3cd9\"","Transtheoretical model of behaviour change.PNG":"\"3937850981d1f00464b3c9eafddb3da8\"","Tripartite model (Therapeutic alliance).PNG":"\"e3cbe09f7bdfb85ce35582acc1df8685\"","Trying out new things":"\"e2e0407c22052bd2de1e77cc8dcbab05\"","Types of Help for Online Working":"\"504b510cb50bf6c3babd5ed1881416bf\"","Types of behavioural activation":"\"99ac8ca681a68459f086a4865cbaad17\"","Types of problems referred to CWP services: London Audit 2018":"\"e5da41d135f0e95f1c980fcce6494477\"","Types of support in your back up team":"\"52b0901ff9098496a44371b0489c9ac3\"","UCL Teaching Days (Fridays)":"\"dac1e7f1a88cb6b2f6996270d3ff256e\"","Understanding trauma: key concepts":"\"286d3be2fc26a3802cd3ecdd891ab75e\"","Useful training sites for CWP practitioners":"\"4eb359e81082dd2fb1401dd4ea020908\"","User Guide":"\"0ab87031ca4c3f0c54319bf672fd5165\"","Using Feedback and Outcome Tools":"\"0639446900f734e5d52d771265ae6df5\"","Using GSH Resources Remotely":"\"4c6b44fc42cd7a52ae619e631044ff3a\"","Using Outcome Measures and Getting Client Feedback":"\"b2c5cf455d84e539c9f7c8c355b74ddf\"","Using POD to produce site reports":"\"e62f27376b49e89f6195bbb495044348\"","Using Zoom":"\"3d494c23c990e0474482d462cd5ea6cc\"","Using supervision when its not working":"\"9d8d5a4fb8fc15b69272001a2050c79c\"","Using the Search Bar":"\"9bd32797ab2bfd3a81402d359b2b7f46\"","Validating":"\"25e239a176ed1f08715efb00ec0c5f78\"","Vending Machine Metaphor":"\"5575516c0abcbb83dd1218538ccddea2\"","Video":"\"11b77f4c04a3546a9a968c647bc6599d\"","Video Equipment Guidance":"\"d05401f89d2aa879273bb38e6a303ea5\"","Video: The Turtle Technique":"\"bd2c9b8fd33f8dac56ddec4ab815d75d\"","Video: Using ABC":"\"c79f7ee84e4a9e15920a43247f3c7527\"","Video: Using the Attention Table":"\"15102bef72ab38f51d0ce3f7a2e0932e\"","Videoing Sessions":"\"eb8bd3deea78856cb4a0c113f6d11a8c\"","Videos: Autistic Spectrum Disorder (ASD)":"\"63657b5d145add60b4c8d9306fa8748b\"","Visualisation":"\"b0dc837ca4a0d07826b7e17605376b4e\"","Ways of describing common mental health problems":"\"ca5dcbe04d23e72dca6051715be165d7\"","Welcome Tower Hamlets":"\"f307a67ad7ea01c0e812d0ecb5bd82ee\"","What advice would you have given yourself at the start of the course?":"\"7599d01e451068fb47def22cea97e927\"","What are 'mild/moderate' mental health problems?":"\"56009f756a21f898d9b54afb96cba229\"","What components should an effective parenting intervention include":"\"911e4e75df7a4277731b5baa4947f8d1\"","What does a Web Page Link Look Like":"\"fc28008722dce1c38c8c816c5d337bd5\"","What is 'Tier 3' CAMHS?":"\"179bffd07cea814b3db4fa82ceb50b19\"","What is ADHD?":"\"e751df0880dbe591f98eb44184fc7cc7\"","What is Anxiety?":"\"2e4adcd6867a717a8039abc300a36b08\"","What is BAME?":"\"a2acbca8028a6174c03b034df761a54a\"","What is Cultural Identity?":"\"b16a9178ebc2b88e30c04934147ee209\"","What is Culture?":"\"a5e2492485f35278cb3a28ada8fe458b\"","What is Low mood?":"\"66a34bad43b4edbbc013784c949314d9\"","What is Psychoeducation?":"\"8844997c0c9f4edd2e240ba8d3406b93\"","What is Racism?":"\"e69b40e6daeac13a1e9e62b7d68ff19e\"","What is Third Culture?":"\"447369fd94002370a9fe777dafbf1ac7\"","What is a 'low intensity' intervention?":"\"e3cb5ec306d7911679cfccacf7116fbc\"","What is a Behaviour Problem?":"\"4b6adbb087b2e210990f795879f83b26\"","What is a CWP":"\"b73154add00e01f0e1fe0f80d303cdd3\"","What is a Session 0":"\"fa66e9d127a4e9ff8457740c002e9ade\"","What is an Action Learning Set?":"\"7ca7e3dfc910d549de236f777edefc64\"","What is fight or flight?":"\"00dd5f5ed05e6bbcabe37a3af7ce74b9\"","What is helpful for the client?":"\"47385b2a6e8741089ddb92657b766942\"","What is meant by a 'low intensity' intervention?":"\"ba7f03ad525be76e57ce3e50cc2c6324\"","What is panic?":"\"b15604904457a2dd6575b66d14ab3373\"","What is self harm?":"\"880465bf3be129f4841e2fb07f13d908\"","What is the difference between guided self help and some traditional forms of therapy?":"\"ca1368285cc1688cecd4558828c9f6a4\"","What is worry?":"\"c67396a3db8ff68ac2f4a3a0a7253468\"","What should CWPs be doing? Scope of the role":"\"f9449f308a08cb8acab5322dbcfc27c5\"","What supervisors can do to help CWPs be open and honest in supervision:":"\"f9201c7f3e1bad1f5c3d2a7876378f03\"","What supervisors learnt in Cohort 1?":"\"a8b3dfeb19c959c579790e3850e00b9c\"","What training will we attend on the course?":"\"068a2c3c63d26a860fc88c26f32ac184\"","When young people feel suicidal":"\"946aeb3d431d7680548ddaaec7afb032\"","Who is brief guided self-help parenting intervention for?":"\"fb6e9361ee70a8638afd7aa046a0a480\"","Why a parenting intervention?":"\"8a77f4efa0b043be4d62c378ed79de04\"","Why do therapists have different outcomes?":"\"8091539d4f206a9a60774d4dc7d95cd4\"","Why is this role called Supervisor/Service Develop Lead?":"\"f8d74e25628c229034089a9428044293\"","Wiki User Competencies":"\"e9c5bc00b361cd8b6559c5fc804996fd\"","Wiki User Quiz!":"\"c339f2dd6aeb45d60b3f2504afc95240\"","Will CWPs be expected to assess young people before working with them?":"\"4756539c0fb1f89698583e743506b175\"","Will I always have anxiety":"\"c72dcb50ead382fe8b9eb8215b657882\"","Will supervisors be expected to develop material and teach as part of the Friday co-teaching sessions?":"\"bbe27ab2244a8fea7dae527f9b365106\"","Will the supervisors receive a postgraduate certificate upon completing the course?":"\"b25e2f8351f2eb4a46e6f275a72d33b7\"","Working with Adolescents with Anxiety":"\"7794844606701b9cf06297301681e6d0\"","Working with GBO online":"\"b15b910f66956555045ce7723508c7fd\"","Working with Parents":"\"547baebc75d6ee8cdf7dbb02648036aa\"","Working with parents with child anxiety":"\"e4db1d8a9929e5e9f3d88713664f593d\"","Working with parents with child/young person anxiety":"\"331a2881ca8110fb2847389603528657\"","Working with routine outcome measures (ROMS)":"\"4fdc9d6dcdb29874a86c8d4275960808\"","Workshop with flipchart, pens and paper - Pixabay.jpg":"\"359c055322749c32970ceb7b3458d1e7\"","Young Adults Discuss Mental Health":"\"b540b529462989ae12433465ff217e25\"","Young Champions":"\"c1ce31ed253266d242e5bf2f971449bc\"","Young Champions at AFNCCF":"\"edd2c1791b4c978be37e24121777472e\"","Young People Talk About Anxiety":"\"caad7622d0c761df9c3c2da43ce461e3\"","Young People Talk About Depression":"\"ce303f97c6e9682cbbd3e6e75531bd02\"","Young People Talk About Self Harm":"\"2cf97703cde72b199909e76ed9483886\"","Young People Talk About Their Experience of Anxiety":"\"5fbfa698c59d14b163e383e3b3382a8b\"","YoungMinds":"\"76a7b7bc559efdddb2d8fb2384ef1302\"","_GoogleDocsIcons_docs":"\"9d4fed4e0e53ef07414e690889b5f0df\"","_GoogleDocsIcons_sheets":"\"644ac0405d219c505fcce761df1a4d87\"","_GoogleDocsIcons_slides":"\"88ad487247d895b8d80e7212b448945f\"","af-logo-green-new.png":"\"062f0d3c71254b6b34f2ee37db426ed0\"","audit RCADS graph.JPG":"\"a17b8b30288d06bc7ee74e2fed91ff39\"","baby and parent hands.jpg":"\"69c44760eb1e298182ad52486952e7a9\"","blue pattern.jpg":"\"c76115df4002ea896133cb58e3411234\"","blur-close-up-indoors-1266003.jpg":"\"be101f5089414c89a19da887ed16f5c7\"","books with open book and pen.jpg":"\"957b0c28e358df4832acaaf075d5e2e5\"","books-2158737_1920.jpg":"\"c7f1755c03b493e45fcef194885e0f5c\"","books-icon.jpg":"\"22f89e2da747d191c3f83db6103ba718\"","books.jpg":"\"2eb5fd1440b132562cc44ff47a9e5469\"","bookshelf.jpg":"\"2e4175885a0a0ea98f3fd64473f0161d\"","boys running.jpg":"\"1157ff5bc4fdcedc21a1882a89110458\"","brain.jpg":"\"ed33317fb58ec61e33ab8b720cc55e17\"","brain.png":"\"112d691ef069f8925b68d6427626f7a4\"","bubbles1.jpg":"\"04a2544036fc2fefdecef61e7c5bed73\"","cave.jpg":"\"3b69ae1f258885325a33e6b0f64494c9\"","children-in-circle - BME -.jpg":"\"9ded2e5d855c4bebd8f2312a62cf8339\"","children-in-circle - BME.jpg":"\"c2bd1eac3e03b4180d949baa47ed394b\"","classroom picture.PNG":"\"6af06301648173048c4df45e2a559327\"","close_up_pen_writing.jpg":"\"cc8f34038a9cf799d60a5b6f2e103755\"","collab icon.jpg":"\"14096753638e7644b5260427164c7c55\"","countryside for icon (4).jpg":"\"b367fc32f5045f6114cffe25bacd495e\"","countryside-2371480_960_720.jpg":"\"8d339c8c431d5b685ee1d3ea579e676f\"","creswell book.JPG":"\"7124d4411b54feacc6e2dd811a8ccc3e\"","documents icon (1).jpg":"\"9dd0b72c06bf1b298c0361701aee0c74\"","draft by Shayo":"\"a40efa1cac122ccf80bca90686263d93\"","fonds-ecran-groupe-enfants-qui-s-amuse-10-1024x685.jpg":"\"1c19f4b06a8657f04c6cb0dd782edfed\"","giraffe.jpg":"\"fe386d118d4c595d2470e3936727aba4\"","group-diverse-kids-standing-together_53876-22754.jpg":"\"993cff1ff556dbf57e4a12017ced72d5\"","head in head small.JPG":"\"e9b1789ce3032f5d08b80bf4535e09d5\"","head in head.JPG":"\"8bb8ea43de118cd9584890228b1775e1\"","image.png":"\"c3cf2c6cb63ee8d1a17ef129e5b7a174\"","inhale-exhale.jpg":"\"54b3518e5d95b4a387c2e34d7a3c7aaf\"","joshua-ness-225844-unsplash.jpg":"\"7d9651e6d90f1de66591e2ff58154896\"","jumbled words.jpg":"\"1b6a4043fbd866dc6e8965c1b8b8d181\"","laptop .jpg":"\"7f3a3105ad9d4eff5879af3cde6a50b2\"","laptop typing.jpg":"\"0ae0dfba943fe6b629bcbd18b73d6f19\"","leaves.jpg":"\"748aced77d4b4d37334122b14c6708ac\"","lightbulb icon1.jpg":"\"f9d8ed850bf583291306f0819563c95c\"","lightbulb.jpg":"\"c905a2e5c0bcafd203a61b2de74ababe\"","maintain.png":"\"414fbc708546eaf31e589e8c6ecfcadc\"","man writing.jpg":"\"ddd1aa183603aa539520b60bf7b3cdab\"","manc":"\"03996fe461a8cf614d3eadd0a5cb0f85\"","mountain river wallpaper (11).jpg":"\"15f534c84ce42c89c54a253f414153c9\"","pad of paper icon1.jpg":"\"b2c9e18a27e327ce7816e0251dfdb40b\"","pad of paper.jpg":"\"70f98993eb2ceeb4195118e0c4de0de5\"","pink and orange.jpg":"\"40bbd1b7a9e239987c69dd6522dd5e4b\"","purple pattern.jpg":"\"7991869d1e8567a3060a24ee765c001f\"","question mark.jpg":"\"6b8c2e175cad18ddd026189f1f7fc12e\"","redd-book.jpg":"\"a3155077f4ce838cdca4a82352f992d8\"","relaxing frog.jpg":"\"7a0c91d044ef615e151322b62fb23e43\"","ripped jeans and laptop.jpg":"\"8c26a29505885dfd06f022c8111353f1\"","sleep.gif":"\"1d2687354bab199ace5a3bda8e9fe4b2\"","sunshine-2596172_960_720.jpg":"\"96c8a65c1e9da751ec0ae9f891ddaa13\"","sunshine.jpg":"\"b4b327cd5df66408292e9f8420790459\"","typewriter icon1.jpg":"\"2e1b5062bd3b3fe6a2393dc8b795c7e9\"","typewriter.jpg":"\"0632a9cfd6ca5b2f067d228247be3135\"","winnie2.gif":"\"869369ac8348d1c0ba08cfa113ef185c\""}
https://8y1wh49hn1.execute-api.eu-west-2.amazonaws.com/prod/
4s50tg1b4toisc43c4q42gsceq
eu-west-2:2756d3cb-8b8b-47a9-8248-595a9d254d91
cwp_public
eu-west-2
eu-west-2_3lsaUbCyk
[[Home]]
UA-9237856-2
G-J19L1608BP
{
    "tiddlers": {
        "image.png": {
            "title": "image.png",
            "text": "iVBORw0KGgoAAAANSUhEUgAAA3QAAAEOCAYAAADBtlU1AAAgAElEQVR4nOydeVyU1frAvwMMwyK4Di6AmqioiIYmapSKFYbXuqJl3rTUq95S07j35tpdtHKtX2lW3gLbLfVm2KqgiVJoueGGCoqgiAiICyAwM8D5/fHOwCzvwIC43d7v58OnfOe85z3nOc9ZnrM8RyWEECgoKCgoKCgoKCgoKCjcdTjd7gQoKCgoKCgoKCgoKCgoNAzFoFNQUFBQUFBQUFBQULhLUQw6BQUFBQUFBQUFBQWFuxTFoFNQUFBQUFBQUFBQULhLUQw6BQUFBQUFBQUFBQWFu5Q71qDL+mgoKpUbc5IaNVY+GqpC5TaHRo3WFPtNSbNDX7bKVxJz3FSohn5E1q1OSr24ieWRNAc3lYqhH90GCWR9xFCVCjcbRbhMSuwkenqrUKlUePd8nb2GW588S26irlxOIXZST7xVKlQqb3q+vpfbnl2FOxRJD92e2kTe7U6Kgg1S39aeJQcdCn1T+9nG427tNxUUFBRsuWMNuspKPaDDUFnzLG/TU7ip3Oi35nhDY0WK1kBlnWEbELtMmm8N1vmqxKADmnrgLhe8/AKH45Ywqr+fcbCtQuXmQ+duw5i4Ko7U/IYPu+tXRjexPCoN6AB9Zd0xG/L3s27WMPxMhpbfMGat20+DxVBZiZQty28b9rzJsKkfc7rzbNbFx/Hm4x6Ul9UeVZ2TBDdsuBp1RV/ZyGVgYM+bw5j68Wk6z15HfNybPO5RTh3ZbVzKM9kZO4thnX1wU5nKtj+jFsSyM7P8Vqbkf4aDS9pL7YXZn5tPZ4bNWsf+G2g3THqoy7lCSaOlth7kbeIpNxVu/dbQ0N7l5nOQJe1VVvL3xq//KJZszeRmarTUt2VTcM2h0De1n2086tlvKigoKNzBuNzuBNSHsjKHepPfIe3p0Bu45EtLAJxRa4COPrS2CmlI38DE4RP4IkOHRhvC8Onj6eoFFKeT+M12PolO4JNvPiRzxyQ6NiAld10Z5WxifPcn2FjsRVDUdMZ3hfTvP2P1+H5sPnuAcwv6NNqnUhI+oIBQ1qxfwdNdgYi636lzkqAehuutJYWEDwogdA3rVzyNg9ltNAzZ3/Ni+BOsydCh0Q5m7NwBtKGY9MRv2L50KnFJcPqXKQTcwjT9L3CtIBvQEv6XPxPaHKCY9O8/I271eBI2H2bXsRUM8r7NiWwIZWXc+S3XNSTxh/OXP4fSHOBiCp9/HcfLkXH8J3oHh94Kp8VtTuXdg+P9poKCgsKdzl1l0HUcv5Xy8bc7FXcialxcgVbN8ATAl673yQTL2cCYXmPZrPNn8te7eCfqHtzMf3/XQPGpZDYcb4FvA1Nyt5XRkS9fZmOxhme+y+LTEcah0LKVZG97mT9ua9wh3vWrBcCTBNzTqNHeoVxHym4Atzy7hnTW/ukx1mRoCF+Tyo/P9zDT83cx5KfyfWIhTW51uv5n6MrTc5YxxWQNL3uVbTO6EfHe67y15e8MeuouHA53HM/Wu6Xh6vo0c5bVTEYsezORv947lJUrX+TzqUeY1eO2pu4uwsF+U0FBQeEu4OZtuSzPZOfb4+g8NJaMxgyr0ECK2PLvCWzWaQiP2c4aa2MOADVeXYYw5Y+9UN+GFN4OCnPSgPsY1N18XluN/yMrOLgi/CZ80RWX34twAVxdbrku5Xw9l+hk0E7/jq8sjDkJtU8QUU8NUmbhG40WPPLEOAC2HEi7zWn5HdIinGkLQoGjbNyt9KAKCgoKv0ca36Arz2Trksfo3KwT4S9+QQbOODdGWJA/L5Q0BzeVD4v2lpO5dQHD/LyN5zr6MCk2hct1JvgyKW8/irdKRefXDzuWR0M++2Mn0cfHrfrM1YKtmehqzeeo6vAqlTd+w2axbn++jJMIA9nbljCqj+ncjzFsSu05cVZrwNUkP2ecXSHQt2VNgLwtfLBWB8EreGdK13oMsjOIfcDOQXG75WF7psuQv5/YSX3wcTPlaQFbM+1KDEP2NpaMMoWXynPUkm1k2whMrtz3k1/hWO48m2mBZD7elu6Aw47LpKybVf0tR8smb0MUKpWKoSsBVjLUeP7lgdibOfiy1iM3fPqMYsm2bAfymchfjWVoWQ5SuW2zLQQz8tgQpUKlGoqU3aFGWT2AeXatzy2q3HzoM2oJW63PthkdzERtyCF9g9GhjJsPk76x5zojj1/Wb0ZHIHOee8Th7WflmVst9E3l7Sd/LswsPfn7Y5nU07a9kWRmdAbj5sOQBbZ6mzTHDZXPIvaWZ7J1wRAZ+Uq6NsTUxvScRKysnhnI37+OWcNqzsNKdWUrtqIcikoVxYYcmfbLIb2om44+zWzSV189rLSSX59Jsdhk3ZBPqtU5YG+//pZt/qVNPKVSoXpAbqIwhw1RbqhUfyURqM0hhsO6kfhXO+dd5Z2EVOvA5T0sGSLJx7vnShzyO2LFPQG2S0t1x++47tRgqZduPkOYtc6Rftb4dorl96TzytbvG+UVtYGc/P01jpXMdcGQzbYlo4wOptzwGSLTLln10ypvP/qPepe9RTVB6uw3FRQUFO4WRCOhL0oXWxaPEAEaBCA0ASPE4q8PiZyyhoU9HRMmABG9w+zFHdECEGExp22e+QcECA1eIihqupg7PUoEeSFAI0auP28WwWkRE4aAaCFFqxdpMeFCA8J/8nfinN6RnBaKHdH+Urq1g8WEuXPF9Kgg4YVG+PtrbdNcuENE+0tp0Q6eIObOnSvmThgstBoEeIlhn5nlxSw9eAWJqOlzxdzpUSJEqxFoZotdjiTPDvqE6QIQga8fruebRpmFxYjT1j/VUh4Wz2xkMF1EBXkJNP7CX2teHsa0psWIcI1RL9bFi/j4OBEzc4DwAqEZuV7UlKiMvIyy9ff3t02HbPY+FOEaKW0BT8eIPXIKK2XCWO5eYsDMGBEXHy/i1y0WIwI0AvzFwt/MlOd0jAgDgUkRzqeI+Ph4sfwPCPiDWB4fL+Lj48Uv6ddqT5uwUw/MkZN3tVw0ImDEYrEuPl7Ex8WImQO8ZOrEDhGNdflKzwJHjhEhGoRXUJSYPneumDBYK8naP1rsKLSf5vMp8SI+frn4Awj+sFzEx8eL+PhfhCm7pvLFVF+r6xACTYCYv8tMLkZZav39hQYvMWDCXDE9KlT8ZfNFewKR8mOlU7VRuCNa+INAoxWDJ8wVc83z6jVMWFRRU3oCAoQXGhEwYrqYO93UlmlE+PPPixCj7k6fO92oHwj/2buEeWnviEaAvwgI0Ai8BogJc+eKCQO8BCDwHyNmjjHq2oS5Yu6EAUbZhIsPLdRZRv9NdQuEJmC+sBRlmACtCAjwqslrdVtkpcP2pBuNgDARY5WO3S9rZeJogB5q/YV/tc6Z5cWi3guR+WG4UX+s4zWvC9fEd88gIFisSrXKyPnPRSQIzeQfjeUiVw/qqRvGumhbV637HXNZ+gt/f5O+TBARoW+JA/alL5tGIYQ4/HqgAMTI9TX1ovb4G6I7xnbVJAuzfjY8Jk3UlLx8fk2y9BowU8TExYv4+HVi8YgAqf9d+Jvt+9oAEeBlW5c04c+L50M0Ak2AGDF9rphujAP/2WZp1ovfFlq213Ex80VU0DBRV5egoKCgcDdywwadpXGmEdrB88XXh3KE3LC4PmHra9ChCRevH6wZZerT1kiD6vAPRWZNrGYdjV6kfThMeIHwj04QeQ4Zc0KI1FUiGARha0Sa2TuFB183DlLN03xN7IjWynR4ZoNazWTxo6kTuvajmKyRGTDr88S+r3fYGlT1wCRPawNn12ypkzT/00TvsO1cb8CgS10VLD1bYy6DQnHwdeOAwqLjN37PxmjQi7Q10oB04W/GRyZ5aaeLBLOw+nPficn+OGbQCSEKD8aIpwNMcpAGiVvOWGrltR3RQitTjqIwQUzXIhi5XlQPpawNumrR1M/QkKKSyi14tDSYtPkbHWybT+P3/aN3CEsRpok1YQi0C8Vv1Q/tG3TgJYbFpJrVz5rJjLrlaozDZnRrqoP+ItrKKqwePAevEtXjb5Ms8RfRCXmizmqa+aEIB0HoGpFWV1ghhLi2Q0RrpfYjJk3OGDEf9FumZ/J356rTo9/9stAa649Fe6LfLV7WItBEix1m0Uu6gNCEvy5qmq3z4vNIqtuzNak1kj//eaTdcratKzXlFGxmyZh0Cf/J4juz2avChOlCC0Izu+4pIyndgWL6p/FGQz1OxDwfIhnbi3db6ltD9BCNCH/9YE14U1jCxYc1Dbm4lr5fHLKefDG1B2a6fO3HyUJjJYcaWWhEdHWhyNSD+upGgww6hCZ8jUi1N49kgbxBV9OXjBTmNnKt8TdQdzQhC0WSWWdZ821z/ZbJr1GWmvAYi35TiEKRMF0rYKSosUVN71tNtJrqkjHdCTWVzDihYF6exjgcbQcUFBQU7nJuzKAzrW5otGLwzM9rWd2oZ1hRf4MudI11s50m1oTaMRaYLjYmRAt/NCJgttVgQ5hWGCz/9ht7FWlmGPHMd7arKzZp1u8Q0RoEga8L23UxUydUE/7ad884bITUF3sG3ekfXqsxDv4SLg1KLQYMN2rQZYoPwxHwjLAVmUzHbxyQd/jXLpGbm2v5t+tfooN53LtmC429VUfZlata0OeJY18vrp4FBn8xZn2N8SYZvlHi01NWaco9JT6NsspDfQw64+qdxd/+GkOhehBex595PiUd7SD+tcs6rbli1786WK2w1GLQyZV52hoRipUBK4sdg84km2e+E7Y1yGTQmKXPFH56Qt3GnHl4ubTLoN8RbV+HqgeQMmVrkx5jfmUGkHKrWtKzUGHdbJnKe3qC3voHG50yhZVri0wrUOZysBu3PkFMd1BmJiPB9k+aoEswMxQbpIcy8ktbE1r7KnWNRKT2xHw3g6kNNp8kqF4Belnsrk6urc7XWzcaZNDZ6oB9TKuY4eIvxjZ7elRI9QrrmK8sS6+2+BuqO7Z504uE6VhOtMnl19hWR316ykYXTn0aZRV3TT9trap282TT3l8U60caJ3r3OTARpKCgoHCX0zheLl19aNHGwbtb6hO2HqhdrE/fOdfifOK/zBhXQAFhrJnygNU5mzx+WTSMsZst3wj/MJMdkzpy7sRuIJT7uzrgm/tcBvt0QGRfetmmmE7BYcBm9mVkQHgABRfPANAvoPGdqTfx0gJw6ep1i+cBw19m2XDjPzJi+eWDRAoa9cvnkER2P46IjMwj0pmWVwbT9hX5IH7G/2Zl7EcHPNS7+40nU+1DUNQCvov6G5lxLzB41Fo2jv0zj9z3C1MCMkjfrQPieLZL3I1/y4y8XxYxzFbZbK6NiN4heEvOR0viX1FJh/OqyTwinQp6ZXBb5EXoJ/vUIboGcj+wt6CYEqi/Y5FzqSQDYYO6Y6sOvnTpr4UtyaSeA4s7BRx1rtK+A72B5ORUrKOQTU7GPqQqaltDUXdCqqL7MFbRWtLTnqAwAJfazwFbfgDrZisgoB+QjKsDnnPOpSYDYQzqLlOxfLsgidJWDjZxq11wdTjNAGHEnP6lxstl+RVO7lzK0yOXEhFWUX11QYP0UG0rP2d7sii/wOG9O9n54xFyAbjC3nQs7z9TP8CYl7SsXPwePx6ZRY9ewPEfeDsZtAsfZ2AtYm6wbtQLWx2ok4JEPlguyRYvX0KHL+b9V6cwIsjH4fgbqjty8XcKCQOSsepaLMhI340OiHu2C463oLYOpNpLlcwBmbVm1PL1PH10ArP7teaVoChemD+HF0YPoJ2tNzAFBQWFu54bc4oSMIn4gnS2zLuHI6+M4l5fH3qOWkJcqoyzj/qEvemM4/0N0fiTTPTzn5BukYDWPBUnEMLyb8ckaXhdabDvyKOhuDrXt0evP62DwwkG0j7deYsvzjVe1lpPQt/YT25uruzfd+OlIYZ0R1tj48Y9UWv4ZmkgkMwXSeYuEqYSZydNufmv8EADvtb6qTgbXRMNvAPQklDe2G8nrbnfMf6OvoBNg7qhVULdmnsCAbZw4EhjpceVW1BFbw4adT0MzAbi1pxuj67g49cCIft13tpi7rDm5ujh5T2L6NPMl3sHjyN6+XKWL1/O8uUfkGgzG6Vm4OMz0JLGiri9ABzfHstRgvnHk6EN+7gFt0E3wmI4bWoris7z29cLiAryaXxvsjdBd6bG2dOFfF5pSANaC+quT7HuRAHpiTFMbPULb44fiG/Xp9iQfutHHAoKCgo3mxv2cqn26sKjC77j9NUzbFk8mPIfX2ZUz9a07DmKJXGpmDsCq0/Ym02z8BVsjwmHxKk8PCfRYS9d0gzhXnanF9n8VllhlQFtGzoB7E4j3Sa0gTNHkwEtg4Ok4btpFW1fxk3wfthjNHMjgaNzWPa9o7k1Iz2HwgZ92LhysXc3tiKrxFpk+AYSCuw9c5mWbdrQRuavuXGGVVrNgJ8On7D5qqHiRow9Nd6tWlnkoUNvgMNcLJJPUxut1x1z1YNvYCiwlzOXW8qntU1zmSsrHOTIAbYAdGqDtiHvt/QlEEhOOSMzkZPDqd8KgEj6BjY0gb0YPj0YSOPtuL11ThZp23QCYHeabQ3FcAapig4m6MYt7Eanpa806ZByRiaXOaeQRNmXBouynng2k+pMQXEJcDP18DifP7eQFEKYveUEl8tMkyGniQmTCR76JP8IhoJ3v2WP4TjbY49C8BQeruO+tobqRla+PQ+sdw6NpzsGzqQkA4HU5hyyvdSAcvhikR1d0OJ1MxpQtRddhkzh7Z05nEuIxj97IxNi99yEDykoKCjcXhrv2gK3e8yMtRH4nI7j5VE9aT1Mxt19fcLeNNR0nfIVW6L9yV4ZyROxjrith4Bej6AFPlv2hdnKnoH8nxcxNnqvZWDvEIZFAnv/xaqtliuR5cfX8vIbBeA/g8gQ6VnrB54gEkh+5R0SzW0uQz77133DkRsyeH0ZszKGcI2Oz54IZXpcJjaeqSsrZGTQBC8tULCJJLMEGLK/Z8qElTahbQmg1yNa4DOWfWEmY0M+Py8ai7XI6DqIccHA2vfYeNY6NQbyU1NrXMD3GMBIIG3F+2wzk1f58XWMn/yeA2lLZE7nccRaXx9RfpwfP04GghnZvyOgpv+IyWjYy5JP99jKrTyTwycaYCTfJLoOGockwo3YijCf1FQHXdQnv8KCdcfN8nuZbe+vIA0NY/7YT2bLpAN0D+MJLfDeIv5z3FySBvK3vcH8LaAZOZYHbuCSuB7jl/CMBrIXPsE0GT03FJ9ia+yPZADeIcOQqugqtlrMKJVzfO3LSFU0kpCGJ+em0T3sCSRR/gdLUeaz7Y35bEHDyLEP3Jr79gzpbPtYmqAaEtQeaEQ9tCGPzKNA778w5dFu1RM8lF8h95Jc+B48PCUYCj7gh7Xf8t5RiJw7mrru3663bng2Qwts+WGf2QThZVLemMoLyQ3K6E2jobqz5u+L+NlMFob0T1i6FvB/lqEyO1NNqPuPYLIG9i75lD22DSiZh084PKnaMNT49H+IIYDOUFlnaAUFBYW7jca/h87MWEtc9TQBVGK3+axP2JtCC8JXfMVCfx2JUx9mTqIDXUroFFaP1EDyNHp1f4wZ8+YxcYgv7Qctpdn91tPDJiOqgPci2+M7ZCLz5s1jxqie+ARNI5EAZn8yk1DTzKTvGBYu9IfslQzt2JNRM+Yxb8Yo+vi2p9/4j7lRm0HddQpfJS4khAzWjOpEM5/ODJs4j3nz5jFxWGd8ek1jL6DpF0D76rdaE/mXyWg4yuzQ7jw2Yx7zJg7Bt8tjJHQOd2j2P3TKaiSR9aL7YzOYN28iQ3zbM2hpM2xERg/Gr4rGX7eZ8cGDmLjqCxISEkj4YpUk554z2Z5jStoo5i/0h4L3iOg4kInVsh3PHofS1pRm+i+Y2q89vn1GMWOeJO+ePkHMStYQsjiWicZRn/fDc3gnXEP24nB6PraA2M0JJCRsJnbBKHr6dKL/R8cckMQtosd4VkX7o9s8nuBBE1n1RQIJCQl8sUqSe8+Z28mpOxbQ5PPN+CB8eo5ixrwZjOrZkYj3CtCEv8OrjzfQTFAP5G/G7c6zgnzoOWqGpH9DfGkfsZJsr2GsWT4K34bFLtFiBCsTFxKiyWbtqE74+A1j4jyTnvvR0rsrkS/slGTgO4aVMeFoCt4jsr0vQybOY968GYzq6UPQtEQImM0nM0PvmNVXc9QD/8aGaH9InkWQj7G9MNatiJXZeA1bw/JRNyRJO6TzxQpJnvPmmdqoXkxLBv/oDfzNdDCtsfTQhr5ETNbA3jlMmBXLZmOcA30eYLGdGcEeo+cSSQGLp80njUjGDXFALvXVDeNKoO6zx+g4cKIxbEf6/AOZdu720jDdCeP+ZksZZJLFjMfo3msqiTp/oj95nj61fdD7Yea8E44mezHhPR9jQexmEhIS2By7gFE9fejU/yMatQXN+ohHffowaoGkHwmbY5k17Gk+w5/ZUX0b80sKCgoKdwa3yxtLXUge0jTCwpO20VNWuLn/arlnUgySd0WL+9vkngmhT/tQDPOyfW6XsjNiy/wI4Wu8g0cbMlHE7MsT+l2zhcY6zUII/bkEsTgq1BgegZevCJVxjS9RKA5+PlNE+BrvpNJoRUDETPF5I3rq0heliy0rJ4iIQF/pfitjmgIjZoqYrcdkrnAoE6mbZorBWskDpJdvhJj5+UFRaPRI6Uh5lJ3ZIuZHGL+n0YqQiTFiX55e8h4pI/eyM1vE4moPblL6IiasFF8ft/JJqs8T+2ImSnf1GdM2f8sZUSaXNjnKzogti6NEqEneeAnfiJkiJvGM7XUa+jyxz7xs0AhtSJSYH/Oz5R2Gxm9bu4G3l9fakK0HlpHa0f8ycWbLYhEVYrwzyyibCSu/FpYi3CVma7C63qPG49/BgzFioikOL18RMX+LkFVb24SJ2Rr7rvALD34uZkYEVJevRhsgImZ+LvZZK58dWTqCPm+f+HxmhAjQamrKKyBURM2PEYkWmdCLcwmLRVRoTX3w8g0VUYtl8mo3PUbPfBZyNEpitsbG7b7cMyGE0VufTHnb/a6xvQgwlbNGaAMixMzP99nUY/u6JKcD8hxY7C/j4dJL+IZGicVfH7fxGHxjelhLustSxaaZEdVtqqneJ9itY+fF+pHGe8zMrxqo8/v10A0hhD4vSaysvlNRK0KiFouEc/LtnF0dsIvj5eRY/PXUHc1ssUt/TiRY9H1RYmWSdd8k388KoRd5+z4XMyNqZKnRhoio+THiZ8sG1M77Jm+bMnmybgf1aWLzzAgRaN6uhxr7aQdkp6CgoHC3oRJCiFtpQCooKNzpJPJX1VBWhsVw+pcpdXqKVFBQUFBQUFBQuH00/pZLBQUFBQUFBQUFBQUFhVuCYtApKCgoKCgoKCgoKCjcpSgGnYKCghXOqDWg8W1Ok9udFAUFBQUFBQUFhVpRztApKCgoKCgoKCgoKCjcpSgrdAoKCgoKCgoKCgoKCncpikGnoKCgoKCgoKCgoKBwl6IYdAoKCgoKCgoKCgoKCncpikGnoKCgoKCgoKCgoKBwl6IYdAoKCgoKCgoKCgoKCncpikGnoKCgoKCgoKCgoKBwl6IYdI2EYV8a7Z87wFNbrtsJUcSGFQdRvZTOwVuaMgUFa6rY+/EhVM+lsin/dqdFIuf7Y7g9d4gljVQ56q6PCgoKCgr/M2RnEjXjAO0/vXi7U6KgcFu4YYMu66OhqFRuzEmS/p00xw2VaigfZZmFiTuKqhEHa3ceVew/Wko2rjze01M+SPYlPskQaHs0IbiO2JJiDqJ67igfnWn0hCpg0seDzEm+3Sm5TRgu8u2hSujozgAf08MqsneeZEj0QVTPHcAtOpVN2XbeTz6J23MHGBp3tZESVMTOozp07u6E11U5HPq2A/WxkTGczWbBqym4PXcA1YwUxm0pAq7y0asH7uhJnN99XVC4pTSGvv3vjycUGkJOSgmbK5x4tqtP3YHvIMozzhO75ih+Mw+geu4A3n8/wqRNF8k33O6UKdxtuNxoBJWVekCHodL4b4MOaIqHu1mYKgFUUlByo1+7QzFcYOOBKghowsP+8kEy9pawBScWBrdDXUd0lZUCEFRWOvj93Cyeeq2Qb1o05eCrnelRj6T/HpH0UVTr7O8Nw55rvFEGI4N98DU9zM7iuS+vs8vLjVWjvGh1pRSuQd6xVDps1hH8sD/7ntRKYSsFOkBfVdU4CTpVwJos0A70ZmCdlcOBb9daHys4/m0aj8eXkxHcGvG8n+37B9Np/34xFvasixMBvm4sivBnzH1NrOpwERu/yGfpeWfGhLdksqeBnegAZ6kOF1dyrY5s1ZszGQxdfpXd97WhfKqv2Q9VpMelct9WPT6D/Dg9rnWt0dRaFwwlpP50gX/uvs72vCqKAY27M4M7evL8w20Z0VOSQ96WVDpsLkdn/q6rE6H+niwa3YlHAyy7mYOfHqJvchVjRnZlQ2QTh7MsvWeZUI27M4MDvVkc1ZH72jjZCa9i2PCObP1ji1pir5FbMap6p63e2Cm/pJiDDN6v5sO5wUzqZPtaVtxR7tlqYPazfVgRdvOSd7OQ1Te5+oYK3w7uLBzSjgn3N7Wob40+njB+P79rS87+vSNSjbnIkpdyeLkYvDo0J2VBJwKs3zOWIY8GsCOqmfFhCZv+L50n0gW4ODP/6e4sCdPU8vFSEmPSidxfiQ5nFj93Lwv6mH7LYc6Mi7zephmZ/wygo9zrySdx+/Q695vSYMpLkJb8We3xtvPVjE1H6JxgYPKYXsQ+pAYqyPz5LG/9XMTHZ6soRoW2qZopw/z410PNcZOLRKZ9MLWT8x5sw/gHbd+7eXXyMlsO6sG9CY8PqN86hak9mjY2iPfCayurm0EO/3ozj9dxYnAXT8arK0g4pefjhBw2ZZVz4u8d8a07EgUFoBEMuvYdegOX8G0p/dtZrQE64lP7OKJWau3UrBuwO4CipCLWVMAzIe2Qz3YBPxw0QHNvovrdhASUVTX+gFHhfxQd2w+VocONyQ/WdI55h0vZAjgSiB4AACAASURBVEwf0Z1ZQ2o6xKyMRjLaauH4gRKSceb1kLaNEp/d+ngpj9hPcpmaXoclX1JJNqD1c+fPbSVZFF/W8VlGKeNjTnNY150V5oO03EK+ygJ6teTzsf6ogQgALjdKfmSpBD2gqxQWjy8npfHwVj16v2b8OOYGGuFLebz9QQ4vnhXg6kJUL3e6auBifjk/nipi1IkKdrzfnXCgpLQSHRDc2ZPhzaXXL+aWsT6jmMg3T/BhdDCTuth+wqWe+0OulVYCToQHuxPqBiBIP1NG3KErJGTo2fXPbgxqah1ehcZFEJ9YwJ7hLexPGFw7z4rtetzcnSguqyKnVF+/xNUXO+VX12Te/+RklJ369t+zpUz9JIMv8jqyI6q2gX/j4KpSmf2rgoJi6f+Kz15l0bZSPn3Ew/IFYxliMbmk50qxAFRoqGRpUg4zwjrZH5Qfy+HF/ZV4uztRUGZtpAoMFdJ37Ba39QRXHy8muxezMLWYpGswoqncS5dJPGoA3Bh5n1Qhjv83lT7bK8DdlbH91Hhe1vFZhp6lGzM5UeZM3Agr0/DSBRatusjCfIHG3YXhxvahutw+P8MrKa1IntYBf7M6d9Pq5LFC3s6FwEHNCbUfSpZy/c3v4+wjoI03+6YGVE9ILSsr4D9vZDMt/Qprfm3Pa/U0UBV+v9ywQad2cQVa0cy4s8m36303GmXtnVpjrw7cMDqSU8vRubjzp1A7szvHrhJ7CYLDm9HrZiShUye2vnszIlb4n+NaHpvSBJogL4vBb4muClATbLXK0fGPwZT/8WYmqIDtRyuglTfDezdGfPL10XAyg8fevUo8rqyK8mBjXDF17frq2qMNy0bXDCRf3XmCbl+W8nryBf4edk+NsVhSRQEQ6uNR5+r7zcRwMoMnNpSS7eXBjmkBdG1wYkrZtuECL54V+If4sH+yPz7mcZVdYeePxWit3nqofzeWDTL9q4oF/z1G4HY9c5NzmdSlxljv8+y9iGcbmjZnnh7WjSnVBmIp295NI+LIdd76uYRBI6xn8F14qa+Kxb9dZ22SjoEPybfRObuusbbChVUPuvJiYmlDE6dwA1jXt5UnTxP+1jUSt+eTFNWCQbW8e0P06cq59+381t2dyafKWBufzQtDAgl1uE6581Lfchb/VsymYzCrp1yYKvbsLeGoizur+lXwYlJjjGnaEtUvj4VJ5Wzcq2PEIzL6fuoKH+di0QdcugZ/jurEm4/WrKqZ2rvNv+RxZIS32diliA0fXmRhPoQMbMPWcb4W7cPKixdZFXOB2amX+NO3Xvwy2toYb/w6efxYKUdxYVXv+m+3vH9KH8SUer/WSPix4p9Wj9y1TB58ieh1pXxwMo/XBjTORKfC/z6K6X+j5F7gg1SBJrAJYbKzYbB3fwlHcWFKT+shkILCrSXv5yLWVqgYH9RadjuOi/MtTtC+y7x2CYKDmzXOVmE79fFc6nV2t/Xm4L+DmRXQsEy2GOLFOICzOtJkflc7qWSe3iIMhaxdf5VEXImZEkh4qxuIal82k49UQdumbLc25gDcmzNkdHuCao3Fia73ehIGFGSXklVr2BvBg0eCpSHollz5fQod+3rzDIK1e3PIkQ1RwKbf9NC2CX9od9MSqlBP1N1aMLEtUKEn/dRtSoTenWcfdIHiEv72bf1W3B/q24RAKnht7wVkj0NdO8/aA1Vogr15VHZPY8Po1duTYOCz1IsUyfyec6KUZCz7gEFTevPeo5ZbJKvbuysVFJo9N/yay8wMgSagOd9N9LVpH9Rt2vDS2KaEAck/F7BHJvONWydz+e+vFdDKg4dlDee7D3VbV+4DCsr/l5biFW42N7xCh7MaDa44G8dIzs6uEOhLS9nApaR8e5a/7ihjV5nAq4krLzzWnkVDjHvkjdsppbMYBqa+cYCpAC6e7HrXi+9nXOT1Cimm5IRMVAmZgKrmPMGpDB544xr3P9uHee5nWLj1mrQf3MWJkK7erB0XQIjZQMdw8SKfbMhjQXoFBRXg1UTNw/21fDymbXVDZ9pfHf6o/LaPnH0lbEZF9L1+8vvVDRf49lAVtPXmD9aNTdkVtq47z5TDenL0KrQ+biz5Y3s6yESTFHOQwame/PYPL7avyeOV81W4tvRm55Iu9LHea5+fxVP/LGRj22acXhhgtfe/iA0rTjM2w716y5TkEOM0L/50nR/zq9ChQuvjSvRD/swe0tSBVYcqsnemM+W7UhJKhM2vYRH3mM3SVZD50xn+vtP0LfBq4srEwVr+EdnGdvBYdoWt/81hwUE9KWXSVhbfDu4slzvLZLjGtk/OMemwnhyb3RlqYl7qZTazL8OlPNb9N5+5x43vuzoR0aMpy57sZKE39pH0e96uMkkOLk6EdPBk+VOdeaRDzdyJ4eJFNsYV1HzHGG6J9Xkj4xmNpo914f02Bcz9+hofF0pbXP70YBv+b3RrvM5m8/qGyyzLqKDYxYnBIa34bIK/xTaXGorYflQHLh6MG2ScFd2Xhk9sCQXGENV1LsR4vqxeW5yt8m8qq0c7MK6Ph0z4KvYcLaUANUv6Wk92VJD502me/1HSKSnPrVku37BUY68+BgzvQf5oF2nAcqWObNSFlzOSJHJZFH2BhWXG59VtkodZ3TJi1K2/HtNTUKHCt4MHH43raqEXDaeUxLXZTMt1JnpcAFO6ycRpKGH/t+f4y8/lpJja3uF+jJeJLSW1lGzgmTD/G1jlM8PLBfOWU/YcmFX6pDN4Xqx+rjOhdibKrOnoYSexHm34U1Ahn6XKr5YYfpUmFSL/oCVAdngpta8f92vHuQcNvLKhkHdq6Vek/KlY/4+28PV5ph6vQO/uzoa5PfjjnT7Zbihh/5ZsXjarw1ofV6KH+PI3e2ep7MXjoL7Zj6OcrKuAi5oA2QNkluMJjbsrfxnqw8LHW5vpWxX5+zOZ+00RXxr7Nt/Wrsx/rAsz+hnbQLvnUYHSKnwjWxL9ax4rd+Ty/eAWjHB0sqR3M6a3KuLFA1fZProdkVZ6LK1AOfHyve1wzmnE7dk9mzGlVREvnihmSy48ZaFzRexM1Vv2AfYwCGlLqbsT5q6lUk6WUoCK6AEd7G8l7eLHvO5XeexEKQmHYKD1UZMbrpPmYYt4twzCHmxpnBS8zqb/O8kT6fJ9fs73xwj4Tse0cX15a1At51IdGA8cX3+YoMQqFk4J4d/meTSeZSwf2I78ieYFcJnYhZlMLfQkeXU37reXqdIqLgEa59s4Sahw13Hjo4lBKygXO5hkbHA7TtqBOPmS7NbCTd+m0ye+HDp6MLe7K27lepZ+mcmSfcatBoGtSBirZXlHAGemD9cSP1ZL/NOt6ElzJj2tJf5BqREK7NVc+m1sayYFmn9FsPvXVO59/yrrKzVM7+dBVFNByvGrDFyTQbpptsiQy5I3cph6WsXYoS2JH9uSN7s7kX66tHpwa05xhdxMibFxdPdkzEB5URoOFPNBGUT20VoaVoZCYt/IJHKfniIvKZ3DXXW8EHOayadt46msFFBWxhPLcnmlWM3kfu4MrB77W+2192nLM92B3BJ+OGYVkdHbpibIk74AVJG+KZUuX5ZwxNOTD8dqiR/VlLHOel7+MoMx38vN8VmS8/1xunx5nRMtm7BurJa4cDcCXACNhpVPall1n8kQKCXxP8fotLGYH4tdGNvPk7n93OlTaWD1Dzl0fv0MGeYRXzrPX/95hshkPedbujG3nydzu6vR55QyPiadx74x7wSL2PBWBhH7Kgnq15z4sS1ZFeiMBmje2ZsfxvowTHZQYPatZecZf1wwakhL4sdqWddPTcaxK/RZlsbeOj1OlZL4n3T6/FDKrko1E/p5MreLC/nZxUR8mlm9QmE4mcGwV3MYf8hAM38P5vbzZHoHJ05nFBP55jEWJJu5ljCe0UhOOkPnmGv87O3O3F4a/AwVfJyQwxPvnqD/inxeueTMM/08GOEp2LUvn7CPc2RnZsm+xLos0PZtygOmsW/XVsSN1fJpL2cs6lx/oznk8BZnU/7LKOrclLixWuJHNCHkahnj309n0T6Z9w0X+eFIFXRsQqRFp1tF+qYTdN94nQS9M1G9PInu6MQPO3K473udbTzV1FIf3V0cH4zawfDrddYB/t2a0B2AFjw9Rkv8cA8CMW+TWtDV4k0dE5adZ3IaDA/xZIKfiktnrxOx+pQDelUXgvRNGUSmVBEe4c+KQXKGcymJa0/TL6GM40i6+UzrKt7ZmMmje6zbtcscyZK23w7qeGMOAkwrASM7N7cwrm3PgVWxd91p+iWUowmUdCduiDu+V8s4Uue1GlXsOV0OOPOnrvZG2hoeDvVESwWxx6xbdx3b916nwMWdmYPtuZCQ2teCY3n0fLOAd0rUPGPer3yYaTHklPJnYPaqs4w9rWJUPw+G24v6TsJQSOyydPr9UMoejSvT+3kyt5crPld1vLwxk56xdtoVG+qjb/KUF14ibk0+i8vAv1+zmvbKDIvxRC8NnSv1rP4hhyc2FVaviBn2neK+mKtscnbjnVFS3/Zsk0q+O2d2nYmd84zVNPXjpYc1aCrKmf59rvxqmyxaRvd3hYpyNu23breMK1CtmvB0o5+R0vJwsAugY/0BK88xxj5AE+wlK9Maqkj/9iprgeB+zQmpfl7TPvTyqy3dGrr6qoEqDuXJea+50TpZk879x0spwJVpoSYz3pNHerkBBt4+YB230aOyizsRxi3+sudSHRwP9AhwQ0sVX6ZbNlQZmeVkAwUnSzhi/sO1YpJyQRPUBPvuFKo4cqyUNFSM73QDWy0Ufnfc+ApdPcjGle/mdGOEcVZ6jnGP9tJDufy7ny+0asWgcKhMK4AsJ0J6tCfCbKDXIqw93StPANCqTTMiwuUPSiefMTD7T11ZPMS4gmMoJHbZWaaev8aaPVW8NcgJskrZVgyhD/vy9mjjtH84WG+lrvW8R53e+ar45dB1CtAwoZ9lw1SUlMcL5wXaXj6cnOFvnFGs4tVtJwn7qkwuMqCS/KZNOfhSZ3q42wkCgIZBwe5oTpQRe6yAWWZbPSVvm2YrGKcy+XOCHp+Q1ux93q96ZjNiaCE9FmcxbXsue0d413LQOJ8vf9Gha+7FN7O7EmKUw6BmqbSM05Hl6seLxvIuSjrLUymVaPyacWSe2RkfU/mcvcrSn3TEPqQBdCR+VcDKYhXhER2IH92yejXu1ZMZDFt9lfiEi2wZ0kKa+Tycx78zBIEPtOX7Z1pLjinCS/H/vxOMOlOBe3QbO6tW1HyrzJWYmUEWKxyPtj9Bty9LWBpfQpzN+RwzjuXwokzelpVdYesv5Ua5XuaT9VdJrHAmelxX3jIbfL+adIJ715Wy9MdzjA/rYrH9sOAaTH4igDWPSKulr/6ahu9HJSQeKcU/xIdzpm1xhgv8Y3Yuiw8VccDgS7hVfmU9rTZtSVh4S9pcvgpHsKlzjiKVbZVNWUUMzGbGa/ksTDzL8/3usXBSIuttE6TD8Dv06Nw9SPhHdx4x9mmvnj3LtNWXWGsvEfXxlukAly5eJSFRGoyUXr7OKztKKW/rxTcj2hrzp6HL/e3pciqDVj+Wgt02qRLat+JUtYOAUsYZz319tRdCb8Rb4ZlChqdUovNrxlozuVtg1E3aNuXIy52rdfPVg6d4Ym2RlXfBMtILANR0qG0CRIZT586RkCj9/6Xsa8xLNhAQ2Jzlw+oalF3lSFYltG7KJ9MCqo3hkaPlwlaRcvwcCeel/z93/BovHBEMCGvNzH72B5jqAc2Zs7mE2b9eZs9obY1+ZOewOlWg7d+Mh+taCSyuov0gP/aOM64AGQr5z+IspmWUkHAGKwdeVWTjQcLLgTzSpr4D9kq+iD/J6V22v1zJvXlbsDK+zWHqeYF/SGsOmfUFyy6d56/L8li57xIfD/C1cx7MjHrpWw01u26MuDjzdIQfq0e3ltXrfHd3kl7qwoNG+Zr6hcQd+fzyeEvC1XDunI5s1KwZ250p3aT3IoY5KBAzfIf58NqebGbvKeCTsLa17/Qwf2+wN8/8cIm1e3NY9FCNc5SaFajW9ADLicxGoEffJoQlXmXz8QLyRjSpbndzUq6zBWlV0Fqml1Nz2J9fCXoDO1OKeTOzCr/AFnw1xscsrI6cqwAudJTxwmqOs1HtC3TyzkwapU7a8WjsHerF5M3lrD16leNjtTX9qbGP0IR41xJ3PcYD/byZsa6EhaeKycDHOGlfwv4MA2Hd3bh0ooy9p6CXUV8Mh0vZiIppPWzlbyi6TmFJGSeT8ng2qQKNXzPm1LWKqqBgxi09Qzd9RI0xB9AirAlPArqc8sZt0IJbsWKI2XY8dUsmPOgOCNadyZOeNXFCCxw+eZn9Fxt2GNnknW+OPe98186z7qiA7l5EWgU5dKYcHc7MecDfbHuIE/6P9OCTEOygZuWTdRlzEt6DvJnmAkePXuV49VOjdyuzFYysY6Uk48yk4KboLxRz0fRX4EqPDs5QpuNIrecX9ORcATp6VBtzAC0C3AhDsK/AdF9YFQeOl1GAM689buWwQd2SCY94okWw9pRxRs1QwLdHq6C5FyutBqrqbvewuK8TVJSRcNj48FoFaUBkB/PO34NeHdVQYSCj1kM8l9hytAo6eDLE+3qNDC4Uo2+n4QFg8/na71w7cvg6R1ExbfA9lnlzb86jjxi38BoPo9O9OYusVlJaDPJlaUfgUhm7reXdq2W1MQegHuApnW1o3ZTtz5udcVK346Fu2MmvydNqk5viafVQWhkFuDIp2JVCcz3SezKgHZBRbqaHYM/bJgDHSvm8AgL7taw25gDUHToQ+7jcCpREnfWxnqQducKw9QUMW19AVEIpKRWgv6rju2PX6jFLD+DBWgtvbx4MCXIDBLsv3uBWq07NWNPLCc5fY3KcfFxZp8o5iu0WyhZ9uhAz1HpYYVztB1zqaRT/8HNBtbzGJevJRpB/qYyko3U5GXHFywMoLOPb/SV1yLaS9340faeQqUcq0AEZZ4s4cLa2dtyH4fe6QJnkiMHE8eRituDCP0Lrvk6G1t78Z5zZdj51S4YGqQE9R87bBp8+oiHGHEAViUevs3yf7d8H52/EcUYRhxLPkWDxd5FsA5h7PnzvT34WW2Rp5cdLg1yBCjamSTqWk2Idz7lq+ddP32rQ+rlX78LwAnBy5uEgLfb8W057JLDamAOpX5jfA6goJ+mQ9KyJxklK94EbvNdL7cNfhnmgxcALP5x13H9t0zb8KUgFWdLWQon6rEA1kC5apnUEMkrYXm1Bm3YwePCHvrZ6eWx3nlSvvr7K0sxKcHeml7egqNBc56q43mj3o914nbTr0bipH+OCVXCplO1mu5QyjlwnGSdekjFoa6jPeKAtkfc6QW4Z+3ONjwxX+fWsE48MaEqki4Ef0mpWKFPOlKNzcSOit7X8S/j6Pydpu+gs4cl6uvfTcuKlG3FspfB75Jau0Lk6WSmxWoXrLfq22teVMEpJNh0ybduB5Y+VcnRLEf3+fYigAA/mD27H6P7eDm7Nqts7X9H+Ej6vUDE5uI3V+bqrZFwUgIbe9fQE4bDTCnU7xvQtYOVv1/nxMPToTbVrX/MVjMw8afbslU/TeUU2oroGJK74NgeyyzhigF7GeE3braK1pu2WNXnuKyMvdQdXwoDNF3VkAAFZOvZVAB3dZbbvOtHJRw3o2FdwGWgBTV0IBH7KzseAaUaxiF/TDeDiYecMhpFT5eyuADKu0GVRww5YFRZXAmqC2tYir1w9yUCYv5fMeUtvurR1giwDqbmA+Qyws8qq8/EgqC2ACofde9xUT6uXSc8RgI5n/y/dsVfseNsEyMo3oAMe8q3PdpPG9pZpe/bzyvELLP3yEku/zKRCbXV1QR1YG0fqRptKc+GRp7REZ+axcnsOsd2b2ZyhO3fJAKi539+R9LoT2BrIM5BxCsLrsVobbTyTAoBBR/bB87z036tMXZuBs5f81QUSTRj1eAue/vAKs2PSeOVrDS8MaMELj7Sjnc3kldW5mLIyTu4+y9NfXydidbrN1QXm9AjzIjLxSs1qieECX/xaAR2bM9oRZwpOtvXNuZZytOnvHMb+eV/T/WENIreQResvs9nioSsfdmjDpE6lUrvT1o3uMvLzbeuKFj3JBaWAK79sK2Cs1Sxs+KPe7OjQrJ76VoO5l8uFx07x8Ooi/vxZBn0XdqnuV2rHiU5t1HDEwFXjJpfWw9qyPj2bCUk5tP41j6jeXsx5tD0D/Oo/9PEe5MvqX08z9sQVVu/z598O3Zpk3FqYWsJrey8wrWc71PVZgWow3gwJcoUsPetSihjn712z5d7ODoZBU/sgpkr/X154iV+35fFs4hX6ndSxY153o6Mld7pqgdwKss4AtazSXS+XDMHeLe0L6sbqZG0exp144F5PtCklvHc4n1k9faie1Kzrrrp6jgdCunmg3VPCD8d0PNVWA4eusw43NvTVcv3XPB47XUgRTfAmn6STVXYc6KnxdAXwYMdqq/PXCgoOcksNujsLJ7qOCOLEoEKSt+Wz8OdSxn94ivm/tGD7rHvqnhkxeecLt+edr4QtB8rQubgz+j7rxqbK8UvDG4wTA4M90P5WwoqUXF7q3bbGte991isYat6Yeg/jZL1JudCsVi9TPjw5II/ZW4oY8Xo6ywa64ZFXzEs/68GrCX+yc7bQLs44bqRgNmjqrWWefxGTki4worKEv/s7cTLlKnOywH+g/BkMG3q2JHe0vNcN5yaess8bHxXqm+Bp0uRpddVN9bTqTty//Rkg95Ozq4WjJJO3zcky3jalMw31pM76eKO40LxHe1Y8oePb94psry64nbTyY8UzZfz0XhFTY9PpamXUVNo7GyRLE/xaAHkGkrJ0TOnSwC0/ag3+/QOIKUpl41flNlcX2ATvdg/rFrdj4a/nWb2ziDd/yGVp0hXWT+nOU3JOXky4u9PtoW58fPEQvZPsXV1gxN+X6d2vsOWEtFoyMe8qb5SpmBzq+/u4vLftPcS9f88NRSE5aWjCU3P68pSdMPXTN3ncegbwev/D3P9bMW8nmbbhNwB1S576W3OGp11gw44rLEi5Qty+IsY85s/nI+xsUbaLN6OGeRH8XhFLE88yJcrBJJi2Fhqdo3QwrkCtcmRVGKBK2L2HrkgnGU1aje3UuG+IJ5E/6NmSeomcx70h5TpbHLzv061lK4aMbcE3hiP0+aWUafH5nBznAzSjgxbINXDkfBV0slc3izh6TprkDPGtpf7eSJ00eTQOkvcwrh7gzYz1JSzcd4W943wIrZ7UbOHYXXUOjgfUfT0Z91kJazIKWPuIH5lZOgq6NKWvWkNZZw1sL+ckEHqqmM1XYMxDch6mNXg2oqdThd8nv5trC4qyykkGAr0sGz61d0uGjO7Ozte7khDiTHb6FWL31hVbjXe+WTbe+Yxk5/NJBmiC5fZqtyCgDYCOw8etf6tC1v9KQ+jXgn+0goJDRewxmFYwLF37+rZUAwbOlHjSpp2XzJ977SuWhlw+/kWPNsCDh8qu8+f1BUQl6wno2ZyD88zv7fGkTTMAA2knZaI5K61eaf096Ajg4yJN/l0ox3bNp4oz+QbAicF+0uyfYV8e/8p2YmQvVwoOXmXY+kL+kePMX/7gx6GJbWvvODu60hugoIIiWRl4ofWuvap4uklbe1Jza9kSZVxFTL54XWZbWRGncqsAV/rWcTah3lR7Wm1i62m1UTB28lRwsUhefm1aa8zKwORt013W01qAVgr5U84l26zIiteB+thYeDjRCqC0Crmj/rcLde8AvopwRVN8nfFfnrfYEtZeK9Xx3dm2DmUqbeRpPH8LbEy5UId/ubrx1kj1xiH322oNXR4M4O1/9ubcnzzwLy5nws+5db+Hqf7ZP68jYcpbBbHHzvPd3jJ07p5MVs6pUL3TIlfPGZkFwJxcPQVAZNu6l5Tqp2/2cGJgaBOCa3Vtb00VZy4aAGd8LZLphFegH1OmBZPzTx+ivSrZuKWAPY4mxQx17/asCnFCl3GVNSccNVyNWwsrytm0N9u4AuXlwApUE3r5AXll7JM9eFjFgQwd4EyYv8wkhr8PEwKArOvszDZut2zuWe0MpG6c8PaQ6lVasb76Wa8OGkCw5mC23a2nhsN5LM8CWrlzf62r/A2vkyaPxtPseRinLU8OcIGyUr79tap6QrvO66PqOx5Qt+PxYBW6k9dJoYSUTEP1LpzWge6ElZWRdBjy0spIxo0xdu4rdnZWgUs9dt0oKFhxRxp0Lb2cgUqyCmVaf+OgOP1auf2zFkcLWZRsdhbDUMgXyZIntGe727l4Ut2E/gFqbLwdyWHXO18NpsPH9vZq9/DTAJWs+MW8Uazg+LcnmHxE5oUGYfR2VVbKD5uv8N4liOzf2mIFo2t3d4KBtXuzOGstUEMJqRbnhQpY88+DqGam8o1pnGV0LjO0uy9rXg2h/P2+iNUhxE+zdvWvIaSTK2DgXz+dszzPUFbA2m3XKcCZGUHGNY+mzSWvlHnFrPrJ8lxN+bEzvHygCrw8iLxXeiYdfndlzB+7cnBlH8T7fSn6v2DetnBhbQe1DyOCVJBXwqe/Vtj8XJ6Rxwkz26Io8QTezx2k87qL1c9CunmgRbBmV2aNJ1WQrl349rw0IOnhyRPuwJEr/OeY+XeqyN+Zw/ws0AR48kAjuza362m10XCifzd3NBhYsvsC5dY/l13hcKrZOSo5b5vmdHFjJJC2r5BtZnIvP3aG8d/LnMdyoD42DlWkH7ouTTy0d6f9zfxUvXGi62hf1vipyE7Jt/D0F9Begxb4LDnbTDeryE9OY+xO21bUe1ArXmsFuowrPLNO5uxRWRG/fpvJXvlr38woZdtRSRsi29XnrJATPiEeDKEWz4PmGArZdlSa4BniW/s+OO9BzXjJHY7+nM/kLAjs17xRHOg4xLEL/Gw8r20orCCdO8kteSvCujoBpSzaVGBRhw0Xs3kjSQ8uGsb2rsUxlJH66ptdmgcKbQAAIABJREFUerZmbkeszp/VsGZbWrU8AQwnM1l6HPDyYKgdo0XdxoeH/IAK+6tetaMh/A/NGOlSxeIdxTKTjfL0CPMiEsHazQW8UQbP3OfIqnAzIkI0aNAz+ePTHLfwlVZF/s40JqQIaOtFlGx+mxAZ4gboWZd4kXVZEHyv3Jb788z550m2Zlj1fWUF/HjUAKgY06GmXrUe1pKFXqA7cYVp3xbYtPflGVlM+6yIozgze3j7OndMNKxO1u1hHKBHTw+CqeKD42f49pCDhnQ9xwPgRN8ubmjKykg6eIWkDGdGdjaOOrp4MbJ5JZtP57PvtA66N7G7JXzQ1D6Id7sxSP5nBYU6uSO3XHZs44qGMhZ/lcqVYy7knnUi+tVASdE7anjABdb+ls+IsiI6X9ehDevNQgtPcZUs/TSdd3e48ee28OuxcnaVgX9IK57vI4XIijtK6EEVU+5twpAWTpRevs7yneXg5WnROB5cd4j7k6q43+weOpN3vsigVnYa5ctsOagH9yayh4/B2CjuvMDCI/l0XFjMdD8V6WfKiCt0ItzPmWyZQ/YNwbRHffH2YsCVf4ZYDax6+rIq5DpDU64QvPg4r/ZtQvcmcCmvhA9+LWdXy6Zk9mwqrZqhIz1fAOXsPIV0p1JHD4Y3vcbL359iw/emSFX4NnfCt4UHi8zuVvONbEfM4bNMPVJA+9nXGNtTTRtdBd+f1JGqVxFwXyszT3XejIlqxtrVV3lvYzr/3e3Gn9s6UXxZx2cZFRS7ODP7cf/qFcD27d0IcCnm6VcP87QpGa5OBHo606NHM/7vyfbcY9eZjIaHI5oSnnaVxZ8d4/AxLyYHqPHQG9h5uIR3Mip5/tnWrDAaqAWXDRQjKD51XTrvB6gHtGV10mnGZlyl1+yjUt5KDHyeoSfHuQm/PQ6+6nb8bdQ1Pl1XyqzVR3g/wJ0RLVRczC1j/fkqdK6ufPh4LXf7NAiTp1VXxlmXfSPiPag17+w+y9TfLtIzv4h5IR60d63iXEYJKw/rON2rDeVBkkMTk7fNl3u0kV85bduB+QOvsXlPKRGLjjChtyuexnJv5udKYLHlKkzd9RE4dY7Fu0opBig3SAOx7KvMi5XW2dp0bUf0IEv5pB+/yLwrJnfUgvSz5fyYL00kbHjcwe1St5QWTJpWypFleazccYFPgppL5+n6tWV14mnGZlyj18vHmNzVheu5Zaw/L7jfTw3nrQbZah9efOY6+2IvszEph/b78hjeRUNXDRRf1vHfsxUUVLjyYU8s7oj76beTzKse4VaRcqJcukPQrxkrI2vRvTMZPPp2CR49m/Cssd59v+can+HM7GDr2XQrD5C6ChJO6UkpA/8QLX+rywW8uh1j+uWzOKkSHS5M721ngu8mUJR7hUHvX2JCbzW5J0spwInowDvFLbkTAx/XEn08j5WJ5/A5kscznVzwKjHw4Snp7sRhj7ZllH/dMdVb3+xScw7M2lszqLnf9TqDXj3M4C7uDFBX8NVxHRkVzkQ/7ofUzV/loyWZrHZxZ3pvY3t0soi/nQD/+7yN1/Y0AP8OLLq/iM1JFRSA1RUl9t4xbS0Uds58yeM7rC1rjpzlz2evETTnMFHdNHTV1LRFOldXPhx7j92Jumpvj8nFYHfLvQouXydyxRG0Pq482cEFr+p+GTR+TXn1YTNDXt2WBVNK2fPuVTb+cI4tu3J5uJMrXTVwMb+Mr89WUYyKYY/6s9iRc8YNqZMmj8b9vbivtoa4Z2vmdixi/G/XmA9E3l9LH1FN/cYDAN73NWH81wVs3n6NdBcNG6qtWB8GdcthdsYl4i78P3v3Hh/TtTd+/DOIGZeEgwltxC0IdWnjEDQeRDWqR3tE+9CWFkVbaWnapyjaHtpHFH1a9FR6mqBVHHpKOPxEoidBG+peNBwhoiKHJKLELcmI9ftjZpK5JjPJBGm/79crf2Rmz9pr7732uszs9V3w/J9s4ymYXWDB1P8w9XpNlkx8kIm/kQXSxZ11RwZ0NWtocDw3SINXLezmTfk80orkrHT+vKeIJfsM6Ns0ZIH5zQYtmP98AafWXCPxyHV21NESa3v/d9FzssN1xm+6wbxzxkWJx4Q1Zd6TzUp+rfHr6MMzx39lxfY85poWjQxu25B9I1rT3fIblGIoxHIdutLofBHOIlSZgo8E9i3jmyav+5jxlga/tdnMSLvJvPPGxYbjx7Wlw5HjtD5HyWLtYPo5Ho3Va+WdRwD8mzA64DLx6QptpwY8Ydcg1yX0lc6cNi32PW3zzZLFvof1akT0wFaUxhPR0t5XA5e19Df/EuLVgN7tstEeqclfhjTgj7UBbnH82A0+PXaVwR//mzVvd2aEP+DVmPFv16Ll3zN553ARX+0rAjT4NdUyp5/9wrVeHQJImJrJgrW/siTzJvPOYbxOAd5WA0UAr9Z1GVbvGp83rM+K3jrqAlwrZGPqdZam5LLlQjHpU1vjh+Py6NUhgIR3TQt+H75M+D5MC37X4ePR9zHaYgVQfSMvvLmFb7t6Fg2pDyPeCKDR3zOZdtB0bKbFkWOfalPyzH6jvh35qf5pZm3NZ80vN5iXDto6Nen30B+YE96K7pZR8WpCbcr4Ft/B9bYrJyWRVn0cXHuLz9XQmD5v+4YGLTYBHhy95tWY8W9reSg+k5k7bjBh/XXMixKP79+MiU+am1FztE0fhjvtfNcgeGRb9nkbFyb+ap/BuDDx8Da81/oSj88rgpJ9u3A/AuTc4IN917F6COxiIfMuGl/R17peOqCrXxN/IPOcqcyZeNf34vGQPzDn8VZ0tOyHm64TdkEwahjPp6PHaBydQ3c4KxtNmvPuk9fYtPY6E9af4bEZbWiODyMmtabBqnOMP1zIkn1F6H11/HVCC0YXnsN7xS27utmrQ2vWftCQsf/I4i+Hi4g7ct10DmrSu50Prwy8jyGmR4Pr162JFgNHT13naEkKGvQNvJgU1ogpT/qVsWQI4N+QiYE3mHb8CuH7TAvSN9URM6EFoy3mHzeoa3xyI/nodZIt9uPXtDZzHmvGK481sfo13lmd2fXB+nTfdYWjLX3sv613eF2c16+O6hJn7Z3Po63Zdf4Ug1JuUFSnFmPCmvGuzaNlZdfzZbWlHtCkOZ+87UX3f+TwlxNFLNlXCLVqEOBXl0/C/Bnevb6LX2K4Wd7KuBf8+jVgXEIuS/f/ysFn9HTDdA5qeTHr7ZZM/+osYw9fZ0eRBr2vloWPtSIipG5JPkL+qGNN8k3eXH+dqxjv4afC/Jj3pLOOtVkZbSo16DqkCdMPZzP3CvjVrW31nuN7XkvfB+viffwGDXv8wW4ahtPr6tWYsVO0BP/rP7ybcp0tR64TR2ld9EFYCzqVFUm1QVOGP3CRpUcU2ubOHrn3Y867NXlw80UWHzddd1O7PL17EyIHNyuNpGzOVocANs3MZXNiNh/+bCjJl7ZOTfp19OGNJ1pbtc8lx+mhe9Ic0XjBH8v7Ys2H/l20aM8Y155zFFW0sv0BABo05anAizyeWoi2k54/WmQqqF0dvHdfZ1ktHd92lse7RdXRKKUqP4P5XnEynT4fXSYlqCnqleZVs48rZxk/I5eVgXpyJrdw2CgcW3OYTsmwaNKD5a/ZU81lx6fSckMRb419kP+16aDnb0ulwbcFDH0isOw13CrtGuv+L42nM+uxa0GgzSC6kM0Lf+aJ41rWzOrMCA8/znivy//XMXy/KWDU8E4VDyzgST+fpOun+RDagiPPeGC+mwv3o7i3mCM1WkXFFOJuuRP9BuFBuSyeeZbX8SF1TrsqCoIlRPVzT86hu5eZo/ONchCdz+g8//jRPvjIb1V6ViGFaGhYx7Yo3ebC5WJAQysf52uHeUY+B84o0NWgnt1qndc4dxmoVRPfe+XppjvGHGlV5yDS6t1hjrZZ7sR0F5V/P4p7y21yrhij3wXeuacdhXDKPJ8xuLELC7yKu88c0bhLVUU0FqJ6uifn0N27rvPDiUKoXY8XnEVhOniVpTc1hPZr/LuobDp3rIv/vutMiT3CzyH1ea5pLeAWxw9f493jBrTNGzLR3aUL3NaYx7rmMHd/Pn1mlc4D5Fohqw9c5avzGkLDfF1buuC3JOci69PBu3uDKlzvyB0X+O7n22ib+3go2qYL96O4RxSyNy6D9f8xsPrIbfCuR3CHu50n8XuWvy+dqMNFHPr3DXKpSWSA4xD14t5y8PhNcmvVZl5VRzQWopqp8kcuNS8fqMrkhRBCCCGE+E1Sf6twCB/xO/LbmkMnhBBCCCGEEL8jModOCCGEEEIIIaopGdAJIYQQQgghRDUlAzohhBBCCCGEqKZkQCeEEEIIIYQQ1ZQM6IQQQgghhBCimpIBnRBCCCGEEEJUUzKgE0IIIYQQQohqSgZ0VrKY+uoBdP93huy7nZUqcmb5ADQaHVN3Gv/fOVWHRjOA5Wfubr6EEEIIIYQQ7pMBnRWF4RYUXi3m2h3ca3Z8KrqXD9LjH7lVvq/i4iKgEEOx6X9DIdCAunWqfNdCCCGEEEIID6t1tzMg4GbR7Tu2rxYtHwQu4tfY+H9NLy3QCt+mdywLQgghhBBCCA+RAd09oNWfu1Dw5zuzL69atYEmNKxn/N+vffc7s2MhhBBCCCGEx8kjl8Ja9lpG+PZnRlwqOQYPbiuEEEIIIYTwuMr/QrfzOJpVN5nyQjfmh1i+cZnlH6Tz4oV67PisA31Nrxakn+X9tXn89ZfbXEWDvoEXz4T5sXhgI+MGJ9Pp89EVHn6hG2/XOc2srVf48pfbXK1Vg6D2PiwdGUBQE1NiJ88yZ8cNrpaRvWbt7yeyrw8AhgsX+GptNjPSbpF7C7zrezGwp54vh9+Hj83nin/JJGrtJT5Mv+V43wA3f2X7lgvM3VPAjiu3KTQdz/jHWzC7fwO8SjbMYuqrF/iyx/38u8NVhq25xo6b0Kn//fz8bDNI+Te6Fdd5+LEAksIbGj9yOp0B8y7T4Il2/K1ZLtM25vP3nNsU1q5B2INNiB3tj7+XZY5vcGjdGcZ9X8Chm8ruPESO/COf9AVqeqGlNjVrGl+vWbM2BPrR2Lxh0/tomb+DucM687G+H2/+7TMih3TC18suSfe2FUIIIYQQQnichx65VCVBNkrdprgYuKUoeSszg2c/vkR8PS3vDfGhe/1bHD98nTkZN1hMI6v0dv2YykNphRQ01xHRQ0Pa6ZvEHbtM7+h0jrwdQHsvIOcGH+y7TmEZOdPXum4c0BnOE/XRf5hV6MWkAY0Z0gjOpl9j4akb5IL1gO7yVQbOL+ZyAy3P96jNefO+l2WQPrU1fqbNdq7MIPQnDf06+7Cmgxd1rxXw6ffXmPv309ys8QCf9NWWnp9bkPtzNg/tvk3t1nWYprtFsnl/xYpCoOi2xVy6YigCUnaepu2V2+ia64jsAT/+XEDivhxCatUifcx9pkHjbfZ+mUbP3bcJ6tqAuAe8uJF+mVf2GbjqW481A7zp+oAp3b7zKbAY77Uam4Qaa3nwfZmTm8bjaz9l1owvmDusM3O9ezH9q1gHgzV3thVCCCGEEEJ42p2dQ5dRwIZbEPH4A8zob3zaMywUXnewacppA1Oebc+c/vWNgxZDHrEf/sKEc1eI3n2bT/rWgJAOFIQ4+LAjZ26w7SoED/Rj8VOm36NCYbyjbW/epm3f5nw7sqlxmGnI4/M5Z5iYfo3E0zC2jXGzgO73kTaiKe18Sp9cDWt9kq6f5rPwWC6f9G1une7V27Qd6M+W/9ajczHbuVdg3NMBRD9q+sXvYiav/m8OS/ZdYfeY+4y/fF7J5K+7i6F9Y757tZUxz6HN6ag9Qrcfirja3I+OTcraizUv73b0H7+Y7aPncDJlLZ9Of7NksDYp+lPeGd69ZLDmzrZCCCGEEEIIz7qzc+jq1EAPbDpyloyb5WzbpQnzzYM5AK/GjP6vOoBi1ekKrBJX37jvw/++xP4L5USVbOrD5+bBnGnfAzp5AUUcOVe6mV/QfVaDOQA61+ERgNxC7JZ2a+rD524M5gDo2rh0MAfQxI+h7YBbRaSdNL2Wc4vTQEgrH4vfOWsQ1FILGEg9784OLXh5067/eBbvziM/LZmYMfDlqB40bTyDXZXZVgghhBBCCOERd/YXuh7+bDx+ikEpebR561f6tavP24Nb8EigFld+xPHyq00IN0gpsHu+s3z3tWTeEzc4Gp9Pj7/8RKeAukzvdz9P9fSxH2DV0FDT5qWaToa+hvw8Du6+zHeZBtNcvlv8C6AY7HLpIN1y1dTYnJsa1LJNxLcWbYBvMq9yiUamQd1tdp8qALzodJ+7O7VVzNUbv5KTkUuRR7cVQgghhBBCVMYdXragLr1f6ErOgGzik3J5d18+gz9OJah3M74bc7/VLDqXmIKJlDmHrvf95Iy5D6hB+yGdON43j5RtOcz6/gajlp1k+g+N+G5ya+OcPLfcJm3zcQZuKiDT3Y96WgN/JnTP4+v9eQz87Bbvlcyhu402oCGD21UwXcNVTv7rU6a99SFxqVfBuxeTVq4xPkZZmW2FEEIIIYQQHuGxAd2Z/GtAfZe21TVvSvgLTQn/71w+/yiTibvz2Nj3/pK5ac7knykgBQj0rm18wbcu7/agzCiXAR0aWP3v5dOY/k81ZvuT19i29BRhh34ldm9rmwidLrhyjvnxBWR664j57+aM6NYAby+Ac7zxcjYL3UyuUjJ/4eOfFCGd6lLv9BXCjyi0dWrxeIgvi571Lwni4irD1ZOkLI/itXe+JPUq4N2L6esdBzpxZ1shhBBCCCGEZ1V+QGeaFxd/Ko9L1Df9ynaDQ6uyeK28uVt19DzcJgvOKWNETEtH85id0pAZIaVBUVanFAA1eaGj6Tefdi2YWdFfn7zq0zPACw4VOIjQ6YIcA/++BbT2YXTP0jluhgsGKjplrcIyCthwqybv92zD25Nde3zVKUMyU/UDWFgIWn0/pn9VxlIE7mwrhBBCCCGE8LjKD+h6NOKdDdd4/fhFWs26TkRz0xIDV7wIvQ+SLUY3O2MO8Vyulild6tOxPlzMzOe9PcVom3sTajcwK2buijQ+S9Lx4n3GcP07boJ/UBNe6eZ+Ns/EHSX4oIbxD9Wnf6Ma3Lh0nXnbC8C7HuEPVuC42/kwvMllUo7lMWyFgUn+NTibfo0PDxVx7g4/yErrOgyvfYP3lv3Me8tMr9WqQYC3hoCWPswJb0X3Zi7Gv7l5nas+/Zjuyppy7mwrhBBCCCGE8DgPDD30TJxUhFpxkXfTbzIvtwZBLeuT+HJbtIk/kZxbGgikc5f6BG+5zpytueTeAm2dmvQL0rNtZAta2ybbRc/JDtcZv+kG884ZHyEcE9aUeU82c3+uHeDX0Ydnjv/Kiu15zC0CatcguG1D9o1oTfeSpzI1eNUCauIgKIrG+H7JG6XHPWfPr2xO0aD31RE11g/izzEByzScp2tMXIMWqF3DYtBVE2oD2poa+81rGvNiXhycZt48dt8lNl6uw2eD6+EPUGRg3/HrzPvpV3qkG9gzN5BgVwZcPkOIzRniwoZubiuEEEIIIYTwOI1SSpW/2R10Mp0+H10mJagp6pXm5W8vOLjiJ/6YUpOV73RhpL/1e0dW/cSDOxWzxgfxlx53J39CCCGEEEKIqnFn16ETVeAKx84VAzVo4GP73g2yLyugJn4N73zOhBBCCCGEEFXrTs/2Eh7XgN4da6P9pYCn5/zMmz2NcwQpMrD90FU+zriNf5CeYRUNHiOEEEIIIYS4Z1XqkUvNywc8mRdRxdTf/ni3syCEEEIIIYTwoHtvDp0QQgghhBBCCJfIHDohhBBCCCGEqKZkQCeEEEIIIYQQ1ZQM6IQQQgghhBCimpIBnRBCCCGEEEJUUzKgE0IIIYQQQohqSgZ0QgghhBBCCFFNyYBOCCGEEEIIIaopGdAJIYQQQgghRDUlAzohhBBCCCGEqKZkQCeEEEIIIYQQ1ZQM6IQQQgghhBCimpIBnRBCCCGEEEJUUzKgE0IIIYQQQohqSgZ0QgghhBBCCFFNyYBOCCGEEEIIIaopGdAJIYQQQgghRDUlAzohhBBCCCGEqKZkQCeEEEIIIYQQ1ZQM6IQQQgghhBCimpIBnRBCCCGEEEJUUzKgE0IIIYQQQohqSgZ0QgghhBBCCFFNyYBOCCGEEEIIIaopGdAJIYQQQgghRDUlAzohhBBCCCGEqKZkQCeEEEIIIYQQ1ZQM6IQQQgghhBCimpIBnRBCCCGEEEJUUzKgE0IIIYQQQohqSgZ0QgghhBBCCFFNyYBOCCGEEEIIIaopGdAJIYQQQgghRDUlAzohhBBCCCGEqKZ+BwM6A5nbZtDfV4dGo0HnO5J1WXc7T0IIIYQQQghReVUzoCv4D4fjFjFmUAea+2jQaDSmwVRbeg6bQez2DArcSu4wcYvGMKhDc3w05vR0+LbtybAZsWzPKCO1rG94OWwuO3R/ZlFcAstmtoQrlT7CuyZ73Qh0Gh09oo/dvUwYcvg+qjc+Gg19YtOdbpMaF8Wwbr7oNBo0Gh+a9xxL7P4cDHc2t0IIIYQQQvxmeXhAZ/w1rLevHw89O4cj9R5h4sdxJCQkkJAQx19f70PDvX9lQmgbfHtHsftSecllsm1Gb3z9HuLZOUeo98hEPo5LMKYX91de79OQvX+dQGgbX3pH7cZRctk/fEs8ELF0JZOHhvHc61E89YBnj9reGZYP0KDRTWWnh1O+efPujkYNmduY2rMFfWf+yFWnW2WzblQLOg97nx/ow7hp0xjdT8fFvV8yoUd3Zu7Mv4M5FkIIIYQQ4jdMeUyROhETqrRoVcDE9Sotv8jJdjfV6fXjlD8obegydcppcidUTKhWoQ1QE9enKefJnVbrx/kr0KrQZfapnYoJURCsok9U4JAq7JSKCUFBpEq6k7utYnlJU1SAFqUNmKg2fRWhABUS4+gKZqhlTw5Si/Zlq9LLVqRORIcoQBG6TGXcuWwLIYQQQgjxm+WxX+guJU9l4IRdPLxgN3uXhNPO28vJljpah0ezeUEXCpOnsXy3owfwLpE8dSATdj3Mgt17WRLeDufJtSY8ejMLuhSSPG05DpPDi1o1K3RYwsLhfy6GFzdx8vgShvjXLmPLVozduJXJ3X0pvWxetH90DCEAyUfIqOrMCiGEEEII8TvgmQGd4QjLXl9IZshCPn89iEZAwbH1TO5vnD/l03ksq479wsaXO9D3r4cBL7o+P5Oh5PJF4iEHyS3j9YWZhCz8nNeDGgEFHFs/2RTYxIfOY1dx7JeNvNyhL8bkuvL8zKGQ+wUlye2dja9GQ9sJKUAKE9qa5t69kWyxoxz2r5rMoOY+pfPyug0jaqv9HL+dU3VofGeztyCDrTMGmeYG6vDtNpbYQ6UPe55ZPgCNpi0TUgAWMsA852/Acs6UfyLJ2R/LWKt5Z8P4bK/FI4o7p6LTaBiw3JxaOrF9SucpWv6VbmNKPXMbUcO64aszz2nsxrCobWTaDoIPRtFCo0E3YDmWM+T6zL3M8SVD8Hc2uHZVoB+NLf5Nj+1jejz1EocsrofOtxtjYw9ZPEp7kKgWGjS6cNZaBbbJYm24Do1uBOuyTS9lr2OEToPGZyo7ZdKeEEIIIYT4jarliUTyv1vMO0f1zNw1jvZeQPpyHu/2Ism+w1kUN44mu97mxW5dqM1VHvmqmfFDTVvzkB42/JRBNsE0LU2N7xa/w1H9THaNa48xucfp9mIyvsMXETeuCbvefpFuXWrD1UcoTe4h9Gzgp4xsCG4KHZ4jLqE3pzdO5oUlELFiMX9uCvi2N37AkEbsoK5MSC7Eu1M4EaPa4301jc1fxzFz8BaWTU/kYFRffEy5KjYUQu5Snus8l/SctoQ/P437zm/m67gvmdD7Mt7pcYzwA7+BC0hIOMbGyS+w5MSfmJcwmYcAGnfEr5zzaNgbRfees7jcaxJ/jRtCC86yfcVCNh3J5dVgH3NGKASKiotNn9LTddw0pvUpTSf7+8/5ctcVGtStU5p2WiyDuk5gV/MhvLfsQ7o3ucHZzfN4c2YY7fatIT1uhH3+rhZQaPGvl05XzhGULf/4TlIAbZ9OtLJ9s3AXn414iG82FtDvmQim1TNeiy8n9OYXjpAwvj1edOOVryL5fMBCRk/fzKMrhtAIuLR5OqM3QGjMBzzZ1DbhaxTcBCo7CBVCCCGEEOJeVPmnNotUUqRWoZ+pdhUppdQVlRSpVxCiSqdX5anECL2CQLXgsPk10zyzkBjreXRFSSpSi9LP3GWcf3UlSUXqbbbLS1QRehSBC1RpcjEqxMGcLuMcOsu8WL6O8o9MUnmWb+QlqUh/FHRRi1JLX06KRAFKG7pAHSz5QOm8sNBllrPCKjaHzqX5fkmRZcxds8i//yy1p2QCmyk//pEqyepgzfnXq1l73MioK/mwVXRCRYegwF/N2mM9IdJ8LbQBU1RitsWsuxMxKlSLQhupkkpezlNJkf4K9CoiMa+0LIREqxPO5lkKIYQQQgjxG+WBRy6PcyC+EB7rRScvwHCAf0bnoh03k+EB5m0a0bJLayCYDiU/zeSRlQa0aYbeKrkDGJPrhDG5fxKdq2XczOGUJtcSY3IdSn/pycvCmJxVak6kk/xlCvA8S2aH0sjyrUahvDV3MHCUb3bZhuQPZuHnbxFU8gEv2g8YRTCQfMS1WWFZPyWSmGj9d8D0zGN9bz1wmG/+uZ+cCj0meIlt745gYWYXFmyeQbD5V6kzO1mdAi3HhtOx6AIXLpj/8vB54BFaksu2I06WH/AIA2lfvUJkCvhPWckbwY5/LpsYM59HfS1m3bUfzfRxQOEqdpY8mduI0HeXEqHPZcnISN6IHMmS3BCil5l+HRZCCCGEEOJ3pPKPXOaf5cgJCBzfwvh4omlANvjRbiWPK4KBX47uheCxtDe/mJ9Dei7oA3wttoP8s0c4QSDjWxhfPX4gnkIG82g3i60Mv2BMrj2lyaWTi54AX8vUnDlLagq3hKTnAAAgAElEQVQQ0peODjb3a9cTPfGkpJ6F0mEkDoOr1KzlxtN82fwwexDPbLB+NXRZBkljW9F02DzWPHeU0VN60PT9ToS/Np2prz1Fr/tde9Tx0rZ3Gbkkly4LvuP1rha5yjhCMsD7/bjvfcefbe7yMbjPGDAnGUJj+G5OX1y5QkZetAkKAVK4fN3i5UaP8sGqCP4RtoSFX0OXBd8xTkZzQgghhBDid6jyv9DlXuA00KRhPeP/eVmcAFr5Wk5mOs7hfwHdA2htesWQ+iNb0fJkcAeb5E4DTShN7gTQCuvkDmNMriQ1Un/cCtonsUmuUrReng6N2ZQRcQqlrP+Sxpp+Z/Rqz4hVx8lNSyZmTBN++HgUvf3aM2JtWvmLcV/aTOQTS8gNiebb17s6HGQGf7Sf8+fPO/zbNCrAwScq79Khj3h68EIy/SOJ/3a8h35FM3Dxl+OYQ8WkHTlbxpp4QgghhBBC/HZ5eGHxUkW3zEOQSxz6KJJ3TgC1zb9mXSIh+iNy9W8xbqArv9cUUZrcIT6KfAdjcqbRwaUEoj/KRf/WOFxKjsb4BQIphzjtYKSUdXIPucDgPwa6kpiHeeHdrj/jF28n62wikf6ZfDM6lt1lfuYSmyOf5utCJ48e+gUSDOw9fYnGzZrRzMHfHyoX78ShgmOf83TvKST7RpL00yeENir/M9byOb4zBQjEzyos5kpeeS0Znl/Fpin+FH79Iu9uK2+VeiGEEEIIIX57Kj+gq++NHrhofiaufXcGA0unzWR14mqingim9+I2jPoTsGoxH21IZPXUgTz9tS+Ra9+kt5dtcnrgIqXJDQaWMm3mahJXR/FEcG8WtxmFMbmP2JC4mqkDn+Zr30jWvtnbxccfOxLytB5YwuzPj1ktUWDI2cZH0+NBO5Rn+tiFTHSRnmZtAE7wn6zytnXOy7cnj/QHCg0Ul7Fd1tpxPP01hMYsc/zoYfu+jOwCLF3CN7/YjmAN5KSm2i9dUEkFxz7n8W4TSfaNJHH/fJcGc9H/M5vvLSYPGtJW8+HXgP8LDOhqfjWd5RMmksxQvpr7HEPeNs+nexcZ0wkhhBBCiN+bys+hMy8/kHSUrLe64uc3nIVrvmPYhAWMfFJP0LNR7P5pPJ0vPkrxsAlMCd+At18YbyZuZLaDXr55+YGko1m81dUPv+ELWfPdMCYsGMmT+iCejdrNT+M7c/HRYoZNmEL4Bm/8wt4kceNsN34B8qL3m2uJXDGAhZM74fu3cJ4f0h7vCz+ybM0Ocgu9GbRsHsPKW2fAKR/adO8CX8cz7onnOBpWmx9PDeTLb0fZh+svcYbljwXzad3xRLzQnxZ1TcsKfA3+U8L5o9PP7WTR6A0U0g7vY8t4922Ltx56jg+e6YoXDzBqUSQfDVjIqC592fbBJJ7r2AQuHmf1F3NYs6Mz0RlJmJ/85OAC2j48lXMPLyM1aWzJLML8vcuJWn/C+M+pfwGQtno+b5/6g2l3H/BMVy/Ij+e1bhNJLmxA9//S8K+P3+VfNrkOHDaDscE2P6cem0vfFp/R75kX6YXpWuBP5Fev0M20SfryCUxMhtBlHzHCD+BRPlj2PEufWMK4D57mp0/MQW6OsbhrJ15PG8eWnFgGuz5xTwghhBBCiOqj8oEyi9SumXqH4egrltwuNVNvG3a/4jKWhSoIVVarCpjlHVQrJ4WpAL1WAQqtXgWETVIr92Ur213vmKJ1nE7GMhUKSjtlh81xnFBrxnRS3qDAW3X6yw51pcycFqkTGyapsEA/02dQ3n7BakzMPpVtmZkdU5TWapmEHWqK1ri93d/QNeqCxUdvno5Xc8KDlN68vbefChu9UK0/ZrWWgVIH5ih/UNruS5TFyg2mc+lkX6CGrjHt7cK3arizPJn+AkvXryhZtiAy8axKnB6m/LxRoFX6oDEqxvJamNLVhsbYLFFwTq0ZqlXgr+YcML+WpCJBwfNqU9knXgghhBBCiGpLo5RSlR4VXtrMC/c/wde1B7EoaQUTu/tWah3nS5tf4P4nvqb2oEUkrZhId1+JYPhblh7bh7YTUohMUnwS6qFEDdt4tXYYS7osIvXIZB7wULJCCCGEEELcSyr/yCVAoyF8cXAlhY+N4vUeTXmnUzjPP/s4j/ZoQV2AG2fZt20L/9z4A/1W5zC/b3nJfcHBlYU8Nup1ejR9h07hz/Ps44/So0VdjMntY9uWf7Lxh36szplPOcmJ36FLCV+zFH+m/HWMDOaEEEIIIcRvlmcGdIDugZGsTX+U9zb/nQWfR5OwaAtLcguNb2r1BLQKos/ET3i2s0up8cDItaQ/+h6b/76Az6MTWLRlCaXJBdAqqA8TP3kWl5ITvzPHWDnja3h+E2/3lclzQgghhBDit8szj1wKUQlnlg+g9YunmHPgLDO6lb99ufbOxnfgMaKPr+WpCge2EUIIIYQQ4t4nAzohhBBCCCGEqKaqbGFxIYQQQgghhBBVSwZ0QgghhBBCCFFNyYBOCCGEEEIIIaopGdAJIYQQQgghRDUlAzohhBBCCCGEqKZkQCeEEEIIIYQQ1ZQM6IQQQgghhBCimpIBnZvOLB+ARqNj6k5PprqTqToNmgHLOePJZM2pT9Wh0QxgeVUkXqYzLB+gQaObivF0VfI4zyxngEZDi6iDHs2lENWDgcxtM+jvq0Oj0aDzHcm6rLudJzfsnIpOo2GAxysi23rmTnK+70uHYhnb2QeNRoPGpzML9hrueO5sVV1bUM3Lprijdk7VodGNYF323c6JsGfsp+lGrMOVy1M1fWJRETKgc1NxcRFQiKG49LWDUS3QaHyISMyvaKoYCoGiYorL3bYCqRsTp7gqEi97zxhPl8F0XKbjbFCXOpgrAk35f+YBYHExRUBm7pU7kvvsdSPQ2eRF59uWQZNXsT/nbnfODhLVQoPGJ4IKF7vfrWp67rK+4eWwuezQ/ZlFcQksm9kSyr0VDFw9uZ3YyYNoa+psazQafJp3oOewGcRuz6CgovnJXscInQZdj2iOubJ9sQFjNefpisi2nimDIYf9qyYzqLl5oNW8kvezk30bdvPxoAl8eaotU1YlEPfxk9QtuFl2UqYvrHROe0aV/+KvytqCCpVNTyogY3sskwe1xVenKbm2lS7jv2cHo2hh2xbrfGk7aDKr9udQmRaw2FAIhVn8es1juXVL5ftsVe/u9T+M/bTCrF9x5fI46hOLu6PW3c7Ab0HBtct3Owv3qBa0fBC46EdjAGripQVa+dIUyO/0PNOmBZdu/uteln2RTG6Xp5j2eNvS1wM70ehOZtvk2q9ZFAJdnpqGMTtXSUv8B1s+HUWPL5YScySB8e297kLOAAqQYldR1fPcZf/wLfFAxNKVTH7UCwgr5xOX2B31JwbN/JGreOMX9gzTgpoBcOHQt2zZMpcJcR+TtqOA+X0rkKGbN+9sn73Sslg3qiNPf3MV707hRIxqD2mb+frTUfTY8AsHzs6gm6d2dSiRL3IhOHoN859rT/nXipIvrAqd9oyq9ou/ynC/bHqQIZPNr4fydHQ6hVo9/Z6ZRq9mcDUtmY3fzWVC3E449QPjA+5cln4TruSSCehDX+LF4D8AcDVtM1/HfcqoxA0c3vEz8/v63N08VlB16LPd2/0PcS+SAZ0HPByVj4q627m4F3lRqzbQpCH1APCjfffSd32Cx/KhxXiO9Fh++CKZ3Ede5cMPQ+9oTsvyyKsfUpKdDxeSFjuIrhOSeW3+dwyPHczdadIeJipfIcWuIqrnubt2NRcIpktLVxpxA3tnP8TDszLRhi5g35rX6e5r+bkPoeA/HI5PJq+iHd1Wo9haMKqCH74Ljvydmd9cRfv8Js6sGGL6kuhDFmZuY+aft3l2cHr9MrnAfwe09mSq9yz3yqYnGUhb+ixPRKejDY0mdcsrPKArffczQw6pm5PJq3+Hs/Ub0v65qXxYMhr+kA+2vUqHsCUs+CSe/+k7gqZ3NXcVU536bPdm/0Pci6rukcuCDLYvHknbAbGke3BbQ04qcTN64/NGcoWy5c7nK7sv8VvkRfvR0xkHFC5N5MDdzo74nfGiVk0XNjsWzfhZmeAfSfy3b9kM5kx09/Ng+EgG+Hk8k/emvCxOAN37drT6xd/L/1HmH5xPVXyFVLvW7+kbdBfLpidlrWdaZAroI9j0rfVgzpglXzqFj6BvdRx13KMaPfo0IwHiD3Dibmfmd0f6H8I5zw/oCjLYGvUEbRu2IfT11aRTE6d1vBvbGnL2s2pybxo37cywuT9S5OVey+HO593dl6NJocbXwlmblcP+2LF0M81f8Wk+iBnbMst//tyQyeaItug0OkZuvOjaQRZksHXGIJr7aNBodPh2G0vs/hxulXmc5u2Nz8d3GxbF1gxHMw4ucchy7olp222ZZR9JTS8t1DZf15rUrA2Bfo1dO54yXDq0isn9fY3PmPs0Z9CMbTjKiiFzG1HDupXMq9D5dmNYlONtXebVki7BNq/tnIpO48vsvZfYHdXfuD+fziy0iN9Sfl5Mc7t0b5Bslz8De2e3QKPpQ2w6lBWMoSBjq9V+nM4TSo+lj5MgFY6CJxhy9hM7tjRdn+Y9GfbZXpzOQjDNwdC9kWxf3g17md1Cg6aP5Zc4NmVM40PzQZNZdeiS9WdNc43C12aRtnYsnX2M5XHsxmzzCbC4D8zzDrZY7McD584iDzn7Yxnbrfyy6IhL9+De2fhqNLSdkAKkMKGtadsyvmja+4//5Shaxv1tNqFuPK+cHtvHSdAMR/O3nM3pKiBj64yS66jz7cbY2P3kOK2IMtkWNaykjiyrbrEugz40HzSDrRmFrh1cvYbogZQvt5HmwvW5dGgVkwc1x6dk3uEgJq86xKWyPpS9lnCNBs2AhQAsHGC6Vn1c+GKzEipTzyW/YbqGNtfBpbbKlbJpO29Ro8O32zCittrObTPdl+FryUpbawooo8N37EanwRmyf1jDhkIInPoyj7paziuSn5z9xI7tbCwLOl+6jY3l0CVKym5nc5vbf4Z9ubWtKzpb3hfG8mS8fqXp93fWnrncZhvvTd/ZeynI2MoMczm2zHtltfKloe1rlw5Z589UfzrdX7HN+es2lli7jQ3kpMYRNaynVbo9rY7jIutGaCzaR2tZa8PRaTSYi6XTQB4FGWy1rIvMbZDdnMF0Yvs4mc/qKPiTC/0Dl1W0/+FWf8+o2LJcanzo7EKfr4SLZcG2r2xfFgxkbotiWMl9099BvWSwboc1PjTvOYzP9rowR9Imn/Z1pyvlz/GxuN3vryzlIUX5aSp+zhAVoEUBShswRM1Z/5PKulm5bW9m7VYrJ/VS3hi39e41ScUkp6n8Itfy5c7nXdn2VEyIAlRkkiuv6VVAgLdCq1f9Rk9T00b3U3otCvzVrD2WGUhSkaAIiVGnlFJK5amkSH8FWhW64KDKc+VAi06omFCtMd+dwlXEtGlqdD+90uKv/P1REKJiTlluHqNCtSjwVp3CI9S0adNURHgn47FrA9T0HVcsEjfnB6XV91Ojp01T00aHKT9vFKHLVIYr+XPFqRgVAgrLE+nofX9/5Y9W6fuNVtOmjVb99Mbj9p+1R1meVfMxagOGqDmrElRCQpyKMV1f7dA16ly52bG/rkoppa5sUs+DQj9L7TG/lhRpzIO/v0IboIZETFOjw4LVJwfcy8vhBYEKtGrclivW+yzapWbqUXRZpFKNuVMxISiIVJbZy0uKVP5QWuZKygEK70Hqa4syYD6fIZYFo+RwbMpM0R41yx+Fdy81KSbOmP/p4arTIHOZdeSwWhCIQjtO2R/OTKUH1WVRqjnnpjLmrXpNilFxCQkqYdUcNSRAa3+/mPKt9/dXWrxVr9HTVER4sHppwwWl1Dm1ZqjWeA3mrFIJCQlq1cLRqp9+isV58ty50wcEKG8XyqIjLt+DV9LUDwkJakVEoIJAFbEiQSUkJKiEQ85K8AkVHYyC59WmK042ccJY5q3rCiPbOsrZa0XqREyo6Zx1UuERpfWev7+xDgmxroiM9ZbF9YqLmaR6eaPQDlVrLA8xL0lF+qMoOd8RKryTt0Lrr/z19tfTwdGpZaY6UhvwnIrZnaUcNDmmXRnLgnevSSomLkElJKxSc4YEKK3dtbUtS+fUoYQElTDvTwpQf5pnulY/pKlyL0V59Z/D8+1ePWd3X5tfCxyqhgdp7a4Z+KvIpDJaoPLKpoN2aVpEuOrkbbyOAdN3WJwX07nU+yt/Lcq712g1LSJcBb+0QV1wdkYicVxHO1Oh/ASoAG/j+Y2YFmGqk1Da0FfUK0Hakvo+wlQ+8J+irJpPm7oiYEiEmhZh7v9oVegrr6ggrX36/lN2WJUZ99psU1nxD1ABWvOxmu4XF9s/c5tm2z6Y6267Os58f5a0EQlqlbmf5z9LWVbhxuumV/7+pWWu9Fhs7vuMZSrUdL1sy7flvXBl0/MKqzbF7JxaOdi6HXLYttvVL5b3gbcaZN0AGMtGiIP2z9F5K6d/4EhV9D/cKjvm+9CqP4nCP1JZVgllnksXyoJ1X9nmXtKGqldeCVJau/vGX02xyHPRnlnW9XVcjJoe3kkNctC3seLgmo8O81PeoEKXmXq2LpY/+2Mpr9/veZUe0FkPzrRK32+6Wv+T44bSnW2tB1feqtOYRSo5Lb/cTlJFPu/Otu4N6FD4j1ObzpamlJcYofSgtFN2WKRq2VDnqaQpAUqLVoVGpzrtcNi6smWc0oLSRyRaDACL1NlN44ydVKtG3NwJsW+sSzq1JQMHpVTqItUFlDY0Rp2wPCk3T6v4TXvK76i4ytUBHf5q3KazpdcnL1FF6FFop6jSs2o6RpvKR6kidSLaeNPN2qPK5LhCLR3cWjVopgoVbaiKTrW9am7kxXyux22xbsyTIpXWqpFwMCi5kqQi9cY8xFhdqNJOtlW67gzoTNsGR58o+6TZSF3UxcEAtUglRWqt0r+SFKn0aFVozAmbToLp2g5dU9qpsygHkYnZNvep6V6KSCyjrvDcuXOtLJaVBxfvQVXWYMuW6RzYDnBMDRNWf9bpVXpAd2WLGqdFoY9QiRaHVXR2kxrnj11Hx7g/+3NQdCLa2Am2uEmNZQkVEm1ZRvLUwQWmAWS5AzqlVN5BFfOcqbNgbqTjT1vXs6ayYFffqTyVGKFXMFStKS2MDr8cMNcHLg80lCotU12eMnYm7f6eUl3sroF79ZzTAR0o70ExyrLqKimHjjqtdll3XG7Mdah/ZJL1F5MlHakuqrT/bT6XKP/IRJVdbmOfoZaFoiBYuVotVTg/4zapkmbc/OWaqXObWJLRIrVrpl6BVkUm2X8BZVtXmAdGdsdrTl8bqUqTcbe+MNcBNl8KF51Q0SEoCFXLyvsm1lSGAyNWGAfpCQkqLsY4+PTuNUftssrGFZUUqXdQf5b2eYaW3jQlZU4bukAdLM2cqcxadKaVUupKmtpv10+8oraMs25DSuoem3rTfP61kUkl596+bTfl30EbVDIYsvpismIDOsf9A8c83v9wu+z4q+ErLfugpfu2r8MdnEsXy4LjvrL5XrJv5833jf31dL0eMDP3T2yv+c3T8WrTntIvVF0qf06PxVm/3/MqN6A7tcxU0PWq36SVarejn9gqsG3RjinGwZV3JxU+J16lufpzXAU+7+6+3B3QRSTapFeUqCKcdowWq/joUKXFWw1aZtOxVVdU2g8JJRWr8W+HOma6P3dM0SoIVAsO2+fZWeec5zc5GIyZvs2y2N78q5FVI1UVXB3Q2XXWi1RihM0xmjqvLd/boc6fP2/9t+M91dLJQMZ6d8Zr2OUpc4dqtArzM33DGTRH7bH6UstYoToc8LiVF1Pla9V4mAdAg9XKkm8u7TuS5kFfoKNCUNIJseh4ujOgu7BGDTU1wPvK72mVMjemloOhoiQVqUUxeGXJt8TG8huuVpy0OT/nT6oV4Y7z7XjQtkfN0hsr1PWnndUxnjt3LpXFMs6Lq/eg8SOVHNBd2aOWWQwQnuqCk3qrEgO6HVOcn0e7jo6pQ97yPbXD9r44v0O919IybXPn3dGvjk4GVU4Vqeyf15f84gYo/+FrSgdvpmMIX3HS7n49uSLc5py5M6Aruw4v7fiX82d5vt2s55wP6Bxdc/MvvZYDWMcclxvzuXH8S/G5lYNtyoN5+whl22w62atpe1fuCc/mx3jOHHQgHXXmndYVpvsnOFrZJ1O5NrustE9EB7v2ZYN5kODgT6vvp6YnWnyRpXaoKVoU4SvUSdtyeHKFCrdp152evxPRKrisPoAFY5nTqtI+srmdtByUl/5qMnNXkc1rFufA3CYFLlD2NVfp4MLuvndzQOfOF6Ie639UtOw4Ojbz9bH4gtW+/+teWXDaV3Z6TPb5u7BmqOnLi30ufBFkZn6CyPKLE9fZlz93+/2e55kol7V9adTMuLaYJ7fV6prQ3Nd2lrPr3Pl8ZffljN2keK9a1Ha2cdoHvDAxl0J9BP/z5/ZYf/LfrA4fxKxcy9e0TNlRwPy+Z0jfXwg8woMdXcjU2VRSgJC+HR1ESPKjXU89xKeQehYIgLysE0AInVrcIxP8a9eyOTemaJqWMo6QDPB+P+5733EyzV3c3dF18zgKgBZ9QD8mxUznjVH9ae2guHg5igrgVl4CGDxxMIxayt93fszgIT6Q/x2rogth6GgGlhHA4mz6PgqBwX/s6iBjbegSAmzYR3o6hLob2bDpMOateY6jo6fQo+n7dAp/jelTX+OpXvdT5l0TMBjj4fydnR8Pxng4qzAezkCMh5NO2q5CII4X2sW5nie7cgAQzKSNc9g6aCbD2qxE3+8ZZr49kxcfaYd3GcW3wufOlbLocIfu3YPuqUdDPZCbx/V8KNmBTzBjLcLKJhfOY91Rd9Mu25n0/RQCj7hUEWVwxHhj0K/cG+Msx3cBwQ/TvtJh3bzw7RTOjE3hvJkRx2v9hrH0m2d48dHu/DA+gPS0XRQCcS+0w43S6IKy6nCLlyKTUJ84CtGSzBuaASy0fMmD9Zy99gQ+DOzN5eo1cD+c4VlSjYWcjg6umV+7nuiJJ8WukNfGtVgypmVxUly9TzyXnxadQgDcCwJjV1e0wJhMLedxBkqyXsH6wss+7ZpuBuoJiTnFDyVRLgv49d/bmfvcUOaGhXDLvHRBehrGKvwFXK/CHQTRqemoTjfu9z+H97J9+xaOnDe+8uveNKzXP/Oiz/C30C+cw5ItR5j8QFfgGP9vcQroZ/Fk7zIbAPYZGwDsWwAv2hgbAPZVqPG0SKkCUYMq3f/wZFvTPhBjlXAVp1VChcqCg75yi04Yb4/yz1nTYfNY89xRRk/pQdP3OxH+2nSmvvYUve4vq3eSh7Fr24nyu7aulL8yjqWsfr8HVS4oSsBYEnLTiH+7NUfeH8ZDfr50HhZFXKqDRSfd2Nar73xysnaz9JlCvpwQSnu9H/0nx7K9jMmbFf18ZfflUe3fZ1VMKNrcJYz7INlm8n0wf8lRKGX5Z+4ImBa39SgtbsaduScFf7Sf8+fPO/zbNMq1ijkyqfR855xKYPF4x5Wpp/LiN3A0Q4Gvl8aTDeSnrGNloZZxLw32QIjo2tSs0HX1ov2IVRzPTSM5ZgxNfviYUb39aD9ibTkBJvwYOHoo8DVL47OBfFLWraRQO46XBtsezQTinJyf8znv08fFnDbqPYPdOVn8tP49+lxcT+Tg9uh7zmZ3pQMBVPTcVVRF78EOBD+pBb5hQ8qdXTi3uCIVUfBH7Hd23TeNMvUxTGuweZiudTjRG+cSCKSs3mkV4GBCnJM8nc/hfVcLo5Wy6vDK8UQ9d7doK9zQeNG0dSAA8QeO3AP5udvuRJut4w8dHmP+l/9LIJks+CTeOmDNhDin5TCnYjcNXNrN7G4N8XuoHyMj5zFvnvHvi+Rcu029ej/Jq3o4MT+OvQDHviP2KHR557+xjSNSEbXvbAMAeK7/UbYqKDtVURac8WrPiFXHyU1LJmZME374eBS9/dozYm1a5QORuFH+7rZKR7n08m7HYzM2ceryaeLn9KNgy0yGdW5K487DiIpLxTI4nDvb6u7vxcjFu8nL3sfKlwI4+OkEQts0xLf/ZGK320ajsufO5yu7L8+pRZvx3xIf6U/mwsE8HetqYQwgoAfAvzh83PY9A7ds+1iN/YwdmEOnHaSfxck9ucBg/mhsK6nXUA/sJ/Vslcfo8Ry/QIKBvacv0bhZM5o5+PuD53+Q9Uxemg7mpXFa2PAV32WZB0CjeCqk7J8m9M3aALDrRJr9m4bTHE0B9P3o1Mr6rbSsPJcPxcu7Hf3HL2Z71lkSI/3J/GY0sbvL/kzTwS9hPJzvyMpPYd3KQrSjnqL0cEzftHOYC/mOz08zvbeTb26d0N3Pg+EzWP9zDqnRoXBoFjM32kfzNKvouaswN+9B9/gwcNxb6Clk6bQvOOL2bZuGG0XCSoCxIuJf9hURBruKyI9A443BpcZOrnvJjWH6NWPvLtLsxqjF3KpE1eTl04QmFv+3MBZGDl/Id5ynZvoyf+29o6q0njvCgXiANjTTV+TzjfEzFnJOO7g+WSf3kAsMrlghB6Dr4xF0AU4sjmNvuWWg6vNTZaq0vqiAeg2N94zplxpatMRYhV8g30k51Ffwpjm28mVmHYKgKfEcv3Sz5MuQUzEhDrYO5r/f6QK5n/HP3QaOfRfLUbowfuADZe9E34w2ALtOYN8CGDhtbADoZ994UsGq8s7xZNlJO8EugDbNcFolVGFZKJsX3u36M37xdrLOJhLpn8k3o2Nx3j0xPcmyP5Wyurbulb+7y3PLFuhaWwzWhuB7Ko6ZwzrTdJCDsK5ubOvl2710sDUpiIIdnzIhtA0N7eLNOubO5yu7L89oROj874gJheQJA5ma7NrPCg/0GgqcYP7ftln8slfAsVWjGLfEZuOOITytB5bM5vNjlsNVAznbPmJ6PGiHPkMf0w8oQWEvoaeQ6A++sv41piCDrauSyKrAUVa59n0Z2QVYuk+NnmIAACAASURBVIRvfrG9Ww3kpKZWbumCKs2LDyFPjUJLPKs2rebvSwvRvzWOgeU8auYTNIjBwN73FrHVKsx+AceWzuSjXPB/dTBB5pfre6MHctfttOj0G8jcPJ7RVs91OeDlS89H+uPskQPrjIXw1CgtxK9i0+q/s7RQz1vjBlo8/uFFzyHj0LKXqBW77b9AKcjg8PGK/rym44GHH6cVUFTsPKNun7vKcvMedJdX7zdZG+kPR6fQ54nF9ssuOPqiB6jvrQdyWbfzSGnjb8hk8/jRlFckAHigF0OBE/P/xjaLS1ZwbBWj7Cqi9vQ13hgs+eYXu86GISeV1JIbI4Cuj+qBr/lwtcUXXYYcvp/9DJF7y89a8tS2jIzdj/WpKODYli9JAboM7UkrwKvnEMZpYW/UCnbbF0YyDh8ve+mCO8lj9VwK789YhWVRvLTtb8w/Adrhf6ZHhR5z7UiIsZAz+/NjVve1IWcbHxkLOc9UtJADPDCKqOe1kDmLpyfGYfdgjeEqJ7fGsiX9DuWnqlRxfeEeA2nbjPeMvn8nWgB49WSI8aZhhf1NQ0HGYSpahWdnHAUe5KXxj9Gh5NuJAn4973g5pwcGjqcLuXzx/5byzyVHYfA0nipnPIdPEIOMDQCLtlo/NVZwbCkzjQ0Ag0sbT4xV5Tp2WnxjZsjczPhyG887rKJlJ+V9ZqyyvE8ukRwdxV60DP9zD+cLmldhWXCVl29PjN0TA85b/SDCXtJDYTQffGX940lBxlZWJRl7tu6Wv7uqymbn3Tytkhc9pwJCXZgE6Ma2Rdk/q/XTeylvt8KHVezzjrZ1NyiK/W5cDC5wbo0aqsVhpCDHmTWFlccU7rkkRLG/Cg0NtJs4XhLdyCKMrWWI9mVW+zSFgsfBsgWWoXMry9WgKA7edzSxv+QYvXup0QuNIdETVi00HWf5Ub6cX0MHnIR4rnBeLCOp2UzoNuXOQTAGi5DxJaH3LUJVB0yxiYRnjtRkDpldutSFbZnJWDZI6YPC1XRTCOKS0PK2IbqdsIzohn6msjucknDiWhUwZLopVLxpaQRvm+hQZZWTHVOU3i/M4hyblj7QhqpldlFeK3Hu3CyLjrh3D7oTFMV8SCfUmuH+pjLkrfyCS8O0B5sm19ulZ44UZw4TbV6KwT9UhQa6UG+pIrVnlmmf3r3UaIvw2P6hoSrQ9h4piS7orXqNXqhWJRiXCFhoCvVsFe3OXCfa5k0bqkJdCIpyYI556ZUgY2h+y+trFWTAIrJpwBCLMj/dtEyCg2i6noxy6eayBe7ULc6DomiVVouDEPKutT9Oy2bJ9bVYJsAyFLxV8C93g9uY97FLzQrSmsqcnwozLTlS0kZZBi7wUH6cHm9ZQVHsrqvzwBpltmcu1RfOA1u43K6ZjkUf+pJFpNUIFR7kOHx9aTTIADVkumnpGVP4eG+b4BFO60gH58ocwbskJP2qhWp0L2+l1WqdHIc50Ifxb/BK+wUaHJ2D0tD+pSHsLUP7T7GJEGnOlznUfsnyLI7quXL6B45USf/DjbITGBpqXArAvGxBL1NdaRP9t8xz6UJZcHqcToO22ZbtDLVskF4FhVv0G0xR622X/rBj0abYLltgjrDsTvlzr9/veVU3oPuNylgWahfZxtXXjEwRgKzWb3P0mlJ5SVOMSzy4uNZbUfY+FTMmqKRx8gubruJP3zTlxX7QkHdwpZoUFmDaHqXVB6iwSSsdRzEsOqsS54SrIH1pwxkcPkfFO40kWAGmiG1OQ7uW8b4xSqL9Md48Ha/mhAeVHKOxwV+o1h8rf3U/59fQAVNkvNAyRonu5cWiY2wbhtmYO2PUP7vw+EXqbOIcFR7sV7qeol+wCp8Trxxeqpupat2kfhZlZpJaeTDPrswUndigJoUFmjpIpus/Jsb1iJcWXzjYrxNk3iZb7Vs5qSSSF2hNg8jv1VnL3ZRVTvJ2qYXhwSrAXE61ehVgug88eu4qUBYdcecedHYfl+2mytq9Uk23PCdolT4gWIXPWaV+dFAobqauU5NKGns/FTZppTqYZzpnLtRbqihb7YsZU1JXePuFqenxp9VN0zmzu0dunlbxlnUL3sovbLRauP6Y3RqcN0/Hq+mmBhetXgWZyuCOKVoXloq4qU7H217fMDUpJtnBvVGksvetVJPCSrfV6oNU+PQY9b11YXRclnZMUVpX646SpMqp/5ydb+V63eKobJZ0rg8edNh+uJb1Mspm3kG1clKYzT05Sa3cZ7vkiLP70gXmuiNAXxK5VKsPUMHh01VMss2yFB7Ij7Hj5uB4HbUDTq+raUDn4Ho6q0Ncry+clxWX27UDc0yDAOs/Y524Xjlqtoqy96mVk8JK2wmtqaP9/Vmrc+u0jnR4rm6q1HUW7YK3nwqbHq9OJzq/x86tGWoabNmvgVrWOSg6m6jmhAdbt3NO+znGfPWzqOcmrTyo8hzVcy70D1zNo0MupO9u2QldlqHyDsaoMUGWbcE6ZbsqgtNz6WJZcHqcpgGd/THZlu0idWLDJBUWaN1uj4lxLeKl8ZqX1p32bb7r5c+9fr/naZRSqhI/8AkhhBCimkp+Q8OAhSHEnPqB8fd2/BQhhBBOeG4OnRBCCCGEEEKIO0oGdEIIIYQQQghRTcmATgghhPidqumlBa0ff6h/t3MihBCiomQOnRBCCCGEEEJUU/ILnRBCCCGEEEJUUzKgE0IIIYQQQohqSgZ0QgghhBBCCFFNyYBOCCGEEEIIIaopGdAJIYQQQgghRDUlAzohhBBCCCGEqKZkQCfE3WA4z+y3DqD5vzNcdLJJ1uaf0b38E1EH72jOhLBj2HeCFi8fYET89budFSMX7p+7mp4QQggPyGft/INo3kpDukJlq/yAbudUdBodI9ZleyA7rrl0KJaxnX3QaDRofDqzYK/hju27cnYyVadBM2A5Z8rc7gzLB2jQtIi6hwuwzbGcWc4AjQbd1J1lf8x2u51T0Wk0DFhucUZOpzPg5QO0WHGhqjJ/1xkO5PPZVRjcrhFNHG6Rz/ajhRTWqUNol3ISS/k3upcPMCDusuczKkrKoy4m627n5C65zf6jN8ikNk92rlfyquGXTGZ8cAjdywfQvHqIkfH5Tj5/meUfHEDz6r8pp3ZwWfn3j3v7dj09IYzOxB1F8/JBpqbc7ZzYymLqqwfQfJBeTj9DiGog8yJfpSv0D9SnvK7QPeXmr2xfd5xB/3MQzcsH0Ew6RM9F6ey/cLvKdlmr0ikUGyikkKxfrwFNK5+j8hh28/GgCXyZH8SUVR/y8I3tZBXcBLyqft+VVoyhECgqpric7YqLgMxcrtyRfFWEzbEUF1ME+NTTlfMx43aFBtMZKDZQCDSoW8cyaYqAzBu3qiDf94Lb/PDTdXLRMrqHj+NNTuYSfQb0vX3oXV7RLlYUAkW3Xa0orrHu/9J4+nRNlkx8kImd3cj675GpPBYWq7udk7vD8B++OXAbAuoz0N/8Yj7frM5h7rmaDA9tzLh6BrZTCOfPMOJ/89jYqAEHP2jLAwDcprgYuKXKqfdc5cL9Y7Ft+fsuO72Cn08zbsVlVl+pQ9LfOhLqNJ1bZHz/C598f5U1WcXk3gJq1yDYvw4Tejdl1H/9AR3AwTRa/O0qmY6SqFWPHZ91oK/FSztjDtJvvxfLpnVhbBvHezbsS6Pjl1dJv6Vh0ONt2PrnhhbvXiDqrSxmXrX+jHf92ox5uBFTnvTD/641n7Z1kSmvN+uwJeoBBjdw8rGT6fT56DIpnfRcn9yCukBB+jlWJv7KrGNFZBWBtk5N+nVuxOcjW9C6joN9plnfz9o6tXi8WwPmPN6Kjlaj+iymvnqBBc0akvFuAK1MrxbfVoDCYFmwyrq2aJjyQjfmhzh6L591/3fKmKfa9Uj5tAMPOz1n5VEYbgHFeOh+c0355dTmPOb8wsjZF1ldpz575gYSbFsGT6YzYOFlkls24sLU1hXrXRoKOfnjOT61vCfR4PeHWgS3rcfk0Jb0D6hYN9hwIYsFn2cz83wtYt7qyvh2tls4K2c1efB+nXWd4MjNX9m+5QJz9xSw48ptCsFUn9Tj7cfvZ0jn+lXa6z0Td5TWWw1llFmMXyavuM7DjwWQ9P/ZO/e4qIr+j78X2F3uoFwUAUEREBUVFdLsQTHDNB+f1NJKy0zNrDTrSS2ttMxr/oqysotWVpZdTCuTvCRKoSYqiuIFRFRA7ndYdllYfn/sLizLLhcFrZ55v178wdk5c+acMzNnvjPf72fGO5tJdGOkHi0nGguWBXdp3f3q2mJxXzcynupKc1+Ktib2yzQijoGblzWLgiQkX1Gy62wxoSvO8f3C3kz0bj6P1nLjBt3NJmEPH+VB2IatrH0oAIi81SX6H8WTwDCge2fcACwtkQEBni5Nn9bVh35Avj6dpRQ54Ot+A5MBTXYqxXy6PJXHshsPlG4ZJRlsOV0LQQ6M9jCd5OzxcuKw5I0QMwluiGoqVe2QreAfSWlsKRuq4eGQLvWDqqwCvr8M9HXhywe8kaLriS+Vtf8kVAvaT9vkpyBhWxr/2aM0M0A3QF3Czo/SuC+xBpWVBcP87RhsD2WFVfyYXsGs1HTo3EE76CuvIR1w87LhMQ8jJxmZLZ5GWdfUaA2HGnOjc3Uub+8oIwMJUEt5tfHETjV5ZYCNjMf7SOkAoKpmT0oV6/dk89FZJUkv++HX3D22C8Z9UWdG9sliyeFKvj6qYvRdcpNnpSZWEAc8HNQJW4ATyQR8WEa6zIJIPzumSqvZeV7Fnvg8grLURvdXRVFZLWDFxFA5PQDQkHBOyfa4ArYnKjn4ck/C64zJVhhITb1bLAh3N31a4d50piSD3ApUVdoJur8bzdZT4+fo7s0zoUV8dbiCVbtL2T7WcMit4fDvpcRUWzB/cJfrM+byr7Hy3WyWZNWCzIJIfztC7LV5JySr2BVfzPYE9XWMCzSkH0jmP99VkNDknLOpegbZuZX8kFrBrNRLPPe7M8cW+BFgZKmoz6cxdWMh35ZpJ14eCJXSue7cMiasT2bU3T78PN7lBoy6psdGJicsjGn1ZHJryeOXE2ro4Mj40FaeqtJwK32WapDyxqxuPDNIb3hXc/a7cwzYp2TO3muMe6yVBmoL+PsZdBXF5AH3+3W71SX5H8cSKyngYqed+fD1pR8Q39xpUitkgKuzznXLM4BBN1qUJjuVtl4duHFKj5XzZbWEGcGdzcwa5bHvdDW4OjKmX3uUwJmpiwcwtT2yFvzDUBGXpERlZcODYQaD63INeUCYu23Dj1L37vz6XvuWqPn20wb5qQv49I0rPHYFRkW48OT5Al7MMpeDhuQdV/h3Yg1yLyeSnu9BL4MVoffU5ST9lkeBfcOzAnp1ZvXEjjdc/szdubyUb8Xr4TIWxCrMJ3S2ZeHMesNmtbqAD1ZcZk5GCR/GYX4Wvl1p3BeFhdgTeLiUL5KyefcuHxPvuJCY02owrJOVGhz7unDpMd+61bjV+ek89Xou75u9PxlPzexpsOKqYO97F4hMrGDZ/uIbWnFo1btVZ7F+txKCHFlWXNpEPfunYUHYnU7cG1/IjgNZHB3lWL9Kl36Z5X9qwMOZp8NNG/VNos7i1dVZLCuTEBHuydZJnXE3Gj0rM3KIPqFu5USGgpiPkxl9TINXX1c2k8+0xObOMa5n8HF2Nhs+ucYzV4oZuSmDk094UVdb1Fms3FjIt2WWTLrHk83j3Bqs4n2QepmnNxSw6dd0lrjbs3bodTwf4K84NmrEmWI25kNwhDN9W3vukJ6UDmmPQrWMiFnBRt4cVvS6twNzDuQQlVhGAhDWxtf824qiyKz+Di6WAoEx5UQfr0RlZc3EQWY64vhCXs+H4GBnncuaQHCLyLrGR0m1yAPtGWrC/U1qIbnJBWpB+2mL/C4XsylLytuze/LrA45Nx9WlX2HRATXY2PLznIbGHABSe3rf3Y3w9lhsz7/Ci9Eq3Ae58nhrXXikLtwVLAVqOZRd2A6Fu076OfOkK3CunFhTy73pxfyQRcM6ObQnZ57ybeha6erNfT2h5fdny13B2qFzTE75jdxBK9CQ+G0uyyplbLjH5X8vftPbhxdDLaGsgncP6CcjNBzeW0I0Fswf4XVdK8dnt+WyrAy8Q9z5fkpjYw7A2qsT48d5NVoRb5pCfjoJj93nx7mnfPC2vI7CAdLOnZm3wINlDpCekM8HBmIJmdH52rIP6cSXRsYcgLWfL2+Os8WNGt6IzeSfHNl99Fg5p7FiZh+3W12UtkFqS283oFJDe8iLtaFBV0P63pVMMBArmbByL+km9EoKE7Ywb5QXjhIJEokER69RzNuSQJNdbs43jJdIkIyIAiBqhPZcyR0bSa1LpCTt15VMGOCOdYO8j5FrVI7UjXcgkYzg00ZRw6aES7TH3F89ijLtVxbry27tzoDpG0kwUXBT6Y7lXkdMWGECW+YNx91agkTiiNeoxew19VDV6exdOYEB7tba52LtzoAJKxunjV2ItcSdV48WcnilLl/HPkSdMMxqLysnDNBdU4K1+wAT79ISSxnIpZZ1/0vl0L1zcw1Pm05mqTvP0hIZgZjz1Cw8cYl5euGFuQmM2phuUA5d8PcW7Ycgbk+aNvhUF6iuDVpPY1YWgIIRs49rf68LFi9k4zKd2EV+Dls2nMZrrvZ895fPsvGE0Wy3upxj284yYL5BkOvaixw1HHScSKbr7ONYL081qJcGpOeyORXkwY6MNBkfouHwaQV5SJk30PhZVpP22/m6IFvr+aeYvi2bXFMLk3HnsZ6dwKvxCg5/fhr3p44jmXuq7j3HfnwCyezTfHoJoIJt/3ccyexENqY0zkqrtnmcZw1UJdRX0lm59pQ2X11ZJnyebrK9m0J9JZ3FKxNw1L8Tw79lDZ+dOjvb4N1oBTgGrE3m11RT7amatN+SmfCyrs7MPo7jf08z76fsRn2A1nWm/nka/92xrblBoIKEnwyCnmefwGvlObYY15smKDxxiXl1z+EE7i+fYeWBEhoUVV3OMaPruL98hpW/FaE0yi/24xNI5l/gaGURv27UvffZJ/BaeZ69VzR1ZR6uq8OOi03UcwMy48vZgYQ5/b10KyVZvDr/OJJ1xcRh2ObOEaM9o1WCDA3vX/+ucsx/C5poP+rsbDa+farBPf+a2szcs7n8/H3YtzaYeQNsm72HnFMV7KiGwFAX7rqpI3INR3cW8QXWvD/e8zpWKzXkltQAEkLdtKtRJz4/iWT2CZ6Nbdyp6JVO69pFXR+j7Zfq6tR/T7NYV4cb9t+nmL6t8btt2BcBuDEy2ApQsun3xoZVZkIF0Q3qZPN0d7RrPhGQWaztU4a6Nf/e24T0Kyw9VE3w7Z2Y2igGyxANucdSmf6y4bfwKmmV2vbWrGCTuoSd753EevYJpuzWDyWN8px9Aq9XzvBevIHDp17YYWF9GveF9e/3xtGt0lnV8sWBTM4CpF9h7XENeDg2Xp3LzzFo48Z/+j4oi++OVIOVDR8+aLDy1Ryx50x+BxoKKnVh1bq+vH+X0427y0k9mBkuA2qIStQvyxaz51QVIOWVoR5mr+EY7sLCDsBlBX8YrOga9//mxjPNj43akJRU7tCNyRr0908lMODtVBLMyQqrr/HTSQ142HOPLs4/PzrJ/Lc5PY3xTx1H8kGG9n+zYmYt+G6fSaHv7OO4f2a8XJ7NyuePa5+x0S+p2xKRzD7B4sNNPYxqipWAlYTrnAtokjZzuUx+bST+6cX0GP8wi8ZWcOSTrWxfEsmxvP2cfCuirlEVxjxL/xFRFA+ey5vbx9LVNp9j61/htakD2HHxT1KXhpmuxJ3uYOnu3cw5+Q6jFv3CPWt2M68/YNdNG8NFITHP9mdEVDpyt2E8sGgwncnmyCdbWT81lM+++IKEX6cazfZUmfD3NiVcoj2Wt+kh+qxKJbfHeB5e5EHWzi/Y/tkshhQ7kLp9ct1Mjzp5I2P6ziJG5UDv8U8yNqCCI588Tehv7rRuEnUb0/pHkascxgPzF8GRT9i6ZxWRQ+X8mbq03j1BnczGUX2ZdciLsa98wupBriiu7mTNc0uI9I9na+p2JusLV6NGRR6b7uvPslwZY2cswuViTN0V1ckbGdV3Foe8xvLKJ6sZ5Krg6s41PLckEv/4rQb36cv0/bVMrzsznLXKlohGGKXznc7+2ummk17Mp3+CBqWXNfND4cgZJXvicxlqZUXqox5I6cD0h2oYmVbKqN9VBPbtwDu9rABLvAPB08uN3c4KftxdxPtFctY84Eh/AAenBrNyqsxiJq9W8mO1jAf62WFXqOKL1EpmbUoF297M7GkBaDi65SK3HdYwuL8T23tKoVDB58crScyFMGPjzEwchHYwYsGS/mb8p9XZ/JKoAV8nRjf4wGtI3naOvnuqUMmsGN9XToBazSf7M/nNxkTXUFOLCg2bvklmWSWM7WWHS0lV/c8N4h3suKuvNSQreed4HjP9DQ1JndqmlQ2ROvdP9flURq0v5pCdnFfu7sAgew1Xz5fyXFwu/tnVpC7s1vSsZ3oak9YWssNGxoqxTgySqdj8WxlflcDECFce7+FEVxpeK6ZaQm8/W6Z2lFBWqOKL1DJGv3mGFx8KYmWdy4mCmA+SGZFQg9xGH3eg4cgZJet/yeSzMwoSFnev6wMyd57F/2cV7j4ObBlrjW1OGc//riTVUk7UOEfu8G/K5Up/rfr6YFuuZP3v5Uz9MJmLM/uyNLTp+bLC2HP036Ig3cqCYUF2DLbXxvEs+foqHl11wgLqAjauvsKsjFocXOQ8GWSFg0obH7Tk2zQ+SVNwYmb9YL6mphYqK3loaRqplVZMC7GDDAWbr1QQuf4ccz3UrE/WMDjIlkVU8f45bT23dAhmeqMBZSkHkqrAxp5JQ/T30pGHJqkZklfBvF0KqGtzcgKA1sQb6e+/2MOWNyfY0VVWzbE/S3ntlwx2FGp0bbwhZttPfgYL1+UQVSbBzcuGRR4Ski8pGP2msknBD/Pt0Qpr45U2M5zN0Lb00d5mAqTaCfWpVGYe1hBxtwdjW2tIVlZy/mAak//UgIM9D+re74ABdgTHlbLhZAavhhsKCeiVTq14PlD3Ndf3Md+dYVWJhpC6OlXFqq/TSD0n5fBJJcUeNswPhYOnKvlsTyZXLKTsH18/zDYVe9Wrjy3BMaXsOJtHzlh7gxgqXZ20smXckObmo3M5fhnAikEezazmqlWkn7jKtN1VYCVnbtiNu8I2j4Kd24rYYWPHwbHuSJuY0i6MvcAgw75CWs3OU3kEXbEioLo5wSYFMZvS+HeihohwT9aP0hq36vgUBm0sp9jDlncn2NEVNQdOlfPz1QqeCtU+r9gv04g4KWFYH0e2GvRxq76+RKVFL966HndIY7x9eDG0hB2Hy/nqiIaHLpeyo9qCJXd3azheU2fx6uprLKu04okRLozvqOHAwWJWZdUSMrAjq3s70A/gfAW7KoEgO5NeBWbxsOP1UAl12kE11fxwQkWKVGKwSmbR4n6hJXgG2BD2SxVH0xVcBnwpJzEDsJIR0KSB70o/73QoUnM+A9Ct/jfs/y0Z39MOjwr9eOYSDm59mOwNngNaNjZqO2o5dCSJ/skqlF7WPBkqIflSJdvPFjNkQyqJL5iIIzxexkeVMHqEW109cL3dnod3KPniRAFnJ3Zs4MGUmVDOjmoJM/TjF5NiZi38bvexZ6JNKcvOl5MI9e6eKRXsKgOoJPYUhNWFxKg4l64GK1vuaiKGSH2qhM+LQN7bVvu825g2M+jyGMKXSZuZ0ktX9RdO49n+I4iKepkfnv6DmX5AaQzLJ0eRG/Exibtn1r3AyMi7CX2qJ5HLVvHDE9uZbDIC1pP+kZ4gjQbAPzSSSAMH1dKY5UyOSkdulDfLF2uNnd0zWRU9jo2jbyDqIj2Drm+c4OjzIVoDdfkzfBARyJwdH7Ln8mSm+wKUsm/t08So3Hhyz3neu0v3YVi+nJ1zhvLvTa26IET+TMqGsbpByUKmPNWTyPdX8f3hpYTpolhTNz/GrBh35u8/ylsR+g9RJPeE9yIicA5zNx5l8tKG3rrpuT3YcGIXT/QyXNBPZfNjs4hxn8/+o29Rn9U9hPeKIHDOXDYenczStnb8NUcZRN7nxwb9bJg+JiK+hMOPehCOLUFDuxJUcw4A187OREYYfIhdOxPpU8jVg0WAJaERXU0r1GWpOD7InauPeutcMzQ8sy2JvnuqePrANab19EJKMYmXa6CTE5vn+OkGr3DvRKO8BgRw9UNzN1RI9AntAHncYNODEfXhEtZVwr3B7g071pIM1u6vQmVjy56XgupWApZfucKc9fmYq1bplZZsmBPEE32abuqOYQ7M2KFk0+lizj7gVt9R6tQ25SH6FYxCNm8tJsbGlv0Lg4jQDyQjNIR/d4bAfcVsjIelTQQwJ8aWsKPaklUP9eaFAdrnEDnwMjVLCthRbMHXg/Szn7prVVsyf0oAb4XXz5ov1xkDq3ZdZepQf3oBpbFXmJxQg9zLueEHQm8UXSlm1W8qNt4pB3L5+g8Vqg4O/LgggBBd2nDnJFy2q7gs8+IZH/MDRu21NERE+rB7Yn1geuQQbR1dFnOFJ0KbUmbL48vdCtKtZHw8Vz9pANoVxkzydCvWqT9lMiujFu+QTg3iLFbnZ/Ds6hyi4vP5bLAn8xooldaQ4eDIiYX+hLgClHLXqhSmXlayvlLGhrl96urD3J9O4/VLFZsSC5nubzSINam0Ksf/9q74p6TiuksBxm2upZRksPwHBblG7yoyQkHoexeIPFzAD6M8mNzATdF8+zm7r4CoMhg60oeY+/XvQ0HCllSGxJozLZtvj81TzOU8ACmBrbTnks9m80JRboNjDr7uLBnZkudZyg+7yzjt6sCpsS18/lnF9Jh93OCABL9AZ0484ldX/+njzEzXUp5JKiO2BMbqB8R6pVMPx7rZcj3pFZa8MTuA53Wrmfo69e1JDREju7Lrfp3bWPolxrxeQEEgygAAIABJREFURPSpIlLHd2zala6PC/M8SpmVWsGBLOrrQXo+Wy6D221O3NHMEknhgQLWFoHcz5GJJpV8tSsThjh42LFnegB33aACnal3G9ivG9ND6w0gdXw6T56Dh+/raiDAYgpdX4FU23Z1fcXq/BzWbchkQZMl0cV8JWiIGOld/y6Aq1dV2jwfCGJmT+2xyFENz/Yb5EHy5E74O9a3j8huKfRdX0rU2TzeCvdq8uotoz6Wbl3sea5cqwbfDswxapOlBwpZVgaTx/uz4W5tXYu8IwfHlzN48ZoGv8ddtf1jrlq7emJt2WAFV6vaWNUgTzycubhMF1fq35UldUaUhuRtSUQh4d6RHm0e61R/fSmBwFH9BFiWWrtC5iZtxrCywMpSW87iSuPfjPt/Dc98d4bAfSo+PFbMZG9npD4tHBu1IXGX1Cx4MIAVw3UiIXWTlSVsOKzhrXDD921GedipMw/2LuCLJAX7zkCvunat68utbJnSxCRDy7/bHozun82yw5UcTYG+unqRc6GSOA9rHlYq2XGxkOf76fpedR6/pYA82KFxv6RWkZdXRUFqNkt/LOW0lYyPI1vuXdAa2szlcugrK+uNOYCOEcxZHAbE8csx3R51J6PZkAdjpg/HsSCb7Gz9XxXdBt8B7ODI2eu5uprjP20gj0Bej5rZ0NKXBjBtxfO4oWLTnuNmc2gRYVF8oDfmdHmPmBoGxJCYpj94kpgvVRC4kNl3GXxopd6M3biZ+a264JNsqjPmADoy/N77ARWHkvVOaZeJ/SoOfKYzPqjK4JlmU+DYizt9IG9vYiP3v7CoD4yMOeByLNqsxhNUZfh+CnDsdSc+5LE30aQjYfvQ16XemANw9eRef6C6imQTroHXjw0fz/I28LO3IGCcMzMA1fkKEgCQ4WALFFTy07Hy63M3OVPAO1kQGNrBzAdCxb6TlaiwZsa/jBQUzij40oRbl9THh43jzLsHhQ3v0qwxB4CTF1OCJZCv7Sj1aNXkLHhev4JxqYivssCntyNBVWVkX9P/VeDYRY4PGvZebdpVsaCsBpBz2wCD7sfVkZEeoMpWcVV/LKWIz7KAoA68Gt7wHjuGe7LKF8iv5FAKgIbjZyvJw5LXxxnN9kldmHaXHW7UsiklT3ewiswiwNe2fjALdPSzZii1xOc1rY918kIleciYHiyj4JrBc6iyY3AXIFVJk13ZqWLezwd5cAem9TTshq3odqePbsVXJ/6ANe8buw65evF8uAyo5tsLxs9bStT9+o85gCODdQ/kyft7N6gPnkG2DAXi8hq7XeqVVhe2h9LqmXI2VMKYvh1wzDOsRzV085ICKo4Yt3Gz7aeYP1OqAWteiDRUfbMlZIon75orfrPtsSVo6laWrFrpQ5OXUcma+IoGf8vTGo3OTFK4N51pqRYsGNOVvi31/bKR8XioHYtCbRgs0x7q0c2ZPg1W99yYeJsMY3dHvdLp6AFujQyxsOFd6ow5qK9T9HVjt4EBgbczEzyArKr6Nm6WjoweIANUbI6v399Qv6L6eK/OTbu85WewfKeCPCsZG8ab8xiwYmKoHYtCbRnrJAEkuHvaM7CJiZyWYurdfpFh8G7Vuby9o5xcLyeW3tWMe+elUnbkA0FOPGTYV7h24vkHnDCvZaMh5btURh/TMPxun4bvArCXWwDVfHvclDu6Fs8QjwbGHAB9bLgTIE/Vdu55ulg6VWolX1ZasCTCt9E7yyutAaSM9DN4XtJO3OZLi+pURy9bFoXa6f7k2j3NzJynPn+Jx/ZUQZALm8a2o+C9QkOD3UQqNW2gEmzc/1sQEGxLGDczNtQEwa6sHW6w1YLUhWn/sgFq2XLJaB9rs8rDckb2t0FONRvP5NUf1o0V3AY2PdHTmu92WG9b3FDzywX9M9NwNqMKN98OTPeVEJdaQl2pT1awpVrCVH+3Rv1Szu4U3F9NJujLMuI62hH9XJDBBG7b0q4qlwGBtwNHySvT7lGXmnwIFbD9EX+2t+mVrpIarwJGM9CEFI60ezBDgR3xqaQScf3yzFKrRn6vlsbiLJdTOaYC7uxH0PVepw4ZxtlLrWRGadJIjAF4jWEer5nOxsQkmtTU6CMtUeuD/towWpFV+2EpMWocFq0eNF03UjtCPIAsffCqPRPGdeShT4pY8PEFXvtBztODO/L0XV3o0lLXrDMKTmPF2/3MTOWX5LDtQi3y3g6NZmwv52r367vTs3W+VS0XrbDgjv52uCWU8/6pXOb1cadOMthwBSOjSltHjmTjccT0xu/N1REXB0ugiuOnNET00+WrFzoIkde5W5JVRRww1NvBxGyWI/4eFnBZTVIW4F9ManYtIGegCWVQqY9M2wdkq0gF/JDh2QFIryRRTd2gOPOcgjgkzHdryt2ykOTMWkDFI/+X3MzdmqGkmgtoY3XMf38U2nvzsCbIxAy+p4cMN6p0xljDVRrjduLnJgXUyCxa+iFpX6XV1Owq7bdgVxrbd7XsHPPtp4Jz2UAnOQGtcLFqtj22CGd83IAsfT1s+ZlDI7vxx/WoXNapIrryQmsU7gxVLivzWL/mKvN+zeDt7h14vl99vfAc5sjDv+TzxelcMsfa46lXOjWzT1+jPsZfTigQ16j/bh2eIXaM/qWK6KR8Msc54mngAtzkiqq6gI0bcokqs2T+FD8TrsR6DNQH1eX8+lEKo4/lMt+3I583Z2Q1Q3Pvtk6Z9MluzY9HstQcAsI87Vs3q19cziP7NKhsbPnvvxrL23ca5cHW5HSmxWbS6UgO4/s5sPDurgz2ajgsVJcWcOJwMfvS1Trjo5rfoI33ubMg7E5HRh8uIrqTA4+YeL9ujpaAitjLCmb6696P+hq/nQc8ZPXfDRsL3IA8ZQ2lUPfMHEP9WF3nOZKBKj6H06aKoi5g09YS4qys+XmqT8tj8K6HkhquAThbaUOHusvpB8TkqcmEJuqGigolmPMMaDROusG22F5IPWUMRUGcsmFNakrJWDrEied/ULDiZDGJD7jRF/3kY3N71bXyu93fgcdtyllxsYBS7HEkh9jzMGVCZwaqiuB7BfE6L4bE5EryzAh12ci1/eP8KQN4q533zbol2xbM2p7Fa4NN/WKJXTPbmN0QMst2CURsgG7j7JtO2DqO/TjF9Eyk3JnOrcrqGD9OMT2nKXduTU7/LKQ9u7FlRReWHclg/YFS3vwli1WxRWydGcTkZmdcdIHaro6MNLORd87vpWyqljCjd6dGnZh2T5j2RTrYkae2lrMsvoijU9wJq5MM7thoBSMs3JMfI0wLDcg7ODR5nb63OzAitpgFXyRRdbU+hi4aS5YNbO3eLBKkrWnUluj6AHfuH5zDguhSxr6RzOoh+hi6qgYxRU1jw/al3pjuymS0Z1dmiNyyHZQm9UqrEe2rtDprQgCvBZv6xQK7BppATbUfXdxeq2i+PbYMCzo5WwI1RKfn8hbtH0eXs7uAZWUQrK5k7cbz9T8Uab88enc/Yxe/Bti48cTdhSz/tJyXDmbweD+DeLk6t6ZyolNgprt+osmxbfb9aynerkzxLSL6cgUH0mEKWnfLwPAmVlTVJezckM6sDIiI9GZteAsNM6k9d49zYnRiEV8cyOSFu/zbsd5nsXGfCpWNjJT4ZF6o2+tHw9FigCre23ie3TJbZj3SFb+a69yXztmBLf+q5N97FMz43kgaH0DqwuTnOjDmwjW+2V/E4oQitseXMunf3nw51gUpGpJ3nmPkzy3Yh9GAanNWXkkNBQC2Ftib+t1bRiAQbWFaMMJxuDMLf85m7Y4U7Eqd6mPoKiXcO9Jg5TjAhnFW5WxKqSCuBPOb05tEQ+K3GczJsuDJB7u1Pja1leRcVHIUCHSz0bU/GwI7ATlaL6Rwc5MR6gKOXAaspATemg0k2xG98rCNaSVjaRfG9c9hxeFytsdD39D6ycf7W7RXXQu/29LO3NkzmxWnFRxXQ0RqBbsq5bzczwJHhS33fl/M8WQYG1rI0ZQa8Dcds+kov3mbCbSrQZd84RBQr3zY1acfEMep7FI6dw5o4szW4kbn7kDcIS4kQ4RR1upLp4kD3Ib1xrdhCcksoKlpkNbj56ednfztFOe4q+HeGerqdjD2dBt8H71EoUtnBt7QlGgg2qwKcek88C85o3PTKCkjNgvoYNVwYC6V4/8vP975l4aXDlxg0NcKpv2exeSeTXu8q4+U8l4lDP2Xi5mBQin7TqvM+oDrV1h+y8wHo0Gjus329PTg/sG5LItR8NMRDfaXdSsYhpLB7lJtHSlW49LF4TrqiIajB8vYbyPnCe8aon7NI69agqePDV8+4MMUQzdMJysCgbjsCtR0NLpWKSlZGkDOwO4AdnR2BrLUXDgPET0bXlV9Rbva5+Ztq+0D1Fl89kcVbn623FlWwWNby1DJLIjs04Hv7u/ewA2zMfpVmWqySx3o3LOptGbQzSIfy1OYuDc9ulXErCouqcHPKFFmVhV5wL0erRqxtIB6pdWVjZRW24auLtr6fKq0is5dmjd9m24/tvT2ALJUJJdgtEpXS6N9tpvNr3X07WdHcGwppxOKODrJvV6sqp2oVGsnd05frDC5wpCXUcmaDIhwqTRv0AHSwR156edynkkq4ed0mFIXNyZnZJgdbknlvHM8j0kuZWYnmtoXR0YGy+Gyii0JpQyngmgseaOPGaNZXc7eTWn8O6lxjEyL8PZkbu9iopO04hyvX3dcZXNoqFAD1VV8FG9qRFDNtvhqsIIxj4Cfh24VI7OcUlwavoOa2ibc/yV0n+hHdF4yIxJyuW+bjYlnYoFDoBczA72Ylp3OwnW5REXn8dRYF8JLMlgbrSTdwZqP7/di8gAnHKQAGTw7O4coo6t16yQDqvgpuZQnejauKepTCr4FAj3trmuj8MzdRbytkvJYfwk/HyjggyoJbu4yVjzozYLhhnFWXswYWMCmPytZtDOXkVPcW1wP1KdSmRpbjVtfd5YPb2elU3UuXxxWAVY8Wecl4MKA7lchR807R3OZ5m+67IUHilhXCfLedjc25rvFlF5WEgcEOhh4numVh0PMKYFD2CB7gg+X8t7payy2qajbq67pvry1320L7uhlgzxBSexJ6JWj5KiHjdZbxsmJezwKWZecy1KvCn7JgoeHmtkX1VKCvLUTz9dJm/VYca8tZstZAxHtwhg2rDwK8kn8R+emIb1tLDPkcHTl5xw21ttGSdqpc01vXWAWR0JGjQaO8srbvzb0B1eeZdOSdeThzVOjQ+oO2zu4AXlsi02s7xDV6eycOa1RR9U6ejH4XuDCWj7ca3A3yrNsmTqD928ob1MEED4lGNjE+99eadS5q3OTSGqplnxAONqs3ufbK41yIjcpqcWy9DcV3cA/uURp4uOmG+hTzTWz04yV/PezTIN6oyF5TwlfAN69HMxsaGmBe4gtw2lOYUyb37GzCvKQMcecepo+2N+cD7i/NfcCF+IL2Gsg86s8c4mpO1suk98cvfrYEoyGj85e4qeT1eDr0FBQoKcTU1yBsyV8m2Y8UtaQeyavQR05+90pnVS23g9dJy7jbcfLj/cj972B1H44gIzFQUwxlojvZcd9NkBiER+cMVyC0ZB7IJMXL4Pcz447PADkhHSXAWpe+e1qwz6gMo9NeyvIw5KneuuGEpcV7C2DEUGebFgegvLDgdSuD2H3nO4GsQfmsOC2njbIUbPy0LVGWwdQWcSpJIN3UnKVJ+cex3phMnW7g/R34HEbUJ0uYvN5w+dYTdpvl9ifDuDK0AALQMGr2/IaXEednc66WK0i3wP9TM53Xz91Sqv2RkqrbYc0xI4ZVnD0z3wONwobqybtZL7Bt6C59tORvr4WgJLVewoM+vNyfv8sg/k5xulb0B5bQx9PVgZJoKyc+zZcplEYnFpFym+p7Gpx3G85R+P077uUa0UAEvQ7vfiOD6b2w4GN/6Zo28/QyG7UfjiwBRtj6+PlqlgTl9fgF+lgR56ygdOnC4lKUoKNHTPaQtGwlXT6lwMPA9FJ2XyeVAWudqZdgNXl7N10kUi9+EdrjTmgzpBFw7qjGZQ2f8J14sna90y8vw+78bEHgC37PxxI7Xs9CQfwt+UuG+BcCV8Z9BXq7Exe3VLaSD69IbZEzPDmYy+I2ZPOwiY2npd2dudOL+o3ms5Vc74a6ObItNv0xhyos9WY2vvcd5A991pB9O4rRv21tr9a+JMCFVKeD7u+VezkDBWqDnJmTelNxnrtdyN3eR8WDzfeQsCCIePcmO8Ap2Mz+PdWEzGC6trGk+vqLFZ+UcppB1u+mezdrq6W6tJctrxzjQX54D3IlUcNvrFhdzpzrxWcPpTFyjjjeH0NucdSuG+HEpWVjA2ju97AJEtLxkZtyOkCXjW8H3UBX8UpAUseCaqvE/o42efNKYGDTrwJ8hLL2JRQwWlkLBra3ORjK7/bgLSfHVOtNHydnEPiFRWB/g669Z+OhPlbciGljMQzCnZgzaQwM/3j0J4oPxzAWvPBrm1GG63QBRLR4zBTe7uzavzDjA2o4OD7mzlSJifi4+WM00/HOI5k4bsRfDlrBRF9TvHcCzMY3tUWxdUDfB71LtsvPsFB5Vqux83Uc1IUH2/az6z3R9P1u2E88NhgOpcls/OL7SSVyfFbsJm5BlOnnUY/zgz5DjYtCCPo4Azu663dauGg9e1EBKYT08S1mqYTE15chveOZbwf6cuJaU8yzE5XDueIG8zbNL2mvs38dSOImhpM+N7lzH0oCFfyOffVR6zYepA+G9LYP923+YzoxdS357NuRBRTg8PZu3wuDwW5Qv45vvpoBVsP9mFD2n5alNXNxFfOHVaw6c9cxlaW0qNChdvQfiwbCiCne2crOFfFjI+SOO0j4UiRNZ8t6N5gtfZsfDZdTxbyQB8pZFWyNUMDDrZsHqNzMb2Uyt3vlGPbx55H/KTYVqnZebiEL7BkQbBBR3IimR6bysjo7EzSy7p4Fb1CnK8dw82op6UeLdfKp5sL9vfw4cUhJew4rCDy1USm9ZPptleoxtlLRmBZG6399unEIt9Spv5ZwovA6Ntdjdx43Zg6Kp91WxRMffMMe4fa81AnKyhX8dXJcrZmWLFhkZtWch/IKahGBXyVVswW7AFn+na3RB5XiOf8+iG7g70lXeyseGSYJ8/d2UEbvC/twnMTSvh8i4J56xP50M+GsR0lZOvej0om45NxPnXl8xzdhY9PXWFWYh5dF5TwQB8pnXUS/0lVEvwGuTJXv5WAry1jnEpYsjOFb3bqSyHBs4MFnh1teXVid+72M989OoZ34t1DV5j1ZzZ9ckt5IcSWrjINV1PLiTql4mLfzih76wzUXDWJVaCqUnIiBQb4a+9tzshC1v2sYtb6U3zpb1O3bcGecgnLZsIIb93A5GwOUTFXcU/M4eHuVjiUq/kkpYq8agmj7vZgwg0q8hmjV1od3dv43bchTl4sHFHCl3vKiVh6hudus2d4RwsUhQo+P65ge4ktB99z1X4LWtB+wu505t74Qnbsu0JQai73udZy5IySg2opER4QYzgCbUF+UMiuz3OJrYJGrnAAdvbMfVC/KbEtY6d2Ztnb2SxLKqD7wiIi/WwIsQfK1XyZWkVmlYQFj8CYFhnICmJ/zuCh3/O5T1ZF1GXAw5bw7i05t3XUxakZq9vWrdaXszQf3G5zYNCtWAmoc/8sYzHmZ+HPbkslMqEGHGT0KSlg2caChgn07ovNXE460IHHt5az4kL5dbjr1WNK5RJg0OCe3NdqF18PZo4sYNXPKuasT+SXXtb0Vmv7AKWdJW7UkNfU6VIXZj5ayi+rC4n6JpXe7r2Z2bOUT1emsd7Khif76fqu86U8dw68BzkyEMDfkUmuxcSdLWDC52rmeltwNbWc1QlVZJjqGr19WDOynN9+rWLO+kTe1fXXZYUqvrtSreuvPJl2nZNEAT7WOCSUM2RBQt0xuY0lvtaWRN7uxkujDTYQd/Vi7Uw11zYW8m1MJp3isgjztiaio4Sywip+TNfGqBnG3l3eqd3Q28mjlt07dO0cAEsiR/kzwhtAxdHtafygq14X0wFq+Gr3eS4eBJDz0LRuRkJFBv0GkJ1byQ9XNJQhwS+wI7seNdpD0rsbmyarOP1NBcs+T+a9H6WMCZDSmVqSryjZlavRuuB6yAl20HD96zItGxv99ud5XjAKOTNW4zVZ312cWDzew+Dealj1eTLv7bfmMQ/tNlQHK8E7xJUnBujT1CsP3zOwqftyY+Jt2TzzSzlz/gB8HZvoy+tp1XcbwKkTEwPz2ZSSx/vFEkZPqJ/t7Rtgg1tsJW+fU0NQR7NKtSe2nOT2WA3BI72Jv799N0i/cYPOUoqcLjz8yff8377/MmPxJtZsV+HgGcncz95i7YQAgwGqlICZu7na/1teX7KId2eNZxUgdwthzMw3+X3ONO5o0fXkjZcvpQHM3J2CzxvP8NL7+9i85iDggGfYeFa8+n88d3e3BgpPOI7m3RPbsH3yCT7a+T5rDnoS+egmTiwbysn7uhGDYbyddjNsUzF4lpYyMCqPNGwxx+I9WfT4Yr7evIYjDp5EPh3Nz6/05MAY47xN3iTabKWN01lK0RbF4JeOEbyVfIlRb/6XxVGLmLJZpb33yAks+XoDD4/3bfp8DLN6i+RLo3jzv4uJWjQFbVaeRE5YwtcbHmb8zTDmLEGG6dggS0utGlmD4jt1Ze3DSi5uLWdPYgUHbeRsNJgE7DXRi605Gcw6q2RNroTeg52MZt9s+HmhPTFb8nk3vooyKwtCejnz0eRuDNK3X29n5gQqWHSuhPHxtYAEz07WfDyrK9OM/LyrqmmwD51eIe7hQZ5mBsg68ZEOjkwy6+ZjQdiUHsQ7XOXx35VsjlfjYC/j6UndeaVbIWPWVIGh4IWlRPuezYhgmHyOADgyPFiO/LJ277m5wxrP/3UMDyLZ8ypvbisi6vciNlcDMgsi/ez5ep4n4w0Gnp1crJBTw8Ru+tUCC3r4WuP1p4Iet3XkOW9t+fJzKvj6RCVLvk0jvtKS7TplsY7hQZy0v8SyX0vZekXBmlTtR3xY/w6sGO/LoM4G9yd1YeYLVvh8nc5Lp6rYHF+F9j3JWWFoKAJInRjin4M80ZKlY50YKAOo5txZBevPljH6zfNsfUG7Z4/J+ih1YeYLcvpHp7PkoIJZP1QAWhegmcM7M2ecwZt2l9JXBsdsrLXGnA7Psb1Isb/IM79VsOtcBQeR4NlJxooxnjynjwVw9eKtF6QM+i6XpReqeD9eBVYW+Hna8lakN5MG2TeYADD/XsFkvGGje6tXWn3SxLs3Po9G9UuCVLsVpEHfZaEtT4PNVC0ImNibqz6XeX1PCe/uKdB+C2ysGNPHid/v6lb3LWi+/QDe3fj6OUte+6aAd9MUrEm3ICTAifjJ3VD8fJKYvPprtyg/KjnwZwVvNFho0LnCAdhImPAg9ee7dmHpK47cE53Okj+UHDxXwR60dbWftx3LhnRiqn6Gtpm2Ce4882gFCZ8UsaYEPH3s+HRKC8QzdG68jfM19U501LkZVrDjBPQaUP9Tr6EOjI4pIhpLFpqKbW3mPhr336bqQXN1Vs7QYBsckhSUWcl41owLsLJK5yVRVsV6k26MNdzxH/BzMl8OAKRdeGhwHitiKvnsUAWjR9th7vlZWmjL3aBN2VviDaTr3F6NmR8A95m8A6hTUjZRLs+xPTlnc5EndinYmVjBXhsrHhzhyZreFUx4q9jIoDNRXgMjYdZ3aYx8uRtDB1qzNaaS536ooAxwsJcyMdKTNeP0rmNuzJlbRe3n+az4s4idcRLc3K1ZOd0TojOYhXF9siBgfG8u+l9l464SonT9NTILwnwc+HBMF8b2sW9i5bSJegq4d7PmdpmKiz2deL+XbmOSQiU7Tpez/pdMdhTWNti7UtqzG98sd+HZvddYe0zJH1cUHE1F23+6yFkR6sKDIz3oZnSdkqxK1jRYgrTAph86g66SpDMVRu9WQ8zpCt1EfTUh90BfDwAZHRwkkGXQb6CdvBwS5MgTIz3MPo+O4T0545nBl3uKWHdRrfuWgYO9jAcinHjUsoS795URujyRh/7lyrIxXfB3tDDflsyMqZoaG9nbWiJHbdK1W15byRJour57SXlifL0oDcFupPSsYObPCtZk1CK3seLRyE6sGde5fjymVx4O72CwVY5pPEPsuXd3oXbvuTATffmNfre1d8rQ3tbIv61kh5UNuwzEo+hvz6OybN5IkjDpXpeb7I5uGkltbW37qy0IBH9JCtm4LI1ZWbbs/zConfZhURH9ThJjLliza2Uv0zO+Z7T7+hDRlcQH2ncG55aTdZnJrxcQM9CDzMeMBoklV3hkYT5f+HUke2FTe7jdODnRSfjsqOL56f0axcqU7k3C6Xsl9/47kO1j29id8a9OyVVmLs7jy0A3cufdiDtPW9GC9nNL8/sHo77GSwuyWGHnSNKK9hQJEVw3Kancsa6YuJBO1D5xUzWobzLZrHw+kyUuHch4sbvR4D2XdS+ks0Bpz59Rge23Z9xfCg3pB5KZtK2CI1WAlR0H9S66fzVaUUfPbj1F7xh4e24/o71VBS3h5smvCAT/i2Rd46OkWuSB9iYVkACOHivnNFbM7PMPN+YALiuJroaOcqtGM5PqLDWXALmjtH2looHUTBUqJDjbGHeBGrKLawAJvo7tHBT/F0SvtDr1pgtgmKEF7eeW5vcPpjS2mHWVEBzcvkqnAkGzXFUQWwbYWNJIQzlfRZoScLa6acrCtx4LvIf35PDa7kSHynD7R4zk9crDtjeoPPy/yy3ZtkAg+F8h/6SCHUhYMNDLzAA5m31nNMi9HLnnf6ET6+XAEw4VvBGbwZC8Eub2k+MK5OeUsz6ukiNWMj4e3tqtC1pPnyBbvOMrWLAxkTP6OECqOXeqnJfPqZF7OTOnRVsX/JOo4I8LKpDZ8cgtEMAwRfPt59bm98+llJ+PVqJCyrxAhvdPAAASa0lEQVR2UjoVCFpMV2cmexWz+1wBA1ZX6mKfQFGoYNOfCnZWWjJ/gkebCpb/LbDpwN0zO9A4WvNvyIkyNlVKiBh248rD/6sIl0vBXwrJ7OO3uggCgUAgEAgEAkG7UfvhwDbNTxh0AoFAIBAIBAKBQPA35X/Np0ggEAgEAoFAIBAI/jEIg04gEAgEAoFAIBAI/qYIg04gEAgEAoFAIBAI/qYIg04gEAgEAoFAIBAI/qYIg04gEAgEAoFAIBAI/qYIg04gEAgEAoFAIBAI/qYIg04gEAgEAoFAIBAI/qYIg64BmSx86jjW/3eZnFtdlHbi8qcjkEisWRir/T92oTUSyQg+vXxryyUQCAQCgUAgEAhajzDoGlCLuhpUZTWU38Sr5kQnYT37BKHf5bX7tWpqqgAV6hrd/2oV4IStTbtfWiAQCAQCgUAgELQxVre6AAKorNLctGt19ekH5OPpov3fUioHfHHvdNOKIBAIBAKBQCAQCNoIYdD9BfD9TzDK/9yca0mtZIArznba/z0DBt2cCwsEAoFAIBAIBII2R7hcChqS8w2T3YezeHsSueo2TCsQCAQCgUAgEAjanBtfoYs9h2RLJQseGcDaoYY/FPPp8lQey7bj4Hs9CdcdVaZe5bVvCnj3ioYyJLg5SXkg0pN3RnbUJkhJ5Y51Jdz+yABesLnEsl9L+OyKhjIrC0ICHNk0xY8QV11mKVdZcVBBWRPF6xzQhfnhjgCos7PZ/E0Oi5OryasGB3spI29z47NJHjganVdzJZ2V3xSyOrXa9LUBKos4sCubVX8qOViiQaW7n5ljuvLqcCekdQkzWfhUNp+FduF8zzImbC3nYCX0Ht6FMw92hrjzWH9ewe13+7F/vLP2lEupjFhTjNO//fmwcx6Lfizl61wNKpkFkf1c2TjNG2+pYYkVJGy7zIzflSRU1jZ6DvOnDOStcMBSihwZlpba45aWMgj0xEWfsJMHPqUHWTWhD2+6DeO5D99j/tjeuEsbZdm6tAKBQCAQCAQCgaDNaSOXy9o6kY16NNTUANW11P2UnsaDbxYSbSfnlbGODLKv5typClakKXiHjg3yO3Qkif7JKpRe1jwZKiH5UiXbzxYzZEMqiS/4ESAFchUsj69A1UTJ3KwqtAadOouV666xTCVl7ggXxnaEq6nlRF1UkAcNDbriMkauraHYSc7DoTKy9Nf+JI3Uhd3w1CWL/TKNiJMShvVxZGtPKbblStb/Xs6qry9RadGLt8Ll9c+nGvLO5ND/sAZZNxsWWVcTo79eTS0qoEpjEEtXA1VAXOwlepRosPayZn4oHDmjZE98LkOtrEh91ENnNGo4+lkytx3WENLXie29pChSi3kiXk2Zux1bRzjQt5cu3/C1KA3sPd/p+6mdbnjz4azIS2bMN+tZtvgjVk3owyqHwby4eaMJY601aQUCgUAgEAgEAkFbc3Nj6NKU7KiGJ8f0YvFwrbdnZAQ8YyJp3CU1Cx4MYMVwe63Roi5g4+orzMooYcNhDW+FW8DQniiHmjjZFJcV7C2DsJGevDNRtx4VATNNpa3U0CPci++ndNKameoCPlhxmTmp5ey5BNO7a5P5DfIgeXIn/B3rPVcju6XQd30pUWfzeCvcq2G+ZRp6jPRm1/1uWLew2HklMOM+PzbcpVvxy0/nqddzeT++hMOPemhXPkvSefdwDQS4sO8pX22ZI7wIkicy4I8qyrw8CXJt6ioNkTr4M3zmOxyYtoKUuG9Y/+Jzdcba3A3reWnSoDpjrTVpBQKBQCAQCAQCQdtyc2PobCxwA35OvEpaZTNpg11ZqzfmAKQuTPuXDVDLlkvXsUucvfbap84Xciy7GVXJTo58oDfmdNce0VsKVJGYUZ/MM8SjgTEHQB8b7gTIU9Foa7dOjnzQCmMOgL4u9cYcgKsn9/oD1VUkp+iO5VZzCRjq62iwzmlBiI8cUJOU1ZoLGiB1wH/4TN45XEBpcgwfPwqfTQ2lk8tiDt1IWoFAIBAIBAKBQNAm3NwVulBvfjx3kVFxBXR/vohh/va8MLordwbKackijtRTxlAUxCkb+Xc2j4cPa/6t4HR0KaFLT9Lbz5YXh3Vh4m2OjQ0sCwmWRocszZi+6tICThwuZl+6WhfLV81vADXQqJQm8m0WS4nRs7HAyjgTdyu6A9+ml1FIR51Rp+HwRSUgpbdHay9qTA1liiJy0/KoatO0AoFAIBAIBAKB4Ea4ydsW2DLkkb7kjsghen8eL8eXMvrNJEKGdGbfo10aRNG1CJ2YSJMxdEO6kPuoB2BBwNjenAsvIG5vLst+VzD1kxRe/KMj++Z108bktQoNyTvPMfJnJemtPbWtcfJm1qACvjhWwMj3qnmlLoZOg9zPmdH+15mvuoyU39az6PnVbE8qA4fBzP1yq9aN8kbSCgQCgUAgEAgEgjahzQy6y6XlgH2L0lp7dWL8I50Yf38eH6xLZ87hAn4M71IXm2aO0stK4oBAB5n2gLstL4fSpMqlX0+nBv9LHV0YPtGFA+PK2bvpIpEJRWw82s1IobMFlGSwNlpJuoM1H9/vxeQBTjhIATJ4dnYOUa3M7oZIv8KbJ2sZ2tsWu0sljE+sRW5jxZih7rz9oHediEtLUZelEPfpSp5+6TOSygCHwbz4g2mhk9akFQgEAoFAIBAIBG3LjRt0uri46IsFFGKvW2VTkLAlk6ebi92yceP27pmQUatVxDTkdAGvxjmzeGi9KMpXcUrAkkeCdGs+/l1Zcr2rT1J7bvOTQoLShEJnC8hVc74a6ObItNvqY9zU2WquN2TtuklTsqPaktdu684L81rmvmoWdQwL3UYQpQK52zBe3NzEVgStSSsQCAQCgUAgEAjanBs36EI78tKOcp45l4/vsgqe9NJtMVAiJcIDYgysm9iPE3goT86CYHuC7CE/vZRX/qxB7uVARCPDrIZVnyfz3n5rHvPQyvUfrATvEFeeGND6Yl7efpqwExJm9rdneEcLFIUVrDmgBAc7xve7jvv2d2SSazFxZwuY8Lmaud4WXE0tZ3VCFRk32ZGVbjZMkil45ZMzvPKJ7piVBX4OEvx8HFkx3pdBnVuof1NZQZnjMF5syZ5yrUkrEAgEAoFAIBAI2pw2MD3cmDO3itrP83k5tZI1eRaE+NizZ3YP5HtOEpNXLwTSJ9iesF0VrPg1j7xqkNtYMizEjb1TutLNONtgN1J6VjDzZwVrMrQuhI9GdmLNuM6tj7UDPIMceeBcEZ8fKGBVFSCzIKyHM/GTuzGozitTgtQKsMSEKIpE+3vdD/X3veLPInbGSXBzt2bldE+IzmAWhnmYz1ebuQQ5ILMwMLosQQbILSWNk1tqy6LfHJzODtztUciPxTa8N9oOb4AqNfHnKlhzsojQVDV/rgokrCUGl+NYNuaObUHCVqYVCAQCgUAgEAgEbY6ktra2tvlkN5GUVO5YV0xcSCdqn/BqPr2AE5+fZGCcJV++FMwU74a/JW45Sb/YWpbNDGFp6K0pn0AgEAgEAoFAIGgfbu4+dIJ2oISzGTWABU6Oxr8pyCmuBSzxdL75JRMIBAKBQCAQCATty82O9hK0OU4MCZIhv6LkvhVneO42bYwgVWoOJJTxZpoG7xA3JlyveIxAIBAIBAKBQCD4y3JDLpeS2cfbsiyCdqb2w4G3uggCgUAgEAgEAoGgDfnrxdAJBAKBQCAQCAQCgaBFiBg6gUAgEAgEAoFAIPibIgw6gUAgEAgEAoFAIPibIgw6gUAgEAgEAoFAIPibIgw6gUAgEAgEAoFAIPibIgw6gUAgEAgEAoFAIPibIgw6gUAgEAgEAoFAIPibIgw6gUAgEAgEAoFAIPibIgw6gUAgEAgEAoFAIPib0j4GnfIap7a/zaOjeuLlKEEi0f5Zu/fgtgmL2XggDWWrsjvF9rcfZVRPLxwl+vysce9xGxMWb+RAWmtyEwgEAoFAIBAIBIJ/BpLa2tratstOTfrepUyauIojVW6EjLmfiWPuIrSrLaDgavwOvtvwA3syy3AYvILdvyxmSMemsktn79JJTFx1hCq3EMbcP5Exd4Wize4q8Tu+Y8MPe8gsc2Dwit38sngITWUnEAgEAoFAIBAIBP8k2tCgU5O8cRR9Zx3Ca87XRK8Zi7+D1EQ6JWnbn2bYhE3kRnxC0v7p+JnMLpmNo/oy65AXc76OZs1Yf0xnl8b2p4cxYVMuEZ8ksX+6ydwEAoFAIBAIBAKB4B9Hmxl0hTHP0n/EBnq8cZjvnw9pZqVMTeK6gfRbkM2SQ5m8PsTYUisk5tn+jNjQgzcOf8/zIc2su6kTWTewHwuyl3Ao83UaZScQCAQCgUAgEAgE/0DaJoZOncgnz0SRPjSKD57RGnPKsz8wb7g71hIJjn2ms+XsFX6c3ZPwd08BUvo+vIR7yeOjPQkmsvuEZ6LSGRr1Ac+EdASUnP1hHsPdrZFIHOkzfQtnr/zI7J7haLPry8NL7oW8jzCRnUAgEAgEAoFAIBD8I7Fqi0xK973DS6fdWHJoBgFSIPVTxgx4jBj3Sby9fQauh17gsQHByCjjzs2dtSd16kZ/N9hxMo0cwuhUnxv73nmJ025LODQjAG12YxjwWAzuk95m+wxXDr3wGAOCZVB25/+3d38hVtYJGMefhXUn2lyW1jOFAzYxobNIoWGyOpEFWpokeSOETkl2UVcNg6GQlATd6BBh0QRlEKVZdFES/TF0bixra1ATGyaa1pSBbQ7F4q6x01mYvXhHj2akMFPwnj6fqzkvZx7m9ss77/tLfW5OKnkjh/7xTTL/ivP+RgAAgEYzCUFXS/+elzNaWZ/l86YkOZm+pzekb7Qjz/W9mvvaktw5L5VT7bn1menp+Ovp2PpLWmYmqf47/0nqQVfrz56XR1NZvzzFXF+e3tCX0Y7n0vfqfSnmKjnVfmuemd6R+lxLirlz1gAAABrWJATdQPrfGU2W/i2zpySp9Wd3bzVN617MqjPvJ7k8V117dZJZaW89fe3bDH+RZOmVqZwz159ibnaKud3prTZl3Yur6i9PufyqFHPtqc8Np5g7Zw0AAKBhTfwZupPH89lgMuu6GflTcibIli25vvicJKnl6yN/T+YvzMzTF0+OZKiaVNqaz/pecvL4ZxnMrFw3o7g60P9ORrMsS64/61u1r1PMzUx9bijVVNLWfPYaAABA45p40FX/ma+STPvzH4vP3w5nMElr89n/9jiQw3uTzGvL1eNXakc/yrtpyor57T+a+yrJtNTnBpO05ty5wynmzqzl6EfvJk0r8qM5AACAhjU5b7n8CT/8rzb+03c52NOVTYNJ/vD7TBm/9l5vT6qV9Vm3+GLuqP2Q+tzB9HRtSjE3fj7Bd++lt6eayvp1uag5AACABjDxZ+gum5pKkoF/nSo+z5yXZUm2b3g4HWNzcuypR/LY4ZuzZnlftu/Ylp5FtUz/cGPufak5Xfu6zzsz7rKplSQDqc8tS7I9Gx7uyNicY3nqkcdy+OY1Wd63PTu29WRRbXo+3HhvXmruyr7uBXEEHQAA8Fsx8Tt048cPDO47kuEkaVmVJ3etzTVfbs3qFV15fdrGHDj0fHqf2JW1zXvz0Mrbcv/OSrr3fJAtt5x/YHhx/MBg9h0ZTjH3ZHatvSZfbl2dFV2vZ9rGAzn0fG+e2LU2zXsfysrb7s/OSnf2fLAlPzEHAADQsH43NjY2NrGJWg5sasnCxy/J5o+H8uj8Cd4jqx3IppaFefySzfl46NFMdA4AAKBRTcIzdFOyoPuFdDadyObFd2TbpyOpXfiXfmZuQbpf6EzTic1ZfMe2fDoyoTUAAICGNQl36Ar//XxH7lm6Jq+dSKbOXpnOu27Pkhtm5NIk+f54Pnn/7ex+c38W7RzJlpsuuJbPd9yTpWtey4lMzeyVnbnr9iW5YcalKeY+yftv786b+xdl58iWXHAOAACgAU1a0CVJaiM5+tYr2fpsb/YfPJah6mhxvamStta5ubHz7jz4wOrMvchn3WojR/PWK1vzbO/+HDw2lPpcW1rn3pjOux/MA6vnxqNzAADAb9HkBh0AAAC/ml/sHDoAAAB+WYIOAACgpAQdAABASQk6AACAkhJ0AAAAJSXoAAAASkrQAQAAlJSgAwAAKClBBwAAUFKCDgAAoKQEHQAAQEkJOgAAgJISdAAAACUl6AAAAEpK0AEAAJSUoAMAACgpQQcAAFBSgg4AAKCkBB0AAEBJCToAAICSEnQAAAAlJegAAABKStABAACUlKADAAAoKUEHAABQUoIOAACgpAQdAABASQk6AACAkhJ0AAAAJSXoAAAASur/BSswoT5dxHgAAAAASUVORK5CYII=",
            "type": "image/png"
        }
    }
}
Public CORE CONTENT for the CWP Programme
[img width=150 [SiteIcon]]<br/>Children Wellbeing Practitioner  
<div class="tc-afc-above-story-logo">
[img width=160 [$:/_AFC/grey-wordmark.svg]]
</div>
<$reveal type="nomatch" state=<<folded-state>> text="hide" tag="div" retain="yes" animate="yes">
<div class="tc-xememex-tiddler-info tc-subtitle">
Bag: <$view tiddler="$:/state/federatial/xememex/tiddlers/bag" index=<<currentTiddler>>>(none)</$view>
</div>
</$reveal>
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline


@font-face {
  font-display: swap;
  font-family: FormaDJRBanner;
  font-style: normal;
  font-weight: 300;
  src: url(/fonts/$:/_fonts/FormaDJRBanner-Light.woff) format("woff");
}

@font-face {
  font-display: swap;
  font-family: FormaDJRBanner;
  font-style: italic;
  font-weight: 300;
  src: url(/fonts/$:/_fonts/FormaDJRBanner-LightItalic.woff) format("woff");
}

@font-face {
  font-display: swap;
  font-family: FormaDJRBanner;
  font-style: normal;
  font-weight: 400;
  src: url(/fonts/$:/_fonts/FormaDJRBanner-Regular.woff) format("woff");
}

@font-face {
  font-display: swap;
  font-family: FormaDJRBanner;
  font-style: italic;
  font-weight: 400;
  src: url(/fonts/$:/_fonts/FormaDJRBanner-Italic.woff) format("woff");
}

@font-face {
  font-display: swap;
  font-family: FormaDJRBanner;
  font-style: normal;
  font-weight: 500;
  src: url(/fonts/$:/_fonts/FormaDJRBanner-Medium.woff) format("woff");
}

@font-face {
  font-display: swap;
  font-family: FormaDJRBanner;
  font-style: italic;
  font-weight: 500;
  src: url(/fonts/$:/_fonts/FormaDJRBanner-MediumItalic.woff) format("woff");
}

@font-face {
  font-display: swap;
  font-family: FormaDJRBanner;
  font-style: italic;
  font-weight: 700;
  src: url(/fonts/$:/_fonts/FormaDJRBanner-BoldItalic.woff) format("woff");
}

@font-face {
  font-display: swap;
  font-family: Mulish;
  font-style: normal;
  font-weight: 400;
  src: url(/fonts/$:/_fonts/Mulish-Regular.woff) format("woff");
}

@font-face {
  font-display: swap;
  font-family: Mulish;
  font-style: italic;
  font-weight: 400;
  src: url(/fonts/$:/_fonts/Mulish-Italic.woff) format("woff");
}

@font-face {
  font-display: swap;
  font-family: Mulish;
  font-style: normal;
  font-weight: 700;
  src: url(/fonts/$:/_fonts/Mulish-Bold.woff) format("woff");
}

@font-face {
  font-display: swap;
  font-family: Mulish;
  font-style: italic;
  font-weight: 700;
  src: url(/fonts/$:/_fonts/Mulish-BoldItalic.woff) format("woff");
}

@font-face {
  font-display: swap;
  font-family: Mulish;
  font-style: normal;
  font-weight: 900;
  src: url(/fonts/$:/_fonts/Mulish-Black.woff) format("woff");
}

@font-face {
  font-display: swap;
  font-family: Mulish;
  font-style: italic;
  font-weight: 900;
  src: url(/fonts/$:/_fonts/Mulish-BlackItalic.woff) format("woff");
}

html body.tc-body {
font-family: "Mulish";
}

.tc-top-menu,
.tc-site-title,
.tc-site-subtitle,
h1, h2, h3, h4, h5, h6 {
font-family: "FormaDJRBanner";
letter-spacing: 0.09em;
font-weight: 600;
text-align: left;
}

h1 button, h2 button, h3 button, h4 button, h5 button, h6 button {
letter-spacing: 0.09em;
}

.tc-site-title {
font-weight: bold;
}

body .tc-titlebar h2 {
font-weight: 700;
}
\define image(title,width,height)
<$image source=<<__title__>> width=<<__width__>> height=<<__height__>>/>
\end
\define embed-video(code)
<$reveal state="$:/state/consent-banner/accepted" type="match" text="yes" tag="div">
<iframe width="560" height="315" src="https://www.youtube.com/embed/$code$" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
</$reveal>
<$reveal state="$:/state/consent-banner/accepted" type="nomatch" text="yes" tag="div">
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/$code$" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
</$reveal>
\end

<<embed-video KtCUr83XgyE>>
afc-white: #fff
afc-black: #000
afc-black-half: #888888
afc-grey: #f8f8f8
afc-light-grey: #f4f4f4
afc-dark-grey: #bfbfbf
afc-darken-grey: #03070a
afc-dark-blue: #232d5a
afc-solid-turquoise: #64c3d7
afc-mid-turquoise: #afdce6
afc-light-turquoise: #eff8f9
afc-solid-purple: #645fa5
afc-mid-purple: #aaa0cd
afc-light-purple: #e4e1f2
afc-solid-pink: #ed73aa
afc-mid-pink: #f0afcb
afc-light-pink: #fbe3f0
afc-solid-yellow: #ffe516
afc-mid-yellow: #ffebaf
afc-light-yellow: #fff6e1
afc-solid-green: #73be6e
afc-mid-green: #bedcaf
afc-light-green: #d7ead9

consent-banner-background: <<colour afc-light-purple>>
consent-banner-foreground: <<colour afc-dark-blue>>
consent-banner-link-foreground: <<colour afc-dark-blue>>
consent-banner-button-border: <<colour afc-dark-blue>>
consent-banner-button-foreground: <<colour afc-dark-blue>>
consent-banner-button-background: <<colour afc-light-purple>>
consent-banner-button-hover-foreground: <<colour afc-light-purple>>
consent-banner-button-hover-border: <<colour afc-light-purple>>
consent-banner-button-hover-background: <<colour afc-dark-blue>>
consent-banner-button-default-foreground: <<colour afc-light-purple>>
consent-banner-button-default-background: <<colour afc-dark-blue>>

menubar-background: <<colour afc-solid-purple>>
menubar-foreground: <<colour afc-white>>

page-footer-background: <<colour afc-solid-green>>
page-footer-foreground: <<colour afc-white>>

alert-background: <<color afc-white>>
alert-border: #b99e2f
alert-highlight: #881122
alert-muted-foreground: #b99e2f
background: #fff
blockquote-bar: <<colour muted-foreground>>
button-background:
button-foreground:
button-border:
code-background: #f7f7f9
code-border: #e1e1e8
code-foreground: #dd1144
dirty-indicator: #ff0000
download-background: #34c734
download-foreground: <<colour background>>
dragger-background: <<colour foreground>>
dragger-foreground: <<colour background>>
dropdown-background: <<colour background>>
dropdown-border: <<colour muted-foreground>>
dropdown-tab-background-selected: #fff
dropdown-tab-background: #ececec
dropzone-background: rgba(0,200,0,0.7)
external-link-background-hover: inherit
external-link-background-visited: inherit
external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee
foreground: <<color afc-black>>
message-background: #ecf2ff
message-border: #cfd6e6
message-foreground: #547599
modal-backdrop: <<colour foreground>>
modal-background: <<colour background>>
modal-border: #999999
modal-footer-background: #f5f5f5
modal-footer-border: #dddddd
modal-header-border: #eeeeee
muted-foreground: #bbb
notification-background: #ffffdd
notification-border: #999999
page-background: <<color afc-light-turquoise>>
pre-background: #f5f5f5
pre-border: #cccccc
primary: <<colour afc-solid-purple>>
sidebar-button-foreground: <<colour foreground>>
sidebar-controls-foreground-hover: #000000
sidebar-controls-foreground: #aaaaaa
sidebar-foreground-shadow: rgba(0,0,0,0)
sidebar-foreground: <<colour afc-dark-blue>>
sidebar-muted-foreground-hover: #444444
sidebar-muted-foreground: #c0c0c0
sidebar-tab-background-selected: #f4f4f4
sidebar-tab-background: #e0e0e0
sidebar-tab-border-selected: <<colour tab-border-selected>>
sidebar-tab-border: <<colour tab-border>>
sidebar-tab-divider: #e4e4e4
sidebar-tab-foreground-selected:
sidebar-tab-foreground: <<colour tab-foreground>>
sidebar-tiddler-link-foreground-hover: #444444
sidebar-tiddler-link-foreground: <<colour afc-dark-blue>>
site-title-foreground: <<colour tiddler-title-foreground>>
static-alert-foreground: #aaaaaa
tab-background-selected: #ffffff
tab-background: #d8d8d8
tab-border-selected: #d8d8d8
tab-border: #cccccc
tab-divider: #d8d8d8
tab-foreground-selected: <<colour tab-foreground>>
tab-foreground: #666666
table-border: #dddddd
table-footer-background: #a8a8a8
table-header-background: #f0f0f0
tag-background: <<colour afc-mid-yellow>>
tag-foreground: <<colour afc-black>>
tiddler-background: <<colour background>>
tiddler-border: <<colour background>>
tiddler-controls-foreground-hover: <<colour afc-dark-blue>>
tiddler-controls-foreground-selected: <<colour afc-black>>
tiddler-controls-foreground: <<colour afc-solid-turquoise>>
tiddler-editor-background: #f8f8f8
tiddler-editor-border-image: #ffffff
tiddler-editor-border: #cccccc
tiddler-editor-fields-even: #e0e8e0
tiddler-editor-fields-odd: #f0f4f0
tiddler-info-background: #f8f8f8
tiddler-info-border: #dddddd
tiddler-info-tab-background: #f8f8f8
tiddler-link-background: <<colour background>>
tiddler-link-foreground: <<colour primary>>
tiddler-subtitle-foreground: <<colour afc-dark-blue>>
tiddler-title-foreground: #182955
toolbar-new-button:
toolbar-options-button:
toolbar-save-button:
toolbar-info-button:
toolbar-edit-button:
toolbar-close-button:
toolbar-delete-button:
toolbar-cancel-button:
toolbar-done-button:
untagged-background: #999999
very-muted-foreground: #888888
<$list filter="[<currentTiddler>!is[tiddler]]" variable="ignore"> 
<div class="tc-sidebuttons">
<a href="mailto:manuals@annafreud.org?subject=Feedback%20on%20the%20manuals" target="__blank">
{{$:/core/images/plugin-generic-language}} Give Feedback
</a>
</div>
</$list>
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline

.tc-sidebuttons {
position: fixed;
right: 0;
top: 50%;
width: 8em;
}


.tc-sidebuttons svg {
fill: <<colour background>>;
float: left;
width: 2em;
height: 2em;
margin-right: 4px;
}

.tc-sidebuttons a {
display: block;
background: <<colour afc-green>>;
padding: 4px;
border-top-left-radius: 8px;
border-bottom-left-radius: 8px;
font-weight: bold;
text-decoration: none;
color: <<colour background>>;
}

.tc-sidebuttons a:hover {
background: <<colour afc-pale-green>>;
}
<$action-setfield $tiddler="$:/state/showeditpreview" $value="yes"/>
<$action-setfield $tiddler="$:/state/editpreviewtype" $value="$:/core/ui/EditTemplate/body/preview/output"/>
/* ------------------------------------------
PURE CSS SPEECH BUBBLES
by Nicolas Gallagher
- http://nicolasgallagher.com/pure-css-speech-bubbles/

http://nicolasgallagher.com
http://twitter.com/necolas

Created: 02 March 2010
Version: 1.2 (03 March 2011)

Dual licensed under MIT and GNU GPLv2 Nicolas Gallagher
------------------------------------------ */

/* NOTE: Some declarations use longhand notation so that it can be clearly
explained what specific properties or values do and what their relationship
is to other properties or values in creating the effect */

/* ============================================================================================================================
== BUBBLE WITH AN ISOCELES TRIANGLE
** ============================================================================================================================ */

/* THE SPEECH BUBBLE
------------------------------------------------------------------------------------------------------------------------------- */

.bubbles-triangle-isosceles {
  position:relative;
  padding:15px;
  margin:1em 0 3em;
  color:#000;
  background:#f3961c; /* default background for browsers without gradient support */
  /* css3 */
  background:-webkit-gradient(linear, 0 0, 0 100%, from(#f9d835), to(#f3961c));
  background:-moz-linear-gradient(#f9d835, #f3961c);
  background:-o-linear-gradient(#f9d835, #f3961c);
  background:linear-gradient(#f9d835, #f3961c);
  -webkit-border-radius:10px;
  -moz-border-radius:10px;
  border-radius:10px;
}

/* Variant : for top positioned triangle
------------------------------------------ */

.bubbles-triangle-isosceles.bubbles-top {
  background:-webkit-gradient(linear, 0 0, 0 100%, from(#f3961c), to(#f9d835));
  background:-moz-linear-gradient(#f3961c, #f9d835);
  background:-o-linear-gradient(#f3961c, #f9d835);
  background:linear-gradient(#f3961c, #f9d835);
}

/* Variant : for left/right positioned triangle
------------------------------------------ */

.bubbles-triangle-isosceles.bubbles-left {
  margin-left:50px;
  background:#f3961c;
}

/* Variant : for right positioned triangle
------------------------------------------ */

.bubbles-triangle-isosceles.bubbles-right {
  margin-right:50px;
  background:#f3961c;
}

/* THE TRIANGLE
------------------------------------------------------------------------------------------------------------------------------- */

/* creates triangle */
.bubbles-triangle-isosceles:after {
  content:"";
  position:absolute;
  bottom:-15px; /* value = - border-top-width - border-bottom-width */
  left:50px; /* controls horizontal position */
  border-width:15px 15px 0; /* vary these values to change the angle of the vertex */
  border-style:solid;
  border-color:#f3961c transparent;
  /* reduce the damage in FF3.0 */
  display:block;
  width:0;
}

/* Variant : top
------------------------------------------ */

.bubbles-triangle-isosceles.bubbles-top:after {
  top:-15px; /* value = - border-top-width - border-bottom-width */
  right:50px; /* controls horizontal position */
  bottom:auto;
  left:auto;
  border-width:0 15px 15px; /* vary these values to change the angle of the vertex */
  border-color:#f3961c transparent;
}

/* Variant : left
------------------------------------------ */

.bubbles-triangle-isosceles.bubbles-left:after {
  top:16px; /* controls vertical position */
  left:-50px; /* value = - border-left-width - border-right-width */
  bottom:auto;
  border-width:10px 50px 10px 0;
  border-color:transparent #f3961c;
}

/* Variant : right
------------------------------------------ */

.bubbles-triangle-isosceles.bubbles-right:after {
  top:16px; /* controls vertical position */
  right:-50px; /* value = - border-left-width - border-right-width */
  bottom:auto;
  left:auto;
  border-width:10px 0 10px 50px;
  border-color:transparent #f3961c;
}


/* ============================================================================================================================
== BUBBLE WITH A RIGHT-ANGLED TRIANGLE
** ============================================================================================================================ */

/* THE SPEECH BUBBLE
------------------------------------------------------------------------------------------------------------------------------- */

.bubbles-triangle-right {
  position:relative;
  padding:15px;
  margin:1em 0 3em;
  color:#fff;
  background:#075698; /* default background for browsers without gradient support */
  /* css3 */
  background:-webkit-gradient(linear, 0 0, 0 100%, from(#2e88c4), to(#075698));
  background:-moz-linear-gradient(#2e88c4, #075698);
  background:-o-linear-gradient(#2e88c4, #075698);
  background:linear-gradient(#2e88c4, #075698);
  -webkit-border-radius:10px;
  -moz-border-radius:10px;
  border-radius:10px;
}

/* Variant : for top positioned triangle
------------------------------------------ */

.bubbles-triangle-right.bubbles-top {
  background:-webkit-gradient(linear, 0 0, 0 100%, from(#075698), to(#2e88c4));
  background:-moz-linear-gradient(#075698, #2e88c4);
  background:-o-linear-gradient(#075698, #2e88c4);
  background:linear-gradient(#075698, #2e88c4);
}

/* Variant : for left positioned triangle
------------------------------------------ */

.bubbles-triangle-right.bubbles-left {
  margin-left:40px;
  background:#075698;
}

/* Variant : for right positioned triangle
------------------------------------------ */

.bubbles-triangle-right.bubbles-right {
  margin-right:40px;
  background:#075698;
}

/* THE TRIANGLE
------------------------------------------------------------------------------------------------------------------------------- */

.bubbles-triangle-right:after {
  content:"";
  position:absolute;
  bottom:-20px; /* value = - border-top-width - border-bottom-width */
  left:50px; /* controls horizontal position */
  border-width:20px 0 0 20px; /* vary these values to change the angle of the vertex */
  border-style:solid;
  border-color:#075698 transparent;
  /* reduce the damage in FF3.0 */
  display:block;
  width:0;
}

/* Variant : top
------------------------------------------ */

.bubbles-triangle-right.bubbles-top:after {
  top:-20px; /* value = - border-top-width - border-bottom-width */
  right:50px; /* controls horizontal position */
  bottom:auto;
  left:auto;
  border-width:20px 20px 0 0; /* vary these values to change the angle of the vertex */
  border-color:transparent #075698;
}

/* Variant : left
------------------------------------------ */

.bubbles-triangle-right.bubbles-left:after {
  top:16px;
  left:-40px; /* value = - border-left-width - border-right-width */
  bottom:auto;
  border-width:15px 40px 0 0; /* vary these values to change the angle of the vertex */
  border-color:transparent #075698;
}

/* Variant : right
------------------------------------------ */

.bubbles-triangle-right.bubbles-right:after {
  top:16px;
  right:-40px; /* value = - border-left-width - border-right-width */
  bottom:auto;
  left:auto;
  border-width:15px 0 0 40px; /* vary these values to change the angle of the vertex */
  border-color:transparent #075698 ;
}


/* ============================================================================================================================
== BUBBLE WITH AN OBTUSE TRIANGLE
** ============================================================================================================================ */

/* THE SPEECH BUBBLE
------------------------------------------------------------------------------------------------------------------------------- */

.bubbles-triangle-obtuse {
  position:relative;
  padding:15px;
  margin:1em 0 3em;
  color:#fff;
  background:#c81e2b;
  /* css3 */
  background:-webkit-gradient(linear, 0 0, 0 100%, from(#f04349), to(#c81e2b));
  background:-moz-linear-gradient(#f04349, #c81e2b);
  background:-o-linear-gradient(#f04349, #c81e2b);
  background:linear-gradient(#f04349, #c81e2b);
  -webkit-border-radius:10px;
  -moz-border-radius:10px;
  border-radius:10px;
}

/* Variant : for top positioned triangle
------------------------------------------ */

.bubbles-triangle-obtuse.bubbles-top {
  background:-webkit-gradient(linear, 0 0, 0 100%, from(#c81e2b), to(#f04349));
  background:-moz-linear-gradient(#c81e2b, #f04349);
  background:-o-linear-gradient(#c81e2b, #f04349);
  background:linear-gradient(#c81e2b, #f04349);
}

/* Variant : for left positioned triangle
------------------------------------------ */

.bubbles-triangle-obtuse.bubbles-left {
  margin-left:50px;
  background:#c81e2b;
}

/* Variant : for right positioned triangle
------------------------------------------ */

.bubbles-triangle-obtuse.bubbles-right {
  margin-right:50px;
  background:#c81e2b;
}

/* THE TRIANGLE
------------------------------------------------------------------------------------------------------------------------------- */

/* creates the wider right-angled triangle */
.bubbles-triangle-obtuse:before {
  content:"";
  position:absolute;
  bottom:-20px; /* value = - border-top-width - border-bottom-width */
  left:60px; /* controls horizontal position */
  border:0;
  border-right-width:30px; /* vary this value to change the angle of the vertex */
  border-bottom-width:20px; /* vary this value to change the height of the triangle. must be equal to the corresponding value in :after */
  border-style:solid;
  border-color:transparent #c81e2b;
  /* reduce the damage in FF3.0 */
  display:block;
  width:0;
}

/* creates the narrower right-angled triangle */
.bubbles-triangle-obtuse:after {
  content:"";
  position:absolute;
  bottom:-20px; /* value = - border-top-width - border-bottom-width */
  left:80px; /* value = (:before's left) + (:before's border-right/left-width)  - (:after's border-right/left-width) */
  border:0;
  border-right-width:10px; /* vary this value to change the angle of the vertex */
  border-bottom-width:20px; /* vary this value to change the height of the triangle. must be equal to the corresponding value in :before */
  border-style:solid;
  border-color:transparent #fff;
  /* reduce the damage in FF3.0 */
  display:block;
  width:0;
}

/* Variant : top
------------------------------------------ */

.bubbles-triangle-obtuse.bubbles-top:before {
  top:-20px; /* value = - border-top-width - border-bottom-width */
  bottom:auto;
  left:auto;
  right:60px; /* controls horizontal position */
  border:0;
  border-left-width:30px; /* vary this value to change the width of the triangle */
  border-top-width:20px; /* vary this value to change the height of the triangle. must be equal to the corresponding value in :after */
  border-color:transparent #c81e2b;
}

.bubbles-triangle-obtuse.bubbles-top:after {
  top:-20px; /* value = - border-top-width - border-bottom-width */
  bottom:auto;
  left:auto;
  right:80px; /* value = (:before's right) + (:before's border-right/left-width)  - (:after's border-right/left-width) */
  border-width:0;
  border-left-width:10px; /* vary this value to change the width of the triangle */
  border-top-width:20px; /* vary this value to change the height of the triangle. must be equal to the corresponding value in :before */
  border-color:transparent #fff;
}

/* Variant : left
------------------------------------------ */

.bubbles-triangle-obtuse.bubbles-left:before {
  top:15px; /* controls vertical position */
  bottom:auto;
  left:-50px; /* value = - border-left-width - border-right-width */
  border:0;
  border-bottom-width:30px; /* vary this value to change the height of the triangle */
  border-left-width:50px; /* vary this value to change the width of the triangle. must be equal to the corresponding value in :after */
  border-color:#c81e2b transparent;
}

.bubbles-triangle-obtuse.bubbles-left:after {
  top:35px; /* value = (:before's top) + (:before's border-top/bottom-width)  - (:after's border-top/bottom-width) */
  bottom:auto;
  left:-50px; /* value = - border-left-width - border-right-width */
  border:0;
  border-bottom-width:10px; /* vary this value to change the height of the triangle */
  border-left-width:50px; /* vary this value to change the width of the triangle. must be equal to the corresponding value in :before */
  border-color:#fff transparent;
}

/* Variant : right
------------------------------------------ */

.bubbles-triangle-obtuse.bubbles-right:before {
  top:15px; /* controls vertical position */
  bottom:auto;
  left:auto;
  right:-50px; /* value = - border-left-width - border-right-width */
  border:0;
  border-bottom-width:30px; /* vary this value to change the height of the triangle */
  border-right-width:50px; /* vary this value to change the width of the triangle. must be equal to the corresponding value in :after */
  border-color:#c81e2b transparent;
}

.bubbles-triangle-obtuse.bubbles-right:after {
  top:35px; /* value = (:before's top) + (:before's border-top/bottom-width)  - (:after's border-top/bottom-width) */
  bottom:auto;
  right:-50px; /* value = - border-left-width - border-right-width */
  left:auto;
  border:0;
  border-bottom-width:10px; /* vary this value to change the height of the triangle */
  border-right-width:50px; /* vary this value to change the width of the triangle. must be equal to the corresponding value in :before */
  border-color:#fff transparent;
}


/* ============================================================================================================================
== BUBBLE WITH A BORDER AND TRIANGLE
** ============================================================================================================================ */

/* THE SPEECH BUBBLE
------------------------------------------------------------------------------------------------------------------------------- */

.bubbles-triangle-border {
  position:relative;
  padding:15px;
  margin:1em 0 3em;
  border:5px solid #5a8f00;
  color:#333;
  background:#fff;
  /* css3 */
  -webkit-border-radius:10px;
  -moz-border-radius:10px;
  border-radius:10px;
}

/* Variant : for left positioned triangle
------------------------------------------ */

.bubbles-triangle-border.bubbles-left {
  margin-left:30px;
}

/* Variant : for right positioned triangle
------------------------------------------ */

.bubbles-triangle-border.bubbles-right {
  margin-right:30px;
}

/* THE TRIANGLE
------------------------------------------------------------------------------------------------------------------------------- */

.bubbles-triangle-border:before {
  content:"";
  position:absolute;
  bottom:-20px; /* value = - border-top-width - border-bottom-width */
  left:40px; /* controls horizontal position */
  border-width:20px 20px 0;
  border-style:solid;
  border-color:#5a8f00 transparent;
  /* reduce the damage in FF3.0 */
  display:block;
  width:0;
}

/* creates the smaller  triangle */
.bubbles-triangle-border:after {
  content:"";
  position:absolute;
  bottom:-13px; /* value = - border-top-width - border-bottom-width */
  left:47px; /* value = (:before left) + (:before border-left) - (:after border-left) */
  border-width:13px 13px 0;
  border-style:solid;
  border-color:#fff transparent;
  /* reduce the damage in FF3.0 */
  display:block;
  width:0;
}

/* Variant : top
------------------------------------------ */

/* creates the larger triangle */
.bubbles-triangle-border.bubbles-top:before {
  top:-20px; /* value = - border-top-width - border-bottom-width */
  bottom:auto;
  left:auto;
  right:40px; /* controls horizontal position */
  border-width:0 20px 20px;
}

/* creates the smaller  triangle */
.bubbles-triangle-border.bubbles-top:after {
  top:-13px; /* value = - border-top-width - border-bottom-width */
  bottom:auto;
  left:auto;
  right:47px; /* value = (:before right) + (:before border-right) - (:after border-right) */
  border-width:0 13px 13px;
}

/* Variant : left
------------------------------------------ */

/* creates the larger triangle */
.bubbles-triangle-border.bubbles-left:before {
  top:10px; /* controls vertical position */
  bottom:auto;
  left:-30px; /* value = - border-left-width - border-right-width */
  border-width:15px 30px 15px 0;
  border-color:transparent #5a8f00;
}

/* creates the smaller  triangle */
.bubbles-triangle-border.bubbles-left:after {
  top:16px; /* value = (:before top) + (:before border-top) - (:after border-top) */
  bottom:auto;
  left:-21px; /* value = - border-left-width - border-right-width */
  border-width:9px 21px 9px 0;
  border-color:transparent #fff;
}

/* Variant : right
------------------------------------------ */

/* creates the larger triangle */
.bubbles-triangle-border.bubbles-right:before {
  top:10px; /* controls vertical position */
  bottom:auto;
  left:auto;
  right:-30px; /* value = - border-left-width - border-right-width */
  border-width:15px 0 15px 30px;
  border-color:transparent #5a8f00;
}

/* creates the smaller  triangle */
.bubbles-triangle-border.bubbles-right:after {
  top:16px; /* value = (:before top) + (:before border-top) - (:after border-top) */
  bottom:auto;
  left:auto;
  right:-21px; /* value = - border-left-width - border-right-width */
  border-width:9px 0 9px 21px;
  border-color:transparent #fff;
}


/* ============================================================================================================================
== SPEECH BUBBLE ICON
** ============================================================================================================================ */

.bubbles-example-commentheading {
  position:relative;
  padding:0;
  color:#b513af;
}

/* creates the rectangle */
.bubbles-example-commentheading:before {
  content:"";
  position:absolute;
  top:9px;
  left:-25px;
  width:15px;
  height:10px;
  background:#b513af;
  /* css3 */
  -webkit-border-radius:3px;
  -moz-border-radius:3px;
  border-radius:3px;
}

/* creates the triangle */
.bubbles-example-commentheading:after {
  content:"";
  position:absolute;
  top:15px;
  left:-19px;
  border:4px solid transparent;
  border-left-color:#b513af;
  /* reduce the damage in FF3.0 */
  display:block;
  width:0;
}


/* ============================================================================================================================
== BLOCKQUOTE WITH RIGHT-ANGLED TRIANGLE
** ============================================================================================================================ */

.bubbles-example-right {
  position:relative;
  padding:15px 30px;
  margin:0;
  color:#fff;
  background:#5a8f00; /* default background for browsers without gradient support */
  /* css3 */
  background:-webkit-gradient(linear, 0 0, 0 100%, from(#b8db29), to(#5a8f00));
  background:-moz-linear-gradient(#b8db29, #5a8f00);
  background:-o-linear-gradient(#b8db29, #5a8f00);
  background:linear-gradient(#b8db29, #5a8f00);
  -webkit-border-radius:10px;
  -moz-border-radius:10px;
  border-radius:10px;
}

/* display of quote author (alternatively use a class on the element following the blockquote) */
.example-right + p {margin:15px 0 2em 85px; font-style:italic;}

/* creates the triangle */
.bubbles-example-right:after {
  content:"";
  position:absolute;
  bottom:-50px;
  left:50px;
  border-width:0 20px 50px 0px;
  border-style:solid;
  border-color:transparent #5a8f00;
  /* reduce the damage in FF3.0 */
  display:block;
  width:0;
}


/* ============================================================================================================================
== BLOCKQUOTE WITH OBTUSE TRIANGLE
** ============================================================================================================================ */

.bubbles-example-obtuse {
  position:relative;
  padding:15px 30px;
  margin:0;
  color:#000;
  background:#f3961c; /* default background for browsers without gradient support */
  /* css3 */
  background:-webkit-gradient(linear, 0 0, 0 100%, from(#f9d835), to(#f3961c));
  background:-moz-linear-gradient(#f9d835, #f3961c);
  background:-o-linear-gradient(#f9d835, #f3961c);
  background:linear-gradient(#f9d835, #f3961c);
  /* Using longhand to avoid inconsistencies between Safari 4 and Chrome 4 */
  -webkit-border-top-left-radius:25px 50px;
  -webkit-border-top-right-radius:25px 50px;
  -webkit-border-bottom-right-radius:25px 50px;
  -webkit-border-bottom-left-radius:25px 50px;
  -moz-border-radius:25px / 50px;
  border-radius:25px / 50px;
}

/* display of quote author (alternatively use a class on the element following the blockquote) */
.example-obtuse + p {margin:10px 150px 2em 0; text-align:right; font-style:italic;}

/* creates the larger triangle */
.bubbles-example-obtuse:before {
  content:"";
  position:absolute;
  bottom:-30px;
  right:80px;
  border-width:0 0 30px 50px;
  border-style:solid;
  border-color:transparent #f3961c;
  /* reduce the damage in FF3.0 */
  display:block;
  width:0;
}

/* creates the smaller triangle */
.bubbles-example-obtuse:after {
  content:"";
  position:absolute;
  bottom:-30px;
  right:110px;
  border-width:0 0 30px 20px;
  border-style:solid;
  border-color:transparent #fff;
  /* reduce the damage in FF3.0 */
  display:block;
  width:0;
}


/* ============================================================================================================================
== TWITTER
** ============================================================================================================================ */

.bubbles-example-twitter {
  position:relative;
  padding:15px;
  margin:100px 0 0.5em;
  color:#333;
  background:#eee;
  /* css3 */
  -webkit-border-radius:10px;
  -moz-border-radius:10px;
  border-radius:10px;
}

.bubbles-example-twitter p {font-size:28px; line-height:1.25em;}

/* this isn't necessary, just saves me having to edit the HTML of the demo */
.bubbles-example-twitter:before {
  content:url(twitter-logo.gif);
  position:absolute;
  top:-60px;
  left:0;
  width:155px;
  height:36px;
  /* reduce the damage in FF3.0 */
  display:block;
}

/* creates the triangle */
.bubbles-example-twitter:after {
  content:"";
  position:absolute;
  top:-30px;
  left:50px;
  border:15px solid transparent;
  border-bottom-color:#eee;
  /* reduce the damage in FF3.0 */
  display:block;
  width:0;
}

/* display of quote author (alternatively use a class on the element following the blockquote) */
.bubbles-example-twitter + p {padding-left:15px; font:14px Arial, sans-serif;}


/* ============================================================================================================================
== NUMBER
** ============================================================================================================================ */

.bubbles-example-number {
  position:relative;
  width:200px;
  height:200px;
  margin:50px 0 200px;
  text-align:center;
  font:140px/200px Arial, sans-serif;
  color:#fff;
  background:#C91F2C;
}

/* creates the larger triangle */
.bubbles-example-number:before {
  content:"";
  position:absolute;
  bottom:-140px;
  right:0;
  border-width:0 0 140px 140px;
  border-style:solid;
  border-color:transparent #C91F2C;
}

/* creates the larger triangle */
.bubbles-example-number:after {
  content:"";
  position:absolute;
  bottom:-140px;
  right:85px;
  border-width:0 0 140px 55px;
  border-style:solid;
  border-color:transparent #fff;
}


/* ============================================================================================================================
== PINCHED SPEECH BUBBLE (more CSS3)
** ============================================================================================================================ */

.bubbles-pinched {
  position:relative;
  padding:15px;
  margin:50px 0 3em;
  text-align:center;
  color:#fff;
  background:#333;
  /* css3 */
  -webkit-border-radius:10px;
  -moz-border-radius:10px;
  border-radius:10px;
}

/* creates a rectangle of the colour wanted for the pointy bit */
.bubbles-pinched:before {
  content:"";
  position:absolute;
  top:-20px;
  left:50%;
  width:100px;
  height:20px;
  margin:0 0 0 -50px;
  background:#333;
}

/* creates a rounded rectangle to cover part of the rectangle generated above */
.bubbles-pinched:after {
  content:"";
  position:absolute;
  top:-20px;
  left:0;
  width:50%;
  height:20px;
  background:#fff;
  /* css3 */
  -webkit-border-bottom-right-radius:15px;
  -moz-border-radius-bottomright:15px;
  border-bottom-right-radius:15px;
}

/* creates the other rounded rectangle */
.bubbles-pinched > :first-child:before {
  content:"";
  position:absolute;
  top:-20px;
  right:0;
  width:50%;
  height:20px;
  background:#fff;
  /* css3 */
  -webkit-border-bottom-left-radius:15px;
  -moz-border-radius-bottomleft:15px;
  border-bottom-left-radius:15px;
}


/* ============================================================================================================================
== OVAL SPEECH BUBBLE (more CSS3)
** ============================================================================================================================ */

.bubbles-oval-speech {
  position:relative;
  width:270px;
  padding:50px 40px;
  margin:1em auto 50px;
  text-align:center;
  color:#fff;
  background:#5a8f00;
  /* css3 */
  background:-webkit-gradient(linear, 0 0, 0 100%, from(#b8db29), to(#5a8f00));
  background:-moz-linear-gradient(#b8db29, #5a8f00);
  background:-o-linear-gradient(#b8db29, #5a8f00);
  background:linear-gradient(#b8db29, #5a8f00);
  /*
  NOTES:
  -webkit-border-radius:220px 120px; // produces oval in safari 4 and chrome 4
  -webkit-border-radius:220px / 120px; // produces oval in chrome 4 (again!) but not supported in safari 4
  Not correct application of the current spec, therefore, using longhand to avoid future problems with webkit corrects this
  */
  -webkit-border-top-left-radius:220px 120px;
  -webkit-border-top-right-radius:220px 120px;
  -webkit-border-bottom-right-radius:220px 120px;
  -webkit-border-bottom-left-radius:220px 120px;
  -moz-border-radius:220px / 120px;
  border-radius:220px / 120px;
}

.bubbles-oval-speech p {font-size:1.25em;}

/* creates part of the curve */
.bubbles-oval-speech:before {
  content:"";
  position:absolute;
  z-index:-1;
  bottom:-30px;
  right:50%;
  height:30px;
  border-right:60px solid #5a8f00;
  background:#5a8f00; /* need this for webkit - bug in handling of border-radius */
  /* css3 */
  -webkit-border-bottom-right-radius:80px 50px;
  -moz-border-radius-bottomright:80px 50px;
  border-bottom-right-radius:80px 50px;
  /* using translate to avoid undesired appearance in CSS2.1-capabable but CSS3-incapable browsers */
  -webkit-transform:translate(0, -2px);
  -moz-transform:translate(0, -2px);
  -ms-transform:translate(0, -2px);
  -o-transform:translate(0, -2px);
  transform:translate(0, -2px);
}

/* creates part of the curved pointy bit */
.bubbles-oval-speech:after {
  content:"";
  position:absolute;
  z-index:-1;
  bottom:-30px;
  right:50%;
  width:60px;
  height:30px;
  background:#fff;
  /* css3 */
  -webkit-border-bottom-right-radius:40px 50px;
  -moz-border-radius-bottomright:40px 50px;
  border-bottom-right-radius:40px 50px;
  /* using translate to avoid undesired appearance in CSS2.1-capabable but CSS3-incapable browsers */
  -webkit-transform:translate(-30px, -2px);
  -moz-transform:translate(-30px, -2px);
  -ms-transform:translate(-30px, -2px);
  -o-transform:translate(-30px, -2px);
  transform:translate(-30px, -2px);
}


/* ============================================================================================================================
== OVAL THOUGHT BUBBLE (more CSS3)
** ============================================================================================================================ */

.bubbles-oval-thought {
  position:relative;
  width:270px;
  padding:50px 40px;
  margin:1em auto 80px;
  text-align:center;
  color:#fff;
  background:#075698;
  /* css3 */
  background:-webkit-gradient(linear, 0 0, 0 100%, from(#2e88c4), to(#075698));
  background:-moz-linear-gradient(#2e88c4, #075698);
  background:-o-linear-gradient(#2e88c4, #075698);
  background:linear-gradient(#2e88c4, #075698);
  /*
  NOTES:
  -webkit-border-radius:220px 120px; // produces oval in safari 4 and chrome 4
  -webkit-border-radius:220px / 120px; // produces oval in chrome 4 (again!) but not supported in safari 4
  Not correct application of the current spec, therefore, using longhand to avoid future problems with webkit corrects this
  */
  -webkit-border-top-left-radius:220px 120px;
  -webkit-border-top-right-radius:220px 120px;
  -webkit-border-bottom-right-radius:220px 120px;
  -webkit-border-bottom-left-radius:220px 120px;
  -moz-border-radius:220px / 120px;
  border-radius:220px / 120px;
}

.bubbles-oval-thought p {font-size:1.25em;}

/* creates the larger circle */
.bubbles-oval-thought:before {
  content:"";
  position:absolute;
  bottom:-20px;
  left:50px;
  width:30px;
  height:30px;
  background:#075698;
  /* css3 */
  -webkit-border-radius:30px;
  -moz-border-radius:30px;
  border-radius:30px;
}

/* creates the smaller circle */
.bubbles-oval-thought:after {
  content:"";
  position:absolute;
  bottom:-30px;
  left:30px;
  width:15px;
  height:15px;
  background:#075698;
  /* css3 */
  -webkit-border-radius:15px;
  -moz-border-radius:15px;
  border-radius:15px;
}

/* ============================================================================================================================
== OVAL SPEECH BUBBLE WITH QUOTATION MARKS (more CSS3)
** ============================================================================================================================ */

.bubbles-oval-quotes {
  position:relative;
  width:400px;
  height:350px;
  margin:2em auto 10px;
  color:#000;
  background:#ffed26;
  /* css3 */
  /*
  NOTES:
  -webkit-border-radius:Apx Bpx; // produces oval in safari 4 and chrome 4
  -webkit-border-radius:Apx / Bpx; // produces oval in chrome 4 (again!) but not supported in safari 4
  Not correct application of the current spec, therefore, using longhand to avoid future problems with webkit corrects this
  */
  -webkit-border-top-left-radius:400px 350px;
  -webkit-border-top-right-radius:400px 350px;
  -webkit-border-bottom-right-radius:400px 350px;
  -webkit-border-bottom-left-radius:400px 350px;
  -moz-border-radius:400px / 350px;
  border-radius:400px / 350px;
}

/* creates opening quotation mark */
.bubbles-oval-quotes:before {
  content:"\201C";
  position:absolute;
  z-index:1;
  top:20px;
  left:20px;
  font:80px/1 Georgia, serif;
  color:#ffed26;
}

/* creates closing quotation mark */
.bubbles-oval-quotes:after {
  content:"\201D";
  position:absolute;
  z-index:1;
  bottom:0;
  right:20px;
  font:80px/0.25 Georgia, serif;
  color:#ffed26;
}

.bubbles-oval-quotes p {
  width:250px;
  height:250px;
  padding:50px 0 0;
  margin:0 auto;
  text-align:center;
  font-size:35px;
}

/* creates smaller curve */
.bubbles-oval-quotes p:before {
  content:"";
  position:absolute;
  z-index:-1;
  bottom:-30px;
  right:55%;
  width:180px; /* wider than necessary to make it look a bit better in IE8 */
  height:60px;
  background:#fff; /* need this for webkit - bug in handling of border-radius */
  /* css3 */
  -webkit-border-bottom-right-radius:40px 50px;
  -moz-border-radius-bottomright:40px 50px;
  border-bottom-right-radius:40px 50px;
  /* using translate to avoid undesired appearance in CSS2.1-capabable but CSS3-incapable browsers */
  -webkit-transform:translate(-30px, -2px);
  -moz-transform:translate(-30px, -2px);
  -ms-transform:translate(-30px, -2px);
  -o-transform:translate(-30px, -2px);
  transform:translate(-30px, -2px);
}

/* creates larger curve */
.bubbles-oval-quotes p:after {
  content:"";
  position:absolute;
  z-index:-2;
  bottom:-30px;
  right:25%;
  height:80px;
  border-right:200px solid #ffed26;
  background:#ffed26; /* need this for webkit - bug in handling of border-radius */
  /* css3 */
  -webkit-border-bottom-right-radius:200px 100px;
  -moz-border-radius-bottomright:200px 100px;
  border-bottom-right-radius:200px 100px;
  /* using translate to avoid undesired appearance in CSS2.1-capabable but CSS3-incapable browsers */
  -webkit-transform:translate(0, -2px);
  -moz-transform:translate(0, -2px);
  -ms-transform:translate(0, -2px);
  -o-transform:translate(0, -2px);
  transform:translate(0, -2px);
  /* reduce the damage in FF3.0 */
  display:block;
  width:0;
}

.bubbles-oval-quotes + p {
  position:relative; /* part of the IE8 width compromise */
  width:150px;
  margin:0 0 2em;
  font-size:18px;
  font-weight:bold;
}


/* ============================================================================================================================
== RECTANGLE-BORDER STYLE WITH CURVE
** ============================================================================================================================ */

.bubbles-rectangle-speech-border {
  position:relative;
  padding:50px 15px;
  margin:1em 0 3em;
  border:10px solid #5a8f00;
  text-align:center;
  color:#333;
  background:#fff;
  /* css3 */
  -webkit-border-radius:20px;
  -moz-border-radius:20px;
  border-radius:20px;
}

/* creates larger curve */
.bubbles-rectangle-speech-border:before {
  content:"";
  position:absolute;
  z-index:10;
  bottom:-40px;
  left:50px;
  width:50px;
  height:30px;
  border-style:solid;
  border-width:0 10px 10px 0;
  border-color:#5a8f00;
  background:transparent;
  /* css3 */
  -webkit-border-bottom-right-radius:80px 50px;
  -moz-border-radius-bottomright:80px 50px;
  border-bottom-right-radius:80px 50px;
  /* reduce the damage in FF3.0 */
  display:block;
}

/* creates smaller curve */
.bubbles-rectangle-speech-border:after {
  content:"";
  position:absolute;
  z-index:10;
  bottom:-40px;
  left:50px;
  width:20px;
  height:30px;
  border-style:solid;
  border-width:0 10px 10px 0;
  border-color:#5a8f00;
  background:transparent;
  /* css3 */
  -webkit-border-bottom-right-radius:40px 50px;
  -moz-border-radius-bottomright:40px 50px;
  border-bottom-right-radius:40px 50px;
  /* reduce the damage in FF3.0 */
  display:block;
}

/* creates a small circle to produce a rounded point where the two curves meet */
.bubbles-rectangle-speech-border > :first-child:before {
  content:"";
  position:absolute;
  bottom:-40px;
  left:45px;
  width:10px;
  height:10px;
  background:#5a8f00;
  /* css3 */
  -webkit-border-radius:10px;
  -moz-border-radius:10px;
  border-radius:10px;
}

/* creates a white rectangle to cover part of the oval border*/
.bubbles-rectangle-speech-border > :first-child:after {
  content:"";
  position:absolute;
  bottom:-10px;
  left:76px;
  width:24px;
  height:15px;
  background:#fff;
}

/* ============================================================================================================================
== OVER SPEECH BUBBLE, EMPTY, WITH BORDER (more CSS3)
** ============================================================================================================================ */

.bubbles-oval-speech-border {
  position:relative;
  padding:70px 30px;
  margin:1em auto 60px;
  border:10px solid #f3961c;
  text-align:center;
  color:#333;
  background:#fff;
  /* css3 */
  /*
  NOTES:
  -webkit-border-radius:240px 140px; // produces oval in safari 4 and chrome 4
  -webkit-border-radius:240px / 140px; // produces oval in chrome 4 (again!) but not supported in safari 4
  Not correct application of the current spec, therefore, using longhand to avoid future problems with webkit corrects this
  */
  -webkit-border-top-left-radius:240px 140px;
  -webkit-border-top-right-radius:240px 140px;
  -webkit-border-bottom-right-radius:240px 140px;
  -webkit-border-bottom-left-radius:240px 140px;
  -moz-border-radius:240px / 140px;
  border-radius:240px / 140px;
}

/* creates larger curve */
.bubbles-oval-speech-border:before {
  content:"";
  position:absolute;
  z-index:2;
  bottom:-40px;
  right:50%;
  width:50px;
  height:30px;
  border-style:solid;
  border-width:0 10px 10px 0;
  border-color:#f3961c;
  margin-right:-10px;
  background:transparent;
  /* css3 */
  -webkit-border-bottom-right-radius:80px 50px;
  -moz-border-radius-bottomright:80px 50px;
  border-bottom-right-radius:80px 50px;
  /* reduce the damage in FF3.0 */
  display:block;
}

/* creates smaller curve */
.bubbles-oval-speech-border:after {
  content:"";
  position:absolute;
  z-index:2;
  bottom:-40px;
  right:50%;
  width:20px;
  height:31px;
  border-style:solid;
  border-width:0 10px 10px 0;
  border-color:#f3961c;
  margin-right:20px;
  background:transparent;
  /* css3 */
  -webkit-border-bottom-right-radius:40px 50px;
  -moz-border-radius-bottomright:40px 50px;
  border-bottom-right-radius:40px 50px;
  /* reduce the damage in FF3.0 */
  display:block;
}

/* creates a small circle to produce a rounded point where the two curves meet */
.bubbles-oval-speech-border > :first-child:before {
  content:"";
  position:absolute;
  z-index:1;
  bottom:-40px;
  right:50%;
  width:10px;
  height:10px;
  margin-right:45px;
  background:#f3961c;
  /* css3 */
  -webkit-border-radius:10px;
  -moz-border-radius:10px;
  border-radius:10px;
}

/* creates a white rectangle to cover part of the oval border*/
.bubbles-oval-speech-border > :first-child:after {
  content:"";
  position:absolute;
  z-index:1;
  bottom:-10px;
  right:50%;
  width:30px;
  height:15px;
  background:#fff;
}

/* ============================================================================================================================
== OVER THOUGHT BUBBLE, EMPTY, WITH BORDER (more CSS3)
** ============================================================================================================================ */

.bubbles-oval-thought-border {
  position:relative;
  padding:70px 30px;
  margin:1em auto 80px;
  border:10px solid #c81e2b;
  text-align:center;
  color:#333;
  background:#fff;
  /* css3 */
  /*
  NOTES:
  -webkit-border-radius:240px 140px; // produces oval in safari 4 and chrome 4
  -webkit-border-radius:240px / 140px; // produces oval in chrome 4 (again!) but not supported in safari 4
  Not correct application of the current spec, therefore, using longhand to avoid future problems with webkit corrects this
  */
  -webkit-border-top-left-radius:240px 140px;
  -webkit-border-top-right-radius:240px 140px;
  -webkit-border-bottom-right-radius:240px 140px;
  -webkit-border-bottom-left-radius:240px 140px;
  -moz-border-radius:240px / 140px;
  border-radius:240px / 140px;
}

/* creates the larger circle */
.bubbles-oval-thought-border:before {
  content:"";
  position:absolute;
  z-index:10;
  bottom:-40px;
  right:100px;
  width:50px;
  height:50px;
  border:10px solid #c81e2b;
  background:#fff;
  /* css3 */
  -webkit-border-radius:50px;
  -moz-border-radius:50px;
  border-radius:50px;
  /* reduce the damage in FF3.0 */
  display:block;
}

/* creates the smaller circle */
.bubbles-oval-thought-border:after {
  content:"";
  position:absolute;
  z-index:10;
  bottom:-60px;
  right:50px;
  width:25px;
  height:25px;
  border:10px solid #c81e2b;
  background:#fff;
  /* css3 */
  -webkit-border-radius:25px;
  -moz-border-radius:25px;
  border-radius:25px;
  /* reduce the damage in FF3.0 */
  display:block;
}
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline

.tc-ext-doc-link {
color: <<color primary>>;
fill: <<color primary>>;
font-size: 1.2em;
font-weight: bold;
font-family: Mulish;
text-decoration: none;
border-radius: 4px;
padding: 0.3em;
margin: 0.3em -0.3em 0.3em -0.3em;
border: 2px solid transparent;
}

.tc-ext-doc-link svg {
vertical-align: middle;
height: 0.75em;
}

.tc-ext-doc-link img {
vertical-align: middle;
height: 1.3em;
}

.tc-ext-doc-link:hover {
color: <<color background>>;
fill: <<color background>>;
background: <<color primary>>;
border: 2px solid rgba(0,0,0,0.5);
}
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline

@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {

<<if-sidebar """

	.tc-sidebar-scrollable {
		background: linear-gradient(to right,rgba(255,255,255,0) 0%,rgba(255,255,255,0.85) 42px,rgba(255,255,255,0.85) 100%);
	}

""">>

}

@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {

<<if-sidebar """

	.tc-sidebar-scrollable {
		background: linear-gradient(to right,rgba(255,255,255,0.85) 0%,rgba(255,255,255,0.85) 100%);
	}

""">>

}
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline

html body.tc-body .tc-tiddler-frame.tc-tagged-HideEditButton .tc-btn-\%24\%3A\%2Fcore\%2Fui\%2FButtons\%2Fedit,
html body.tc-body .tc-tiddler-frame.tc-tagged-HideEditButton .tc-btn-\%24\%3A\%2Fcore\%2Fui\%2FButtons\%2Finfo,
html body.tc-body .tc-tiddler-frame.tc-tagged-HideEditButton .tc-btn-\%24\%3A\%2Fcore\%2Fui\%2FButtons\%2Fmore-tiddler-actions,
html body.tc-body .tc-tiddler-frame.tc-tagged-HideEditButton .tc-tags-wrapper,
html body.tc-body .tc-tiddler-frame.tc-tagged-HideEditButton .tc-tagged-by {
	display: none;
}

button.tc-tiddlylink, a.tc-tiddlylink {
    font-weight: bold;
}

.tc-afc-above-story-logo {
background: <<colour afc-light-purple>>;
margin: -0.5em -0.5em 1.5em -0.5em;
padding: 0.5em 0.5em 0.5em 0.5em;
border-radius: 0.25rem;
}

h1, h2, h3, h4, h5, h6 {
margin: 0.75em -0.25em 0.25em -0.25em;
padding: 0.25em 0.25em 0.25em 0.25em;
border-radius: 0.25rem;
color: <<colour afc-dark-blue>>;
}

h1 {
background: <<colour afc-solid-turquoise>>;
}
h2 {
background: <<colour afc-solid-purple>>;
color: <<colour afc-white>>;
}
h3 {
background: <<colour afc-solid-yellow>>;
}
h4 {
background: <<colour afc-solid-green>>;
}
h5 {
background: <<colour afc-solid-pink>>;
}

.tc-titlebar h2,
h1.tc-site-title {
background: none;
color: <<colour afc-dark-blue>>;
}

div.tc-thumbnail-caption {
background: <<colour afc-dark-blue>>;
}

\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline

.tc-topbar-right {
	top: 0;
	right: 0;
}

.tc-topbar-left {
	display: inline-block;
	top: 0;
	left: 0;
	width: 100%;
}

nav.tc-top-menu p {
	margin: 0;
}

nav.tc-top-menu > ul {
	position: relative;
	list-style-type: none;
	margin: 0;
    padding: 0 0 0 42px;
	text-transform: uppercase;
	background: <<colour top-menu-background>>;
	<<box-shadow "1px 1px 5px rgba(0, 0, 0, 0.3)">>
}

nav.tc-top-menu > ul > li {
	display: inline-block;
	margin: 0;
	padding: 0;
}

nav.tc-top-menu > ul > li > a,
nav.tc-top-menu > ul > li > button {
	display: block;
	font-weight: 700;
	color: <<colour top-menu-foreground>>;
	fill: <<colour top-menu-foreground>>;
	text-decoration: none;
	padding: 0.5em;
	margin: 0;
	background: none;
	border: none;
    cursor: pointer;
    text-transform: inherit;
    border-radius: 0;
    text-decoration: none;
}

nav.tc-top-menu > ul > li > a.tc-selected,
nav.tc-top-menu > ul > li > button.tc-selected {
	background: <<colour top-menu-foreground>>;
	color: <<colour top-menu-background>>;
	fill: <<colour top-menu-background>>;
}

nav.tc-top-menu > ul > li svg {
	width: 1em;
	height: 1em;
	fill: <<colour top-menu-foreground>>;
}

nav.tc-top-menu > ul > li > a:hover,
nav.tc-top-menu > ul > li > button:hover {
	background: rgba(0,0,0,0.25);
    border-radius: 0;
    text-decoration: none;
}

nav.tc-top-menu .tc-drop-down {
	max-height: 70vh;
	overflow: auto;
}

nav.tc-top-menu .tc-drop-down a {
	text-decoration: none;
}

nav.tc-top-menu .tc-drop-down button {
	display: inline-block;
	width: auto;
}

nav.tc-top-menu .tc-drop-down ol {
	margin: 0;
}
<$list filter="[{$:/_AFC/SurveyBanner/URL}!is[blank]]" variable="ignore">
<a href={{$:/_AFC/SurveyBanner/URL}} target="_blank" class="tc-survey-banner">
<div class="tc-survey-banner-heading">
{{$:/core/images/plugin-generic-language}}
Help us improve
</div>
<div class="tc-survey-banner-body">
We are hoping to gather valuable feedback on your use and opinion of the Wiki Manuals. By sharing your thoughts and opinions, you will contribute directly to ongoing improvements. It will take no longer than 10 minutes of your time to complete.
</div>
</a>
</$list>
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock

.tc-survey-banner {
background: <<colour afc-light-green>>;
color: <<colour afc-dark-blue>>;
fill: <<colour afc-dark-blue>>;
padding: 1em;
text-shadow: none;
border-radius: 8px;
line-height: 1.2;
text-decoration: none;
display: block;
margin-right: 1em;
}


.tc-survey-banner:hover {
background: <<colour afc-dark-blue>>;
color: <<colour afc-light-green>>;
fill: <<colour afc-light-green>>;
}

.tc-survey-banner-heading {
font-size: 2em;
font-weight:bold;
margin-bottom: 0.5em;
}

.tc-survey-banner-heading svg {
width: 1em;
height: 1em; 
vertical-align: text-bottom;
}
<hr/>
<$button class="tc-btn-invisible">
<$set name="tags" filter="[<currentTiddler>]">
<$action-sendmessage $message="tm-new-tiddler" tags=<<tags>>/>
Create new tiddler tagged '<$text text=<<currentTiddler>>/>'
</$set>
</$button>
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline

.tc-tag-navigation-buttons {
	clear: both;
	display: flex;
	font-size: 1em;
	border: 1px solid #c1e1ea;
}

.tc-tag-navigation-button-previous,
.tc-tag-navigation-button-next {
	cursor: pointer;
	border: none;
	background: #c1e1ea;
	border-radius: 4px;
	padding: 5px; color: white;
}

.tc-tag-navigation-button-middle {
	flex: 1; font-size: 100%;

}

.tc-tag-navigation-body {
	padding: 0.5em;
	border-left: 1px solid #c1e1ea;
	border-right: 1px solid #c1e1ea;
}

.tc-tag-navigation-button-previous:hover {
  background-color:#94d2e3;
}

.tc-tag-navigation-button-next:hover {
  background-color:#94d2e3;
}
\define tag-navigation-buttons()
<div class="tc-tag-navigation-buttons">
<$list filter="[<__tag__>tagging[]allbefore<currentTiddler>limit[1]]" variable="ignore">
<$button class="tc-tag-navigation-button tc-tag-navigation-button-previous">
<$action-setfield $tiddler=<<state>> $value={{{ [<__tag__>tagging[]before<currentTiddler>] }}}/>
{{left}} previous

</$button>
</$list>
<$button class="tc-tag-navigation-button tc-tag-navigation-button-middle tc-btn-invisible">
<$action-navigate $to=<<__tag__>>/>
 (<$text text={{{ [<__tag__>tagging[]allbefore<currentTiddler>count[]add[1]] }}}/> of <$text text={{{ [<__tag__>tagging[]count[]] }}}/>)
</$button>

<$list filter="[<__tag__>tagging[]allafter<currentTiddler>limit[1]]" variable="ignore">
<$button class="tc-tag-navigation-button tc-tag-navigation-button-next">
<$action-setfield $tiddler=<<state>> $value={{{ [<__tag__>tagging[]after<currentTiddler>] }}}/>
next {{right}}
</$button>
</$list>
</div>
\end

\define tag-navigation(tag)
<div class="tc-tag-navigation">
<$set name="state" value=<<qualify "$:/state/tag-navigation">>>
<$set name="state" value={{{ [<state>addsuffix[/]addsuffix<__tag__>] }}}>
<$tiddler tiddler={{{ [<state>get[text]] ~[<__tag__>tagging[]first[]]  }}}>
<<tag-navigation-buttons>>
<div class="tc-tag-navigation-body">
<h1><$text text={{!!title}}/></h1>
<$transclude mode="block"/>
</div>
<<tag-navigation-buttons>>
</$tiddler>
</$set>
</$set>
</div>
\end
<textarea readonly="readonly" style="width:100%;height:10em;"><$text text={{!!text}}/></textarea>
<$button message="tm-login" class="tc-consent-button tc-btn-invisible">
Login
</$button>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 230 53" class="header__logo--desktop">
  <g class="logo-icon">
    <path fill="#FFDC16" d="M5.546 36.716 0 47.398 10.682 53l3.88-7.47c-3.716-2.032-6.885-5.052-9.016-8.814Zm4.562-8.843 2.322-.412c.71 4.12 3.251 7.47 6.639 9.337l6.01-11.589-6.803-13.099-8.168 15.763Z"></path>
    <path fill="#64C3D7" d="M34.23 26.5c-1.911-3.707-.49-8.293 3.197-10.215L28.986 0l-13.36 7.003 2.65 5.107 1.585-3.048 10.682 5.602-5.464 10.573L39.476 53l13.36-7.003-8.442-16.284c-3.688 1.95-8.25.494-10.163-3.213Z"></path>
    <path fill="#AFDCE6" d="m19.861 9.062-1.585 3.048 6.803 13.1 5.464-10.573L19.86 9.062Z"></path>
    <path fill="#645FA5" d="M44.394 29.713c3.688-1.922 5.136-6.508 3.196-10.216-1.912-3.707-6.475-5.162-10.163-3.212l6.967 13.428Z"></path>
    <path fill="#AAA0CD" d="M34.23 26.5c1.913 3.707 6.476 5.163 10.164 3.213l-6.967-13.429c-3.688 1.923-5.108 6.509-3.196 10.216Z"></path>
    <path fill="#ED73AA" d="m29.068 48.03-1.694-9.694c-2.978.412-5.846-.165-8.305-1.538l-4.508 8.733a22.757 22.757 0 0 0 14.507 2.499ZM2.814 29.164a23.297 23.297 0 0 0 2.732 7.551l4.562-8.842-7.294 1.29Z"></path>
    <path fill="#F0AFCB" d="m12.457 27.461-2.322.412-4.59 8.87a23.222 23.222 0 0 0 9.016 8.815l4.508-8.76c-3.36-1.895-5.901-5.218-6.611-9.337Z"></path>
  </g>
  <g class="logo-text">
   <path fill="#000" d="M81.957 38.336a.594.594 0 0 1-.546-.385l-2.022-6.123h-9.288l-1.967 6.123c-.082.193-.3.385-.546.385h-3.36c-.192 0-.328-.192-.274-.385l8.06-22.957c.081-.192.3-.385.546-.385h4.671c.246 0 .465.165.547.385L85.7 37.95c.055.165-.082.385-.273.385h-3.47Zm-3.66-9.941-3.58-10.82-3.496 10.82h7.076Zm9.152 9.941c-.192 0-.41-.192-.41-.412l.164-7.8-.137-8.841c0-.193.191-.413.41-.413h3.142c.19 0 .41.193.41.412l-.055 2.142c1.12-1.62 3.06-2.938 5.655-2.938 3.633 0 5.901 2.444 5.901 6.838v3.597l.136 7.003c0 .192-.191.412-.409.412h-3.36c-.192 0-.41-.192-.41-.412l.136-7.003v-3.487c0-2.472-1.338-3.762-3.196-3.762-2.05 0-3.934 1.73-4.29 5.354v1.895l.055 7.003c0 .192-.19.412-.41.412H87.45Zm18.194 0c-.191 0-.41-.192-.41-.412l.164-7.8-.136-8.841c0-.193.191-.413.409-.413h3.142c.191 0 .41.193.41.412l-.055 2.142c1.12-1.62 3.06-2.938 5.655-2.938 3.634 0 5.901 2.444 5.901 6.838v3.597l.137 7.003c0 .192-.191.412-.41.412h-3.333c-.191 0-.41-.192-.41-.412l.137-7.003v-3.487c0-2.472-1.339-3.762-3.196-3.762-2.049 0-3.934 1.73-4.289 5.354v1.895l.054 7.003c0 .192-.191.412-.41.412h-3.36Zm30.188 0c-.191 0-.41-.192-.41-.412l.055-1.977c-1.202 1.702-3.005 2.718-5.355 2.718-4.781 0-7.349-3.927-7.349-9.007 0-5.053 2.787-9.117 7.431-9.117 2.268 0 4.043.879 5.218 2.581l-.082-1.84c0-.192.191-.412.41-.412h3.333c.191 0 .41.193.41.412l-.164 8.266.164 8.376c0 .192-.192.412-.41.412h-3.251Zm-4.562-2.527c2.732 0 4.289-2.032 4.316-6.068.027-4.037-1.475-6.262-4.234-6.29-2.924-.027-4.372 2.225-4.372 5.96-.027 4.064 1.421 6.398 4.29 6.398Zm17.593 2.527c-.191 0-.41-.192-.41-.412l.273-11.451-.273-11.452c0-.192.192-.412.41-.412h14.452c.191 0 .41.193.41.412v2.444c0 .193-.192.412-.41.412h-10.545l-.192 7.305h10.245c.191 0 .41.192.41.412v2.444c0 .192-.191.412-.41.412h-10.245l.192 9.474c0 .192-.192.412-.41.412h-3.497Zm17.129 0c-.191 0-.41-.192-.41-.412l.164-8.403-.164-8.239c0-.192.192-.412.41-.412h3.306c.191 0 .41.193.382.412l-.109 2.719c1.284-2.17 3.579-3.24 6.065-3.24.273 0 .546.027.765.055.218.027.41.247.41.466v2.362a.398.398 0 0 1-.41.385c-.191-.028-.465-.028-.738-.028-3.223 0-5.764 1.867-5.983 5.767l.082 8.156c0 .192-.191.412-.41.412h-3.36Zm26.828-5.959c.191 0 .382.192.327.412-.491 3.295-3.332 5.959-7.922 5.959-5.601 0-8.633-3.762-8.633-9.062 0-5.52 3.196-9.172 8.496-9.172 5.328 0 8.387 3.597 8.524 9.474 0 .192-.191.412-.41.412h-12.539c.164 3.734 1.693 5.492 4.589 5.492 2.076 0 3.47-.989 3.961-3.076a.521.521 0 0 1 .492-.412h3.115v-.027Zm-7.677-9.035c-2.431 0-3.879 1.483-4.316 4.311h8.414c-.164-2.279-1.475-4.311-4.098-4.311Zm16.391 15.406c-3.633 0-5.901-2.444-5.901-6.838v-3.598l-.109-7.002c0-.192.191-.412.41-.412h3.306c.191 0 .409.192.409.412l-.109 7.003V31.8c0 2.472 1.339 3.762 3.169 3.762 2.049 0 3.934-1.73 4.289-5.355v-1.895l-.027-7.002c0-.192.191-.412.41-.412h3.333c.191 0 .409.192.409.412l-.163 7.799.136 8.842c0 .193-.191.412-.41.412h-3.141c-.192 0-.41-.192-.41-.412l.109-2.142c-1.147 1.62-3.114 2.939-5.71 2.939Zm24.724-.412c-.191 0-.409-.192-.409-.412l.082-1.977c-1.175 1.702-3.006 2.718-5.328 2.718-4.781 0-7.349-3.927-7.349-9.007 0-5.053 2.787-9.117 7.431-9.117 2.268 0 4.043.879 5.191 2.554l-.082-8.046c0-.192.191-.412.41-.412h3.36c.191 0 .41.192.41.412l-.164 10.874.164 12.028c0 .193-.191.412-.41.412h-3.306v-.027Zm-4.535-2.5c2.705 0 4.289-2.031 4.317-6.068.027-4.064-1.475-6.344-4.235-6.371-2.923-.055-4.371 2.28-4.371 6.014-.027 4.064 1.421 6.426 4.289 6.426Z"></path>
  </g>
</svg>
cwp-white: #f7f7f8
cwp-black: #333
cwp-grey: #e8e8ec
cwp-active: #59b799
cwp-primary: #6b717e
cwp-zone-cwp: #59b799
cwp-zone-young-person: #fc8f68
cwp-zone-parent: #f4ee7f
cwp-zone-more: #aee5d8

cwp-mid: rgba(232, 232, 232, 0.84)

top-menu-background: <<colour cwp-primary>>
top-menu-foreground: <<colour cwp-white>>

page-footer-background: <<colour cwp-primary>>
page-footer-foreground: <<colour cwp-white>>

alert-background: <<color cwp-white>>
alert-border: #b99e2f
alert-highlight: #881122
alert-muted-foreground: #b99e2f
background: #ffffff
blockquote-bar: <<colour muted-foreground>>
button-background:
button-foreground:
button-border:
code-background: #f7f7f9
code-border: #e1e1e8
code-foreground: #dd1144
dirty-indicator: #ff0000
download-background: #34c734
download-foreground: <<colour background>>
dragger-background: <<colour foreground>>
dragger-foreground: <<colour background>>
dropdown-background: <<colour background>>
dropdown-border: <<colour muted-foreground>>
dropdown-tab-background-selected: #fff
dropdown-tab-background: #ececec
dropzone-background: rgba(0,200,0,0.7)
external-link-background-hover: inherit
external-link-background-visited: inherit
external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee
foreground: <<color cwp-black>>
message-background: #ecf2ff
message-border: #cfd6e6
message-foreground: #547599
modal-backdrop: <<colour foreground>>
modal-background: <<colour background>>
modal-border: #999999
modal-footer-background: #f5f5f5
modal-footer-border: #dddddd
modal-header-border: #eeeeee
muted-foreground: #bbb
notification-background: #ffffdd
notification-border: #999999
page-background: <<color cwp-grey>>
pre-background: #f5f5f5
pre-border: #cccccc
primary: <<colour cwp-active>>
sidebar-button-foreground: <<colour foreground>>
sidebar-controls-foreground-hover: #000000
sidebar-controls-foreground: #aaaaaa
sidebar-foreground-shadow: rgba(255,255,255, 0.8)
sidebar-foreground: #acacac
sidebar-muted-foreground-hover: #444444
sidebar-muted-foreground: #c0c0c0
sidebar-tab-background-selected: #f4f4f4
sidebar-tab-background: #e0e0e0
sidebar-tab-border-selected: <<colour tab-border-selected>>
sidebar-tab-border: <<colour tab-border>>
sidebar-tab-divider: #e4e4e4
sidebar-tab-foreground-selected:
sidebar-tab-foreground: <<colour tab-foreground>>
sidebar-tiddler-link-foreground-hover: #444444
sidebar-tiddler-link-foreground: #999999
site-title-foreground: <<colour tiddler-title-foreground>>
static-alert-foreground: #aaaaaa
tab-background-selected: #ffffff
tab-background: #d8d8d8
tab-border-selected: #d8d8d8
tab-border: #cccccc
tab-divider: #d8d8d8
tab-foreground-selected: <<colour tab-foreground>>
tab-foreground: #666666
table-border: #dddddd
table-footer-background: #a8a8a8
table-header-background: #f0f0f0
tag-background: #ec6
tag-foreground: #ffffff
tiddler-background: <<colour background>>
tiddler-border: <<colour background>>
tiddler-controls-foreground-hover: #888888
tiddler-controls-foreground-selected: #444444
tiddler-controls-foreground: #cccccc
tiddler-editor-background: #f8f8f8
tiddler-editor-border-image: #ffffff
tiddler-editor-border: #cccccc
tiddler-editor-fields-even: #e0e8e0
tiddler-editor-fields-odd: #f0f4f0
tiddler-info-background: #f8f8f8
tiddler-info-border: #dddddd
tiddler-info-tab-background: #f8f8f8
tiddler-link-background: <<colour background>>
tiddler-link-foreground: <<colour primary>>
tiddler-subtitle-foreground: #c0c0c0
tiddler-title-foreground: #182955
toolbar-new-button:
toolbar-options-button:
toolbar-save-button:
toolbar-info-button:
toolbar-edit-button:
toolbar-close-button:
toolbar-delete-button:
toolbar-cancel-button:
toolbar-done-button:
untagged-background: #999999
very-muted-foreground: #888888
\define if-fluid-fixed(text,hiddenSidebarText)
<$reveal state="$:/themes/tiddlywiki/vanilla/options/sidebarlayout" type="match" text="fluid-fixed">
$text$
<$reveal state="$:/state/sidebar" type="nomatch" text="yes" default="yes">
$hiddenSidebarText$
</$reveal>
</$reveal>
\end

\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock

@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {

	.tc-story-river {
		padding: 84px;
	}

	.tc-tiddler-frame {
		width: calc({{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}} - 84px);
	}

<<if-no-sidebar "

	.tc-story-river {
		width: calc(100% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}});
	}

	.tc-tiddler-frame {
		width: 100%;
	}

">>

<<if-fluid-fixed text:"""

	body.tc-body .tc-tiddler-frame {
		width: 100%;
	}

""" hiddenSidebarText:"""

""">>

}
\define image-link-body(image,caption,width,height,color,background-color,icon)
<div class="tc-thumbnail-wrapper" style="width:$width$px;height:$height$px;">
<div class="tc-thumbnail-image">[img[$image$]]</div><div class="tc-thumbnail-icon" style="fill:$color$;color:$color$;">
$icon$
</div><div class="tc-thumbnail-caption">
$caption$
</div>
</div>
\end

\define image-link(link,image,caption,width,height,color,background-color,icon)
<$link to="""$link$"""><$macrocall $name="image-link-body" icon=<<__icon__>> color=<<__color__>> background-color=<<__background-color__>> image=<<__image__>> caption=<<__caption__>> width=<<__width__>> height=<<__height__>>/></$link>
\end

\define image-link-ext(link,image,caption,width,height,color,background-color,icon)
<a href="""$link$""" target="_blank" rel="noopener noreferrer"><$macrocall $name="image-link-body" icon=<<__icon__>> color=<<__color__>> background-color=<<__background-color__>> image=<<__image__>> caption=<<__caption__>> width=<<__width__>> height=<<__height__>>/></a>
\end

\define link-doc(caption,url,type:"docs")
<a href="""$url$""" class="tc-ext-doc-link" style="" target="_blank" rel="noopener noreferrer" title="Open in Google Docs">
{{$:/core/images/chevron-right}}<$image source={{{ [tag[$:/_GoogleDocsIcon]caption<__type__>] }}}/> $caption$
</a>
\end
\define link-pdf(caption,url,colour:"#55c6a7")
<a href="""$url$""" class="tc-btn-big-green" style="background-color:$colour$;" target="_blank" rel="noopener noreferrer">
{{$:/core/images/file}} $caption$
</a>
\end
\define embed-video(code)
<iframe width="560" height="315" src="https://www.youtube.com/embed/$code$" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
\end


<div class="tc-table-of-contents">
<<toc-selective-expandable 'Finding OutContents'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'HelpingContents'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'HomeContents'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'MoreContents'>>
</div>


<a href="../cwp-richmond/index.html">Richmond</a>
<a href="../cwp-tower-hamlets/index.html">Tower Hamlets</a>
<a href="../cwp-westminster-rbkc/index.html">Westminster and RBKC</a>

<<list-links "[tag[Partnerships/SitesContents]tag[Partnerships/SitesContents]]">>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Partnerships/SitesContents'>>
</div>


<div class="tc-table-of-contents">
<<toc-selective-expandable 'SupervisingContents'>>
</div>



reverse

modified

hide
show
hide
show
show
show
hide
show
show
hide
no
hide
hide
show
! Our use of cookies

We use necessary cookies to make our site work. We’d also like to set optional analytics to help us improve it. We won’t set optional cookies unless you enable them. Using this tool will set a cookie on your device to remember your preferences.

Anna Freud  provides this wiki platform for external teams who are responsible for the content, including cookies, that are added to their individual manuals. Guidance for teams on how to embed correctly has been added to the user guide.

For more detailed information about the cookies we use, see our <a href="https://www.annafreud.org/your-privacy/" class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer">Cookies page</a>.

---

!! Necessary cookies

Necessary cookies enable core functionality such as security, network management, and accessibility. You may disable these by changing your browser settings, but this may affect how the website functions.

---

!! Analytics cookies

We’d like to set non-essential cookies, such as Google Analytics, to help us to improve our website by collecting and reporting information on how you use it. The cookies collect information in a way that does not directly identify anyone. For more information on how these cookies work, please see our <a href="https://www.annafreud.org/your-privacy/" class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer">Cookies page</a>. If you are 16 or under, please ask a parent or carer for consent before accepting.

---
<$list filter={{$:/core/Filters/Drafts!!filter}} >
<div class="tc-menu-list-item">
<$link><$view field="title"/></$link>  <$list filter="[all[current]frombag{$:/plugins/federatial/xememex/config/recipe}]" variable="listItem"><span style="display:inline-block;background:#ff4;border:1px solid #cc0;color:black;padding:0 2px;border-radius:4px;font-size:0.8em;line-height:1.3;">local</span></$list>
</div>
</$list>
\define lingo-base() $:/language/ControlPanel/
\define config-title()
$:/config/PageControlButtons/Visibility/$(listItem)$
\end

<<lingo Basics/Version/Prompt>> <<version>>

<$set name="tv-config-toolbar-icons" value="yes">

<$set name="tv-config-toolbar-text" value="yes">

<$set name="tv-config-toolbar-class" value="">

<$list filter="[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]" variable="listItem">

<div style="position:relative;" class={{{ [<listItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>

<$checkbox tiddler=<<config-title>> field="text" checked="show" unchecked="hide" default="show"/> <$transclude tiddler=<<listItem>>/> <i class="tc-muted"><$transclude tiddler=<<listItem>> field="description"/></i>

</div>

</$list>

</$set>

</$set>

</$set>
<$transclude tiddler="$:/core" subtiddler="$:/core/ui/ViewTemplate/subtitle"/>
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAB0VJREFUeAHtW2lsVUUUPt33HWigFrrQHShUoAiIAUTQpKIJCMZEJPEHjTFR4w//6A//+EtjNIbEJaIRFEOkCAIpBdkCCIWydKGle+leuryWbq+L5xs6t3Pvu68PKiQm757kcWfOnDv3zpnvfOfMTfF45/2Px8mNxdON1y6WbjnAQoCbe8AKATcHAFkIsBDg5h6wQsDNAWCRoBUCVgi4uQesEHBzAFhZwAoBKwTc3ANWCLg5AKwsYIWAFQJu7gErBNwcAFYWsELACgE394AVAm4OACsLWCFghYCbe8AKATcHAHm7ckBwcBBFhoeRr68PNTa10sDgoNNbPDw8yMvLSxsfGRnR2mYN1X5sbIzwm0owN+4ZHx+n0dFR8Sz0ncnDzGnqgLDQEFq5fAmtWraEwsNCtPnxN7Vt7feovrGZzl28StV1DdoYXu6TD3MpKiJc0xXeKKE9vx7U+mojMDCAPnr3bYqMCBPqMV7UNz/so/LKGtVMa2dnLaI3tuaQJy/YzouH7a4d28jfz1ezMTYwZ3tHJzW3tlNTSxuVV9VSVU29zszBAemp82nn669SgJ+fzhAd+Dp6ZpT4ZS1KpyP5p+nE6QvCDjsyMjIq2vKfhWlJYpcwZpTU+fHa4jGGhWVmpDh1wIqlmcIGtj7s7GG7fcrFyznl+y5ekEovPr+GTp29RIeOn9LQpiNBeBleNVs8JlTFy9OTNm9aR7k7t5P3BOyLb99RTcjP15cS42J1OtmBo42SnuKog40vz5OgzNPIu2mz9Rlvd9nHBq5fs4I+yN1BoSHBwl5DQCRD97VXNmlelrOdZI9dvVnKMGoT8H5pw3OUtTBNDlMGv/TGdavprxNnqPh2Ja1/doU2hkZ6ciJVMPSMkp6UYFTRjMhwmsUIQ5ipkpwYR3C4lOIyvaOlvr6phQomEAldeHgoLeD3S4yfq7s/LjaGcjaupb0HDk+WwltyNogdk5PhmnfsFB08WkD1d5vIbh+hlrYO+nHfH+Kq2sGrPj4+Ir4GBofUITLb6ZjZ0doO6Iy5A4cZJS0pXqcyIk0OgqSv8WbJH+D+1Xe/0GdffitCRtrhujxroSB24VYQUkZqkjpOPb19dPLsRZ0OHTDw0YKzOr0vLz6FYxqsW1ZRpRubEz2TiTRUp3MGdRilpzg6IFVBS9/9fqqtb9TN56qDjTOSKxA1IzLiQRoE+agQw4RXrt0SizWbvOhWGTvnEo2Nj1H/wBD/BgTLwha7A4JUJT05gS5cua6p0HcmSQnzGE3eAnGwieAsASKTUlpR7fS9pI3ZdWjY7qDGcwQHzI2Z7TCIVOdMgAKEhpmUllexY8Z1XJLGsJYO8OO0pRJaA8M2dk60NpWPtzclJcRRaXml0KUpuw9FcVmFZvuwDX/OaPOZB1TBOza1tD/gAMmIqkEvQ206AojWNTTpbgWEPSdIDKGiou1w/t/UbevV2asIUR0wKkKsWmerdlAToGCTP6Bn7epsem/XmxTOtY0qqA3snEoFAkwd0HdftX+kNsIgfm6Mdk+Avx/Fz3tKkKRKcsjlFZW1vNtVtHLZYs1ecMThfFH1pSgEWF3bMGUluoSzE36uBI78Pe+4MBMkaDcpWVGYTFfM0pRcuLxibqRHlMslE3CXz5s1I5KimKDmxc6hQH9/qRZpVutMs4HFH2DnVtXWixkEAmy9jrsdwmeA6Upjcyt19dgoQmH/DC58Lhfd0lV/qBsg5XdqCC+mhkYGZ4OgoEDdKzhLfzojJ50Rrkav3SzjDHaGOu51aVbCAT38skYJCdY/3Djuql/Ci1udnaWZIfev4vOFKnLnB4eGeEcaKJkzgBSkw8CAANmldn7pVk5nU0ktc0+BIXX39w9Qe2cXdXfbTLOHcAAOCShmVEmMm0uF10tUla4dxLUDyuCOzm6Rl4uKy6inZ5LMsLuqAxBQ65iQpDTzYrq6emRXhIHqANQlahCWGMps7UalAWK7zin6UURwAIoEYwX39OIM8uaU5EzWr3mGUFIuzcygLTkvUHZWps4Uc5pxizQyprMSQ3mrLh73yHCR9z+uq3AATmsXCycLFUwO8tn68kbBxMaHZfLJSkXMMJfJxvuRYszOAHIu44JQrXV2TyJC2uE6NDxMldV1quqxtbUtPpJ/hnBkxMcPKYjZmVERdKOknJoYXqFMjIu4akSqUbPE+X+uUi+XzkbBInFYMko/f1SpqbtrVIt0qIaNNLjNJAkSexKiOWCYvfzT/kOU+9Z23TkbJzH8nMnlomL6kw9NZgLW3rZ5k8MQFmT29QekaOaA/8L+Dg83KEQISB2+lnyxew91MWO6EnwdOsJH4J/35zndHZAckGMUY/zLcfCGcafxHGSUJyU6B+Ah+HT06ee76be8Yw7HXowjXyMkvv5+Lx0/eQ6qKeVS4Q1xNpBGKLGdLWiYDyynz1+WpuIK9reZhBeqSCPJPuopEQ/wcPXf51FX42NJYIA/2bg8Rj519bFTt4L/eedfHBHQUgz/OBAAAAAASUVORK5CYII=
Open Pages
Recent Edits
$:/_AFC/Palette
\whitespace trim
\define print-button()
<$button tooltip="print" aria-label="print" class=<<tv-config-toolbar-class>>>
<$action-sendmessage $message="tm-open-window" template="$:/plugins/federatial/print/window" windowTitle={{$:/config/plugins/federatial/print/window-title}}/>
<$list filter="[<tv-config-toolbar-icons>prefix[yes]]">
{{$:/core/images/print-button}}
</$list>
<$list filter="[<tv-config-toolbar-text>prefix[yes]]">
<span class="tc-btn-text">
<$text text="print"/>
</span>
</$list>
</$button>
\end
<$list filter="[<currentTiddler>tagging[]role[heading]limit[1]]" variable="ignore" emptyMessage=<<print-button>>>
<$text text=""/>
</$list>
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline

.tc-export-controls {
	background: #dfddf9;
	margin: -1em -1em 0 -1em;
	padding: 1em;
	border-bottom: 2px solid black;
}

.tc-export-controls textarea {
	width: 100%;
}

.tc-export-header {
	margin-top: 1em;
	padding: 1em;
	border: 1px solid black;
}

@media print {

	.tc-unprintable {
		display: none;
	}

}
<$transclude tiddler="$:/plugins/federatial/print/template/inner" mode="block"/>
! <$view field="title"/>

{{!!text}}

\whitespace trim

<$set name="themeTitle" value={{$:/view}}>

<$set name="tempCurrentTiddler" value=<<currentTiddler>>>

<$set name="currentTiddler" value={{$:/language}}>

<$set name="languageTitle" value={{!!name}}>

<$set name="currentTiddler" value=<<tempCurrentTiddler>>>

<$importvariables filter="[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]">

<div class="tc-unprintable tc-export-controls">

<$button message="tm-print" tooltip="Print this page">
Print
</$button>

</div>

<$transclude tiddler="$:/plugins/federatial/print/template" mode="block"/>

</$importvariables>

</$set>

</$set>

</$set>

</$set>

</$set>
!! This tiddler is present to disable the default login status pill that Xememex provides
{"tiddlers":{"$:/config/Comments/EnableFilter":{"title":"$:/config/Comments/EnableFilter","text":"[all[current]!is[system]]\n"},"$:/plugins/tiddlywiki/comments/above-story":{"title":"$:/plugins/tiddlywiki/comments/above-story","tags":"$:/tags/AboveStory","text":"<$reveal state=\"$:/config/Comments/EnableWikiComments\" type=\"match\" text=\"yes\" default=\"no\">\n\n<$tiddler tiddler=\"$:/SiteTitle\">\n\n<$transclude tiddler=\"$:/plugins/tiddlywiki/comments/comments-template\" mode=\"inline\"/>\n\n</$tiddler>\n\n</$reveal>\n"},"$:/plugins/tiddlywiki/comments/add-comment-button-actions":{"title":"$:/plugins/tiddlywiki/comments/add-comment-button-actions","text":"<$set name=\"username\" value={{$:/status/UserName}} emptyValue=\"(anonymous)\">\n<$set name=\"target\" filter=\"[<currentTiddler>]\">\n<$action-createtiddler $basetitle={{{ [[Comment by ']addsuffix<username>addsuffix[' on ']addsuffix<currentTiddler>addsuffix[']] }}} role=\"comment\" list=<<target>> text=\"\" edit-mode=\"yes\"/>\n</$set>\n</$set>\n"},"$:/plugins/tiddlywiki/comments/add-comment-button":{"title":"$:/plugins/tiddlywiki/comments/add-comment-button","text":"<$reveal state=\"$:/status/IsReadOnly\" type=\"match\" text=\"no\" default=\"no\" tag=\"div\" class=\"tc-comment-button\">\n<$button class=\"tc-btn-invisible\" actions={{$:/plugins/tiddlywiki/comments/add-comment-button-actions}}>\nadd comment {{$:/core/images/add-comment}}\n</$button>\n</$reveal>\n"},"$:/plugins/tiddlywiki/comments/comments-template":{"title":"$:/plugins/tiddlywiki/comments/comments-template","text":"<div class=\"tc-comments\">\n<ol class=\"tc-comment-list\">\n<$list filter=\"[all[tiddlers+shadows]role[comment]contains<currentTiddler>sort[created]!has[draft.of]]\">\n<li>\n<div class=\"tc-comment-entry\">\n<div class=\"tc-comment-entry-heading\">\n<$link>{{!!creator}} at <$view field=\"modified\" format=\"date\" template=\"0hh:0mm:0ss DDD DDth MMM YYYY\"/></$link>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/CommentToolbarButton]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$list>\n</div>\n<div class=\"tc-comment-entry-body\">\n<$reveal type=\"match\" state=\"!!edit-mode\" text=\"yes\">\n<$edit-text tiddler=<<currentTiddler>> tag=\"textarea\" focus=\"true\"/>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"!!edit-mode\" text=\"yes\">\n<$transclude tiddler=<<currentTiddler>> mode=\"block\"/>\n<$transclude tiddler=\"$:/plugins/tiddlywiki/comments/add-comment-button\" mode=\"inline\"/>\n</$reveal>\n</div>\n</div>\n<$transclude tiddler=\"$:/plugins/tiddlywiki/comments/comments-template\" mode=\"inline\"/>\n</li>\n</$list>\n</ol>\n</div>\n"},"$:/plugins/tiddlywiki/comments/config":{"title":"$:/plugins/tiddlywiki/comments/config","text":"\\define select(description,filter)\n<$button>\n<$action-setfield $tiddler=\"$:/config/Comments/EnableFilter\" $value=<<__filter__>>/>\n$description$\n</$button>\n\\end\n\n! Wiki Comments\n\n<$checkbox tiddler=\"$:/config/Comments/EnableWikiComments\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Comments/EnableWikiComments\">Allow wiki-level comments as well as tiddler comments</$link> </$checkbox>\n\n! Tiddler Comments\n\nThis filter expression determines which tiddlers will have commenting enabled:\n\n<$edit-text tiddler=\"$:/config/Comments/EnableFilter\" tag=\"input\"/>\n\nOr you can choose a preselected filter:\n\n* <<select \"All tiddlers except system tiddlers\" \"[all[current]!is[system]]\">>\n* <<select \"Only tiddlers tagged 'commentable'\" \"[all[current]tag[commentable]]\">>\n* <<select \"Disable all commenting\" \"\">>\n"},"$:/plugins/tiddlywiki/comments/filter-all-comments":{"title":"$:/plugins/tiddlywiki/comments/filter-all-comments","tags":"$:/tags/Filter","filter":"[role[comment]!sort[modified]]","description":"All comments","text":""},"$:/plugins/tiddlywiki/comments/footer-view-template-segment":{"title":"$:/plugins/tiddlywiki/comments/footer-view-template-segment","tags":"$:/tags/ViewTemplate","list-after":"$:/core/ui/ViewTemplate/body","text":"<$list filter={{$:/config/Comments/EnableFilter}} variable=\"ignore\">\n<div class=\"tc-comments-segment\">\n<$transclude tiddler=\"$:/plugins/tiddlywiki/comments/add-comment-button\" mode=\"inline\"/>\n<$transclude tiddler=\"$:/plugins/tiddlywiki/comments/comments-template\" mode=\"inline\"/>\n</div>\n</$list>"},"$:/plugins/tiddlywiki/comments/header-view-template-segment":{"title":"$:/plugins/tiddlywiki/comments/header-view-template-segment","tags":"$:/tags/ViewTemplate","list-before":"$:/core/ui/ViewTemplate/body","text":"\\define display-original-comment()\n<$link><$text text=<<currentTiddler>>/></$link>\n\\end\n\n\\define find-original-comment(exclude)\n<$list filter=\"[<currentTiddler>role[comment]]\" emptyMessage=<<display-original-comment>> variable=\"ignore\">\n<$list filter=\"[list<currentTiddler>sort[title]] -[enlist<__exclude__>]\">\n<$set name=\"newExclude\" filter=\"[enlist<__exclude__>] [<currentTiddler>]\">\n<$macrocall $name=\"find-original-comment\" exclude=<<newExclude>>/>\n</$set>\n</$list>\n</$list>\n\\end\n\n<$list filter=\"[all[current]role[comment]]\" variable=\"ignore\">\n<div class=\"tc-is-comment-header\">\n<p>\nThis tiddler is a comment on\n<$list filter=\"[list<currentTiddler>sort[title]]\">\n<span class=\"tc-small-gap-right\"><<find-original-comment>></span>\n</$list>\n</p>\n<$list filter=\"[list<currentTiddler>role[comment]sort[title]limit[1]]\" variable=\"ignore\">\n<p>\nParent comments:\n</p>\n<ul>\n<$list filter=\"[list<currentTiddler>role[comment]sort[title]]\">\n<li>\n<$link to=<<currentTiddler>>><$text text=<<currentTiddler>>/></$link>\n</li>\n</$list>\n</ul>\n</$list>\n</div>\n</$list>\n"},"$:/plugins/tiddlywiki/comments/readme":{"title":"$:/plugins/tiddlywiki/comments/readme","text":"This plugin provides a simple means for adding threaded comments to tiddlers.\n\n* Click the \"add comment\" button to make a new comment, and then click the \"save\" button to save it\n* You can comment on a tiddler itself, or add a comment to an existing comment\n* The sidebar tab ''Comments'' lists a timeline of all comments\n* Comments are attributed to the username stored in the system tiddler [[$:/status/UserName]]\n* By default, comments are available on all non-system tiddlers. The ''config'' tab lets you customise which tiddlers can accept comments by specifying a filter extension\n* The buttons for adding and editing comments are only available if the system tiddler [[$:/status/IsReadOnly]] is not set to `yes`\n* Use the \"All comments\" option in the $:/AdvancedSearch ''Filter'' tab to see or export all comments\n\n!! Data Model\n\nThe data model employed by the comments plugin is very simple:\n\n* Comment tiddlers are identified by the `role` field being set to `comment`\n* The `list` field of comment tiddlers lists the tiddlers to which this comment applies\n** It is thus possible for a comment to be applied to multiple tiddlers at once\n** The links between comments can be preserved when renaming them by using the relink checkbox in the edit template\n* The `edit-mode` field of comment tiddlers is set to `yes` to display it in edit mode, or `no` to display it in view mode\n* The `saved-text` field is updated when switching to edit mode so that it can be restored if the user cancels\n\n"},"$:/plugins/tiddlywiki/comments/sidebar-segment":{"title":"$:/plugins/tiddlywiki/comments/sidebar-segment","tags":"$:/tags/SideBarSegment","list-after":"$:/core/ui/SideBarSegments/site-subtitle","text":"<$reveal state=\"$:/config/Comments/EnableWikiComments\" type=\"match\" text=\"yes\" default=\"no\">\n<$tiddler tiddler=\"$:/SiteTitle\">\n<$transclude tiddler=\"$:/plugins/tiddlywiki/comments/add-comment-button\" mode=\"inline\"/>\n</$tiddler>\n</$reveal>\n"},"$:/plugins/tiddlywiki/comments/sidebar":{"title":"$:/plugins/tiddlywiki/comments/sidebar","tags":"$:/tags/SideBar","caption":"Comments","text":"<div class=\"tc-timeline\">\n<$list filter=\"[all[tiddlers+shadows]role[comment]has[modified]!sort[modified]eachday[modified]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"modified\" format=\"date\" template=\"DDth MMM YYYY\"/>\n<$list filter=\"[all[tiddlers+shadows]role[comment]sameday:modified{!!modified}!sort[modified]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link>Comment by '<$view field=\"modifier\">(anonymous)</$view>'</$link> on\n<$list filter=\"[list<currentTiddler>sort[title]]\">\n<$link to=<<currentTiddler>>><$text text=<<currentTiddler>>/></$link>\n</$list>\n</div>\n</$list>\n</div>\n</$list>\n</div>\n"},"$:/plugins/tiddlywiki/comments/styles":{"title":"$:/plugins/tiddlywiki/comments/styles","tags":"[[$:/tags/Stylesheet]]","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n.tc-is-comment-header {\n\tpadding: 0.25em;\n\tborder: 2px solid <<colour message-foreground>>;\n\tborder-radius: 4px;\n\tbackground: <<colour message-background>>;\n}\n\n.tc-comments-segment {\n\tborder-top: 2px solid <<colour message-border>>;\n}\n\n.tc-comment-button button {\n\twidth: 100%;\n\ttext-align: right;\n}\n\n.tc-sidebar-scrollable .tc-comment-button button {\n\twidth: auto;\n\ttext-align: right;\n}\n\n.tc-comment-button button svg {\n\tfill: <<colour download-background>>;\n\theight: 2em;\n\twidth: 2em;\n}\n\n.tc-comments {\n}\n\n.tc-comment-list {\n\tlist-style: none;\n     padding-left: 0;\n}\n\n.tc-comment-list .tc-comments {\n\tpadding-left: 1em;\n}\n\n.tc-comment-entry {\n\tposition: relative;\n\tborder: 2px solid <<colour message-border>>;\n\tborder-radius: 4px;\n\tmargin: 0.5em 0 0 0;\n\tbackground: <<colour message-background>>;\n}\n\n.tc-comment-entry-heading {\n\tfont-size: 0.7em;\n\tfont-weight: bold;\n\ttext-transform: uppercase;\n\tbackground: <<colour message-background>>;\n\tcolor: <<colour message-foreground>>;\n\tpadding: 0 0.5em;\n}\n\n.tc-comment-entry-body {\n\tfont-size: 0.8em;\n\tpadding: 0 0.5em;\n}\n\n.tc-comment-entry-body textarea {\n\tfont-size: 1.1em;\n\twidth: 100%\n}\n"},"$:/tags/CommentToolbarButton":{"title":"$:/tags/CommentToolbarButton","list":"[[$:/plugins/tiddlywiki/comments/toolbar-button-cancel]] [[$:/plugins/tiddlywiki/comments/toolbar-button-delete]] [[$:/plugins/tiddlywiki/comments/toolbar-button-save]] [[$:/plugins/tiddlywiki/comments/toolbar-button-edit]]"},"$:/plugins/tiddlywiki/comments/toolbar-button-cancel":{"title":"$:/plugins/tiddlywiki/comments/toolbar-button-cancel","tags":"$:/tags/CommentToolbarButton","text":"<$reveal state=\"$:/status/IsReadOnly\" type=\"match\" text=\"no\" default=\"no\" tag=\"span\">\n<$reveal type=\"match\" state=\"!!edit-mode\" text=\"yes\">\n<$button>\n<$action-setfield $tiddler=<<currentTiddler>> $field=\"edit-mode\" $value=\"no\"/>\n<$action-setfield $tiddler=<<currentTiddler>> $field=\"text\" $value={{!!saved-text}}/>\ncancel\n</$button>\n</$reveal>\n</$reveal>\n"},"$:/plugins/tiddlywiki/comments/toolbar-button-delete":{"title":"$:/plugins/tiddlywiki/comments/toolbar-button-delete","tags":"$:/tags/CommentToolbarButton","text":"<$reveal state=\"$:/status/IsReadOnly\" type=\"match\" text=\"no\" default=\"no\" tag=\"span\">\n<$reveal type=\"match\" state=\"!!edit-mode\" text=\"yes\">\n<$button>\n<$action-deletetiddler $tiddler=<<currentTiddler>>/>\ndelete\n</$button>\n</$reveal>\n</$reveal>\n"},"$:/plugins/tiddlywiki/comments/toolbar-button-edit":{"title":"$:/plugins/tiddlywiki/comments/toolbar-button-edit","tags":"$:/tags/CommentToolbarButton","text":"<$reveal state=\"$:/status/IsReadOnly\" type=\"match\" text=\"no\" default=\"no\" tag=\"span\">\n<$reveal type=\"nomatch\" state=\"!!edit-mode\" text=\"yes\">\n<$button>\n<$action-setfield $tiddler=<<currentTiddler>> $field=\"edit-mode\" $value=\"yes\"/>\n<$action-setfield $tiddler=<<currentTiddler>> $field=\"saved-text\" $value={{!!text}}/>\nedit\n</$button>\n</$reveal>\n</$reveal>\n"},"$:/plugins/tiddlywiki/comments/toolbar-button-save":{"title":"$:/plugins/tiddlywiki/comments/toolbar-button-save","tags":"$:/tags/CommentToolbarButton","text":"<$reveal state=\"$:/status/IsReadOnly\" type=\"match\" text=\"no\" default=\"no\" tag=\"span\">\n<$reveal type=\"match\" state=\"!!edit-mode\" text=\"yes\">\n<$button>\n<$action-setfield $tiddler=<<currentTiddler>> $field=\"edit-mode\" $value=\"no\"/>\nsave\n</$button>\n</$reveal>\n</$reveal>\n"}}}
<div class="tc-timeline">
<$list filter="[all[tiddlers+shadows]role[comment]has[modified]!sort[modified]eachday[modified]]">
<div class="tc-menu-list-item">
<$view field="modified" format="date" template="DDth MMM YYYY"/>
<$list filter="[all[tiddlers+shadows]role[comment]sameday:modified{!!modified}!sort[modified]]">
<div class="tc-menu-list-subitem">
<$link>Comment by '<$view field="modifier">(anonymous)</$view>'</$link> on
<$list filter="[list<currentTiddler>sort[title]]">
<$link to=<<currentTiddler>>><$text text=<<currentTiddler>>/></$link>
</$list>
</div>
</$list>
</div>
</$list>
</div>
{"tiddlers":{"$:/plugins/tiddlywiki/consent-banner/banner":{"title":"$:/plugins/tiddlywiki/consent-banner/banner","tags":"$:/tags/PageTemplate","text":"\\whitespace trim\n\n<$reveal state=\"$:/state/consent-banner/accepted\" type=\"match\" text=\"\" tag=\"div\">\n\n<div class=\"tc-consent-backdrop\">\n\n</div>\n\n<div class=\"tc-consent-banner tc-consent-banner-left\">\n\n<$transclude tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/greeting-message\" mode=\"block\"/>\n\n<div class=\"tc-consent-buttons\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ConsentBanner/Button]]\">\n\n<$transclude tiddler=<<currentTiddler>> mode=\"inline\"/>\n\n</$list>\n\n</div>\n\n</div>\n\n</$reveal>\n"},"$:/plugins/tiddlywiki/consent-banner/blocked-embed-message-wrapper":{"title":"$:/plugins/tiddlywiki/consent-banner/blocked-embed-message-wrapper","text":"\\define styles()\nwidth:$(width)$;height:$(height)$;\n\\end\n\n<div class=\"tc-blocked-embedded-content\" style=<<styles>>>\n<div class=\"tc-blocked-embedded-content-inner\">\n<div class=\"tc-blocked-embedded-content-inner-inner\">\n<$transclude tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/blocked-embed-message\" mode=\"inline\"/>\n</div>\n</div>\n</div>\n"},"$:/plugins/tiddlywiki/consent-banner/buttons/accept":{"title":"$:/plugins/tiddlywiki/consent-banner/buttons/accept","tags":"$:/tags/ConsentBanner/Button","text":"<$button message=\"tm-consent-accept\" class=\"tc-consent-button tc-consent-button-default tc-btn-invisible\" tooltip={{$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/hint}}>\n{{$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/caption}}\n</$button>\n"},"$:/plugins/tiddlywiki/consent-banner/buttons/decline":{"title":"$:/plugins/tiddlywiki/consent-banner/buttons/decline","tags":"$:/tags/ConsentBanner/Button","text":"<$button message=\"tm-consent-decline\" class=\"tc-consent-button tc-btn-invisible\" tooltip={{$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/hint}}>\n{{$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/caption}}\n</$button>\n"},"$:/config/DefaultColourMappings/consent-banner-backdrop-background":{"title":"$:/config/DefaultColourMappings/consent-banner-backdrop-background","text":"rgba(0,0,0,0.2)"},"$:/config/DefaultColourMappings/consent-banner-background":{"title":"$:/config/DefaultColourMappings/consent-banner-background","text":"#009677"},"$:/config/DefaultColourMappings/consent-banner-button-background":{"title":"$:/config/DefaultColourMappings/consent-banner-button-background","text":"transparent"},"$:/config/DefaultColourMappings/consent-banner-button-border":{"title":"$:/config/DefaultColourMappings/consent-banner-button-border","text":"#fff"},"$:/config/DefaultColourMappings/consent-banner-button-default-background":{"title":"$:/config/DefaultColourMappings/consent-banner-button-default-background","text":"#fff"},"$:/config/DefaultColourMappings/consent-banner-button-default-foreground":{"title":"$:/config/DefaultColourMappings/consent-banner-button-default-foreground","text":"#009677"},"$:/config/DefaultColourMappings/consent-banner-button-foreground":{"title":"$:/config/DefaultColourMappings/consent-banner-button-foreground","text":"#fff"},"$:/config/DefaultColourMappings/consent-banner-button-hover-background":{"title":"$:/config/DefaultColourMappings/consent-banner-button-hover-background","text":"#fff"},"$:/config/DefaultColourMappings/consent-banner-button-hover-border":{"title":"$:/config/DefaultColourMappings/consent-banner-button-hover-border","text":"#fff"},"$:/config/DefaultColourMappings/consent-banner-button-hover-foreground":{"title":"$:/config/DefaultColourMappings/consent-banner-button-hover-foreground","text":"#009577"},"$:/config/DefaultColourMappings/consent-banner-foreground":{"title":"$:/config/DefaultColourMappings/consent-banner-foreground","text":"#fff"},"$:/config/DefaultColourMappings/consent-banner-hr-background":{"title":"$:/config/DefaultColourMappings/consent-banner-hr-background","text":"rgba(255,255,255,.25)"},"$:/config/DefaultColourMappings/consent-banner-link-foreground":{"title":"$:/config/DefaultColourMappings/consent-banner-link-foreground","text":"#fff"},"$:/config/plugins/tiddlywiki/consent-banner/block-embedded-content":{"title":"$:/config/plugins/tiddlywiki/consent-banner/block-embedded-content","text":"yes"},"$:/config/plugins/tiddlywiki/consent-banner/blocked-embed-message":{"title":"$:/config/plugins/tiddlywiki/consent-banner/blocked-embed-message","text":"Blocked embedded content from<br/><a href=<<url>> class=\"tc-tiddlylink-external\" target=\"_blank\" rel=\"noopener noreferrer\"><$text text=<<url>>/></a>\n\n<hr/>\n\n{{$:/plugins/tiddlywiki/consent-banner/buttons/accept}} cookies to unblock"},"$:/config/plugins/tiddlywiki/consent-banner/blocked-raw-message":{"title":"$:/config/plugins/tiddlywiki/consent-banner/blocked-raw-message","text":"<div class=\"tc-blocked-embedded-content\" style=\"width:100%;\">\n\n<div class=\"tc-blocked-embedded-content-inner\">\n\n<div class=\"tc-blocked-embedded-content-inner-inner\">\n\nBlocked raw content\n\n<hr/>\n\n{{$:/plugins/tiddlywiki/consent-banner/buttons/accept}} cookies to unblock\n\n</div>\n\n</div>\n\n</div>\n"},"$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/caption":{"title":"$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/caption","text":"Accept"},"$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/hint":{"title":"$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/hint","text":"Accept cookies"},"$:/config/plugins/tiddlywiki/consent-banner/buttons/clear/caption":{"title":"$:/config/plugins/tiddlywiki/consent-banner/buttons/clear/caption","text":"Clear"},"$:/config/plugins/tiddlywiki/consent-banner/buttons/clear/hint":{"title":"$:/config/plugins/tiddlywiki/consent-banner/buttons/clear/hint","text":"Clear cookies"},"$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/caption":{"title":"$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/caption","text":"Decline"},"$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/hint":{"title":"$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/hint","text":"Decline cookies"},"$:/config/cookie-consent-required":{"title":"$:/config/cookie-consent-required","text":"yes"},"$:/config/plugins/tiddlywiki/consent-banner/greeting-message":{"title":"$:/config/plugins/tiddlywiki/consent-banner/greeting-message","text":"! Our use of cookies\n\nWe use necessary cookies to make our site work. We’d also like to set optional analytics to help us improve it. We won’t set optional cookies unless you enable them. Using this tool will set a cookie on your device to remember your preferences.\n\n---\n\n!! Necessary cookies\n\nNecessary cookies enable core functionality such as security, network management, and accessibility. You may disable these by changing your browser settings, but this may affect how the website functions.\n\n---\n\n!! Analytics cookies\n\nWe’d like to set non-essential cookies, such as Google Analytics, to help us to improve our website by collecting and reporting information on how you use it. The cookies collect information in a way that does not directly identify anyone.\n\n---\n"},"$:/plugins/tiddlywiki/consent-banner/tv-block-embedded-content":{"title":"$:/plugins/tiddlywiki/consent-banner/tv-block-embedded-content","tags":"$:/tags/Macro","text":"<$set name=\"tv-block-embedded-content\" value={{{ [{$:/config/cookie-consent-required}else[no]match[yes]then{$:/state/consent-banner/accepted}!match[yes]then[yes]] }}}/>\n"},"$:/plugins/tiddlywiki/consent-banner/config":{"title":"$:/plugins/tiddlywiki/consent-banner/config","text":"! [[Greeting Message|$:/config/plugins/tiddlywiki/consent-banner/greeting-message]]\n\n<div style=\"\">\n\n<div style=\"display:inline-block;vertical-align:top;width:45%;\">\n\n<$edit-text tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/greeting-message\" tag=\"textarea\" class=\"tc-edit-texteditor\"/>\n\n</div>\n\n<div style=\"display:inline-block;vertical-align:top;width:45%;margin:0.5em;border:1px solid black;padding:0.5em;\" class=\"tc-consent-banner\">\n\n<$transclude tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/greeting-message\" mode=\"block\"/>\n\n</div>\n\n</div>\n\n! Buttons\n\n|[[Accept caption|$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/caption]] |<$edit-text tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/caption\" tag=\"input\"/> |\n|[[Accept hint|$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/hint]] |<$edit-text tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/hint\" tag=\"input\"/> |\n|[[Decline caption|$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/caption]] |<$edit-text tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/caption\" tag=\"input\"/> |\n|[[Decline hint|$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/hint]] |<$edit-text tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/hint\" tag=\"input\"/> |\n\n! [[Consent Accepted Status|$:/state/consent-banner/accepted]]\n\nCurrent status: {{$:/state/consent-banner/accepted}} (blank indicates that consent has not yet been granted or declined)\n\n<$button message=\"tm-consent-accept\" tooltip={{$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/hint}}>\n{{$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/caption}}\n</$button>\n\n<$button message=\"tm-consent-decline\" tooltip={{$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/hint}}>\n{{$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/caption}}\n</$button>\n\n<$button message=\"tm-consent-clear\" tooltip={{$:/config/plugins/tiddlywiki/consent-banner/buttons/clear/hint}}>\n{{$:/config/plugins/tiddlywiki/consent-banner/buttons/clear/caption}}\n</$button>\n\n! Embedded Content Blocking\n\n//Requires page reload//\n\n<$checkbox tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/block-embedded-content\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> Block all embedded content such as &lt;iframe>, &lt;embed> and &lt;object> unless consent has been granted</$checkbox>\n"},"$:/plugins/tiddlywiki/consent-banner/docs":{"title":"$:/plugins/tiddlywiki/consent-banner/docs","text":"! Features\n\nIf the same wiki is opened in multiple tabs then once the warning has been accepted or declined in one tab then the other tabs will autonatically follow suit.\n\nConsent is automatically granted if the user logged in (ie the tiddler [[$:/status/IsLoggedIn]] is set to `yes`).\n\n! Consent Banner Palette Entries\n\nAdd these entries to your current colour palette to change the colours used by the consent banner:\n\n* ''consent-banner-backdrop-background'' - the colour of the backdrop behind the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-backdrop-background}})\n* ''consent-banner-background'' - the background colour of the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-background}})\n* ''consent-banner-button-background'' - the background colour of buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-background}})\n* ''consent-banner-button-border'' - the border colour of buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-border}})\n* ''consent-banner-button-default-background'' - the background colour for the default button within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-default-background}})\n* ''consent-banner-button-default-foreground'' - the foreground colour for the default button within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-default-foreground}})\n* ''consent-banner-button-foreground'' - the foreground colour of buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-foreground}})\n* ''consent-banner-button-hover-background'' - the background colour of hovered buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-hover-background}})\n* ''consent-banner-button-hover-border'' - the border colour of hovered buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-hover-border}})\n* ''consent-banner-button-hover-foreground'' - the foreground colour of hovered buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-hover-foreground}})\n* ''consent-banner-foreground'' - the foreground colour of the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-foreground}})\n* ''consent-banner-hr-background'' - the background colour of horizontal rules within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-hr-background}})\n* ''consent-banner-link-foreground'' - the foreground colour of tiddler links within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-link-foreground}})\n\n! Embedded Content Blocking\n\nUnless disabled via the config tab, content embedded via &lt;iframe>, &lt;embed> or &lt;object> is blocked until the user consents to accept cookies.\n\n!! Implementation Details\n\nEmbedded content is blocked if the variable `tv-block-embedded-content` is set to `yes`. It is set to the current consent status by a [[global macro|$:/plugins/tiddlywiki/consent-banner/tv-block-embedded-content]]:\n\n<$codeblock code={{$:/plugins/tiddlywiki/consent-banner/tv-block-embedded-content}}/>\n\n! ~YouTube macro\n\nA simple macro for embedding ~YouTube videos is provided to show how to adapt content according to whether consent has been granted. It works by checking the tiddler [[$:/state/consent-banner/accepted]] for the following values:\n\n* ''empty or missing'' - the user has yet to accept or decline to give their consent\n* `yes` - the user has granted consent\n* `no` - the user has declined consent\n\n! Customising banner buttons\n\nThe [[\"accept\"|$:/plugins/tiddlywiki/consent-banner/buttons/accept]] and [[\"decline\"|$:/plugins/tiddlywiki/consent-banner/buttons/decline]] buttons in the banner are individual tiddlers with the tag [[$:/tags/ConsentBanner/Button]], allowing them to be customised and extended.\n\nA common use case is to add a \"login\" button allowing users to login directly to bypass the banner. This could be implemented as a tiddler tagged [[$:/tags/ConsentBanner/Button]] with the following text:\n\n```\n<$button message=\"tm-login\" class=\"tc-consent-button tc-btn-invisible\">\nLogin\n</$button>\n```\n\n! Integration with other plugins\n\nThird party plugins that set cookies can configure themselves to defer setting cookies until the user grants consent. There are several parts to this mechanism:\n\n* The consent-banner plugin includes a shadow tiddler [[$:/config/cookie-consent-required]] with the text `yes`. The third-party plugin should inspect this tiddler at startup; if it is not set to \"yes\" then it can proceed to set tiddlers immediately\n* Otherwise, the third-party plugin should listen for changes to the tiddler [[$:/state/consent-banner/accepted]] and only start setting cookies when and if the value changes to \"yes\"\n\nThe [[Google Analytics plugin|https://github.com/TiddlyWiki/TiddlyWiki5/tree/master/plugins/tiddlywiki/googleanalytics]] shows an example of how this mechanism can be implemented.\n"},"$:/core/modules/widgets/raw.js":{"title":"$:/core/modules/widgets/raw.js","text":"/*\\\ntitle: $:/core/modules/widgets/raw.js\ntype: application/javascript\nmodule-type: widget\n\nAn override of the raw widget that blocks raw content until the user has consented to accept cookies\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RawWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRawWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRawWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tthis.blocked = this.getVariable(\"tv-block-embedded-content\",\"no\") === \"yes\";\n\tif(this.blocked) {\n\t\tthis.makeChildWidgets([{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: \"$:/config/plugins/tiddlywiki/consent-banner/blocked-raw-message\"}\n\t\t\t}\n\t\t}]);\n\t\t// Render child widgets\n\t\tthis.renderChildren(parent,null);\n\t} else {\n\t\tvar div = this.document.createElement(\"div\");\n\t\tdiv.innerHTML=this.parseTreeNode.html;\n\t\tparent.insertBefore(div,nextSibling);\n\t\tthis.domNodes.push(div);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRawWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRawWidget.prototype.refresh = function(changedTiddlers) {\n\tif(this.blocked) {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t} else {\n\t\treturn false;\t\t\n\t}\n};\n\nexports.raw = RawWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/plugins/tiddlywiki/consent-banner/readme":{"title":"$:/plugins/tiddlywiki/consent-banner/readme","text":"The ''consent-banner'' plugin helps make websites that are compliant with \"cookie legislation\" such as the [[EU General Data Protection Regulation|https://gdpr.eu/cookies/]].\nIt presents a banner inviting the user to accept or reject cookies, keeping track of their consent in local storage so that the banner can be hidden on subsequent visits.\n\nBy default, content embedded with &lt;iframe>, &lt;embed> and &lt;object> is blocked unless the user consents to accept cookies.\n\nConsent status is  available via a configuration tiddler so that it is possible to construct content that behaves differently depending upon whether consent has been granted. As an example, a macro is provided for embedding ~YouTube videos that automatically uses the youtube-nocookie.com variant of video URLs unless the user has accepted cookies.\n\nPlease note that using this plugin does not guarantee compliance with any particular legislation. You will need to understand the technical issues specific to your situation, and if necessary seek legal advice.\n"},"$:/plugins/tiddlywiki/consent-banner/startup.js":{"title":"$:/plugins/tiddlywiki/consent-banner/startup.js","text":"/*\\\ntitle: $:/plugins/tiddlywiki/consent-banner/startup.js\ntype: application/javascript\nmodule-type: startup\n\nStartup initialisation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"consent-banner\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"render\"];\nexports.synchronous = true;\n\nvar CHECK_CONSENT_INTERVAL = 1000, // Milliseconds between checking local storage\n\tIS_LOGGED_IN_TITLE = \"$:/status/IsLoggedIn\",\n\tCONSENT_KEY = \"COOKIE_CONSENT\", // Local storage keyname\n\tCONSENT_TITLE = \"$:/state/consent-banner/accepted\", // \"\": undeclared, \"yes\": accepted, \"no\": declined\n\tCONFIG_BLOCK_EMBEDDED_CONTENT_TITLE = \"$:/config/plugins/tiddlywiki/consent-banner/block-embedded-content\",\n\tEMBEDDED_MESSAGE_WRAPPER_TITLE = \"$:/plugins/tiddlywiki/consent-banner/blocked-embed-message-wrapper\";\n\nexports.startup = function() { \n\tvar consentState = \"\",\n\t\tsetConsentStatus = function(state) {\n\t\t\tif(consentState !== state) {\n\t\t\t\tconsentState = state;\n\t\t\t\t// Write to local storage\n\t\t\t\twindow.localStorage.setItem(CONSENT_KEY,state);\n\t\t\t\t// Write to a state tiddler\n\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler({\n\t\t\t\t\ttitle: CONSENT_TITLE,\n\t\t\t\t\ttext: state\n\t\t\t\t}));\n\t\t\t}\n\t\t},\n\t\tcalculateConsentStatus = function() {\n\t\t\t// Consent is implied for logged in users, otherwise we check local storage\n\t\t\treturn ($tw.wiki.getTiddlerText(IS_LOGGED_IN_TITLE) === \"yes\" && \"yes\") || window.localStorage.getItem(CONSENT_KEY) || \"\";\n\t\t},\n\t\tcheckConsentStatus = function() {\n\t\t\tsetConsentStatus(calculateConsentStatus());\n\t\t\tif(consentState === \"\") {\n\t\t\t\tpollConsentStatus();\n\t\t\t}\n\t\t},\n\t\tpollConsentStatus = function() {\n\t\t\tsetTimeout(checkConsentStatus,CHECK_CONSENT_INTERVAL);\n\t\t};\n\t// Set the current consent status\n\tcheckConsentStatus();\n\t// Listen for consent messages\n\t$tw.rootWidget.addEventListener(\"tm-consent-accept\",function(event) {\n\t\tsetConsentStatus(\"yes\");\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-consent-decline\",function(event) {\n\t\tsetConsentStatus(\"no\");\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-consent-clear\",function(event) {\n\t\tsetConsentStatus(\"\");\n\t});\n\t// Add our element rendering hook\n\tif($tw.wiki.getTiddlerText(CONFIG_BLOCK_EMBEDDED_CONTENT_TITLE,\"no\") === \"yes\") {\n\t\t$tw.hooks.addHook(\"th-rendering-element\",function(parseTreeNodes,widget) {\n\t\t\tif(parseTreeNodes) {\n\t\t\t\treturn parseTreeNodes;\n\t\t\t}\n\t\t\tif([\"iframe\",\"object\",\"embed\"].indexOf(widget.tag) !== -1 && widget.getVariable(\"tv-block-embedded-content\",\"no\") === \"yes\") {\n\t\t\t\tvar url = widget.getAttribute(\"src\"),\n\t\t\t\t\taddUnitsIfMissing = function(str) {\n\t\t\t\t\t\tstr = \"\" + str;\n\t\t\t\t\t\treturn str + ((\"\" + parseInt(str,10)) === str ? \"px\" : \"\");\n\t\t\t\t\t},\n\t\t\t\t\twidth = addUnitsIfMissing(widget.getAttribute(\"width\",\"\")),\n\t\t\t\t\theight = addUnitsIfMissing(widget.getAttribute(\"height\",\"\"));\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"vars\",\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\turl: {type: \"string\", value: url},\n\t\t\t\t\t\t\twidth: {type: \"string\", value: width},\n\t\t\t\t\t\t\theight: {type: \"string\", value: height}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"transclude\",\n\t\t\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t\t\ttiddler: {type: \"string\", value: EMBEDDED_MESSAGE_WRAPPER_TITLE},\n\t\t\t\t\t\t\t\t\tmode: {type: \"string\", value: \"inline\"}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t];\n\t\t\t}\n\t\t\treturn null;\n\t\t});\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/plugins/tiddlywiki/consent-banner/styles":{"title":"$:/plugins/tiddlywiki/consent-banner/styles","tags":"$:/tags/Stylesheet","text":".tc-consent-backdrop {\n\tz-index: 1999;\n\tposition: fixed;\n\tleft: 0;\n\tright: 0;\n\ttop: 0;\n\tbottom: 0;\n\tbackground: <<colour consent-banner-backdrop-background>>;\n}\n\n.tc-consent-banner-left {\n\tz-index: 2000;\n\tposition: fixed;\n\tleft: 0;\n\ttop: 0;\n\tbottom: 0;\n\tmax-width: 500px;\n\toverflow-y: auto;\n}\n\n.tc-consent-banner {\n\tpadding: 1em;\n\tbackground: <<colour consent-banner-background>>;\n\tcolor: <<colour consent-banner-foreground>>;\n\tbox-shadow: 0 0 20px rgba(0,0,0,.2);\n}\n\n.tc-consent-banner a.tc-tiddlylink-external {\n\ttext-decoration: underline;\n\tcolor: <<colour consent-banner-link-foreground>>;\n\tbackground-color: inherit;\n}\n\n.tc-consent-banner a.tc-tiddlylink-external:visited {\n\tcolor: <<colour consent-banner-link-foreground>>;\n\tbackground-color: inherit;\n}\n\n.tc-consent-banner hr {\n\tclear: both;\n\tpadding: 0;\n\twidth: 100%;\n\toverflow: hidden;\n\ttext-align: left;\n\tborder: 0 none;\n\tmargin: 24px 0;\n\theight: 1px;\n\tmax-height: 1px;\n\tbackground: <<colour consent-banner-hr-background>>;\n}\n\n.tc-consent-buttons {\n\t\n}\n\n.tc-consent-banner .tc-consent-button {\n\tmargin-right: 1em;\n}\n\n.tc-consent-button {\n\tborder: 1px solid <<colour consent-banner-button-border>>;\n\tmargin-top: 1em;\n\tpadding: 0.75em 1.5em;\n\tcolor: <<colour consent-banner-button-foreground>>;\n\tbackground: <<colour consent-banner-button-background>>;\n\tfont-weight: bold;\n}\n\n.tc-consent-button:hover {\n\tcolor: <<colour consent-banner-button-hover-foreground>>;\n\tborder-color: <<colour consent-banner-button-hover-border>>;\n\tbackground: <<colour consent-banner-button-hover-background>>;\n\topacity: .6;\n}\n\n.tc-consent-button-default {\n\tcolor: <<colour consent-banner-button-default-foreground>>;\n\tbackground: <<colour consent-banner-button-default-background>>;\n}\n\n.tc-blocked-embedded-content {\n\tdisplay: inline-block;\n\toverflow: hidden;\n\tcolor: <<colour background>>;\n\tbackground: <<colour muted-foreground>>;\n\tborder: 1px solid <<colour foreground>>;\n\t<<box-shadow \"inset 0 0 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-blocked-embedded-content-inner {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  width: 100%;\n  height: 100%;\n}\n\n.tc-blocked-embedded-content-inner-inner {\n\tdisplay: inline-block;\n\ttext-align: center;\n}\n\n.tc-blocked-embedded-content-inner-inner hr {\n    background: <<colour foreground>>;\n    height: 1px;\n    width: 80%;\n    border: none;\n}\n"},"$:/plugins/tiddlywiki/consent-banner/youtube":{"title":"$:/plugins/tiddlywiki/consent-banner/youtube","tags":"$:/tags/Macro","text":"\\define embed-video-with-consent(code)\n<$set name=\"tv-block-embedded-content\" value=\"no\">\n<$reveal state=\"$:/state/consent-banner/accepted\" type=\"match\" text=\"yes\" tag=\"div\">\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/$code$\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen></iframe>\n</$reveal>\n<$reveal state=\"$:/state/consent-banner/accepted\" type=\"nomatch\" text=\"yes\" tag=\"div\">\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube-nocookie.com/embed/$code$\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen></iframe>\n</$reveal>\n</$set>\n\\end\n\n! Macro source\n\n<$codeblock code={{$:/plugins/tiddlywiki/consent-banner/youtube}}/>\n\n! Example\n\n<<embed-video-with-consent KtCUr83XgyE>>\n"}}}
{"tiddlers":{"$:/plugins/tiddlywiki/googleanalytics/googleanalytics.js":{"title":"$:/plugins/tiddlywiki/googleanalytics/googleanalytics.js","text":"/*\\\ntitle: $:/plugins/tiddlywiki/googleanalytics/googleanalytics.js\ntype: application/javascript\nmodule-type: startup\n\nRuns Google Analytics with the measurement ID in the tiddler `$:/GoogleAnalyticsMeasurementID`\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"google-analytics\";\nexports.platforms = [\"browser\"];\nexports.synchronous = true;\n\nvar CONFIG_CONSENT_REQUIRED_TITLE = \"$:/config/cookie-consent-required\", // \"yes\" or \"no\" (the default)\n\tCONSENT_TITLE = \"$:/state/consent-banner/accepted\"; // \"\": undeclared, \"yes\": accepted, \"no\": declined\n\nexports.startup = function() {\n\tvar hasInitialised = false,\n\t\tinitialiseGoogleAnalytics = function() {\n\t\t\tconsole.log(\"Initialising Google Analytics\");\n\t\t\thasInitialised = true;\n\t\t\tvar gaMeasurementID = $tw.wiki.getTiddlerText(\"$:/GoogleAnalyticsMeasurementID\",\"\").replace(/\\n/g,\"\");\n\t\t\tvar url =\"https://www.googletagmanager.com/gtag/js?id=\" + gaMeasurementID;\n\t\t\twindow.dataLayer = window.dataLayer || [];\n\t\t\twindow.gtag = function() { window.dataLayer?.push(arguments); };\n\t\t\twindow.gtag(\"js\",new Date());\n\t\t\twindow.gtag(\"config\",gaMeasurementID);\n\t\t\tconst scriptElement = window.document.createElement(\"script\");\n\t\t\tscriptElement.async = true;\n\t\t\tscriptElement.src = url;\n\t\t\twindow.document.head.appendChild(scriptElement);\n\t\t};\n\t// Initialise now if consent isn't required\n\tif($tw.wiki.getTiddlerText(CONFIG_CONSENT_REQUIRED_TITLE) !== \"yes\") {\n\t\tinitialiseGoogleAnalytics();\n\t} else {\n\t\t// Or has been granted already\n\t\tif($tw.wiki.getTiddlerText(CONSENT_TITLE) === \"yes\") {\n\t\t\tinitialiseGoogleAnalytics();\n\t\t} else {\n\t\t\t// Or when our config tiddler changes\n\t\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\t\tif(changes[CONSENT_TITLE]) {\n\t\t\t\t\tif(!hasInitialised && $tw.wiki.getTiddlerText(CONSENT_TITLE) === \"yes\") {\n\t\t\t\t\t\tinitialiseGoogleAnalytics();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n};\n\n\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/plugins/tiddlywiki/googleanalytics/readme":{"title":"$:/plugins/tiddlywiki/googleanalytics/readme","text":"This plugin enables you to use Google Analytics to track access to your online TiddlyWiki document.\n\nBy default, the user is not asked for permission before initialising Google Analytics. This plugin also optionally integrates with the \"Consent Banner\" plugin (also found in the official plugin library) so that Google Analytics is not initialised until the user grants explicit permission.\n\n[[Source code|https://github.com/TiddlyWiki/TiddlyWiki5/blob/master/plugins/tiddlywiki/googleanalytics]]\n"},"$:/plugins/tiddlywiki/googleanalytics/settings":{"title":"$:/plugins/tiddlywiki/googleanalytics/settings","text":"''[[Google Analytics Measurement ID|$:/GoogleAnalyticsMeasurementID]]'': (mandatory) a code of the form `G-XXXXXXXXXX` where X are digits or uppercase letters<br/><$edit-text tiddler=\"$:/GoogleAnalyticsMeasurementID\" default=\"\" tag=\"input\"/>\n\n"},"$:/plugins/tiddlywiki/googleanalytics/usage":{"title":"$:/plugins/tiddlywiki/googleanalytics/usage","text":"!! Create a Google Analytics account\n\nIf you don't already have an account:\n\n# Go to the Google Analytics website: http://www.google.com/analytics/\n# Click the ''Access Google Analytics'' button and follow instructions to set up your account\n# Enter the URL where the wiki is hosted\n# Note the Tracking ID for this domain of the form `G-XXXXXXXXXX`\n\n!! Install the plugin on your local copy of the TiddlyWiki\n\n# ''Backup your TiddlyWiki''. Just in case\n# Install the plugin via the plugin manager in control panel\n# Save the TiddlyWiki andrefresh the page to load the plugin\n# Go to [[$:/ControlPanel]] > Plugins tab and unfold the Google Analytics Plugin\n# Go to the //settings// tab and edit the parameters\n# Save the TiddlyWiki\n\n!! Upload the new version of your TiddlyWiki\n\n# Upload the saved TiddlyWiki to Tiddlyhost, GitHub, GitLab or other web host\n# Return to your Google Analytics page to check that your site is being tracked\n"}}}
{"tiddlers":{"$:/config/DefaultColourMappings/menubar-foreground":{"title":"$:/config/DefaultColourMappings/menubar-foreground","text":"#fff"},"$:/config/DefaultColourMappings/menubar-background":{"title":"$:/config/DefaultColourMappings/menubar-background","text":"#5778d8"},"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/pagecontrols":{"title":"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/pagecontrols","text":"hide"},"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server":{"title":"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server","text":"hide"},"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/sidebar":{"title":"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/sidebar","text":"hide"},"$:/config/plugins/menubar/TableOfContents/Tag":{"title":"$:/config/plugins/menubar/TableOfContents/Tag","text":"TableOfContents"},"$:/config/plugins/menubar/breakpoint":{"title":"$:/config/plugins/menubar/breakpoint","text":"620px"},"$:/plugins/tiddlywiki/menubar/config":{"title":"$:/plugins/tiddlywiki/menubar/config","tags":"$:/tags/ControlPanel/Toolbars","caption":"Menu Bar","text":"\\define config-base() $:/config/plugins/menubar/MenuItems/Visibility/\n\n! Menu Bar Configuration\n\n!! Menu Items\n\nSelect which menu items will be shown. You can also drag items to reorder them.\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/MenuBar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n\n!! Breakpoint Position\n\nThe breakpoint position between narrow and wide screens. Should include CSS units (eg. `400px`).\n\n<$edit-text tiddler=\"$:/config/plugins/menubar/breakpoint\" default=\"\" tag=\"input\"/>\n\n!! Contents Tag\n\nThe tag for the ~TableOfContents used in the Contents dropdown\n\n<$edit-text tiddler=\"$:/config/plugins/menubar/TableOfContents/Tag\" default=\"\" tag=\"input\"/>\n\n!! Menu Bar Colours\n\nTo change the colour of the menu bar, define the colours `menubar-foreground` and `menubar-background` in the currently selected palette\n"},"$:/plugins/tiddlywiki/menubar/items/contents":{"title":"$:/plugins/tiddlywiki/menubar/items/contents","caption":"Contents","description":"Table of Contents","is-dropdown":"yes","tags":"$:/tags/MenuBar","text":"<div class=\"tc-table-of-contents\">\n\n<$macrocall $name=\"toc-selective-expandable\" tag={{$:/config/plugins/menubar/TableOfContents/Tag}}/>\n\n</div>\n"},"$:/plugins/tiddlywiki/menubar/items/hamburger":{"title":"$:/plugins/tiddlywiki/menubar/items/hamburger","tags":"$:/tags/MenuBar","caption":"Hamburger","description":"Show the full menu bar on a narrow screen","custom-menu-content":"{{$:/plugins/tiddlywiki/menubar/items/hamburger}}","show-when":"narrow","text":"<$list filter=\"[[$:/state/popup/menubar/hamburger]get[text]else[no]match[no]]\">\n<$button set=\"$:/state/popup/menubar/hamburger\" setTo=\"yes\">\n{{$:/core/images/menu-button}}\n</$button>\n</$list>\n<$list filter=\"[[$:/state/popup/menubar/hamburger]get[text]else[no]match[yes]]\">\n<$button set=\"$:/state/popup/menubar/hamburger\" setTo=\"no\">\n{{$:/core/images/close-button}}\n</$button>\n</$list>\n"},"$:/plugins/tiddlywiki/menubar/items/pagecontrols":{"title":"$:/plugins/tiddlywiki/menubar/items/pagecontrols","tags":"$:/tags/MenuBar","description":"Page controls from the sidebar","caption":"Page controls","custom-menu-content":"<$transclude tiddler=\"$:/plugins/tiddlywiki/menubar/items/pagecontrols\" mode=\"inline\"/>","text":"\\whitespace trim\n\\define config-title() $:/config/PageControlButtons/Visibility/$(listItem)$\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\t<$set name=\"hidden\" value=<<config-title>>>\n\t\t<$list filter=\"[<hidden>!text[hide]]\" storyview=\"pop\" variable=\"ignore\">\n\t\t\t<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\t\t\t\t<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\t\t\t</$set>\n\t\t</$list>\n\t</$set>\n</$list>\n"},"$:/plugins/tiddlywiki/menubar/items/search":{"title":"$:/plugins/tiddlywiki/menubar/items/search","custom-menu-content":"{{$:/plugins/tiddlywiki/menubar/items/search}}","description":"Search","caption":"Search","tags":"$:/tags/MenuBar","text":"\\define cancel-search-actions()\n<$set name=\"userInput\" value={{{ [<__storeTitle__>get[text]] }}}>\n<$list filter=\"[<__tiddler__>get[text]!match<userInput>]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[<__storeTitle__>] [<__tiddler__>] [<__selectionStateTitle__>]\"/>\"\"\">\n<$action-setfield $tiddler=<<__tiddler__>> text=<<userInput>>/><$action-setfield $tiddler=<<__refreshTitle__>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\whitespace trim\n<$vars searchTiddler=\"$:/temp/menubarsearch/input\" searchListState=<<qualify \"$:/state/search-list/selected-item\">>>\n<span style=\"margin: 0 0.5em;\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<form class=\"tc-form-inline\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/menubarsearch\" storeTitle=<<searchTiddler>> selectionStateTitle=<<searchListState>> \n\t\trefreshTitle=\"$:/temp/menubarsearch/refresh\" tag=\"input\" type=\"search\" focusPopup=\"$:/state/popup/menubar-search-dropdown\" \n\t\tclass=\"tc-popup-handle tc-menu-show-when-wide\" placeholder=\"Search...\" default=\"\" cancelPopups=\"yes\" \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> inputCancelActions=<<cancel-search-actions>> \n\t\tfilterMinLength={{$:/config/Search/MinLength}} configTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\" />\n</form>\n</$keyboard>\n</$keyboard>\n</span>\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=\"$:/state/popup/menubar-search-dropdown\" type=\"nomatch\" text=\"\" default=\"\">\n\n<div  class=\"tc-block-dropdown tc-search-drop-down\">\n\n<$list filter=\"[<searchTiddler>get[text]minlength[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">Type your search terms</div>\"\"\" variable=\"ignore\">\n\n<$list filter=\"[<searchTiddler>get[text]minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$vars configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} userInput={{{ [<searchTiddler>get[text]] }}}>\n\n{{$:/core/ui/SearchResults}}\n\n</$vars>\n\n</$list>\n\n</$list>\n\n</div>\n\n</$reveal>\n\n</$vars>\n"},"$:/plugins/tiddlywiki/menubar/items/server":{"title":"$:/plugins/tiddlywiki/menubar/items/server","tags":"$:/tags/MenuBar","description":"Server options","caption":"Server","custom-menu-content":"<$transclude tiddler=\"$:/plugins/tiddlywiki/menubar/items/server\" mode=\"inline\"/>","text":"<$list filter=\"[[$:/status/IsLoggedIn]get[text]else[no]match[yes]]\" variable=\"ignore\">\n<$transclude tiddler=\"$:/core/ui/Buttons/save-wiki\" mode=\"inline\"/>\n</$list>\n<$list filter=\"[[$:/status/IsLoggedIn]get[text]else[no]match[no]]\" variable=\"ignore\">\n<$button message=\"tm-login\">\nLogin\n</$button>\n</$list>\n"},"$:/plugins/tiddlywiki/menubar/items/sidebar":{"title":"$:/plugins/tiddlywiki/menubar/items/sidebar","caption":"Sidebar","description":"Sidebar","is-dropdown":"yes","tags":"$:/tags/MenuBar","text":"<$scrollable fallthrough=\"none\" class=\"tc-popup-keep tc-menubar-dropdown-sidebar\">\n\n<$transclude tiddler=\"$:/core/ui/SideBarSegments/tabs\" mode=\"inline\"/>\n\n</$scrollable>\n"},"$:/plugins/tiddlywiki/menubar/items/topleftbar":{"title":"$:/plugins/tiddlywiki/menubar/items/topleftbar","tags":"$:/tags/MenuBar","description":"Items from $:/tags/TopLeftBar","caption":"Legacy Top Left Bar","custom-menu-content":"<$transclude tiddler=\"$:/plugins/tiddlywiki/menubar/items/topleftbar\" mode=\"inline\"/>","text":"<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>"},"$:/plugins/tiddlywiki/menubar/items/toprightbar":{"title":"$:/plugins/tiddlywiki/menubar/items/toprightbar","tags":"$:/tags/MenuBar","description":"Items from $:/tags/TopRightBar","caption":"Legacy Top Right Bar","custom-menu-content":"<$transclude tiddler=\"$:/plugins/tiddlywiki/menubar/items/toprightbar\" mode=\"inline\"/>","custom-menu-styles-wide":"float: right;","text":"<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]reverse[]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>"},"$:/plugins/tiddlywiki/menubar/menu":{"title":"$:/plugins/tiddlywiki/menubar/menu","tags":"$:/tags/PageTemplate","text":"\\define menubar-inner(size)\n<ul class=\"tc-menubar-list\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]]\">\n<$list filter=\"[<currentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]\" variable=\"ignore\">\n<$list filter=\"[[$size$]match[wide]] ~[<currentTiddler>get[show-when]match[$size$]] ~[{$:/state/popup/menubar/hamburger}match[yes]]\" variable=\"ignore\">\n<li style={{!!custom-menu-styles-$size$}} class={{{ [<currentTiddler>get[show-when]addprefix[tc-menubar-]] tc-menubar-item +[join[ ]] }}}>\n<$list filter=\"[<currentTiddler>!is-dropdown[yes]]\" variable=\"listItem\" emptyMessage=\"\"\"\n\t<!-- Dropdown -->\n\t<$set name=\"dropdown-state\" value=<<qualify \"$:/state/popup/topmenu/dropdown/\">>>\n\t<$set name=\"dropdown-state\" value={{{ [<dropdown-state>addsuffix<currentTiddler>] }}}>\n\t<$button popup=<<dropdown-state>> selectedClass=\"tc-selected\">\n\t<$set name=\"tv-wikilinks\" value=\"no\">\n\t<$transclude field=\"caption\" mode=\"inline\"/>\n\t<$text text=\" \"/>\n\t<span class=\"tc-menubar-dropdown-arrow\">\n\t<$transclude tiddler=\"$:/core/images/down-arrow\" mode=\"inline\"/>\n\t</span>\n\t</$set>\n\t</$button>\n\t</$set>\n\t</$set>\n\"\"\">\n<$list filter=\"[<currentTiddler>has[custom-menu-content]]\" variable=\"listItem\" emptyMessage=\"\"\"\n\t<!-- Link -->\n\t<$link to={{!!target}}>\n\t<$set name=\"tv-wikilinks\" value=\"no\">\n\t<$transclude field=\"caption\" mode=\"inline\"/>\n\t</$set>\n\t</$link>\n\"\"\">\n<!-- Custom content -->\n<$transclude field=\"custom-menu-content\" mode=\"inline\"/>\n</$list>\n</$list>\n</li>\n</$list>\n</$list>\n</$list>\n</ul>\n\\end\n\n<$list filter=\"[<tv-config-static>!match[yes]]\" variable=\"ignore\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[limit[1]]\" variable=\"listItem\">\n<nav class=\"tc-menubar tc-adjust-top-of-scroll\">\n<div class=\"tc-menubar-narrow\">\n<<menubar-inner narrow>>\n</div>\n<div class=\"tc-menubar-wide\">\n<<menubar-inner wide>>\n</div>\n<div style=\"clear:both;\"/>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]is-dropdown[yes]]\">\n<$list filter=\"[<currentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]\" variable=\"ignore\">\n<$set name=\"dropdown-state\" value=<<qualify \"$:/state/popup/topmenu/dropdown/\">>>\n<$set name=\"dropdown-state\" value={{{ [<dropdown-state>addsuffix<currentTiddler>] }}}>\n<$reveal type=\"popup\" state=<<dropdown-state>> position={{{ [<currentTiddler>get[dropdown-position]else[below]] }}} class={{{ [<currentTiddler>get[class]] }}} tag=\"div\">\n<div class=\"tc-drop-down\">\n<$transclude/>\n</div>\n</$reveal>\n</$set>\n</$set>\n</$list>\n</$list>\n</nav>\n</$list>\n</$list>\n"},"$:/core/ui/PageTemplate/topleftbar":{"title":"$:/core/ui/PageTemplate/topleftbar","text":"<!-- The menubar plugin overrides this tiddler to remove the core top left menu. The menu items that it would include are instead included in the menubar -->"},"$:/core/ui/PageTemplate/toprightbar":{"title":"$:/core/ui/PageTemplate/toprightbar","text":"<!-- The menubar plugin overrides this tiddler to remove the core top right menu. The menu items that it would include are instead included in the menubar -->"},"$:/plugins/tiddlywiki/menubar/readme":{"title":"$:/plugins/tiddlywiki/menubar/readme","text":"!! Introduction\n\nThis plugin provides a menu bar with the following features:\n\n* Menu items take the form of simple text links, dropdowns, or entirely custom content\n* Menu items can be individually enabled via the control panel\n* Responds to reduced screen width by abbreviating the menu items to a \"hamburger\" dropdown\n\n!! Menu Item Tiddlers\n\nMenu items are tagged <<tag $:/tags/MenuBar>>. The following fields are used by this plugin:\n\n|!Field Name |!Purpose |\n|title |Each menu item must have a unique title (not shown to the user) |\n|description |Description for use in listings |\n|tags |Must contain `$:/tags/MenuBar` |\n|caption |The text that is displayed for the menu item. Avoid links, using `~` to suppress CamelCase links if required |\n|target |For simple link menu items specifies a tiddler title as the target of the link |\n|is-dropdown |Set to `yes` to indicate a dropdown menu item |\n|dropdown-position |Optional position for the dropdown (can be ''left'', ''above'', ''aboveleft'', ''aboveright'', ''right'', ''belowleft'', ''belowright'' or ''below'') |\n|text |For dropdown menu items, specifies the body of the dropdown |\n|custom-menu-content |Optional wikitext to be displayed in place of the caption |\n|custom-menu-styles-wide |Optional string of styles to be applied to menu item when the menubar is wide |\n|custom-menu-styles-narrow |Optional string of styles to be applied to menu item when the menubar is narrow |\n\nCustom menu items should make sure that the clickable link or button is an immediate child, and not wrapped in another element.\n\nNote that menu items can be pushed to the right of the menu bar setting the ''custom-menu-styles'' field to `float: right;`.\n"},"$:/plugins/tiddlywiki/menubar/styles":{"title":"$:/plugins/tiddlywiki/menubar/styles","tags":"[[$:/tags/Stylesheet]]","text":"\\define breakpoint-plus-one()\n<$text text={{{ [{$:/config/plugins/menubar/breakpoint}removesuffix[px]add[1]addsuffix[px]] ~[{$:/config/plugins/menubar/breakpoint}] }}} />\n\\end\n\n\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}} />\n\\end\n\n\\define set-sidebar-scrollable-top-if-hamburger()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[$:/plugins/tiddlywiki/menubar/items/toprightbar]] -$:/plugins/tiddlywiki/menubar/items/hamburger +[limit[1]]\">\n\n\t.tc-sidebar-scrollable {\n\t\tmargin-top: 2em;\n\t}\n\n</$list>\n\\end\n\n\\define set-sidebar-scrollable-top()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[limit[1]]\">\n\n\t.tc-sidebar-scrollable {\n\t\tmargin-top: 2em;\n\t}\n\n</$list>\n<$reveal state=\"$:/state/popup/menubar/hamburger\" type=\"match\" text=\"yes\">\n\n\t<$set name=\"itemCount\" value={{{ [all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[count[]] }}}>\n\n\t\t.tc-sidebar-scrollable {\n\t\t\tmargin-top: calc(<<itemCount>> * 2em);\n\t\t}\n\n\t</$set>\n\n</$reveal>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\nnav.tc-menubar {\n\tposition: fixed;\n\tz-index: 850;\n\tdisplay: inline-block;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n}\n\nnav.tc-menubar ul.tc-menubar-list {\n\tposition: relative;\n\tlist-style-type: none;\n\tmargin: 0;\n\tpadding: 0 0 0 42px;\n\tbackground: <<colour background>>;\n\tbackground: <<colour menubar-background>>;\n\t<<box-shadow \"1px 1px 5px rgba(0, 0, 0, 0.3)\">>\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\thtml nav.tc-menubar ul.tc-menubar-list {\n\t\tpadding: 0 0 0 8px;\n\t}\n\n}\n\nnav.tc-menubar li.tc-menubar-item {\n\tdisplay: inline-block;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nnav.tc-menubar .tc-menubar-narrow li.tc-menubar-item {\n\tdisplay: block;\n}\n\nnav.tc-menubar li.tc-menubar-item > a,\nnav.tc-menubar li.tc-menubar-item > button {\n\tdisplay: inline-block;\n/*\ttext-transform: uppercase; */\n\tline-height: 1;\n\tfont-weight: 700;\n\tcolor: <<colour foreground>>;\n\tcolor: <<colour menubar-foreground>>;\n\tfill: <<colour foreground>>;\n\tfill: <<colour menubar-foreground>>;\n\ttext-decoration: none;\n\tpadding: 0.5em;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\tcursor: pointer;\n\tborder-radius: 0;\n\ttext-decoration: none;\n}\n\nnav.tc-menubar li.tc-menubar-item > a.tc-selected,\nnav.tc-menubar li.tc-menubar-item > button.tc-selected {\n\tbackground: <<colour foreground>>;\n\tbackground: <<colour menubar-foreground>>;\n\tcolor: <<colour background>>;\n\tcolor: <<colour menubar-background>>;\n\tfill: <<colour background>>;\n\tfill: <<colour menubar-background>>;\n}\n\nnav.tc-menubar li.tc-menubar-item svg {\n\ttransition: none;\n\twidth: 1em;\n\theight: 1em;\n\tfill: <<colour foreground>>;\n\tfill: <<colour menubar-foreground>>;\n}\n\nnav.tc-menubar li.tc-menubar-item .tc-menubar-dropdown-arrow svg {\n\twidth: 0.5em;\n\theight: 0.5em;\n}\n\nnav.tc-menubar li.tc-menubar-item > a.tc-selected svg,\nnav.tc-menubar li.tc-menubar-item > button.tc-selected svg {\n\tfill: <<colour background>>;\n\tfill: <<colour menubar-background>>;\n}\n\nnav.tc-menubar li.tc-menubar-item > a:hover,\nnav.tc-menubar li.tc-menubar-item > button:hover svg,\nnav.tc-menubar li.tc-menubar-item > button:hover {\n\tbackground: <<colour foreground>>;\n\tbackground: <<colour menubar-foreground>>;\n\tcolor: <<colour background>>;\n\tcolor: <<colour menubar-background>>;\n\tfill: <<colour background>>;\n\tfill: <<colour menubar-background>>;\n\tborder-radius: 0;\n\ttext-decoration: none;\n}\n\nnav.tc-menubar li.tc-menubar-item > a:active,\nnav.tc-menubar li.tc-menubar-item > button:active svg,\nnav.tc-menubar li.tc-menubar-item > button:active {\n\tbackground: <<colour foreground>>;\n\tbackground: <<colour menubar-foreground>>;\n\tcolor: <<colour background>>;\n\tcolor: <<colour menubar-background>>;\n\tfill: <<colour background>>;\n\tfill: <<colour menubar-background>>;\n\tborder-radius: 0;\n\ttext-decoration: none;\n}\n\nnav.tc-menubar .tc-drop-down,\nnav.tc-menubar .tc-block-dropdown {\n\tmax-width: 70vw;\n\tmax-height: 70vh;\n\toverflow: auto;\n}\n\nnav.tc-menubar .tc-drop-down a {\n\ttext-decoration: none;\n}\n\nnav.tc-menubar .tc-drop-down .tc-table-of-contents button {\n\tdisplay: inline-block;\n\twidth: auto;\n}\n\nnav.tc-menubar .tc-drop-down ol {\n\tmargin: 0;\n}\n\nnav.tc-menubar .tc-drop-down .tc-menubar-dropdown-sidebar a,\nnav.tc-menubar .tc-drop-down .tc-menubar-dropdown-sidebar button {\n\tdisplay: inline;\n\twidth: auto;\n}\n\nnav.tc-menubar .tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (max-width: {{$:/config/plugins/menubar/breakpoint}}) {\n\n\t.tc-menubar-wide {\n\t\tdisplay: none;\n\t}\n\n}\n\n@media (min-width: <<breakpoint-plus-one>>) {\n\n\tnav.tc-menubar li.tc-menubar-item.tc-menubar-narrow,\n\t.tc-menubar-narrow {\n\t\tdisplay: none;\n\t}\n\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t<<set-sidebar-scrollable-top-if-hamburger>>\n\n}\n\n@media (max-width: {{$:/config/plugins/menubar/breakpoint}}) {\n\n\t<<set-sidebar-scrollable-top>>\n\n}\n@media print {\n\n\tnav.tc-menubar {\n\t\tdisplay: none;\n\t}\n\n}\n"},"$:/tags/MenuBar":{"title":"$:/tags/MenuBar","list":"$:/plugins/tiddlywiki/menubar/items/hamburger $:/plugins/tiddlywiki/menubar/items/topleftbar $:/plugins/tiddlywiki/menubar/items/contents $:/plugins/tiddlywiki/menubar/items/search $:/plugins/tiddlywiki/menubar/items/pagecontrols $:/plugins/tiddlywiki/menubar/items/server $:/plugins/tiddlywiki/menubar/items/toprightbar"}}}




$:/themes/tiddlywiki/snowwhite
960px
450px
770px
770px
686px
fluid-fixed
PatternLanding.svg
classic
@@color:red;This page is being developed in light of recent changes to working due to the outbreak of COVID-19@@

<center>''Creating a safe context''</center>


''1.'' Always make sure that contacts are planned to specific times. Do not have vague commitments to call.

''2.'' Check that person has time available, whether they are likely to be interrupted and if so plan for interruptions.  

''3.'' Plan loss of signal and who will call who if this happens.
 

<center>''Stay on track''</center>

''4.'' Connect with agreed goals if you have them and how session may help with those goals

''5.'' Try to monitor changes over time using measures (by email) or simple feedback.

''6.'' Notice small changes or exceptions to negative expectations.
 

<center>''Being responsive''</center>

''7.'' Validate what things are like for the person.

''8.'' Try not to reassure without hearing about the problem fully

''9.'' Invite solutions from the person and problem solve

''10.'' Be clear when you will next be in contact
This is a short clip where a five/six year old child explains about anxiety. She uses adult words and is very articulate. The script is an adult script but this might be useful in psychoeducation. 

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/MjJmemgWM6A" frameborder="0" allowfullscreen></iframe></html>

Please see below for some clips of children young people and their parents talking about ADHD. This is a really good resource for gaining a better understanding of the lived experience of children you people and their families. These could be really helpful when discussing ADHD with CYP and their families.

Here Ethan ages 8 discusses what it feels like for him to have ADHD:

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/wmM5sm8wYQQ" frameborder="0" allowfullscreen></iframe></html>


Here is a clip from 'what about the kids?' in which CYP discuss ADHD:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/Wppcxbm-28c" frameborder="0" allowfullscreen></iframe></html>



This is Brad's Story: A 12 year-old with ADHD:

Here is a clip from 'what about the kids?' in which CYP discuss ADHD:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/z2hLa5kDRCA" frameborder="0" allowfullscreen></iframe></html>


This is Ally Hardesty story of what it feels like living with ADHD which she describes as her biggest insecurity & how it affects her on an everyday basis:

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/p3y5JZDpKIM" frameborder="0" allowfullscreen></iframe></html>


There is a plethora of videos of lived experiences on what it feels like to live with ADHD on [[YouTube|https://www.youtube.com/results?search_query=what+it+feels+like+to+have+ADHD]] so please do explore.
[img[lightbulb.jpg]]

!!!This Guide: 
This online guide has been designed for use by Wellbeing Practitioners and their supervisors. It is not a website in the usual sense but has a range of materials that provide a set of materials and resources to support CWP practice. Please take a moment to check out how this online guide works in [[User Guide]] as it takes a little bit of getting used to. 

We recommend you use ''Google Chrome'' or ''Mozilla Firefox'' instead of Internet Explorer. 

Any problems, use [[Contact us]]

The guide is an open resource for any Child Wellbeing Practitioners both in training and those who have qualified. CWP supervisors may also find the information on this guide helpful.

!!!The Purpose of this guide
The purpose of this guide is to make information freely available to all. However, this material is designed to be used by practitioners who have been trained in methods of guided self help and who are working under supervision from an experienced mental health professional. These materials are not designed to be used unless these conditions are met.

This guide is being written during the autumn 2018 and throughout 2019 while the first group of CWP trainees are being trained. It is being constructed out of the generosity of the teaching staff to share their expertise while teaching on this programme.

The author or source material is indicated on each page. Permission for use of any copyrighted material is routinely sought and, if not obtained, such material is not used. Each page is reviewed by the editorial team and by the source author before being completed. Pages in the process of being written are indicated with a banner at the top of the page. We aim not to include material from other sources which we believe to be discriminatory, disrespectful or offensive. The aim is that material will be as accurate and as up to date as possible but we welcome feedback on any of the material in this guide.

Please send any feedback or questions about the guide to [ext[PGS Online Guides|mailto:PGSonlineguides@annafreud.org]] 

!!!The CWP Role

In line with the Government’s priority to increase access and availability of mental health and wellbeing support for children and young people, the CWP role is an exciting opportunity to deliver evidence-based early interventions for children and young people, working across healthcare sectors in England. Please go to the follow link to find out more https://www.annafreud.org/mental-health-professionals/cyp-mh-workforce-development-1/
*Varying types of BA 
#Activity schedule
**plan activities then do them and see the impact on your mood, used a lot and start of CBT 
#Lejuez 
**activity in line with values in different life areas, you then start to plan in concrete activities that fit with values. Support available through planning in contracts to help young people along the way. 
**more likely to engage as its brief (Brief BA or BATD) and tried to keep it simple 
#Matrell
** function analysis which can be complicated for therapist and client. RCT conducted in the USA found equally as good as CBT and IPT.
!!!!!Source: CWP Audit Report for London and the South East 2018. Main author:  Deepa Mavji

!!!''Introduction''

The CWP teams had to work out a referral acceptance and rejection criteria based on the training material and also on site specific needs. 
Each site was asked about their inclusion and exclusion criteria and a summary of the main inclusion and exclusion criteria from all site qualitative data are listed below.

!!!Inclusion criteria:

*Low mood, anxiety or challenging behaviour
*Willingness to engage
*Case not previously known to other psychological service
*Case redirected from CAMHS as not appropriate for their service
*Early signs of emotional well-being distress
*Elevated RCADS scores

!!!Exclusion criteria:

*Extreme risk (e.g. self-harm) or safeguarding concerns
*High case complexity (Eating disorder, Obsessive Compulsive Disorder, Post Traumatic Disorder, Psychosis, cases currently in court)
*Learning disability
*Complex family circumstances or social concerns
*Receiving an intervention in CAMHS or engaged with private therapy or additional support

However, all sites adapted the inclusion and exclusion criteria based on the needs of the community and service expectations.

!!!''Rates of acceptance of referred cases'' 
The total number of referrals to the CWP service across all 15 sites were 1,434. 78% (1,111) of referrals met referral criteria and were accepted for an assessment and/or intervention and 17% (243) did not meet referral criteria and the remaining 6% (80) were in progress.


The proportion of children and young people who did not access the CWP service were referred to:

* 62% referred to a Tier 3 service
* 21% were referred to their G.P
* 5% were referred to a third sector organisation
* 5% were unspecified
* 3% were referred to a Tier 2 service
* 3% were referred to another service
* 1% were referred to a Tier 4 service

!!!''Referral source'' 


Children and young people were most  referred from the following sources:

* 37% Education sector (mainly schools) 
* 24% CAMHS Tier 3
* 8% Self-referrals
* 7% Other 
* 7% GP Practice
* 5% Local Authority
* 4% CAMHS Tier 2
* 3% Voluntary 
* 2% CAMHS triage
* 1% A&E
* 1% NHS other
* 1% Family Intervention Services
* Less than 1% CAMHS Tier 1
* Less than 1% CAMHS Tier 4      
Source: Peter Fuggle and Joe Hickey

!!What is active listening?

Active listening could also be called 'explicit listening'. It is simply a set of behaviours on the part of the practitioner to communicate to the young person or parent that you are interested in what they are saying. It usually involves a number of brief statements by the listener to make this unambiguous to the client. The sort of phrases that might be used are:

* //That seems really important.//
* //I think I understood that, but could you tell me a bit more//.
* //That's really helpful.//
* //I can imagine that wasn't easy to tell me about.//
* //I want to make sure I don't forget that.//

!!The rationale for active listening:

*it conveys that what you are hearing is important. 
*it challenges an idea that the client may have about themselves that they are boring or worthless.
*it doesn't assume that the client is used to being listened to and that he/she will interpret more passive listening as interest by the practitioner. 
*it help the practitioner make sense of complicated material. 

!!Practice points:

''The important thing is that it doesn't become mechanical and just a formula.''

__Be attentive__

* Appropriate eye contact, posture and tone of voice
__Open questions__

* Ask questions that invite more than yes/no answers
__Summarise__

* Short statements to offering your understanding of what you are hearing
__Reflect__

* Repeating a word or phrase to encourage the speaker
__Clarify__

* Use prompts or questions to seek better understanding of points that are relevant but unclear 
__React__

* Giving feedback and showing your reactions sensitively

For more information on how to actively listen watch 
'[[6 Tips for Active Listening|https://www.youtube.com/watch?v=oWe_ogA5YCU]]' a really useful short video which may  further your understanding about active listening.


!!Links to other pages

Active listening is a key technique for [[Engagement]]
and should be used as part of range of techniques included in pages around  [[Guided Self Help]] 
*Handouts in colour etc. can be flexible in how you deliver it to young people 
*Want them to record their activities but don't want to set them up to fail - need practitioner to be passionate about the activity log otherwise it wont be completed. No critisims or punishment if they don't do it, praise if they have completed it in any way. If they don't bring it back they can complete it in session 2. 
*Don't refer to it as homework but as 'getting to know you' and do an example day within the session. 
*How is it going to be feasible and manageable for the young person 
*Importance box means important to the young person
!!!''Key points''
*Having done some daily monitoring, the next step is to encourage the young person to start to plan activities which they have selected as part of their preferred activities in terms of enjoyment and/or importance.
*Activity lists may be helpful in prompting ideas about the range of possible activities. 
A useful Anxiety Manual Developed by the Richmond wellbeing team:

Richmond Adolescent Anxiety Model

<<link-pdf "Richmond Adolscent Anxiety Practitioner Manual" "https://drive.google.com/open?id=1CwY4g-GWE6unIwWMNNp24px4ua2OGruD">>

For the core intervention manual taught on the CWP/EMHP course please see [[Adolescent Anxiety - Manual]]
<<list-links "[tag[Adolescent Anxiety]]">>
Source: Helen Barker and colleagues 

---

!!'''Getting to Grips with Anxiety'''
The approach to helping young people with anxiety is summarised in the manual called 'getting to grips with anxiety'.  This has been drafted by Helen Barker and colleagues and provides a step by step account of how to help a young person with anxiety. 
We are indebted to Helen Barker and her team for generously sharing their work on adolescent anxiety with us.

Please use the link below for the full manual:

<<link-doc "Getting to grips with anxiety" "https://drive.google.com/file/d/1wUrDMPAYZnq0c1WPOEopQjmGV8SCS3Ri/view?usp=sharing">>

@@font-size:12px;
<<< <<link-doc "The Previous version of Getting to grips with anxiety can be found here" "https://drive.google.com/file/d/1CFJ4RymiV2RIlE4qksaUYgGz1DQntLLp/view?usp=sharing">> 
@@

---

!!''Introduction''

*This framework is designed as a guide as what might be useful content to cover in a course of guided self-help (GSH) for anxiety with adolescents. 
*Services should feel free to try this out and adjust accordingly. 
*Services should experiment with materials and resources available to them and utilise websites such as ‘get self-help’ or ‘Mind-Ed’ and other [[self-help materials|Self Help Materials]] / books / literature. 
* We encourage services to develop their own booklets. 
*Although GSH is a mixture of shorter and longer sessions; the modality these sessions take place in (e.g. phone/Skype/face to face) will likely differ between services.

!! ''Sessions overview''

[[Session Overview for Overcoming Adolescent Anxiety]]

!!''Session Plans''

For a full list of session plans based on  'Getting to Grips with Anxiety' by Helen Barker and colleagues go  to:
[[Session Plans for Overcoming Adolescent Anxiety]]


!!''Related pages:''

Please also go to 
[[Working with Adolescents with Anxiety]] for general guidance on how to work with YP who are experiencing anxiety. 

!!Supplementary Manuals
 The Kings College London CYP-IAPT teaching team have also developed some excellent manuals ''to be used alongside the 'Getting to Grips with Anxiety' manual'', for more detailed guidance with the specified areas below.

!!!Injection, blood and injury fears supplement:

<<link-doc "Supplement: Injection, blood and injury fears" "https://drive.google.com/file/d/16SRtHJyJ0sXQWoF9pGUdRFBVt5ZW_JK7/view?usp=sharing">>

!!!Managing Panic supplement:

<<link-doc "Supplement: Managing Panic" "https://drive.google.com/file/d/1qt2Q_ZK1QV1ZKkUGdsWV5-G2WfxiJAiI/view?usp=sharing">>

!!!Managing Worry supplement:

<<link-doc "Supplement: Managing Worry" "https://drive.google.com/file/d/1DwsXWSq-cIj-TuXCrSCPs6tC9tqvtiQX/view?usp=sharing">>

!!!What to do when our thoughts get in the way supplement:

<<link-doc "Supplement: What to do when our thoughts get in the way" "https://drive.google.com/file/d/1sAtXtolQIYypSd7r8dEHoVYcjaXKw1TP/view?usp=sharing">>

@@
<<< <<link-doc "The Previous version of What to do when our thoughts get in the way can be found here" "https://drive.google.com/file/d/1Yzf2FE62B95fdgleePm88HA8GxMTdmjt/view?usp=sharing">> 
@@
Please see below for the adapted adolescent anxiety manual in response to the current circumstances caused by COVID-19. 

This manual was compiled and edited by the KCL CYP-IAPT team: Susanna Payne, Laura Bowyer, Sarah Carman and Helen Barker; and the UCL CYP-IAPT team: Vicki Curry

With information from: Caroline Stokes (KCL); Alice Kerr & Emma Warnock-Parkes, (Centre
for Anxiety Disorders and Trauma/KCL); Lisa Shostak (KCL); Ali Lambie, (Mindfulness
Hampshire); Jynna Yarrum and Alysia James, (University of Northampton).
Young people’s perspective from: Lila and Remy Moar

----

This manual suggests recommending study skills to families, below are some good examples of study skills.

Exam essentials: Studying for success

https://www.bbc.co.uk/bitesize/articles/zb7j382

Go The Distance: Study Skills

https://www.bbc.co.uk/learningenglish/gothedistance/studyskills

Nine nifty ways to study remotely

https://www.bbc.co.uk/bitesize/articles/z77svk7


These have all been taken from the 'support' section of [[BBC Bitesize|https://www.bbc.co.uk/bitesize/support]]

---

<<link-pdf "Adolescent anxiety manual: COVID-19 adaptations" "https://drive.google.com/file/d/1xg18Nv4yul_0taIaqa3HpG4nQSvW5Dp0/view?usp=sharing">>
The Improving Access to Psychological Therapies (IAPT) Manual and its resources have been produced to help the IAPT programme improve the delivery of, and access to, evidence-based psychological therapies within the NHS. The programme is designed  for adults and is distinct from the CYP-IAPT Programme which is for children and young people. 

The Manual can be downloaded from NHS England <<link-pdf "IAPT Manual" "https://www.england.nhs.uk/wp-content/uploads/2018/06/the-iapt-manual.pdf">> 

!!!What is the IAPT manual?
*IAPT Manual is a framework for services providing publicly accessible information bringing together guidance developed over the 10 years of IAPT. 
*Single source for all information on the IAPT programme (workforce, measures, therapies, outcomes, supervision, service improvement)
*Guide for commissioners, IAPT service managers and therapists working in IAPT

!!!Manual in practice 
Services can use the manual as a blueprint and as a benchmark for the local balance between access, recovery and wait times whilst maintaining standards. Bench marking exercises from the manual can help services understand when they aren't reaching the standard and how they can improve. 


!!! What are you doing since qualifying
* Funding in some boroughs for Band 5
* Some people doing doctorates
* Transferable skills for other positions
* Sustainability is still a discussion and trying to think about expanding workforce

!!! Advice for first session
* Know the materials
* Role play with colleagues
* Speak to supervisor
* Don't worry about covering everything. Most important thing is to engage and build good relationship with young person. 
* Go in with a crib sheet so you can glance at it throughout as a reminder
* Allowing them to feel heard is important part of session 1 

!!! What did you find most challenging?
* Not knowing what was coming next but hopefully cohort 2 will be more contained 
* Worrying about getting clients and taking on inappropriate clients - don't worry about this, clients will increase
* Course team are also speaking to new services and passing on learning from partnerships from last year. 
* Video submission: try to video a lot of clients and then you can pick from it. Also everyone finds it hard to watch yourself but you do get used to it. Persuading people to be filmed was also not a big challenge, most people agreed easily.
* Assignments: Have discussions with colleagues and ask for help.
* Using ipads work phones or camcorders to film was fine once learnt how to use it.
* Client and CWP tended to forget it was filming so didn't create huge anxiety
* If young person is anxious then you can use session 1 for young person to hold camera on CWP and then next session might feel more comfortable

!!! How to you make it collaborative and person-centred?
* Ask the client what they want to work on and make sure you take their lead 
* Set goals together and make sure that you check back on goals 
* Manualised interventions can mean it is a challenge. Sometimes you can balance the material in intervention and do general problems solving etc as well. make time for both and direct back to interventions/ have a structure and bring client back to it.
*Give client space to tell you what works and doesn't work. 
* Sharing ideas with clients so that you can learn together
* Set learning goals as these will make progress faster 
!!!!Source: Doreen S. Marshall and colleagues, [[SPRC|http://www.sprc.org/]]  and [[AFSP|https://afsp.org/]]

'After a Suicide' provides guidance, tools and resources on how to respond in the immediate aftermath of a suicide death of a student to prevent further trauma which may lead to further suicidal behaviour. This is referred to as 'postvention'.

This toolkit reflects consensus recommendations developed in consultation with national experts, including school-based administrators and staff, clinicians, researchers, and crisis response professionals. 

This resource was developed in America for administrators and staff in middle and high schools, but it can also be useful for parents and communities. As such, some of the materials may need adapting for work in British schools however is still a valuable resource for supporting schools around a students death from suicide.

<<link-pdf "After a Suicide" "https://drive.google.com/file/d/1v5r7yI5R1cd4XTAAl7KW_2Wx_r3QG5hf/view?usp=sharing">>



!!!!© 2018 Education Development Center and American Foundation for Suicide Prevention. All rights reserved. This publication may be copied, reproduced, and distributed provided the correct copyright procedure is followed. 
!!!!Source: Laura Bowyer and Peter Fuggle 

Much of the material in this page is consistent with ideas around relapse prevention. 


!!!''The principle of having a plan''
Different services will have different contexts that will influence how a plan is developed with a parent or young person. The exact format of the plan is less important than that the client leaves the contact with a clear sense of what is going to happen next and what the purpose will be for future contacts. 

The intention is to model the idea that help is purposeful, collaborative and explicit. The reason for being clear about the next contact is to make the process of help as predictable as possible. If the  appointment had gone well, the client, when asked by a friend what was happening, would be able to say in ordinary terms what was agreed and what would happen next. 

The plan should always include an action that the young person or parent is going to carry out, however modest. Help is not something that is done to a client but something that is carried out collaboratively together between the practitioner and the client but with a focus on the client maintaining a position of agency  (see [[The basic stance for guided self help]]).

!!!''Practical skills around having a plan''
Some young people will prefer to record the plan on their phone rather than have a piece of paper. The important thing is that something is written and both the client and practitioner have a copy. The plan should have some of the following:

#the purpose of what the helping process is all about. - e.g. the aim is to worry less, or go to school more or see friends etc
#the client will be invited to think about some specific goals and bring these to the first session (active stance)
#the expected way that the help will be offered - frequency of contact, type of contact, who will be included etc. 
#look at some self help materials before first session. 
#what to do if things get much worse. 
!!!''In the session'' 
This may be the final session with a young person or near the end of your intervention as a art of the work around relapse prevention 

*Leave adequate time to cover – it is an important part of any intervention 
*Be creative!
*Review the content of your sessions and discuss what YP has found most helpful
*Create a folder of resources the YP can keep and refer back to
*Think with them about the important people who will continue to support them (back up team)
*Discuss other resources available to them. 
*Many of the booklets will have worksheets for relapse prevention where common questions for the YP / parent to think about include:
!!!''Useful questions to ask''
*What are the key things learnt?
*What has been helpful?
*How have you done in relation to your goals?
*What do you still want to work on?
*Who is going to help you? 
*What do you need to help you?
*What could cause set-backs? 
*How would you overcome these?

Source: Deb ~McNally and the Manchester Collaborative 

* To improve parent-child interactions and the relationship in order to reduce the escalation of behavioural and emotional problems 
* To break any unhelpful patterns of interaction by establishing a positive, relationship between the parent and child
* To learn about children’s behaviour, including the triggers for challenging behaviour and what reinforces behaviour
* To increase parents’ confidence in interacting with their child 
* To consider the importance of special time and positive attention for the parent-child relationship
* To learn ideas for managing difficult behaviours
* Acknowledge how difficult being a parent is and to normalise the experience of needing help with parenting to remove self-blame

{{manc}}

Below is a list of alternative session material that a practitioner may want to use with a parent of children with behaviour problems:

<<list-links "[tag[Alternative Session Plans for Behaviour Problems]]">>
''Surfs up'' is an animation developed by Michelle Bainbridge (an Education Mental Health Practitioner) for children. This animation for children explains how anxiety can effect us during the COVID-19 pandemic, and how to ride the waves of anxiety during this time. Michelle feels this could be particularly helpful for children those who have parents and carers who are key workers.

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/jfbKq49NKaE" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>

''Time for Change'' is an animation created by Michelle Bainbridge about the transition of year 6 students into secondary school considering the uncertainty and changes due to the global pandemic. This animation was made in partnership with Barnet, Enfield and Haringey NHS trust, Enfield CAMHS, and a collection of year 6 students and their parents.


<iframe width="560" height="315" src="https://www.youtube.com/embed/wbmvWsWvdQU" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
[img[pink and orange.jpg]]
The intervention practitioners are trained in for Anxiety covers two ages groups as seen below.

* [[Adolescent Anxiety]]
* [[Child Anxiety]]

The core materials relating to this intervention can be found via the [[Helping]] page.

!!!Anxiety Overview

<<list-links "[tag[Anxiety Overview]]">> 

!!!!Source: Peter Fuggle and David Trickey 
Below is a general summary and introduction about anxiety drafted by Peter Fuggle, David Trickey  and colleagues at the Anna Freud National Centre for Children and Families for the Royal Foundation in 2017. 

!!!Anxiety in young children: a brief introduction 
''Anxiety as normal.'' Young children get worried about things. For young children, many get worried about the dark, they are nervous with strangers, they are not always sure that the world is a safe place. As small people, inexperienced in the ways of the world, and still learning how it all works, they are vulnerable; anxiety is in that sense an appropriate and proper response that prepares them to cope with possible hazards. For instance, when they are exposed to potentially unkind adults (strangers) they may practically-speaking be helpless alone, but knowing how to signal and ensure that they stay close to safe adults who can protect them has real survival value.  So, in a supermarket, if a young child stays close to his parent or carer out of a nervousness about getting lost, this is generally helpful in making sure that he/she stays safe. So small levels of anxiety have an adaptive function. This also applies to older children and young people although they commonly have other worries, often about whether they have friends, or how others feel towards them. The worries of older children are generally related to the developmental challenges of becoming a more autonomous person as they progress towards becoming young adults. Complete indifference to worry – either in younger children or adolescents – about these kinds of predictable challenges may be more a concern than typical levels of social apprehension. 
So some level of anxiety in children is adaptive and the absence of such anxiety is not entirely a good thing.  It is adaptive because it helps a parent to do the job of caring for their child by providing  signals to the parent about how their child is. Parents (however sensitive and well attuned to their children) need this feedback and most will quite naturally (without having to be purposefully or additionally alert) notice the signs of distress that their child sends out. This is good too. This is what makes the parenting process work – a good mix of  parental sensitivity to the mental state of the child, alongside the child’s capacity to communicate the coming and going of their distress and anxiety as they explore and discover the world.  Without such signals the parent would be at a loss as to what to do. So in a way the child’s capacity to communicate distress is helping the parent to do their job. This is fine in moderation but sometimes this ‘adaptive dance’ gets into trouble and this is what we shall turn to next. 
''When anxiety gets worse''. So some level of anxiety is both normal and adaptive for children and young people. Difficulties arise when such normal levels of anxiety become more severe, more persistent and begin to have an impact on the child’s capacity to engage in normal aspects of living. In young children, parents are nearly always the first to notice such developments but it is not always easy to identify in the early stages often because children will show this through their behaviour as much as by anything they may say. The most common indicator of an anxiety problem is the emergence of a pattern of responding to something that is generally referred to as ‘avoidant behaviour’; for instance,  when a child becomes resistant to particular places (e.g. buses), social situations (e.g. saying goodbye to a parent at the nursery), objects (e.g. spiders) or events (e.g. going to bed). Avoiding the feared situation is also usually accompanied by increased levels of distress or protest when the child is then encouraged or required by others to face these kind of situations.  Often this escalating level of distress results in changes of behaviour in the parents or adult caring for the child as they then understandably attend to trying to settle the child’s distress (e.g. crying or explicit silence and withdrawal) more than addressing the situation (or understanding and coping with the situation) that is triggering this. 
It is not always easy to know whether a child’s distress and anxiety around something is a temporary reaction to a particular event or whether it indicates a more enduring difficulty.  For example, the death of a grandparent may lead a child to seek the presence of a parent more than previously. This is a common response and on its own is not an indication of an anxiety problem. After a while this reaction is likely to diminish and a child will regain their previous ways of being and behaving. However for some children this reaction persists for several months and this may be a reason for some concern. Similarly a child may have an unhappy day at nursery and may be unenthusiastic about going to school the following day.  There may be complaints of feeling unwell etc, or escalating distress when the time to leave approaches. Again this is not uncommon but if such a pattern of avoidance of school persists for several weeks, then this is a cause for concern. When this does start to happen, typically the parent, too, becomes a little unsure as to what is the best thing to do.  Such problems may trigger a lot of thinking about why the problem started (e.g. “he has always been a bit of an anxious baby”, or “he was very close to his grandmother”, or “I hated nursery when I was a child.”.)  Sometimes, as part of the development of a pattern of avoidant behaviour, the parent starts to become less confident about encouraging their child to do the things that they may be avoiding opportunities for ‘experimenting’ and ‘having a go’ may, without anyone being particularly aware of this, reduce.  Anxiety becomes a significant problem when it starts to set up rather fixed ways of responding to the world, rather than allowing for adaptation, and experimentation.   
''How can we help children with anxiety problems?'' The vast majority of help for young children with anxiety problems is provided by parents. 75% of children with such problems do not receive any professional help.  Although, psychologists and others have described a lot of different types of anxiety problems that occur in young children (e.g. phobias, separation anxiety, social anxiety, etc), the effective principles of how to help a child with anxiety are essentially similar and are also consistent with parenting in general. So what can parents do to help?  
Validating feelings: Firstly children can easily feel both anxious about something and also that they are doing something wrong by being anxious. Their anxiety can quickly become muddled up with feeling that they are causing trouble (not wanting to do to go to school; not wanting to stay at grandma’s because of spiders) and, of course, in a sense they may be.  So, as with lots of parenting it is about helping a child really to feel that they are not being criticised for how they feel, that their feelings are ‘validated’ and not dismissed This helps a child to feel better and safe. In ordinary language this is about a child feeling loved and accepted when they are feeling vulnerable. As always, these things are easy to write about but are not always so straightforward in practice so, although this may sound a bit basic, it remains the cornerstone of how to be helpful to a child who has developed a pattern of being worried about things.  What does this look like in practice?  Doing as much listening as possible: some parents find the saying “listen to understand, not to respond!” helpful here.  As parents we easily fall into having an answer or some kind of response to everything our children throw at us.  Young children do not find it easy to say what is happening and showing acceptance, warmth and genuine curiosity will help the child to make sense of what it is that they are feeling, believing, anticipating or fearing. A little gentle humour may be reassuring to a child that things will be okay. 
''Supporting experimentation'': That first step is not the last one. The next step is the need to not get stuck in ‘validation’ but to enable a child to get back to a usual process of experimentation. This is tricky as it requires the parent not to be overly protective of the child and also for the child to be supported to try new things again. The fundamental process is called ’encouragement’ (there is no need to dress this up with science!) and usually both the parent and the child are a little apprehensive about it. However parents in general do this all the time, so it is not really a new thing.  What this means in practice is helping a child to practice small steps at a pace that is perhaps just a little bit faster than their fear would prefer, but not so fast that the parent isn’t confident that they can cope. There is no benefit in pushing a child into an experiment that is almost bound to fail, and upset them even more.  So, if a child is anxious about going to sleep on their own and wants a parent to get in bed with them while they go to sleep, then the plan would be to gradually encourage the child to tolerate increasing distance between himself and his parent.  There are many parent guides to helping with this process, of which one of the best is the guidance by Cathy Creswell – “”.  The most effective approaches manage to create some reassuring security for both parent and child by creating very clear and organised plans.  The important thing is that plans mean there are no surprises, and that progress can be gentle rather than forced.  Making progress measurable in ways that allow for the child (and the parent) to feel rewarded by their successes is important.
''What do I do if this doesn’t work or that I don’t really feel that I understand the problem?'' There are some types of anxiety problems that may need a slightly modified approach to this basic approach. For example children who have experienced trauma may have a specific form of anxiety which, if they continue to show persistent distress over time, needs some specialist help. These subtypes of anxiety are less significant in young children in that the overall approach remains more similar with younger children. For some children, despite the approaches outlined above, the anxiety problems continue and may become more severe.  When this happens it is important that additional professional help is sought so that the child’s pattern of relating to the world does not become too firmly established. What we know is that professional interventions for anxiety are no more likely to be helpful than parent-led interventions if the problems are quite new and ‘ordinary’ anxieties such as some of the things we have described above. However, professional interventions for significant problems are likely to be more effective if those problems have not been allowed to become entrenched for too long. This is a balancing act, but talking with other parents or professionals can often help a parent to decide when their own efforts might need extra support.

18th February 2017
 
This is a tag tiddler

<<list-links "[tag[Anxiety practice]]">>
<<list-links "[tag[Anxiety skills]]">>
!!!!!Source: Laura Bowyer	

!!Explaining what anxiety is
Anxiety is a natural human emotion and although it feels unpleasant, it cannot harm us physically 

*We all get anxious (but do acknowledge we don’t all get it to the same frequency and degree as the YP struggling with an anxiety problem)

*Anxiety becomes a problem when it gets overly distressing and has an impact on our day to day lives / gets in the way of things 

*Anxiety can be helpfully explained by the flight / fight explanation. You can use [[videos|Psychoeducation: Videos]] from [[YouTube|https://www.youtube.com/]]. 

*Various handouts from booklets are available to show the body and what happens in fight / flight. The key is to explain the sometimes ‘scary’ or ‘unpleasant’ symptoms young people get when anxious. 

*The ‘false car alarm’ metaphor is useful to explain that we often get ‘false alarms’ with our anxiety just like a car alarm going off when it’s too windy or someone walks too close – we only really want our car alarm to go off when someone is actually breaking in (i.e. when there is a real life threatening or serious situation). Guided self help (GSH) can teach us skills to help our alarm system to go off less frequently and help us learn to have less false alarms. 

*Anxiety in children is caused by a range of factors and we don’t really know what accounts for what. The key point is it is no-one’s fault. Things we think from research contribute: temperament/genes (~30%); life events; learning by example; learning from example; coping experiences.

!!Talking about anxiety with parents 

Parents are evolutionarily designed to protect their children – it’s almost like we have to resist these very primal urges which can be really difficult at times (to help normalise reassurance giving from parents)

Parents are expert at supporting their child when they are anxious and helping them feel ok. Sometimes, they are so expert that the child doesn't learn to do it themselves. As children get older they have to do more things by themselves – learn to be more independent.  So we need to think how we can teach him all those things that you’re really good at doing, so he can do them himself when you’re not there
! Breathe With Me

''What is it?''

An animated app designed to teach children and young people diaphragmatic breathing. This breathing technique is known to reduce anxiety and help users control anxious feelings.

''How does it work?''

This simple app works by asking users to select an animal: either a cat, dog or panda. Once selected, users are then shown instructions to prepare for the deep breathing technique. Users are told to sync their breath with the movement of the animation, which shows their chosen animal breathing in and out.

The animation includes pop-up instructions reminding users to breathe from the belly. It also keeps time and tells users when they’ve been breathing for two minutes and for five minutes.
Users also have the option to play or mute music during the animation, and can view the full instructions at anytime if they need reminding of the technique.

''How to access the app?''

Breathe with Me is available via the Breathe with Me website: https://breathewithme.co.uk.
Although it is possible to use the app through a web browser, we recommend downloading to the home screen of your device (tablet, smartphone, etc.) and using as a normal app. Installation instructions are available here.
Please note: Breathe with Me is not currently accessible via the Windows smartphone.

! Grow
''What is it?''

Grow is an app for managing your personal goals, aimed primarily at users aged 12-18 in the CAMHs system.

Users can set themselves goals, either on their own at home or in a session with a clinician, and then rate them (along with a reason for the rating), edit the goals, or delete the goals. Goals can be tracked graphically.

''How does it work?''

Users can currently register to use Grow via Facebook, as it needs a way to store the goals for a specific user. However, Grow stores no identifiable data on users, nor does it draw any data from Facebook. Users can input goals and track them over time by accessing the web-based tool.

''How to access the app?''

You can try out Grow here: https://polar-dawn-55555.herokuapp.com/login
!!! 
!!! Getting to Know You

''What is it?''
A fun and accessible questionnaire for children when first visiting CAMHS (Child and Adolescent Mental Health Services). Designed for tablets.
This questionnaire aims to reduce the anxieties of children (5 – 12 years old) coming to CAMHS for the first time. It offers an alternative questionnaire to the paper based one which is currently used and is not appropriately designed for children.
This questionnaire helps therapists get to know a young person better so that they can more quickly build a healthy and meaningful relationship.

''How does it work?''
The child chooses an avatar (lion, monkey or bear) then goes on to answer a series of interactive questions about themselves.

''How to access the app? ''
The app can be found here: https://welcome-in.herokuapp.com/
!!!''What is it like being helped?'' 
*Difference types of help 
**Practical, emotional etc. 
*Normalising and listening and offering reassurance which helps you feel understood and comforted 
*Unconditional support - how can you create this? 
**Characteristic of a long standing relationship which creates the feeling
**Explicit about what is going on- trust around why is this person helping me, what will happen if I can't change 
*Nice to be thought about without being asked and not being annoyed if you do ask for help
*Positive acceptance and validation 

!!!''Reflections of the helping process''. 
Difficult to ask for help as it may expose vulnerability. The importance of trust when this is the case. 
In ordinary life there is a balance between giving and receiving help- how do we balance this in daily life and also as a EMHP? 
*How can we draw on one's own experience of asking for help and receiving help to develop our work as a EMHP? 

How do we find it asking for help? 
*It varies but can make you feel vulnerable 
*Independence vs. dependence- do you lose control asking for help? 
!!!!!Source:Deb ~McNally and the Manchester Collaborative 

* The assessment is important in determining what support the parent may benefit from. If there is a group available to the parent, then the assessment should be used to consider the parent and child’s suitability for brief individual intervention vs group intervention. 
* If following the assessment, it is deemed that the parent and child would benefit from more intensive support, then the family can be stepped up. 
* The assessment should involve a brief clinical interview with the parent as per CYWP guidelines, with some additional questions (see below). This must include the use of routine outcome measures (ROMS) to ascertain the severity of child behavioural problems. 
 
''Brief Clinical Interview ''

During your assessment, it is recommended that the following information is gathered from parent, and child where appropriate: 

* Detailed description of the problem behaviours, preferably with a recent example i.e. “tell me about the last time they hit, what was happening? What was the trigger? How did you/ other respond?”
* Description of development of the problem. Specifically: 
**“When did the problem/ behaviour start?”
**	“What was going on around that time? (in your family, at home, with the child, for you?)”
**	“Can you think of any significant experiences that may have impacted on the problem behaviour?”
* Parents theory about the problem i.e. “why do you think he has started hitting?”, “what are your thoughts about why this behaviour has started?”
* Details of what strategies they have already tried to manage the behaviour/ how do they respond to the behaviour. (NB: if parent states that they use smacking as a means of discipline, this needs further exploration i.e. is it with force, does it leave a mark, parents beliefs about smacking).
* Their hopes for support, what would they like to change. Here setting SMART goals for the intervention will help keep the focus of intervention and track change over time. 

''*Should parents disclose concerns that raise safeguarding concerns, you must follow your service’s safeguarding procedure as appropriate. ''

''Routine Outcome Measures

''

* The use of routines outcome measures (ROMS) will be important when assessing the needs of parents with children presenting with some behavioural problems. ROMS are also important to evaluate the effectiveness of the intervention for the clinical problem; they are an evaluation tool that can track change over time. 
* It is recommended that this brief intervention is offered to those children where they score within the borderline – subclinical ranges on measures of behavioural difficulties, or where there are clinical problems but no evidence-based parenting group available at the time or in their area. 
* If children are scoring well within the clinical range on these measures and a group intervention is available in their area, then this would be the recommended treatment in line with NICE guidance.
* In addition to ROMS, it is advised that goal based outcomes (GBO) are used track and evaluate progress towards a parent’s goal throughout the intervention. GBOs use a simple scale from 0-10 to capture the change; the outcome is simply the amount of movement along the scale from the start to the end of the intervention. GBOs should be used at every session.
* Session trackers are used to evaluate how the intervention is progressing. They can be used as a collaborative tool to think about ‘how are we doing?’ and consider whether anything needs to change. Session trackers should be used at every session. 
* Additional ROMS (child measures – see below) should be used at time 1 (pre-treatment) and time 2 (post-treatment) at a minimum. 
* It is best practice to use patient/ client report measures; parent and child measures to assess clinical problems and as an evaluation tool. The recommended measures are: 
//''
Child measures - aim is to measure frequency/severity of behavioural concerns''//. 

* The Strengths and Difficulties Questionnaire (SDQ) - Brief behavioural screening questionnaire for 2-17 year olds
* RCADS – 47 Item questionnaire with 6 sub scales: Separation anxiety disorder, Social phobia, Generalized anxiety disorder, Panic disorder, Obsessive compulsive disorder, Major depressive disorder (MDD). Normed for children 7+
* The Eyberg - evaluates parental report of behavioural problems (paid)

//''Parent measures – aim to assess and monitor the presence of parental mental health, primarily depression and anxiety''//

* PHQ-9 – brief self-report screening tool for monitoring and measuring the severity of depression
* GAD-7 – brief self-reported screening tool for monitoring the severity of generalized anxiety disorder (GAD)
* Becks Depression Inventory – screening for depression (paid)
* Parent Stress Index (PSI) – identify parent-child problem areas. Measure of parental stress

''//Session Rating – aim to measure therapeutic relationship/ helpfulness of session//''

* Session Rating Scale (SRS) (Miller, Duncan and Johnson, 2002)
* Outcome Rating Scale (ORS) (Miller and Duncan, 2000)


{{manc}}
[img[books with open book and pen.jpg]]

The core materials relating to conducting an assessment can be found under the [[Helping]] section for this guide.

!!!''The approach of [[Guided Self Help]] may not be the right one for everyone''

As such an assessment session will be conducted before the intervention starts (either by the practitioner or a supervisor - depending on the service). 

!!!Session 0
This session may be called may different things by different services. You may hear it be referred to as a choice appointment or a ''Session 0'' these all mean the same thing. Within this guide it is most frequently referred to as a session 0 this is because it is a 'pre-intervention' session (i.e. it takes place before the intervention starts). Please see [[What is a Session 0]]

!!!Why conduct a Session 0? 
The main reason to conduct a session 0/ assessment session is to check if the approach of [[Guided Self Help]] is the most appropriate type of help for the young person/ family before they start the intervention. 

For more general additional information on conducting assessments please see below in the relevant subtopics:

!!!Overview of Assessments

<<list-links "[tag[Overview of Assessments]]">>

!!!Assessments with Parents

<<list-links "[tag[Assessments with Parents]]">>

!!!Additional Needs Assessment
This area of the guide is still being developed
<<list-links "[tag[Additional Needs Assessment]]">>

!!!Anxiety Assessment
<<list-links "[tag[Anxiety Assessment]]">>


!!!Related topics: 

[[Psychoeducation]]: During an assessment session you may want to include some information on the specific area of concern. 
!!!!!Source: Laura Bowyer

For more information about the Assessment that practitioners may be conducting please see [[Assessment]]

!!!First session
*Even if an assessment has already taken place, might be helpful to have a 'session 0' with CYP to work out what treatment route/goals 

!!!Aims
*Identify situations, emotions, bodily sensations, thoughts and behaviours 
*2 key things: how severe and how much is it impacting on the person.
**How frequently is it happening?
**Rate on a scale of 0-10 (10 being it is taking over my entire life)
*Use assessment to build engagement and alliance with YP (validation and normalising, highlighting strengths, praise)
!!!Multi-informant
*Use different people, measures, observation (in waiting room etc)

!!!''Key starting points''
*Prepare any assessment with a good agenda, setting expectations, and creating a ‘problem list’ so you know what to focus on in the assessment 
*Cover introductions / consent / confidentiality at the beginning 
*Use the assessment as a chance to build rapport and a therapeutic relationship with the YP or family 
*Consider time together and time apart with the YP alone for any assessment 
*Use multiple sources of information; e.g. from YP, observations, ROMS, parents, schools etc.
*Remember to use outcome measures for useful information and to flag up risk concerns 
*Always assess for risk and check low mood, even in cases of anxiety 
*Funnelling questions are important – start with open questions and get more specific as the assessment goes on
*Use the [[‘5 W’s’|https://en.wikipedia.org/wiki/Five_Ws]] as useful prompts to gather information; what, when, why, where, who 
*Consider the onset and development of the problem over time.
!!!''Obtain a detailed description of one example of the problem''  
*Once you have the information from the 5 W’s, focus on a typical, recent example to collect information about a specific situation. Specifically, what thoughts, emotions, physical sensations and behaviours did the YP / parent engage in? The below is a useful diagram to have in mind when in an assessment. Remember to ask about environment and also about the responses / behaviours of others e.g. do mum / dad reassure or enable the YP to avoid anxiety provoking situations?
*Using [[The Hot Cross Bun Technique]]
!!!''Taking a developmental perspective'' 
**We also need to think about developmental stage and what it normal e.g. children aged 2-4 find it more difficult to distinguish between fantasy and reality so anxiety might be related to fantasy, but this might be normal levels of anxiety for age group
!!!''What is the impact of this problem on everyday functioning? ''
**Normal' anxiety versus anxiety 'disorder' in CYP; Try to work out what is normal and when anxiety becomes a disorder
**To do this we need to think about how much distress/impact it has on YP in order to figure out what would be appropriate treatment (e.g. signpost or low intensity treatment) we need to assess the impact that it has on CYP e.g. is it keeping them up every night?
*Don’t forget to check in about coping and the YPs’ / families’ strengths
!!!''Setting realistic goals around improvement not cure ''
*Setting up realistic expectations
*Ask about the YP / Parent’s goals and try to ensure these are SMART (specific, measurable, achievable, realistic, time limited). It is unlikely in an assessment to get goals particularly SMART due to time constraints and the fact you might still need to make decisions about the intervention plan with your supervisor. Aim to get goals SMART in the initial GSH session. 
*Difficulties: 'I don't want to feel anxious' - anxiety is normal and helpful, we don't want to get rid of anxiety completely. How are you going to know if you have achieved a goal like this? Needs to be more measurable. 
*Ask - are there things that you would want to do that you can't do now e.g. to be able to go in lifts
*Summarising and using 0-10 scales 
*Prioritising goals might be useful as not all might be achievable in LI treatment 

!!!Self monitoring
*Monitoring thoughts, feelings and behaviours
*Using faces, rating scales (create your own e.g. inside out - what happens when anger takes over your control centre?) 
!!!Identifying negative thoughts
*Being a thought detective/using thought diaries etc
!!!Identifying behaviours 
*Identifying behaviours or what mum and dad do in these situations 
!!!Making sense of anxiety
*Common child behaviours: escape, safety behaviours, hypervigilant, reassurance-seeking
*Common child cognitions: catastrophising, over-generalisation, personalisation, perception of not being able to cope


!!!''Checking out about the session''
*Aim to leave at least 10 minutes at the end of any assessment to explain about what LI work is and to socialise the YP / family to the intervention and give them a chance to ask questions and obtain feedback on the session. 


!!!!@@Color:red; THIS PAGE IS CURRENTLY BEING WRITTEN AND IS AWAITING REVIEW@@ 

Source: Joe Hickey

The five W's are a good tool to use when exploring with the CYP or their parent/carer the main issue the CYP is facing. Please see below for some examples of questions MHPs may want to use when exploring the main issue the CYP is concerned about.

!!!''WHAT?''

* What is the main problem you want help with?
* What have you been doing more/less of since feeling…..
* What kinds of things have been bothering you?
* What helps?

!!!''WHERE?''

* Where do you feel……?
* Are there places where it’s not as bad?
* Where were you when you last noticed things getting difficult?
* Are there places that you avoid because of….?

!!!''WHEN ''

* When do you feel most…?
* When are things a bit better?
* Are there times of the day/the week that are better/worse?
* When did this first become a problem for you?

!!!''WHO?''

* Is there anyone who makes it better?
* Is there anyone who makes it worst even if they don’t mean to?
* How does mum/dad/sister help?
* Are there people you turn to when you’re…?

!!!''WHY?''

* What do you worry might happen?
* What’s the worst case fear for you?
* When you feel…does that mean something to you at the time?
* What the worst thing about ….?


!!Links with other pages:

for more information on how to conduct assessments please go to [[How to Conduct Assessments]]

Please go to [[Assessment]] for a list of relevant pages 










!!!!!Source: CWP Audit Report for London and the South East 2018. Main author:  Deepa Mavji

During 2017-18, a comprehensive audit was carried out on the first cohort of the CWP programme in London and the South East. This included information from 15 sites across London with approximately 1500 cases included in the audit. 

The full report can be found in a folder in googledocs using the link below.  

<<link-pdf "Full CWP Audit Report 2017-18" "https://drive.google.com/drive/u/1/folders/1HjAQ4SLc-esh1MIOBts4_OCTOZbZ38eE">>

Specific details from the audit are shown in different parts of the guide in order to link the information form the audit to the material in the guide. 

These pages are listed below. 

[[Access to CWP services: London Audit 2018]]



Source: Georgia Pavlopoulou, The National Autistic Society, Autism Education Trust 

For more information on what ASD is and videos please go to [[Autistic Spectrum Disorder (ASD)]]

!!Overview
Those with ASD are often still misunderstood, which can have emotional consequences for both the person with ASD and their family. For many young people with ASD anxiety infiltrates their daily life, which can have a big impact on their social life as well as their learning. 
As practitioners it is important that you understand the link between ASD and mental health problems, and the impact this can have on a CYP, their family and their education.


!!!Impact of social environment and welbeing
The ''‘problems of living’'' people on the autism spectrum have in navigating a social world that was not designed for their needs. The lack of opportunities, coupled with the social stigma of being seen as autistic can impact massively on a person with autism's mental well being.
Dr Damian Milton explains this in more detail along with defining autism, in the article 'So what exactly is autism?' Please see below for the full document:
<<link-pdf "'So what exactly is Autism?'" "http://www.aettraininghubs.org.uk/wp-content/uploads/2012/08/1_So-what-exactly-is-autism.pdf">>


!!Mental health
A vast amount of literature on autism would suggest that autistic people are in some way predisposed to mental health difficulties including anxiety and depression.


!!!Suicidal ideation
A small body of research is showing worryingly high rates of suicidality in people with autism. The risk factors for suicide in people with autism can be very different to those in the general population, and thus require tailored prevention strategies. For example, substantially more adults with Asperger's syndrome experienced suicidal ideation (66%) than were depressed (32%), indicating a different route to suicidality than in the general population. Suicidality in people with autism remains poorly understood, and under-researched and studies have failed to explore risk or protective factors. Please see below for an interview with Dr Sarah Cassidy about autism and suicide:

<<link-pdf "Interview with Dr Sarah Cassidy" "https://network.autism.org.uk/knowledge/insight-opinion/interview-dr-sarah-cassidy-autism-and-suicide">>

!!!The family

Levels of stress experienced by families of autistic children are widely reported as higher. A study by Galpin et al. (2018), sought to establish families' support needs from their own perspectives. Please see below for a link to the abstract of this study (Full study not freely available)

<<link-pdf "'''The dots just don't join up'''" "https://doi.org/10.1177/1362361316687989">>

People with supportive family and good social experiences and relationships generally have better mental and physical health than those who lack these networks. Please follow the link for research by Dr Georgia Pavlopoulou and Dr Dagmara Dimitriou on the role of and effect that siblings can have on people with autism: 

<<link-pdf "Research with siblings" 
"https://network.autism.org.uk/good-practice/evidence-base/strengths-based-approach-autism-research-siblings">>

An existential view of well-being, away from a deficit focus might help us understand further the needs of family members when they interact with healthcare and educational specialists. This is in line with siblings' stories who are often ahead of the game showing resilience, understanding and acceptance.  Research by Dr Georgia Pavlopoulou and Dr Dagmara Dimitriou on Sisters’ accounts of growing up with autistic siblings. Please see below for a link to the abstract of this study (Full study not freely available)

<<link-pdf "‘I don't live with autism; I live with my sister’" 
"https://www.sciencedirect.com/science/article/abs/pii/S0891422219300253?dgcid=author">>
 
!!Impact on learning
Please go to [[Autistic Spectrum Disorder (ASD)]] for more information on how learning is impacted by ASD 

!!!Well being and learning
The article below is by Dr Smith and looks at emotional well being and learning, before outlining some approaches used to improve emotional well being in young autistic people. 

''Key points:''

* For young people with autism their emotional state often captures the essence of the day. 
* A student who is confused, scared and anxious cannot focus on the teacher’s tasks or their own learning.
* They can’t often clearly articulate their emotional predicament, and may communicate their discomfort in different ways such as hitting out, screaming, avoiding situations, running away or closing down
 Please follow the link below for the full article:

<<link-pdf "Emotional wellbeing and Mental Health in Young People with ASD" 
"https://network.autism.org.uk/sites/default/files/ckfinder/files/Emotional%20wellbeing%20and%20Mental%20Health%20in%20Young%20People%20with%20ASD%20FINAL.pdf">> 


!!Practice Points: Helpful links
Please follow the link below to go to the National Autistic Society's You Need To know campaign highlighting the mental health commonalities for those with ASD and how services can better help those with ASD and poor mental health. This resource may be a good resource to share with teachers and parents: https://www.autism.org.uk/get-involved/campaign/successes/you-need-to-know.aspx


''Working with CYP:''
It is important to consider that social and emotional implications of having ASD and how this may effect your work with the CYP.

<a class="tc-float-right">[img width= 100 [brain.jpg]]</a>


Source: Georgia Pavlopoulou, The National Autistic Society, Autism Education Trust 

---
As practitioners it is important that you understand the impact that ASD can have on a persons mental health. For more information on Mental health in young people with ASD please go to:  [[Autism Spectrum Disorder (ASD) and Mental health]]

---

!!What is ASD?

ASD is a lifelong, developmental disability that affects how a person communicates with and relates to other people, and how they experience the world around them.
It is often diagnosed by a multi-disciplinary diagnostic team, often including a speech and language therapist, paediatrician, psychiatrist and/or psychologist.

There are approximately 700,000 autistic adults and children in the UK, however those with ASD are often still misunderstood, this can have emotional consequences for both the person with ASD and their family. 

'So what exactly is Autism?' is a document written by autistic academic Dr Damian Milton covering key areas, including: correct terminology, the triad of impairments, theories surrounding functioning, sensory overload, Mental health. Please see below for the full document:

<<link-pdf "'So what exactly is autism?'" "http://www.aettraininghubs.org.uk/wp-content/uploads/2012/08/1_So-what-exactly-is-autism.pdf">>

!!Gender differences
Originally it was thought that only males could have autism. Now however it is known that both males and females can have autism. Still, it is more likely for boys to be diagnosed over girls, with many girls who are diagnosed not getting a diagnosis until much later in life. 

This is because autism ''presents differently'' in males and females often boys might be overactive or appear to misbehave. Whereas girls more often seem anxious or depressed. Furthermore, women are more likely to 'camouflage' (any effort made to mask an autism feature/ behaviour). Camouflaging is emotionally, physically and mentally draining.

Please see below for the full article by by Francine Russco on 'camouflaging' and autism in women

<<link-pdf "'The costs of camouflaging autism'" "https://www.spectrumnews.org/features/deep-dive/costs-camouflaging-autism/">>

!!Learning:

It is estimated that 44% - 52% of autistic people may have a learning disability, although research concerning the exact numbers is varied depending on methods used. Around a third of people with a learning disability may also be autistic. (NAS, 2019). Please follow the link for more information on [[SEND|The SEND Framework]] 

!!!Sleep effecting learning

Autistic people struggle to fall asleep and stay asleep during the night at higher rate than their typically developing peers, ranging from 40% to 80% affecting memory, language, social skills, physical and mental health. For the full article please see Devnani, P. A., & Hegde, A. U. (2015) via the link provided: 

<<link-pdf "Autism and sleep disorders" "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4770638">>

!!!Interests and learning

Research carried out by Rebecca Wood (2019):

Intense or “special” interests with a tendency to focus in depth to the exclusion of other inputs, is associated with autism.

Despite some drawbacks and negative associations with unwanted repetition, this disposition is linked to a range of educational and longer-term benefits for autistic children. It may enhance curriculum access and learning, including their participation in classroom activities, independence and ability to gain intrinsic enjoyment from activities.

For the full article please visit:

<<link-pdf "Autism, intense interests and support in school" "https://www.tandfonline.com/eprint/9BS2x7p77frBWiHZ8fdd/full?target=10.1080%2F00131911.2019.1566213&">>

!!!Schools based interventions
For more information on schools based interventions for CYP with Autism please go to the link provided:

<<link-pdf "School-Based, Educational Interventions and Autism" "http://www.researchautism.net/autism-interventions/types/educational-interventions/school-based-interventions">>

!!!Working with families:
If you need to explain what autism is to a child, young person or parent, the following link provides reliable and authoritative sources of accessible information about ASD.  

Useful information on broaching the subject of ASD can be found [[here|https://www.autism.org.uk/about/what-is/broaching.aspx]]

!!!Working with CYP:
It is important to consider that social and emotional implications of having ASD and how this may effect your work with the CYP. Please go to [[Autism Spectrum Disorder (ASD) and Mental health]] for more information 

''The National Autistic Society'' has some really useful information/ videos on what ASD is and how it can feel to have ASD [[here|https://www.autism.org.uk/about.aspx]]


!!!Working in schools:
Children, teenagers and young people with autism need additional help and support with education. Some will need highly-specialised education, others will follow a more mainstream path. This section of The National Autistic Society website provides advice about school life such as getting extra help in school, dealing with school refusal and exclusion, bullying, and coping with exams. You may want to refer school leads or families to this [[resource|https://www.autism.org.uk/about/in-education.aspx]]


!!Videos

Please see below for a quick [[cartoon explaining ASD|https://www.youtube.com/watch?v=RbwRrVw-CRo]] in a simple but effect way. This video could be used to help those that you are working with such as parents, teachers, other students in the school and the CYP you are working with get a better understanding of ASD.



!!!Diagnosis
These films have been made by young people on the autism spectrum who wanted to share their experiences of receiving a diagnosis with other young people who may be going through the diagnostic process. They know that receiving a diagnosis of autism can be difficult and confusing at any age and for this reason wanted to offer some help and support to young people and their families. Please find the videos [[here|https://www.autismeducationtrust.org.uk/receiving-and-understanding-a-diagnosis/]]

!!!Sensory processing
The clip below has been produced from the National Autistic Society and was part of their 'Too much information' (TMI) campaign. This is a really helpful perspective on what it may feel like for a young person who has ASD:

*[[Make it Stop|https://www.youtube.com/watch?v=xHHwZJX67-M&t=1s]]

*[[TMI: virtual reality|https://www.youtube.com/watch?v=Lr4_dOorquQ]]

!!!Gender differences
An interesting video, from a group of women talking about the misconceptions and issues relating to [[women who have ASD|https://www.youtube.com/watch?v=NwEH9Ui4HV8]]


!!Links to other pages:

Information about special educational needs can be found  in [[The SEND Framework]]



The BAME Inclusion group was started by the wonderful Sarah Thompson and Shayo Bryan-Fenelon, and through conversations with Sarah, I became involved as an honorary contributor to this amazing cause. 
I was asked to write a reflection on the work we’ve been doing so far, and I should preface this reflection by saying I am no great speech writer, I am just a person who believes passionately in the cause that we are working towards; fair and equal access to low intensity CBT for all, which is meaningfully adapted to acknowledge and celebrate all cultures, and provide the best possible outcomes for the clients we work with.

I am a white middle class British male, with seemingly no obvious personal connection to the root of the BAME inclusion cause; white middle class British people are exactly who the manuals were written for.
For me however, it seemed that it should not be fair that the interventions we offer only cater to one specific and small section of the population, rather it should aim to improve outcomes for as much of the population as possible. 

Just as a quick background to me, I was born and raised in Kent to a middle class family, as the eldest of five. I was privately educated through most of primary school, before attending the local grammar school. I coasted through most of my secondary years, before failing my A-Levels. From there I went on to study childcare at levels 2 and 3 at a local college, and then completed my undergrad at a local university, whilst working as a nursery teacher.
I consider myself lucky that I have had some incredible people shape my thinking over my education, from that one fantastic Early Years teacher who taught me to question the status quo, to the psychology lecturer who talked about improving access to psychological therapies for all. They inspired me to become an agent of change, to stand up for equality and to challenge those who don’t. 

I have done my best to educate myself in the topic of systematic inequality, with the hope of learning from the mistakes of others before me. I have had to sit with feelings of discomfort and disgust, because I believe it is important to not “brush them under the carpet”, but to expose them and label them for what they were.   
It is easy to maintain the status quo unintentionally, by not standing up and by turning a blind eye, but nothing that was ever worth fighting for was easy.

I am incredibly lucky and excited to have been included in this inclusion group, and I urge as many people to become involved with this project, in any capacity that you feel able to! I believe we have a moral obligation and duty to make sure all are treated with the respect that they deserve.

It almost seems strange to me if people should question my involvement to an extent, as in my mind, of course I would! I may not experience the difficulties and hardships that others have to deal with on a daily basis, but that does not mean that I do not want to help! To change systems, and to bring about true equality that is considerate of the individual and their unique circumstances is my ultimate aim.

Please see the links below for incredibly useful articles regarding the coronavirus pandemic. these have all been taken from the 'support' section of [[BBC Bitesize|https://www.bbc.co.uk/bitesize/support]]

''Exam essentials: Studying for success''

https://www.bbc.co.uk/bitesize/articles/zb7j382

''Go The Distance: Study Skills''

https://www.bbc.co.uk/learningenglish/gothedistance/studyskills

''Nine nifty ways to study remotely''

https://www.bbc.co.uk/bitesize/articles/z77svk7

''Eight ways to support your anxious child during the coronavirus pandemic''

https://www.bbc.co.uk/bitesize/articles/z6ksy9q

''Six ways to cope with lockdown loss''
https://www.bbc.co.uk/bitesize/articles/z7xyvk7 - Ros Law writing for young people, 

''Six ways to help your child come to terms with lockdown loss''
https://www.bbc.co.uk/bitesize/articles/znxyvk7 - Sheila Redfern writing for parents and carers 

''Eight ways to support your anxious child during the coronavirus pandemic''

https://www.bbc.co.uk/bitesize/articles/z6ksy9q - Vicki Curry writing for parents and carers 

''Five ways to manage your wellbeing as a parent during lockdown''

https://www.bbc.co.uk/bitesize/articles/zrmhscw - Peter Fuggle and Yvonne Millar writing for parents and carers.
!!!Barriers to digital
*Fear of digital 
*Lack of funding
*Fear of change 
*Lack of evidence 

!!!Optimising the use of digital 
*By starting with the end in mind: 
**What's the problem?
**Who will it benefit?
**Where in the journey is the optimal place to use tech?
**Map interventions using behaviour change models
**Understand the context of the user to the appropriate tech
**Can you connect your local services into the  online tech offer?

!!!When using technology need to consider: 
*Tone of voice
*Addressing digital exclusion
*Sensory requirements
*Systems adoption
*Undermining stigma
*insight and trust/empathy
This translated version of the Parenting intervention has been generously shared with us by the Tower Hamlets CAMHS service. 
 


<<link-doc "Parent Behaviour Intervention in Bengali/Sylheti" "https://drive.google.com/drive/folders/1oSJ1x0kXQp9AWRhgDs_i7Csl07j6CD9j?usp=sharing">>
[img[blue pattern.jpg]]

!!''Behaviour problems in this guide''
All pages in this guide relate to behaviour problems for children under 11 years of age. The intervention for behaviour problems is parent led. Core materials relating to this intervention can be found via the [[Helping]] page.

!!!This area of the guide is divided into four key areas as listed below:

!!![[Behaviour Problems Overview]]

!!![[Behaviour Problems Practice]]

!!![[Behaviour Problems Session Material]]

!!![[Alternative Session Plans for Behaviour Problems]]

!!![[Behaviour Problems Research]]

!!!!!Source: Caroline Bengo, Matt Woolgar, Sara Dawson and Jelena Crnokrak 
---
!!'''Guided Self Help for Behaviour Problems''' 

The brief guided self help for behaviour problems follows the guidance in the guided self-help for behaviour problems manual. Written by Caroline Bengo and her team and generously shared with the other CYP-IAPT Training Collaboratives 

<<link-doc "Guided Self-Help for Common Behaviour Problems" "https://drive.google.com/file/d/1Bfh_KdCBjsBMnrJH_-o-dRbsjNMUV3OM/view?usp=sharing">>
 
@@font-size:12px;
<<< <<link-doc "The Previous version of Guided Self-Help for Common Behaviour Problems can be found here" "https://drive.google.com/file/d/1vBNYY-hZtqIKHZucyZmbxZmfjTvYYoRZ/view?usp=sharing">>
@@

ALL behaviour problems handouts: 

<<link-doc "Behaviour Manual ALL handouts word version" "https://drive.google.com/file/d/1DdoY9H4Hpvp6nlKIPRSBckbTYpMx5Ld7/view?usp=sharing">>

For translations of these materials please see page: [[Translation of Original Materials]]

__Sharing handouts with young people and parents during remote working__

For further adaptions made to the manual in light of COVID-19 and the changes to working please see page:
[[Behaviour problems manual: COVID-19 adaptions]]

The authors of the behaviour problems, low mood and adolescent anxiety manuals/handouts have given practitioners permission to create a Word version of the handouts for ease of sharing when remote working with young people and parents should you wish to do so.


PLEASE NOTE: The manuals/handouts are covered by Creative Commons copyright.  

Copyright: Available under License Creative Commons Attribution No Derivatives
See further: https://creativecommons.org/licenses/by-nd/3.0/

In addition, they are designed to fit with the evidence base for working with these interventions.  

For these reasons, the content of the manuals/handouts should not be amended by practitioners, but young people/parents/carers can fill them in as part of the intervention as they would a paper copy.

---


!!''Introduction''
Parenting programmes delivered in a structured manner over several weeks are the most widely researched psychological intervention in child and adolescent mental health. They are the single most effective intervention for the treatment of conduct problems in children.

!!''Sessions overview''
The brief guided self-help parenting intervention is divided into two broad areas that can be covered over seven (or more) sessions. These have been divided into parenting approaches that:

#To promote positive relationships, attachment and pro-social behaviour through sensitive responding
#To provide appropriate routines, boundaries and limit setting

For more information about the sessions please go to: [[Session Overview for Behaviour Problems]]

!!''Session Plans''
 For a list of the session plans: [[Session Plans for Behaviour Problems]]

!!Related pages:

[[What is a Behaviour Problem?]]
Below is a list of pages giving an overview of the approach for helping parents who have children with behaviour problems:

<<list-links "[tag[Behaviour Problems Overview]]">>
<<list-links "[tag[Behaviour Problems Practice]]">>
Below is a list of research relating to behaviour problems:

<<list-links "[tag[Behaviour Problems Research]]">>
Below is a list of the Materials that practitioners will use in their work with parents of children with behaviour problems.

<<list-links "[tag[Behaviour Problems Session Material]]">>

!!''Behaviour problems in this guide''
All pages in this guide relate to behaviour problems for children under 11 years of age can be found in [[Behaviour Problems]]. 

!!''Useful resources''
Dispatches programme on [[Challenging Children|https://www.youtube.com/watch?v=RlMAYaYRDJE]]


Description of [[behaviour problems in Hindi|https://www.youtube.com/watch?v=Wvii7HUY_GE]]


An interesting discussion of the [[nature of challenging behaviour|https://www.youtube.com/watch?v=zuoPZkFcLVs]]


NHS information on [[behaviour problems in young children|https://www.nhs.uk/conditions/pregnancy-and-baby/dealing-with-difficult-behaviour/]]

Royal College of Psychiatry [[guidance on behaviour problems|https://www.rcpsych.ac.uk/healthadvice/parentsandyoungpeople/parentscarers/behaviouralproblems.aspx]]
Please see below for the adapted behaviour problems manual in response to the current circumstances caused by COVID-19. This manual was Compiled and edited by the KCL CYP-IAPT team: Helen Barker, Zoe Maiden, Laura Bowyer, Sarah Carman, Victoria Pile, Susanna Payne; and the UCL CYP-IAPT team: Vicki Curry With information from: Caroline Stokes (KCL); Alice Kerr & Emma Warnock-Parkes, (Centre for Anxiety Disorders And Trauma/KCL); Lisa Shostak (KCL); Ali Lambie, (Mindfulness Hampshire); Jynna Yarrum and Alysia James, (University of Northampton). Young people’s perspective from: Lila and Remy Moar

---

<<link-pdf "Behaviour Problems manual: COVID-19 adaptations" "https://drive.google.com/file/d/1FYj3k_2JmBuclnMAkb_wWM4X8FWzLU-E/view?usp=sharing">>


ALL behaviour problems handouts: 

<<link-doc "Behaviour Manual ALL handouts word version" "https://drive.google.com/file/d/1DdoY9H4Hpvp6nlKIPRSBckbTYpMx5Ld7/view?usp=sharing">>

----

Sharing handouts with young people and parents during remote working

The authors of the behaviour problems, low mood and adolescent anxiety manuals/handouts have given practitioners permission to create a Word version of the handouts for ease of sharing when remote working with young people and parents should you wish to do so.

PLEASE NOTE: The manuals/handouts are covered by Creative Commons copyright.  

Copyright: Available under License Creative Commons Attribution No Derivatives
See further: https://creativecommons.org/licenses/by-nd/3.0/

In addition, they are designed to fit with the evidence base for working with these interventions.  

For these reasons, the content of the manuals/handouts should not be amended by practitioners, but young people/parents/carers can fill them in as part of the intervention as they would a paper copy.
!!!!Source:Laura Bowyer 
!!''Key points''
*Anxiety is maintained when someone avoids experiencing the anxiety by either escaping the situation in some way or avoiding it all together 
*Over time a reduction of anxiety becomes associated with avoidance 
*The YP never learns what will happen to their anxiety should they remain in that situation and don’t learn what might happen and how they might cope
*Main intervention (after psychoeducation) is to create a hierarchy and face a YP’s fears in a step by step fashion and wait for them to habituate to their anxiety (exposure)
*Exposure means facing fears until anxiety naturally reduces and subsides
*The YP should remain in the feared situation until their anxiety has come down by half 
*They should repeat each step of their hierarchy or ‘fear ladder’ until the anxiety has reduced 
*Exposure is best done in a graded manner, from the least difficult to the most difficult situation (use the fear thermometer for this)
*It needs to be repeated multiple times, until the anxious response is no longer elicited (or is weak)
*And it needs to be prolonged enough for the anxiety to reduce on each occasion
!!''Supporting children and parents to practice'' 
*You should be rating anxiety levels throughout the exposure 
*Encourage positive behaviours and coping with contingency management / use of rewards
*Practice new behaviours in session if possible to increase confidence in parent’s ability or the YP’s ability to do this for homework. You can role play with parents
*For the CWP, it requires a mixture of kindness and confidence. In general, starting slowly is best but not so slowly the CWP worker becomes avoidant of the problem too. 
*Reward effort, not just success 
!!''Supporting coping''
*Another behavioural intervention is to increase coping behaviours e.g. relaxation, but note these should only be done outside of planned exposure work. I.e. do not do relaxation when a YP is facing a fear on their ladder as this will prevent them habituating naturally to their anxiety and this also teaches them subtly that they need to do something to their anxiety to manage it. When outside of planned exposure, a YP can of course use coping strategies to help manage their anxiety. 
!!!''Source of this material''
The material in this section is drawn from the work of C.W. Lejuez,  Derek R. Hopko, Ron Acierno, Stacey B. Daughters, Terry L. Pagoto and the treatment manual for Brief Behavioral Activation Treatment for Depression (BATD): Revised Treatment Manual (BATD-R). This is an evidence based approach for adults with depression with indications of effectiveness with young people. 

<<link-pdf "BA Paper from Reading" "http://centaur.reading.ac.uk/64457/1/Pass%20Whitney%20Reynolds%202016%20Brief%20BA%20complexity%20Accepted%20manuscript.pdf">>
!!!''Introduction''
*The basic rationale of behavioural activation is quite simple. The assumption is that when a person experiences persistent low mood, it is very easy for positive life experiences (such as friendships and enjoyable activities) to become neglected and even avoided. 
*This absence of positive experience creates a vicious cycle of supporting the low mood. The approach of behavioural activation is to try to reverse this vicious cycle. 
*The application of this approach presents common difficulties for the practitioner as it is easy for the young person to experience this approach as critical of themselves or that it mimics negative patterns of interaction between the young person and their parents. 
!!!''Basic Rationale''
*Improvement in mood is more likely if each day includes some enjoyable or valued  activities that help a person feel valued and provides a sense of purpose.
*The approach invites the client to identify the areas of his/her life where either this used to happen or where it could be anticipated now and to consider how to reconnect with these. 
*The young person is then encouraged to identify and plan daily activities that help him/her to do things that they value and enjoy. 
*This is important because when a young person does positive and enjoyable experiences this is likely to improve how they feel and think about their life. 
*It is difficult to feel depressed and hopeless when regularly doing activities that are valuable and worthwhile and that bring a sense of pleasure and accomplishment. 
*In this way the approach focuses on changing behaviour as a way of improving mood. 
!!!''Motivation and cognitions'' 
*Many young people with low mood often feel tired and lack the motivation to do various activities; thinking that once they have more energy and think more positively, they will be able to do the activities they have ignored or have been unable to accomplish in the past. 
*The opposite approach is taken in this approach – behavior is changed first as a way to increase energy and motivation, as well as positive thinking and feelings. 
*The focus on behavior change, however, does not mean that  thoughts and feelings are ignored. Instead, we suggest that negative thoughts and feelings will change only after you change your behavior and are having more positive life experiences. 
*Healthy behavior is defined as behavior that is directed towards improving your quality of life, and is directed towards the attainment of the values you have in your life. In contrast with healthy behavior, unhealthy (depressed) behavior generally is not directly related to improvements in the quality of your life and does not move you closer to living according to your values.
!!!''Activity and low mood''
*It is possible to be active, yet still be depressed. This can happen if a person feels overwhelmed with activities that are unfulfilling or forced by others. For example, although you may be busy at work and home, these activities may be focused only on helping others. 
*Although it certainly is important to help others, it is never a good idea to focus so much on others that your own needs and feelings are completely neglected. 
*Focusing entirely on the needs of others may result in feelings of emptiness and dissatisfaction, followed by confusion and guilt for having such feelings. Thus, it is not only important to have many activities in life, but specifically to have activities that bring you some degree of pleasure and fulfilment.
!!!''Key steps in behavioural activation'' 
The method of behavioural activation has a number of common steps. 
#[[Diary keeping and daily monitoring of activity]] 
#[[Activity planning]]
#[[Reviewing life activities and interests]] 
#[[Learning about the impact of behaviour on mood]]
#[[Building a back up team]] 


!!!Learning objectives for the session
#Reflective- thinking about own practice in terms of safeguarding issues 
# Understand safeguarding responsibilities and roles 
#Understand how we assess and formulate risk in relation to children 
# Process around escalating and getting help
!!!CWP Core competencies covered by this session
*Use of outcome measures 
*Accountability and evidence-based principle of IAPT
!!!Slides for session
*These can be found via the following link:
!!!Main content of the session - where to find relevant pages in the wiki guide 
*[[Being a safe Practitioner]]
*[[Outcome monitoring]]
*[[Guided Self Help]]
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/k96-DISPP88" frameborder="0" allowfullscreen></html>
!!!References for session
*London Safeguarding Guide 
*Cognitive-Behavioural Therapy for Child Anxiety Confers Long-Term Protection from Suicidality 
*Child Outcomes Research Consortium (CORC) for full list of measures 
*Is it time for clinicians to routinely track patient outcome? A meta-analysis 
*Effects of routine feedback to clinicians on mental health outcomes of youths: a randomised trial 
!!!Feedback from session - points to improve
*Thought Creswell lecture was going to be about book rather than research behind it 
*Hard to concentrate all day in lectures (not relevant today, but highlighted how the variety helped)
*Afternoons more interactive or practical sessions 
*Feedback or question box in sessions so people don't have to speak out in lectures 
*Demo different ways of giving feedback i.e. post-in notes 
*More visual presentations, suggestion of showing a session in the beginning and the end of treatment 
*Whole day on the same topic i.e. justifying what we are doing with evidence. Suggestion to break up the content 
*Lecture slides given further in advance 
!!!Feedback from session - positives from the day
*Three different lectures, kept people interested due to variety 
*Useful to know why we are doing what we are doing i.e. justification around ROMs and GPD-CBT
*Case vignettes during safeguarding to think in practice how its going to work 
*Video useful to look and see if something is working i.e. the parental anxiety effects 
*Lots of links to extra readings students can look at later 
!!!Specific issues 







!!! What are breathing techniques and why should I use them?
Although we all breathe every day, it can sometimes be helpful to actually focus on this exercise to reduce our experiences of [[Stress]] or [[Anxiety]]. This is because when we feel this ways, we tend to breathe faster and more shallow, which is related to the [[Fight or Flight]] response. 

However, breathing techniques don't only have to be used when we feel stressed, worried or anxious. It can greatly improve our mental well-being to practice these techniques regularly. An added benefit of this is that you will be well practiced at using them faster, and more able to call upon them when your emotions are heightened. 

{{inhale-exhale.jpg}}

!!! A simple to use breathing technique:
* Let your breath flow as deep down into your belly as is comfortable, without forcing it. 
* Try breathing in through your nose and out through your mouth. 
* Breathe in gently and regularly. Some people find it helpful to count steadily from one to five. You may not be able to reach five at first. 
* Then, without pausing or holding your breath, let it flow out gently, counting from one to five again, if you find this helpful. 
* Keep doing this for three to five minutes. 
(sourced from nhs.co.uk)

!!! Guided breathing techniques
It can also help to follow guided breathing exercises such as this one: https://breathewithme.co.uk 

*Mindful of the CBT model but focuses on the target of behaviour change (which can impact cognitions)  
*Evidence that BA is not inferior to CBT and behavioural components are just as effective as cognitive 
*Thinking about doing rather than thinking and thinking might be easier for young people 
*Hardly any evidence for BA and a gap in the research of adolescent depression
!!!~ROMs 
*Benefit clinically for an understanding of the young person from parent and clinician
*Added question specifically about suicide - good to pick up risk. If not on questionnaire then discuss at beginning of session. 
*BA ~ROMs (RCADS, ORS, SRS) 
*Same principles apply with other measures used e.g. SFQ and SRS, ORS or GBO
!!!Brief BA 
* 8 session treatment
* the start the BA is about understanding yourself and what you are doing with your time so its important to get this understanding soon so that behaviour change can happen 
*Clinical review one month after sessions to see how they have got on on their own 
*Structured parental involvement in sessions (marked with a P) and this is formalised with a contract in session 6 
*Values based activities are reinforcing 
*No evidence behind the order of things so flexible in terms of what an activity is introduced to young person 
*Arranged phone calls with parents if working in schools
The goal-based outcome (GBO) tool guidance notes (2019) written by Duncan Law can be downloaded here

<<link-doc "Goals and goal based outcomes" "https://goalsintherapycom.files.wordpress.com/2019/02/gbo-version-2.0-guide-final-1st-feb-2019.pdf">>

Please also see the website [[Goals in Therapy|https://goals-in-therapy.com/2018/12/07/guidance-notes-for-using-the-goal-based-outcome-gbo-tool/]] for more guidance on goals and the GBO
!!!!Source: Joe Hickey

For information on what a therapeutic alliance is please go [[here.|Therapeutic Alliance]]

!!How to build a therapeutic alliance?

*Fit the intervention to the CYP, don’t make them fit in with the intervention
*Explore previous experiences of helping relationships
*Build and maintain the necessary alliances within the child’s systems (Parents/carers, teachers, TAs, etc.)
* Constantly reflect on whether the relationship alliance is good – use your supervisors, use colleagues etc.
*Ordinary/casual way of chatting can be helpful to build relationship (just like any other conversation that the YP would have had)

__Establish the bond with CYP__

*Use reflecting statements and other [[Active Listening]] techniques (OARS) -Reflect back on how the client feels when they talk to other people, in regards to the young person talking to you. 
*Use collaborative language (we, us, let’s) creates a sense of being in this together
*Track and validate feelings

__Collaborate on goals and tasks__

*Work with CYP and parents/carers to achieve mutually agreed-upon treatment goals and tasks

__Provide a treatment rationale__

*Link tasks to wider aims and goals

__Consider readiness for change__

*Transtheoretical model of change and motivational interviewing techniques
*Work within the CYP’s developmental level

!!What factors promote or hinder?
Practitioner-parent/carer alliance associated with CYP outcomes just as strongly as practitioner-CYP alliance.
For CYP work, you are always creating multiple alliances and they can all influence outcomes. Some factors that effect a therapeutic alliance:

* Discrepancies between CYP and parents
* Low motivation
* Poor expectations about outcome
* Lack of credibility in the help offered
* Alliance ruptures
* Negative previous experiences of help
* Severity of the problem 
* Practitioner factors 
* Timing of the help offered 


!!How do you know if a therapeutic alliance is good?

* Ask for feedback at the end of each session
*Use your supervision and practice tutoring
* Use your colleagues
* Observe the CYP or parent/carer
* Observe yourself
* Ask the CYP or parent/carer

!!What is a rupture?

Impasse or breakdown in the therapeutic relationship due to a disagreement on goals, lack of collaboration or strained bond.

__Spotting a rupture__

* May be characterised by confrontation or withdrawal and will vary in intensity, duration, and frequency
* Misunderstanding of some kind, followed by a marker in speech or behaviour

__Repairing a rupture__

* Investigate, don’t ignore
* Take responsibility for your part in what happened
* Show openness to the CYP’s experience
* Rupture repairs are associated with better therapeutic outcomes 

!!Links with other pages
There are a number of pages around [[Engagement]] which are highly related to this topic. 
!!!!!Source: Roslyn Law
This is a core component of guided self help which has been drawn from Interpersonal Psychotherapy for Adolescents (IPT-A). 
The core idea is to support the young person or parent in identifying key people in their social group who in their view may be able to be helpful to their problems and difficulties. 

More to be written here.



<<list-links "[tag[COVID-19 Resources]]">>
On the 24/07/2018, a total of 1136 clients were registered on POD, of which 958 clients had outcomes data which met the inclusion criteria. 368 of these cases were current and 590 had completed intervention with a CWP. 

The reported results are based on this sample. 

!!Goals Outcomes

Data for GBOs was available for 430 clients at Time 1 and 385 clients at Time 2, creating a percentage completion for Time 2 data of 89.5%.
{{Audit Descriptive Scores_GBO .PNG}} 

{{Audit GBO's graph.PNG}}

The mean GBO score significantly increased from baseline (M= 2.58, SD= 1.79) to discharge (M=7.00, SD=2.35; t (384) =33.65, p<.001, g=2.10, 95% CI [1.88-2.31]).

{{Audit Reliable Change for GBO.PNG}}
On average, 77% of clients showed a reliable improvement in GBO scores between Time 1 and Time 2. Few clients (1%) showed reliable deterioration, and 22% showed no reliable change. 
Data for the RCADS was available for 385 clients at Time 1 and 287 clients at Time 2, therefore the percentage of completion at Time 2 was 74.5%. 

{{audit RCADS graph.JPG}}


{{Audit RCADS_table.PNG}}


The mean total anxiety and depression score significantly declined from baseline (M = 58.46, SD = 13.87) to discharge (M = 48.87, SD = 13.67; t(235) = 11.49, p < .001, g = 0.69, 95% CI [0.56-0.83]).		
Data for the SDQ was available for 227 clients at Time 1 and 155 clients at Time 2, creating a percentage completion for Time 2 data of 68.3%. 

{{Audit SDQ graph.PNG}}
>
{{Audit SDQ Means.PNG}}

Table 1 shows that the mean Total Difficulties score significantly declined from baseline (M = 14.94, SD = 6.27) to post treatment (M = 10.94, SD = 5.82; t(111) = 7.40, p < .001, g = 0.66, 95% CI [0.46-0.85]).	

The mean Total IMPACT score significantly declined from baseline (M = 3.28, SD = 2.49) to post treatment (M = 1.65, SD = 2.05; t(127) = 8.89, p < .001, g = 0.82, 95% CI [0.61-1.02]).

!!''Module 1: Children & Young People’s Mental Health Settings: Context and Values''

Number of credits: 15 credits

!!!''Aims:''
To equip the CYP worker with the necessary knowledge, attitude and competence to operate effectively in an inclusive, values driven service. 

!!!''Content to include:'' 

#CYP services context & principles – local & national 
#Service role of the CYP PWP & overview of roles 
#Multi agency working & navigation (including context of service delivery)
#Legal/professional issues, (incl. legal framework, ethics, confidentiality, capacity/consent, safeguarding etc)
#Overview of CYP MH therapies & evidence base 
#Diversity and Culture, social inclusion 
#Caseload & clinical management, use of supervision, liaison & clinical decision-making. 
#Child, youth and family development and transitions 
#Working with families and systems 
#Service user involvement 
#CYP mental health policy 
#Collaborative practice/working and participation?? 
#Outcomes-informed practice. 

!!!''Teaching and Work Placement Time'' 
To include 12 days teaching (90 hours) plus Service-based learning (including service supervision & observation/shadowing) and private study.

!!!''Module assessment (For guidance only - each HEI may specify individual requirements).'' 

#Portfolio (signed off by service supervisor) 
#Multi choice examination 
#Presentation of service related problem based leaning task in groups with project reflective analysis. 
 
!!''Module 2: Assessment & Engagement'' 

Number of Credits: 15 

!!!''Aims:''
 
#To be able to assess and identify areas of difficulty (including risk) and establish main areas for change. 
#Establish and maintain a working therapeutic alliance & engage the child/young person/family to support them in self-management of recovery # Identify and differentiate between common mental health problems in CYP 
#Navigate & signpost to appropriate interventions 
#Use Routine Outcome measures and standardized assessment tools effectively 

!!!''Content to include:'' 

#Therapeutic relationship skills, ability to engage and communicate across the age range. Developmental stages and background, working with difference. 
#Cultural diversity awareness - cultural competence 
#Engagement of CYP & families. 
#Using creativity to engage children & young people 
#Interviewing & questioning skills 
#Risk assessment, safeguarding & management 
#Common mental health problems in CYP 
#How to use measures, goal-setting & goal based outcomes 
#Knowledge of support interventions & giving evidence based information 
#Pharmacology 

!!!''Teaching and Work Placement Time'' 
12 days teaching (90 hours), service based learning and (including service supervision), and private study. 

!!!''Module assessment (suggested)'' 
#Video assessment of client demonstrating engagement, assessment, information giving and shared decision making 
#1000 word reflective analysis. 
#2,000 word case report 
#Portfolio (signed off by service supervisor) 


!!''Module 3: Evidence based interventions for common mental health problems with children and young people (Theory and Skills)''

Number of credits:30

!!!''Aims: ''
#To acquire knowledge and skills in effective brief (low-intensity) interventions for children, young people and family systems based on the most up to date evidence. 
#To acquire knowledge of a range of interventions (including written and computerised interventions) and services available to CYP & families across CYP agencies 

!!!''Content to include:'' 
#Behaviour change: Theories and models 
#Critical evaluation of the evidence base 
#Functional analysis & formulation of presenting difficulties 
#Goal setting (continued) 
#Collaborative working 
#Guided self-help – content and suitability. Sign-posting: when & how 
#Problem solving 
#Pharmacology – awareness of medication that may be prescribed for CYP for common mental health problems 
#Health promotion 
#Behavioural activation –theoretical principles & application in practice
#Exposure – theoretical principles & application in practice. 
#Working with parents 
#Assisting with Parenting training for conduct problems – social learning theory & application in practice. 
#Therapeutic endings 
#Delivery of interventions for anxiety, depression, conduct and low level regulatory issues via a range of communication methods. 


!!!''Teaching and Work Placement Time'' 
22 days teaching, service based learning and private study 


!!!''Module Assessment (suggested)'' 
#Two video recordings demonstrating skills in planning and implementing a low-intensity treatment: one of behavioural activation for depression and one of either a parenting intervention or a behavioural treatment for anxiety. 
#A 1000 word reflective video analysis 
# 2,000 word case report 
#Service based learning portfolio (signed off by service supervisor 

!!Grad/Postgraduate Certificate in Brief Evidence Based Interventions with Children and Young People with common mental health problems 

Credits: 60 (PG) Level 7 

The course will consist of three modules:  

#Fundamental Skills: Children and Young People’s Mental Health Settings: Context and Values ([[CWP National Curriculum - Module 1]]) (15 credits) 

#Fundamental Skills: Assessment and Engagement ([[CWP National Curriculum - Module 2]]) (15 credits)

#Evidence based interventions (Theory and skills) ([[CWP National Curriculum - Module 3]]) (30 credits) 

Modules 1 and 2 will run in parallel

This national guidance was drafted in 2017 by the CWP national curriculum group.  
Notes from National CWP Implementation Group and discussion across collaboratives can be found at:


https://3.basecamp.com/3393815/projects/5736629
* Barnet
* Brent
* Bromley Y
* Camden
* Croydon
* Hammersmith and Fulham
* Haringey
* Hertfordshire
* Hillingdon
* Hounslow
* Islington
* Kingston
* Lambeth
* Lewisham
* Norfolk
* Suffolk
* Surrey
* Sutton
* Tower Hamlets
* Westminster
''CWP Service Satisfaction ''

''Experience of Service Questionnaire (ESQ)''

257 young people completed the self-rated ESQ on POD.  

Most items on the ESQ were rated ‘certainly true’, majority of young people reported they felt ‘treated well’ (99%), listened to’ (95%) and ‘had received good help’ (94%), with the ‘comfortable facilities’ item scoring the lowest (63%). 

{{ESQ Young person reported responses.PNG}}

170 parents completed the self-rated ESQ on POD.  

Most items on the ESQ were also rated ‘certainly true’, majority of parents reported they felt they ‘had received good help’ (98%), were ‘treated well’ (98%), ‘listened to’ (97%) and found it ‘easy to talk’ (97%), with ‘comfortable location’ (84%) and ‘convenient appointment’ items rated the lowest (84%).  

{{ESQ parent reported responses.PNG}}


''Session Feedback Questionnaire (SFQ) ''

The SFQ was completed a total of 2922 times on POD. 

96% (n=2812) of sessions were rated the top 25% of the satisfaction scale or above (>16). 

''Session Rating Scale (SRS)  ''

The SRS was completed a total of 345 times on POD. 

78% (n=269) of sessions were rated the top 25% of the satisfaction scale or above (>36).

This section of the wiki contains all of the core information that sites need to know. A list of pages within this section are listed.

<<list-links "[tag[Site Information]]">>

[img[redd-book.jpg]]

<<list-links "[!is[system]!is[image]sort[]]">>




Each partnership will be invited to develop their own CWP pathway with the expectation that the supervisor will have a key role in selecting cases, particularly at the beginning of the training. 

*Overall, the local care pathway is the responsibility of the local steering group, supervisors and local commissioners. The role of the HEI is to train the staff who will be implementing this pathway. 
*Selection of cases is likely to fall into one of two options: 
**Develop a selection criteria which includes some indication of severity but also includes some recognition of the family context and help seeking stance. 
**All new cases to a service are offered CWP in the first instance as first level of help. 
* A key issue is that local services need to identify the young people who ''will not'' be served by the new service of guided self help. What cases will not be suitable for guided self help? Important to recognise that CWP service cannot take all cases not accepted by CAMHS Tier 3.  
*Signposting may be an important part of the pathway.  
!!!!Source: Peter Fuggle 
!!''Introduction''
This guide is being continuously updated and developed. This means that some pages are not finished or are incomplete. This is because we believe that this should be an open system with on-going improvements in the material. Some pages will have a tag (see below) saying ''draft page''. This indicates that this is still in the process of being written. Most pages are complete for now but some are more explicitly in a state of development. 

The software used to support this on-line guide is called tiddlywiki.

It has similarities to other wiki software, such as Wikipedia. This has enormous flexibility so that material can be linked together in very creative ways.

This guide has hundreds of pages of information (including handouts, self-help materials, videos) about the EMHP programme.

These have been organised into key areas that can be found through the row of tabs at the top of the screen - contents bar:

[img[CWP site map.PNG]]

!!''Finding your way around''
!!!''Tags and links''
The software used to support this on-line guide is called tiddlywiki. It has similarities to other wiki software, most notably for Wikipedia. This has enormous flexibility so that material can be linked together in very creative ways. 
However, for some users, they experience the guide as being hard to find things and to know what is available in the guide. 

This page explains some of the thinking about how to address this. 

There are hundreds of pages in this CWP manual that are linked together by ''tags'' and ''links''. 

A ''tag'' joins together pages to do with a particular topic. So there is a tag for [[Guided Self Help]] that links together all the pages related this approach.This is a big topic so it has lots of pages connected together under this tag. Within this big topic, there are tags with a smaller number of pages. One way of thinking about a tag is that it is like a washing line (remember these) where all the clothes on the line are held together on the line. The line is a tag. 

It is better not to have a huge number of tags as the guide can become confusing with too much  connectedness that leaves people being unable to see the wood for the trees. 

One of the main design  tasks of the guide is to work out the key tags. These could be thought of as chapter headings if the guide was a book. 

A ''link'' makes a specific connection between individual pages. So that someone can more easily find pages related to the page that they are reading. Using the metaphor of the washing line, a link would connect two pieces of clothing, like a pair of socks!



<<list-links "[!is[system]!is[image]sort[]]">>
* Warning “tea is ready in 5 minutes so you will have to stop playing”
* Command given “time for tea”
* Wait for compliance – if the child complies, praise and no need to calm time
* If child doesn’t comply – give an if-then warning. “if you don’t come for tea, you will go to calm time”
* If child still doesn’t comply say “you didn’t come for tea, go to calm time”
* When calm time is over, there is an expectation that the child will still comply. Say “it’s time for tea”. 
__Hammersmith and Fulham__ 

Set up service initally sitting as part of the community CAMHS team and set up team in schools in the borough. 
CAMHS uses a version of the CAPA model. Community CAMHS and specialist CAMHS sit under single point of access so screened together. Quota of assessment of choice appointment. Took mainly from the C-CAMHS team not tier 3 for CWP. 

''Case 1''
Eric (not real name),  9 years, referred for anxiety with facial ticks, assessed through choice appointment. Good fit for Cathy Creswell parent anxiety model. CWPs joined joint meeting, offered 8 sessions of GSH for anxiety. Identified goals around worries in schools, scored highly on social anxiety. Parent was motivated who bought the book and read the chapters and was able to work with CWP to deliver intervention. Good case as the parent was motivated and the symptoms weren't severe, needed extra support around taking part in class activities and generalised worries. Incident of bullying which the school wasn't responding to. CWP was required to speak on the phone and attend meetings. Example of cases which seem straight forward but complications may come up which is managed in supervision. 

''Case 2'' 
Supervisor has reservation with this client but was convinced to try. Boy, 6, on paper seemed complex as he was referred for behaviour. Eldest of 3 with severe behaviour at home. Assessed by C-CAMHS and query for neurodevelopmental concerns. What was missing was lack of structure and boundaries to contain the behaviour. Needed to go back to basic intervention based on IY. Caveats for working with the case, the case was held by the family therapist. Goal around reducing aggressive behaviour at home. Parents in chaotic mindset at home but motivated for help. Family engaged well, attended all appointments, resistance about trying things out at home. Noticed a significant change in his behaviour with manageable reward charts and attending with play time. 

__Cambridge and Peterborough __

*Invited parents to sessions 1 and 2 with psycheducation 
*Found that out of all the models the behaviour group parents were more likely to drop out.
*Clear in assessment if you cancel 3 times its the end of intervention 
*New Tier 2 service in CAMHS which sat in Tier 3.
Referrals now being made as they would have otherwise been signposted to another service. 
*Most success with parent and adolescent anxiety 

''Case 1''
Jane, 15 years, counselling not successful. Needed to adjust criteria as they went through the programme. General worries but phobia of illness and silence. Never spent a night away from home. safety behaviour is chewing gem constantly. 
1- formulation 
2- thinknng traps, goals 
3- hierarchy, relaxtion
4- revisit hiearych and thinking trpas/problem solving
5- thought challenging 
6- revisit strategies for managing anxiety 

__Richmond__

*Setting learning goals is the most successful  which can be set independently but also GBO-HIT 
!!!Role play- parent wanting you to see child only 
*Negative example 
**Not listening, trying to convince parent= not collaborative 
**Came across as the benefit for the therapist not the client 
*Positive example 
**Reassured and showed empathy about whose problem it was but how parents could help 
**Find out what the concerns were 
**Improve- ideas from parents what there views are about how they could help 
**Improve- Highlight that the parent is the expert on the child
!!!Role play- use of language 
*Positive example 
**Element of psychoeducation i.e. explaining terminology 
**Establishing the clients understanding of words 
**Building a therapeutic reliance through asking about hobbies etc. 
!!!Discussion 
*How to transition hobby discussion into problem discussion i.e. how would a dancer feel before a show
*Ask the child their understanding about why they are in the session 
!!!Case examples 

!!!Inventory in context 
*Emotional development
*Also important to think about how in tune parent is to this
*Social development: Interest in what is going on out of home becomes more important (evolutionary design to help us move to adulthood)
!!!The challenges of adolescents
*Capacity to consider others does change in adolescents and focus moves away from family to peers 
*Make riskier decisions with peers (need to think about back up team containing peers and others)
**Connections in brain  mean that making decisions in adolescence is harder (an adult might be able to help adolescent to make decisions)
*Brain is becoming attuned to wider social contexts 
!!!Asking about peers and family
*Research show importance of presence of adults in adolescents making decisions (even without any actual input)
*Best predictor of depression in teenage years was not what happened in younger life (maltreatment) but what they are experiencing socially (bullying)
*Longer outcomes for mental health are more mediated by parental attachments

Guided self help (GSH) for child anxiety generally adopts the parent led approach developed by Cathy Creswell and colleagues at Reading University.

Much of the information provided in this guide is generously shared by her team.

For a list of Pages relating to child anxiety please see below

<<list-links "[tag[Child Anxiety]]">>
!!''Treatment manual for parent led approach to child anxiety''

----
''The most recent version'' of the Cathy Creswell's therapist guide 'Helping Your Child with Fears and Worries: A self-help guide for parents Treatment Manual for Therapists'. The therapist manual is free to download, just click the following link and click on the box labelled ‘Request copy from Reading author’ and following the instructions. 

[[Treatment Manual for Therapists|http://centaur.reading.ac.uk/87041/]]
----

''The Previous version of Cathy Creswell's therapist guide'' can be obtained from the Reading [[website|http://centaur.reading.ac.uk]]
*Search on the left hand panel - type in 'overcoming your child's fears and worries'
*Click on the relevant article
*Click on 'request a copy from Reading author
Or directly use the links below:
For the [[individual programme manual|http://centaur.reading.ac.uk/65537/]] 
For the [[group programme manual|http://centaur.reading.ac.uk/65533/]]  

!!''Session Overview:''
For an overview of the session plans based on Cathy Creswell's therapist guide can be found here: [[Session Overview for Child Anxiety]]


----

''__Sharing handouts with parents/carers during remote working___
''
For further adaptions made to the manual in light of ~COVID-19 and the changes to working please see page: 

[[Child anxiety manual: COVID-19 adaptations]]

Cathy Creswell and her team have produced a Word version of the handouts from her manual for ease of sharing and completing with parents when working remotely.

PLEASE NOTE: The handouts are covered by Creative Commons copyright.  

Copyright: Available under License Creative Commons Attribution No Derivatives
See further: https://creativecommons.org/licenses/by-nd/3.0/

In addition, they are designed to fit with the evidence base for working with these interventions.  

For these reasons, the content of the handouts should not be amended by practitioners, but parents/carers can fill them in as part of the intervention as they would a paper copy.

Please find the handouts here:

<<link-doc "Child anxiety manual- Handouts" "https://drive.google.com/file/d/1fIIRwuKi-4TMA-rTj-IKvuElTor46H3p/view?usp=sharing">>

----
@@color:red;THE CHAPTER SUMMARY'S AND TRANSLATED VERSIONS HAVE BEEN SHARED FROM THE OLD MANUAL/BOOK. IF UPDATED VERSIONS ARE SHARED WITH US WE WILL ENDEAVOUR TO UPLOAD THEM HERE.@@

These recordings are taken from Cathy Creswells first book 'Overcoming Anxiety' the second version of this book can be purchased from [[Amazon|https://www.amazon.co.uk/s?k=cathy+creswell+anxiety+children&ref=nb_sb_noss]]

<<link-doc "Creswell English Audio" "https://drive.google.com/open?id=1hiq_qeG-QA6nGwcO5Ywd6W9WJnH1mRIR">>

<<link-doc "Creswell Sylheti Audio" "https://drive.google.com/open?id=1VVMtenh0tmVbctmjGdVene-gxh-bKuD7">>
!!'''Overcoming your child's fears and worries' by Cathy Creswell and colleagues. ''

@@color:red;PLEASE NOTE – THERE HAVE BEEN SOME RECENT UPDATES IN CATHY’S MANUAL AND BOOK. THIS MEANS SOME OF THE MATERIAL SHARED ON THE WIKI MAY RELATE TO THE OLD BOOK. WE AIM TO CLEARLY INDICATE WHERE THIS IS THE CASE. IT IS OUR HOPE THAT THIS IS STILL HELPFUL BUT THIS IS A NOTE ACKNOWLEDGING THAT SOME MAY FIND THIS CONFUSING.@@

Follow the link to access the previous version of the [[Treatment manual|http://centaur.reading.ac.uk ]] for parent led approach to child anxiety by Cathy Creswell for the full interventions manual. 

----

''The most recent version'' of the Cathy Creswell's therapist guide 'Helping Your Child with Fears and Worries: A self-help guide for parents Treatment Manual for Therapists'. The therapist manual is free to download, just click the following link and click on the box labelled ‘Request copy from Reading author’ and following the instructions. 

[[Treatment Manual for Therapists|http://centaur.reading.ac.uk/87041/]]

The most recent version of this book is entitled 'Helping Your Child with Fears and Worries 2nd Edition: A self-help guide for parents'

----

This is an excellent self help guide written for parents based on extensive research and practice.The book includes a step by step guide to helping a parent provide effective support to their anxious child.

This book follows the parent led intervention for [[child anxiety treatment manual. |Child Anxiety - Manual]] As such parents will be encouraged to read this book as part of the intervention. 
This book can be easily purchased and we would encourage parents and practitioners to purchase a copy of this.

 We are indebted to Cathy Creswell and her team for generously sharing their work on child anxiety with the London and South East ~CYP-IAPT Collaborative.

@@color:red;THE CHAPTER SUMMARY'S AND TRANSLATED VERSIONS HAVE BEEN SHARED FROM THE OLD MANUAL/BOOK. IF UPDATED VERSIONS ARE SHARED WITH US WE WILL ENDEAVOUR TO UPLOAD THEM HERE.@@

For translated version of the Cathy Creswell book please go to [[Child Anxiety Book- Translated Versions]]

Chapter summaries are also available (with Cathy's permission) for practitioners to use as a quick reminder of core ideas.  

<<link-doc "Chapter Summary Part 1 "  "https://docs.google.com/document/d/1CdLmESbIUql6mGDIgitzBZ-hssC2ORHAVca0nHarF8k/edit?usp=sharing">>

 <<link-doc "Chapter Summary Part 2" "https://docs.google.com/document/d/1MicoU_0T5RYC4UX5pBX_m0t0R_tYVuGpwDFmFw4OVhw/edit?usp=sharing">>  

 <<link-doc "Chapter Summary Part 3 "  "https://docs.google.com/document/d/1vv7k0BnlZybNkPo3Y4AuzUrLcMh2XRVa4LKDDG_DA18/edit?usp=sharing">>
[img[boys running.jpg]]

!!!''Child and adolescent development''
Pages relating to the overall development of both children and young people. 

<<list-links "[tag[Child and adolescent development]]">> 



!!!Adolescent Development
Pages that specifically relate to the development during adolescence 
<<list-links "[tag[Adolescent Development]]">> 

!!!Child Development
Pages that specifically relate to the development during childhood.
<<list-links "[tag[Child Development]]">> 
Please see below for the adapted child anxiety manual in response to the current circumstances caused by COVID-19. This manual was originally developed by Cathy Creswell and colleagues and has been adapted by Vicki Curry and Lauren Hassan-Leslie.

---

Much of the session plans in the original manual (Halldorsson,
Elliot, Chessell, Willetts and Creswell, 2019) can be conducted as usual. However, there may need to be some flexibility and creativity on the part of the practitioner and the parent in the context of the ever-changing circumstances caused by Covid-19 to make this work. In this guide, we have highlighted some aspects of each session that might particularly benefit from slight modifications in response to the current context.

----

<<link-pdf "Child anxiety manual: COVID-19 adaptations" "https://drive.google.com/file/d/1yhxljkK5v24WhbqZVL62Np0chaFRtblI/view?usp=sharing">>


Cathy Creswell and her team have produced a Word version of the handouts from her manual for ease of sharing and completing with parents when working remotely.

PLEASE NOTE: The handouts are covered by Creative Commons copyright.  

Copyright: Available under License Creative Commons Attribution No Derivatives
See further: https://creativecommons.org/licenses/by-nd/3.0/

In addition, they are designed to fit with the evidence base for working with these interventions.  

For these reasons, the content of the handouts should not be amended by practitioners, but parents/carers can fill them in as part of the intervention as they would a paper copy.

Please find the handouts here:

<<link-doc "Child anxiety manual- Handouts" "https://drive.google.com/file/d/1fIIRwuKi-4TMA-rTj-IKvuElTor46H3p/view?usp=sharing">>
This material has kindly been shared by Vicki Curry and was originally developed by Islington CAHMS service.

---

Please find below two power point presentations containing the parenting workshops 'Building confidence and managing anxiety in your child' part 1 and 2.


<<link-pdf "Part 1: Child anxiety (parent workshop)" "https://drive.google.com/file/d/1HBQjTDuHg4twaUHDkAN8Ze4wSPbqF8BU/view?usp=sharing">>


<<link-pdf "Part 2: Child anxiety (parent workshop)" "https://drive.google.com/file/d/1s2RKqxpLBEabYKXOs1YddNmq2cn_hotJ/view?usp=sharing">>
!!!!!Source: Derek Bolton 
Common mental health problems can be classified by a system of medical diagnosis. 

!!''Diagnosis''
*Different services will use diagnostic criteria/language to different extents
*The most widely used system of diagnosis is the International Classification of Diseases (ICD) which is now in its tenth iteration so it is known as ICD-10.
*There is also a system known as DSM-5 which is  the American system of classification of medical disorders.  
*Many people recognise there is a problem with the language around diagnosis but the key factor is the loss of/abnormal functioning.
*Even if the idea of diagnosis is thrown out, you need to be able to think about recognisable patterns

!!''Recognisable patterns''
*Key thing to track is distress which is so severe that is interferes with functioning
*Distress can sometimes be 'ordinary problems of living'. Mental health professionals need to look at functioning. With adults this is easier (they can compare it to their norm e.g. how they were 6 months ago). Children however are on a developmental trajectory so it is harder to identify. 

!!''Other connected pages'' 

[[What are 'mild/moderate' mental health problems?]]

[[What is a 'low intensity' intervention?]]


!!!Creswell model 
*Assessment with the parent and the child then no contact with child after that. unlikely for CWP 
!!!Child focused work 
*Coping Cat considered to be a child-focused intervention for anxiety 
*Effective but requires more than 8 sessions 
*What is the value of parent led work? Cheaper, and delivered in a shorter time frame 
*Time and a place for both child-focused and parent-focused work
**Depends on the age of the child- younger age= focus on parents 
**Conclusion through formulation process 
[img[leaves.jpg]]

!!!''Child mental health problems''

This Programme does not cover all mental health problems. It focuses on the three most common mental health problems for children and young people. These are:

* [[Anxiety]] (0-18 years)
* [[Low Mood]] (11-18 years)
* [[Behaviour Problems]] (0-11 years)


Pages providing an overview of child mental health problems can be found below:

!!!Mental Health Problems Overview 

<<list-links "[tag[Mental Health Problems Overview]]">> 
 


!!!!!Source: Laura Bowyer
!!!''Key points''
*Anxiety is maintained because the child thinks something bad is going to happen and thinks they will be unable to cope. They then look out for evidence to support this.
*The aim in cognitive interventions is to develop more flexible thinking and increase coping. Helping the YP to develop realistic/helpful thoughts can result in reduced anxiety and a reduction in avoidance and/or safety behaviours.
*Main interventions include helping the YP or parent to question their own (their child’s) thoughts by helping them evaluate them. This also helps gives parents alternatives to reassurance. Generally, parents and the YP look to ask questions versus provide answers.
!!!''Thinking about thinking''
*Avoid persuasion and start from a position that the child or young person has a reason to think the way they do. Be curious about how that has come about rather than feel you have to change their thinking. The process of increasing flexibility rather than content is useful. 
*Padetsky once commented that the purpose of Cognitive Therapy was to move people from certainty to doubt, to enable people to be less sure that there predictions about the world will always be true. 
*For children, this can be about asking them to notice when people behave in a surprising way, doing things they didn't expect, such as when a sibling is kind to them etc. 
*From this starting point, key  techniques include: 
**acting like a judge in a court and putting the thought on trial; 
**thinking about what a friend / other person might think in the situation (alternative view point)
**considering how helpful / unhelpful the thought is
!!!''Walking on eggshells''
*However, this process is much more tricky in adolescence. Young people have an astute radar for sensing that their way of seeing the world is being discounted by an adult. They are in a process of individuation in which they are working out what they think in contrast to the adults around them. Cognitive techniques for young people can be experienced as hugely disrespectful to their own understanding of the world.   
!!!''Engaging in enquiry''  
*The aim is to increase the number of alternative thoughts available to the YP in that situation and for them to reflect on their coping and build this up
*For adolescents you could use thought records 
*There is no ‘right’ or ‘wrong’ thought to have, it’s just that some thoughts are less helpful than others to have. *The really important next step is then to ‘test out’ the thoughts 
*Testing out thoughts is another way of re-evaluating them and is done via behavioural experiments. This is when a YP faces a fear in order to test out a thought and then reflects back on their prediction (thought) after the exposure to see what they learnt (how true it was).
*You should be rating the strength of belief in a particular thought before and after a behavioural experiment
*Be mindful of safety behaviours and support the YP to drop these during experiments
<<list-links "[tag[Cohort 1 Lecture summaries]]">>



!!!!Source: Duncan Law

!!!Local Collaboration

The CWP and EMHP programmes are not just about training a new workforce, they are about system change to improve CYPMH services and systems.  This requires good collaboration with in the services the CWP/EMHP are employed and good collaboration between all stakeholders in the local CYPMH system including: commissioners, school and community leaders, CYP and their families, services providers across health, local authority and the voluntary sector. Your level area should already have a CYPMH forum to support these connections  - make sure the CWP and EMHP programmes are on the agenda and that all stakeholders understand what they can (and can't) offer and how this fits with existing services and other initiatives.

!!!Regional Collaboration

The development the new of CWPs and EMHPs workforce is groundbreaking and we can learn form others who are developing services. link in with other areas who may be at the same stage of implementation as you and try and link with those who may be a little further down there road.  The CWP and EMHP steering groups are a great place to hear about how others are progressing, group problems solving and networking

!!!National Collaboration

the London and South East CWP programme link with all the other regions of England who are implementing the CWP workforce programme.  Here learning can be shared at a national level and link back to NHSE and DfE to report on progress.  This is one of the areas where data from the CWP work is vital.





This page is great!

!!!!!Source: Laura Bowyer
!!!''1.	Young person doesn't attend''. 
*Phone or text young person to enquire how they are. 
*Arrange to ring again at a specific time in a few days’ time. 
*Remind of next appointment. 
*Send materials to young person if they agree.
!!!''2. Young person attends but is very disengaged, passive and monosyllabic.'' 
*Reduce demands in the session. *Validate young person's state of mind. 
*Avoid too much praise for coming. *Problem solve about ways of making the contacts more adaptive to young person's preferences.
!!!''3.	Young person says problem has gone away''.
*Young person describes rapid improvement in mood and doesn't see need to come for more sessions. *Practitioner positively validates improvement, 
*emphasises the cyclical nature of low mood
*encourages persistence with plan
*focuses on relapse prevention in psycho-educational material.
!!!''4.	Young person says parent would like to phone practitioner.''
 *Discuss how young person feels about this. 
*Problem solve best way of responding to parent's request and use shared decision making. *Consider how to avoid secrets and option of doing call in front of young person. 
*Agree explicit plan with young person about what practitioner will do.
!!!''5.	Young person is relatively active and low mood has not impacted on behaviour significantly.'' *What does the young person believe would be helpful in improving his/her mood? 
*Secondly, it may be helpful to review the basic formulation and also to consider a developmental formulation as a way of making sense of the current difficulties. 
*It may also be important to recognise the resilience and coping that the young person is demonstrating.
!!!''6.	Young person says the problem has changed part way through a course of GSH''. 
*Sometimes when clients present with multiple problems, the issue you initially are working on resolves and the YP wants to change focus. 
*Other times there can be various reasons for wanting to change focus e.g. avoidance of talking about / doing things which are difficult for the YP. 
*Consider ROMS and progress towards goals in such situations. 
*Is there a reason why things have ‘changed’? 
*Consider formulation and practitioner/YP/environmental factors. 
*What are the pros and cons of switching tact? 
*Always discuss in supervision. *Consider shared decision making. *It is often useful to consolidate what has been done and to cover relapse prevention rather than trying to cover something new in a few sessions. 
!!!''7.	Young person or parent is over inclusive in sessions'' 
*YP or parent wants to talk about other things and you end up not getting through planned material. *Using the principles of GSH is important and setting up the intervention at the beginning well will help here. 
*For example, the parent / YP should know what each week will entail at the beginning of the course of GSH. 
*Additionally, setting up a good agenda at the start of each session will help give you something to refer back to.
*Make a decision collaboratively with the family as to how best to use the rest of the time if conversations go off track. 
*Of course, there are times when a YP or parent has experienced something unexpected in their week and wishes to talk about this, and this might be important. 
*The process of shared decision making here is helpful. Listen and validate and then gently consider the choice and the pros and cons of how you can use the time in that particular session. 
Source: Peter Fuggle

''Purpose of the page'' This page will provide basic information on common mental health problems in children and young people.  

!!''Common Mental health Problems'' 

Major surveys of the mental health of children and young people in England were carried out in 1999, 2004, and 2017. For more information and the full link of this survey please go [[here.|Survey of the Mental Health of Children and Young People in England, 2017]]

From this survey disorders were grouped into four broad types as follows:

!!Emotional disorders:

Anxiety disorders (7.2%) (characterised by fear and worry)   
Depressive disorders (2.1%) (characterised by sadness, loss of interest and energy, and low self-esteem)
Mania and bipolar affective disorder. 

Overall one in twelve (8.1%) 5 to 19 year olds have an emotional disorder. 

*girls (10.0%) 
*boys (6.2%) 

Using a system of medical diagnosis, (see [[Ways of describing common mental health problems]]) there are different types of anxiety:

# Generalised anxiety disorder
# Social anxiety 
# Panic
# Specific phobias
# Post traumatic stress disorder
# Obsessional Compulsive disorder 

See [[Young People Talk About Anxiety]] for seeing from young people's point of you.

!!Behavioural disorders 
A group of disorders characterised by repetitive and persistent patterns of disruptive and violent behaviour in which the rights of others, and social norms or rules, are violated. 

Overall about one in twenty (4.6%) 5 to 19 year olds had a behavioural disorder.

*boys (5.8%) 
*girls (3.4%). 

!!Hyperactivity disorders 
Include disorders characterised by inattention, impulsivity, and hyperactivity. 

Overall about one in sixty (1.6%) 5 to 19 year olds had a hyperactivity disorder

*boys (2.6%) 
*girls (0.6%). 

An example of a child’ description of ADHD: [[A child describes ADHD]]

!!Other disorders 

Such as: autism spectrum disorders (ASD), eating disorders (ED), tic disorders (Tourettes), very low prevalence conditions (Psychosis) . One in fifty (2.1%) 5 to 19 year olds were identified with one or more of these other types of disorder: 

* 	1.2% with ASD, 
* 	0.4% with an eating disorder, 
* 	0.8% with tics or another less common disorder.

Please got to the page [[Autistic Spectrum Disorder (ASD)]] for helpful information and clips about what it can feel like to live with ASD.

!!''Practice points for EMHPs''

1. Useful to have an overall knowledge of the frequency of mental health problems in children and young people. 

2. There are different forms of language around mental health disorders/ problems 

''Diagnostic language: ''Disorder; illness; e.g. anxiety disorder; psychotic illness.  

''Practitioner Language:'' Problems and difficulties e.g. anxiety problem; behaviour difficulty

!!''Links to other pages''
Other pages which may be of interest to this topic. If you go to the page [[Child/Adolescent Mental Health Problems]] you will see a list of pages about child mental health problems. 

Source: Peter Fuggle

For more information on RCADS please go to: [[RCADS]]

!!How to use RCADS?
RCADS will be used by practitoners when working with young people often of a secondary school age for students being seen for low mood or anxiety. 
Following a full RCADS at Session 1, practitioners should complete the relevant subscale at each session. The full RCADS is then completed again in the final session.

In completing the RCADS, some young people like to do it quietly on their own whereas other may like active involvement form the EMHP. The stance is to ensure that the process is not seen as an exam and it is important to support the young person by using a number of supportive phrases such as 

*there are no correct answers. 
*always ask if you are not sure
*this is not a test and you cant get things wrong
*the idea is to help you think about what you really feel 

!!Using POD

The RCADS is best collected [[using POD|How to Use POD]] as this will provide immediate feedback to the young person and also can compare repeat measures with previous ratings. 

Personal identifiable information is not collected on POD. However in order for the RCADS to be scored information on Gender and Year group is required.

For more information on POD please go to: [[POD]]

!!Practice Points:

* At the beginning of the intervention, fill out whole RCADS
* For subsequent sessions, only track them on the subscale you have both agreed to focus on. 
*you cant solve everything, choose something that is important to that CYP, be specific!
* Helps you be clear of how you are going to be helpful.
* Use subscales to track specific issue that you agreed to address.

!!!Videos
[[How to use RCADS|https://vimeo.com/57925678]] with a CYP on CORC's (Child Outcome Research Consortium) website (Copyright of CORC) is a helpful example of how the RCADS may be used in practice.



!!Links to other pages:

For more information on how to complete questionnaires, practice points and video demonstrations on this topic please go to: [[Using Feedback and Outcome Tools]]
For more pages concerning the outcome measures used by practitioners please go to [[Outcomes]] for a list of relevant pages.
This page contains an overview and link to the paper developed by Pennant et al. 2015 (see full reference below), Computerised therapies for anxiety and depression in children and young people: a systematic review and meta-analysis.

---

This work aimed to systematically review the evidence for computerised anxiety and depression interventions in CYP aged 5-25 years old. computerised CBT (cCBT) had positive effects for symptoms of anxiety and depression.
For a link to this paper please see 

<<link-doc "Pennant et al. 2015" "https://drive.google.com/file/d/17XWygYzV1SwGbB-1MadQuHIPS1Oxl1oS/view?usp=sharing">>


---

Pennant, M. E., Loucas, C. E., Whittington, C., Creswell, C., Fonagy, P., Fuggle, P., … Kendall, T. (2015). Computerised therapies for anxiety and depression in children and young people: A systematic review and meta-analysis. Behaviour Research and Therapy, 67, 1–18. doi: 10.1016/j.brat.2015.01.009tre for Mental Health, Royal College of Psychiatrists, London, UK
!!!!!Source: Laura Bowyer
!!''Consent and video recording''
In any piece of work you do, ensuring you have explained confidentiality and obtained informed consent is vital. This is however, perhaps particularly true when you want to be recording sessions for the purposes of completing a training course.

The emphasis here is on informed consent: in order to make a decision about whether their information can be used a YP / parent will need to know:

*What it is you are recording
*Why you are recording 
*How you will be recording 
*What will you do with / how will you use the recording 
*How will it be stored and for how long 
*Any other questions they might have 
The vast majority of YP and parents will not object to being recorded if this is discussed in an open, straight forward and transparent way. 

Be honest about your role as a trainee but also confident in what this means; e.g. 

*you will often have two heads thinking about a case due to close supervision, 
*you are training so have access to the latest developments in things which might be helpful to the family, *you work as part of a team with expertise in helping young people with common mental health difficulties etc. 

It is useful to explain the purpose of recording is more about monitoring you as the practitioner and about ‘quality control’ – to make sure you are doing your job well and to help think about what other support a family or YP might need. 

Confidentiality is especially important when working with children and young people. 

*Never promise / agree to keep anything secret
*You will always try to tell the YP or parent first and have a discussion about things if you need to tell other people about something (‘break confidentiality). It is helpful to explain that the point of this is always about helping support them / ensuring they are safe 
*Use of shared decision making 
*Always set up that confidentiality is held within the team i.e. you work as part of a larger team with a supervisor etc. 
*Always encourage the YP to allow you to share concerns with parents to help develop safety plans if needed 
*Remember, both confidentially and consent are on-going processes and should be re-visited throughout your work with a YP or family. 
*You should consult your local Trust’s policies and service’s protocols for specific consent and confidentiality forms.
*Don’t forget to seek permission from YP/families to use their work for your assignments and to document this in the appropriate way within your services 
@@color:red;This page is being developed in light of recent changes to working due to the outbreak of COVID-19@@
[img[typewriter.jpg]]

For more information about the CWP Programme in London and the South East or about this guide, please contact the CWP Team at the Anna Freud National Centre for Children and Families (AFNCCF). Or visit the [[CYP-IAPT website|https://cypiapt.com/2019/03/13/educational-mental-health-practitioner-2019-update/]]

For feedback regarding this guide please contact [ext[PGS Online Guides|mailto:PGSonlineguides@annafreud.org]] 
[img[books-2158737_1920.jpg]]

This guide has hundreds of pages of information. It is organised into five key areas that can be found through the tabs at the top of the screen.

!!![[Home]]: 
Contains  information about this guide and [[User Guide]] it as well as an overview of the core aspects of CWP's work.

!!![[Helping]]:
Contains the ''core manuals'' and ''session plans'' and related resources for the core interventions CWP's are trained in.

!!![[Finding Out]]: 
Contains information and guidance pages relating to 10 key areas of CWP work. These pages provide the knowledge and skills important to CWP's and also has additional resources/ self help materials that may be useful to use in CWP work.

!!![[Supervising]]: 
Contains information on supporting and supervising CWP's.

!!![[More]]:
Which contains information on UCL [[Teaching]] and 
background to the [[Training]] of CWP's


!!''Converting concerns into goals'' 
The challenge is how to set and develop goals with parents and convert these concerns (things they want to get rid of) into positive goals.
As always, try to get specific as possible. Here are some examples.  
*Parental concern: Child won't go to sleep, one of the main trigger points in a household (next to getting ready for school and mealtimes). 
**Agreed goal: go to bed at a specific time, go to bed the first time asked 
*Parental concern: Not listening (gain more information- how do you know they're not listening?)
**Agreed goal: Child responds by demonstrating listening. 
*Parent concern: Not doing what they are told
**Agreed goal:  acknowledge that they have heard you, being able to say the word no
*Parental concern: Poor table manners
**Agreed goal: use a knife and fork, keep food on the plate, not speaking with food in their mouth 
*Parental concern:Hitting people
**Agreed goal  playing nicely, listen to people, using a strategy other than violence to stay calm, using words instead of hitting 
*Parental concern: Running away- **Agreed goal: stay close to mum or dad (an agreed distance) 
*Parental concern:Tantrums 
**Agreed goal: non-dangerous way to express emotion, express emotions in words or in another way 
This is a tag tiddler

<<list-links "[tag[Copyright]]">>
<<link-doc "Copyright guidance" "https://drive.google.com/file/d/1grrqewCGXHw8uV5SJOZtdvTS_GqfvFQP/view?usp=sharing">>
Source: Peter Fuggle, AFNCCF 

Please see below for a document that can be easily shared regarding copyright and the wiki manual.

<<link-doc "Copyright guidance" "https://drive.google.com/file/d/1grrqewCGXHw8uV5SJOZtdvTS_GqfvFQP/view?usp=sharing">>



!!!''1. Materials produced by University Teaching staff''

All pages in the Guide should indicate the source of the material shown on that page. 

The source of the majority of the pages are written by teaching staff at UCL or KCL.

This material has been uploaded on to the guide with permission from the staff member. 

The name of the staff member is shown at the top of the page with the initials of the organisation (where this is applicable).

This indicates that copyright for the use of this material has been granted. 

The generosity of all teaching staff in contributing to this  guide is hugely appreciated. 

!!!''2. Linking to materials freely available on the internet'' 

For materials freely available on the internet, linking to them to the wiki, has few if any copyright implications and will be very low risk. 

We avoid linking to website content which is in itself obviously infringing (that is, it has obviously been uploaded without the permission of the copyright owner). 

We avoid “deep linking” which obscures the ownership/ branding of the site we are linking to. For example, rather than link straight into a pdf, we link to a preliminary page which makes the context clearer.   

!!!''3. Reproducing material from the internet''

Reproducing the material itself either in full or substantial parts does pose a risk of breaching copyright. 

If any of the material is already licensed by a Creative Commons licence or equivalent we are then able to reproduce this and comply to the terms of the specific licence. This is  evident from the information on the website.  Usually a Creative Commons licence has the following: "When reusing third party copyright material it is always important to credit the source and the author(s)". 

In the absence of such licence terms, though, we try to obtain permission from the copyright owner unless we are able to rely upon one of the statutory exceptions to copyright. 

When we seek permission, we request the copyright owner to let us know the wording they would prefer us to use in our  acknowledgement. Typically that could be something like: “Copyright […...] All rights reserved. Reproduced here with permission” 

 !!!''4. Permission for others to use material in this guide''

This guide is freely available for use by others under a Creative Commons Licence 
(see [[Creative Commons licence]])

This states that the material in this guide can be used by others as long as the source of this material is acknowledged and that it is not used on a commercial basis. 

!!!''5. Your Privacy''

You can see the AFNCCF privacy policy [[here|https://www.annafreud.org/your-privacy/]].


!!!''Useful contact for advice'' 

Chris Holland|Copyright Support Officer|UCL Library Services|Gower Street| London WC1E 6BT
T: 020354 95729| 
!!!!!Source: Deb ~McNally and the Manchester Collaborative 

The brief guided self-help parenting intervention for behaviour problems is divided into two broad areas that can be covered over five (or more) sessions. These have been divided into parenting approaches that:

# promote the child’s development, child’s attachment and the parent-child relationship
# keep children safe in their exploration through limits and positive discipline  

In the first part of the intervention, parents will be supported to improve their communication with their child and to encourage appropriate child behaviour by increasing the social attention that they give to their child through spending special time together and giving praise. In the second part of the intervention, the parent will be encouraged to think about the importance of routine and boundaries for their child’s development and learning. Parents will be supported to use clear instructions, set limits with their children and withdraw attention from inappropriate behaviours.

Research suggests that a strong relationship between parent and child builds the foundations for a child’s development and the setting of effective limits and boundaries. Therefore, it is recommended that the intervention starts with sessions that focus on improving the strength of the parent-child relationship prior to moving on to setting limits and withdrawing attention. It is really important that the structure is followed, because parents may ask how to manage behaviour that will be covered in later sessions. It might be tempting to do behaviour management earlier, but it will confuse the parent. Furthermore, these strategies will not be effective unless the foundations (special time, attention and praise) are firmly in place. It may be helpful to remind the parents that we will be covering behaviour management in later sessions. 

Session topics are:

1) 	Learning about your child and their behaviour


2) 	Enhancing your relationship and supporting children’s communication


3)	Building self-esteem and improving behaviour through praise


4) 	Using routines and boundaries to set limits for your child

5) 	Reducing problematic behaviour through withdrawing attention

6) 	Supporting emotional regulation through calm time and dealing with non-adherence to commands in children over 5 years


This page provides a link to the paper manual for the Manchester approach to parent training. This framework was written by Deb ~McNally, Consultant Clinical Psychologist in Manchester and generously shared with other collaboratives in the CYP-IAPT National Programme.   

''__Brief Guided Self-Help Parenting Intervention'' 



<<link-pdf "Manchester Parent Training Manual" "https://docs.google.com/document/d/1YVAXcYyWF5_4wxM1BfUOoogXwpxro3sSwLLoRg4zP3Y/edit#heading=h.gjdgxs">>


{{manc}}

!!!''25 CORE CWP COMPETENCIES'' 
These are divided into two groups, knowledge and skills. 

<<link-pdf "CWP Competencies" "https://drive.google.com/open?id=0B1hDLHd8syMsSkVMOVJhV3o2YVE">>

Competency Framework for Direct Low Intensity Work with Parents, Children or Young People:

<<link-pdf "Direct Low Intensity Work Competencies" "https://drive.google.com/file/d/1DFzy7oEWH1hAkbHDOEp0R6nqu_N-a7aA/view?usp=sharing">>

!!!Marking Frameworks:

This framework is also useful for preparation of [[video assignments (assessment)|https://drive.google.com/open?id=0B1hDLHd8syMsNmVOVkVjbEJNOXM]] 

And for [[intervention videos|https://drive.google.com/open?id=0B1hDLHd8syMsOWdSSEtoNHhpT2M]] 
!!!Core Intervention Manuals
Below is a list of the core manuals used by EMHP's in their work with CYP and their families.  

!!!''[[Child Anxiety]]:''
Cathy Creswell therapist guide based on the [[book|Child Anxiety: Book]] by Cathy Creswell and colleagues: 'Overcoming your child's fears and worries' (book available on amazon). can be obtained by following the links below:

*For [[individual|http://centaur.reading.ac.uk/65537/]] programme manual 
*For [[group|http://centaur.reading.ac.uk/65533/]] programme manual

!!!''[[Adolescent Anxiety]]:''
The manual called 'getting to grips with anxiety' by Helen Barker and colleagues 

<<link-doc "Getting to grips with anxiety" "https://drive.google.com/file/d/1MhSkweHKlMx3gAHe8SyVqss4nSjzJhFd/view?usp=sharing">>

!!!''[[Low Mood]]:''
The manual used to guide practice is the 'Guided Self-Help for Low Mood'. 

<<link-doc "Guided Self-Help for Low Mood: Full Manual" "https://drive.google.com/file/d/1Ua1L-0BUmNMBTJi2AkYQhdlmnWpKwl0g/view?usp=sharing">>


!!!''[[Behaviour Problems]]:''

The brief guided self-help parenting intervention, the manual for this intervention can be found here:

<<link-doc "Guided self-help for behaviour problems" "https://drive.google.com/file/d/1vBNYY-hZtqIKHZucyZmbxZmfjTvYYoRZ/view?usp=sharing">>
!!!!Source: Peter Fuggle 

!!What are the core outcome measures and feedback tool?

Outcome measures are a systematic way for practitioners and clients to measure, track and monitor if the interventions being implemented are being helpful to the young person. They help facilitate feedback from young people and families that help practitioners understand how they are being helpful  - in this sense they are both outcome measures and feedback tools.

They are also helpful to initiate conversations about issues a CYP is having. For more information please go to [[Using Feedback and Outcome Tools]]

For the CWP & EMHP programmes it is proposed that a core set of measures are'' used to evaluate the benefit of the interventions''. These are all taken from the CYP-IAPT basic set of measures. Please find linked below:

<<link-pdf "Outcomes Framework for London and the South East" "https://drive.google.com/open?id=19dWlwSybIYhh8mLqGUMd62JHECbrkFF7rP-YjMD7xlU">>


The core measures used in the CWP & EMHP programmes can be divided into three domains:  

!!!''Goals - using the Goal-based outcomes (GBO) tool''
This is the same measure either used by a parent or a young person for all cases. 

* [[Goal-Based Outcomes (GBO)]] 
!!!''Symptom change''
The symptom change measure is different depending on whether the child is primary school age or secondary school age. 

For primary school aged children the symptom change measure is the SDQ:

*[[SDQ]] for Child Anxiety and Behavioural Difficulties cases 

For secondary school aged young people it is the RCADS: 

*[[RCADS]] for Low Mood and Adolescent Anxiety cases 

!!!''Satisfaction with the service''
For each case, it is essential to obtain information in all three of these domains. 


There are two ways of measuring satisfaction; one is a feedback form for the session and the other is a feedback form for the end of the intervention. 

*''Session Feedback''
 
*[[Session Feedback Questionnaire (SFQ)]] 

*''Service (intervention) feedback''

*[[Experience of Service Questionnaire (ESQ)]]

!!Additional outcome measures for work in schools
Following discussion with both teaching teams (October 2018), a number of measures will be considered that are additional measures for use in schools.  

*A combination of child's goals and teacher goals. 
*RMQ  - the Impact supplement of the SDQ.
*Outcome Rating Scale (ORS) and the Child Outcome Rating Scale (CORS)
*IMPACT subscale of the Teacher version of the SDQ. 
*The measure of 'Me and my school' 

An excellent website for information about these outcome measures for children and young people can be found on the [[CORC website|https://www.corc.uk.net/outcome-experience-measures/]] (Children Outcomes Research Consortium)




!!POD
For the EMHP programme in London we use [[POD]] to collect measures as this supports good quality feedback to the young person. (see [[The Importance of Feedback]])

<<link-pdf "Paper Outcome Measures" "https://drive.google.com/open?id=0B1hDLHd8syMsU1lwY1ZTWUVORFU">>


!!Links to other pages:
For information on how to use POD please go to [[How to Use POD]]

Please go to [[Outcomes]] for a list of pages for information about core outcome measures and other aspects of outcome measurement in the guide.

Please go to [[Using Feedback and Outcome Tools]] for more information on how to use outcome measures
The term parent will be used throughout, however, refers to the child's primary caregiver. This approach builds on the core components of parent training developed by Carolyn Webster-Stratton and colleagues over many years. Building on the foundation of developing capacity in parents/carers to enhance skills in: 

*Empathy
*Play 
*Attending
*Praise 
*Problem Solving 
Axel Scheffler has illustrated a digital book for primary school age children, free for anyone to read on screen or print out, about the coronavirus and the measures taken to control it. Published by Nosy Crow, and written by staff within the company, the book has had expert input: Professor Graham Medley of the London School of Hygiene & Tropical Medicine acted as a consultant, and the company also had advice from two head teachers and a child psychologist.

The book answers key questions in simple language appropriate for 5 to 9 year olds:

*What is the coronavirus?
*How do you catch the coronavirus?
*What happens if you catch the coronavirus?
*Why are people worried about catching the coronavirus?
*Is there a cure for the coronavirus?
*Why are some places we normally go to closed?
*What can I do to help?
*What’s going to happen next?


Please find the book on the following [[website|https://nosycrow.com/blog/released-today-free-information-book-explaining-coronavirus-children-illustrated-gruffalo-illustrator-axel-scheffler/]]
''Assessment of CWP Supervisor/Service Development Lead'' 

Supervisors/Service Development Leads will be assessed on a pass/fail basis following completion of the course, based on the following criteria:

* Attendance – Supervisors/Service Development Leads will need a minimum of 80% attendance 
* Submission of a video, for peer review and reflection, of a supervision session where outcomes measures are used as part of the supervision
* Presentation of a new workforce/service model for CWPs
* Discussion and action planning from a participation/co-production event
* Evidence of data collection on throughput and outcomes and submission of data to the CYP IAPT/CWP central team via POD or other (or another online system) and is available for export as part of the CWP audit


Supervisors will recieve an Attendence Certificate upon passing the course. 
<<link-pdf "Course Handbook UCL" "https://drive.google.com/open?id=1xZkdv-jVplLLX-bxtrp-N11lXgPEisXc">>
<html><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Creative Commons Licence" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a><br />This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a></html>

See a readable summary of the terms of this license [[here|https://creativecommons.org/licenses/by-nc-sa/4.0/]]
!!!! Explored and Explained by Kimberley Saddler, CWP at Whittington Health NHS Trust and Cassandra Neo, Educational Psychologist Trainee at UCL

Definition

Cultural Competency is defined as “the ability of systems to provide care to patients with diverse values, beliefs and behaviors, including tailoring delivery to meet patients’ social, cultural, and linguistic needs” (Betancourt et al., 2003). The value of this definition is that it doesn’t just focus on healthcare but takes other systems into account. From a child and family context, we know that effective care relies on the interrelations between multiple systems, including, education, social care and voluntary sector services.

 

A limit of the traditional cultural competency is approach is the tendency to focus on the development of technical skills. There is a temptation to reduce the approach to merely increasing skills such as, booking interpreters, collecting ethnicity data, and so on. Culture is often synonymised with ethnicity and race and therefore the cultural competency approach can lend itself to a series of do’s and don’ts depending on someone’s ethnic background. However, we know that culture is not a fixed state, but something that is fluid, and whilst there are many values, attitudes and lifestyles that are common within ethnocultural groups each individual may ascribe to those values to varying degrees. 

 

Kleinman & Benson (2006) highlight the inherent challenges of the cultural competency approach and provides some alternative approaches that address these challenges. One major element of this approach is using a process of enquiry to elucidate what the individual values, for example, asking about ethnic identity and whether this is important to them, rather than merely asking about what ethnic group the individual belongs to. Essentially, Kleinman & Benson (2006) place the value of interpersonal qualities over technical skills.

 

Kirmayer (2012) highlights some alternatives to the traditional cultural competency approach which includes:

 
 
1.     Cultural safety – the acknowledgement of how power imbalances can contribute to how safe a system is for the individual (which can include the emphasis on institutional racism)

2.     Cultural sensitivity – practitioner self-reflexivity in the therapeutic interaction

3.     Cultural humility – a willingness in being open to hear from others’ experiences

 

Kirmayer emphasises that a combination of approaches including cultural competency (technical skills) and the above alternatives can enhance how culturally responsive an organisation or system is rather than emphasising one approach in isolation.

 
 
 

Why is this important?

The below video by the BBC called “Mental Health and Being Black” includes the experiences of a few individuals in the UK and touches upon the issues described so far.

 

BBC MENTAL HEALTH & MENTAL HEALTH VIDEO HERE – 5mins long approx.

 

The experiences highlighted in the video touches upon the issues described so far. One young black man describes how he feels that he hasn’t been supported by the “white power structure” and refers to the criminal justice system and the impact on mental health as an example. One young lady spoke about her experience of identifying as a queer, mixed-race woman, the impact on her mental health and the importance of speaking about this in her work with young people. Another individual spoke about her experience of having a Dad being diagnosed with schizophrenia and that people within the black community in particular are not getting the help that they need. Another individual spoke about her experience as being a mental health practitioner. An important discussion occurs around stereotypes and how this can affect what young people may be labelled with and how this impacts the help that is or isn’t offered. 

 

Research

Research has found ethnic variations in access to CAMHS…

 

Ethnic variations in mental health services research, incl. my dissertation.

 

Expand the CAMHS cultural competency approach by Papadopoulous

Use the sections of the diagram – cultural awareness, cultural competence, cultural knowledge and cultural sensitivity​



<<link-doc "Rethinking Cultural Competence Article" "https://drive.google.com/file/d/19Otyaw9-BhN_5mzgl9Z3oUTkNprdCpD7/view?usp=sharing">>

<<link-doc "Anthropology in the Clinic: The Problem of Cultural Competency and How to Fix It - Kleinman & Benson Article" "https://drive.google.com/file/d/1jksPtH47piYmC1No8_PcVSmDizUKxFmk/view?usp=sharing">>

<<link-doc "Cultural Competence: A Literature Review and Conceptual Model for Mental Health Services - Hernandez et al. Article" "https://drive.google.com/file/d/1QaMSzHNl3YTk3C1CIk66ADE6gv8yL4oP/view?usp=sharing">>

<<link-doc "Cultural competence in mental health care: a review of model evaluations - Kamaldeep et al. Article" "https://drive.google.com/file/d/1xy5B9LUcy7qKFfTiXcldhRkAmL0Nh5dw/view?usp=sharing">>



Tackling Anxiety (exposure :

<iframe width="560" height="315" src="https://www.youtube.com/embed/7YV3NXtzM8U" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



Children's experience in retrospect:

<iframe width="560" height="315" src="https://www.youtube.com/embed/Ii9o8B_9sXo" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


We all have mental health:

<iframe width="560" height="315" src="https://www.youtube.com/embed/DxIDKZHW3-E" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



<iframe width="560" height="315" src="https://www.youtube.com/embed/bpdT_p4iFxo" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


About south Asian history:

<iframe width="560" height="315" src="https://www.youtube.com/embed/kGvp5Dqa5Mk" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


Young black men:

<iframe width="560" height="315" src="https://www.youtube.com/embed/6J-R50NJC3Q" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


Being Black and Mental Health:

<iframe width="560" height="315" src="https://www.youtube.com/embed/bIhZcsGqWIM" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



Articles:


https://www.independent.co.uk/voices/mental-health-bame-communities-stigma-nhs-culture-crisis-misunderstood-a7973666.html





!!!! The Children's Wellbeing Practitioner BAME Inclusion Group

https://www.linkedin.com/groups/8873855/



!!!!Source: Duncan Law
!!Key points
*Effective help includes enabling the client to develop a clear set of goals that they would like to achieve form the help being offered. 
*There is a large literature on goals-based outcomes. Goals are routinely measured on a scale of 0-10 with higher scores being more positive. 
*Usually a young person or parent will discuss and agree three main outcomes and will then rate how far they are along these goals at the beginning and where they want to get to by the end. 
*So a parent might have a goal of enabling their child to get to bed before 9.00 each night. At the beginning this happens quite rarely so she rates the problem as being a 2 at baseline. She would like to reach a 7-8 by the end of the intervention. 
*The aim is to not always to reach 10 by the end of the intervention but to begin to progress towards an improvement against a goal.  
*It is important that goals are agreed in a collaboration with the practitioner as it is important to establish goals that are measureable, that can be influenced by the intervention and that are realistic.  

!!Helping to shape goals
This section is adapted from Law, D. (2019) 'The goal-based outcome (GBO) tool: guidance notes' ~MindMonkey Associates: London 

*Goals should be agreed collaboratively between the practitioner, working with the young person or family and the person asking for help. 
*The first step is to identify potential goals and then shape these into agreed goals for the intervention
*At the point where you feel the young person/family have told you enough initial information it can be helpful to start to introduce goals by saying something along the lines of:
“That has been really useful to help me understand a little about what has brought you here today; next it might be helpful for us to think together about what your hopes for the future might be”
 
*What comes out of the following discussion can begin to be shaped into goals:
“So, from what you have told me so far, what would you say your main goals are from coming to this service? If we were to work together in a very helpful way, when we agree to stop meeting, what things would you hope to be different in the future from how things are now?”

*Once a goal has been agreed it is useful to write it down in a sentence that summarises it – ideally using the young person’s own language 
*Helpful goals tend to be future-focused, positively framed and realistic
*Helpful goals could focus on:
**Change goals – goals that focus on something someone wants to be different or change in their lives – most therapy goals are ‘change goals’
**Learning goals –  getting ideas that might help with the issues even if these might not lead to (immediate) change
**Exploration or understanding goals - these might be goals that focus on the young person wanting to understand themselves better, or to explore who they are. These may lead to change but this is not the primary focus of the work
*Make sure the goal is safe for the young person and others
*Set up to three goals 
*You can write the agreed goals on the GBO ‘goals record sheet’

The below power point was developed by Dr Hannah Baron and Dr Russell Hurn who originally created this material for the CYP-IAPT Therapy course as part of the 'core skills' module. It has kindly been shared by the creators as the majority of the material within these slides will be relevant to all helping practitioners. 

''This presentation does not replace any Trust/Service policy or guideline. Please consult your local information governance team and policies.''

<<link-doc "Core Skills: Remote Therapy with Children, Young People and Families" "https://drive.google.com/file/d/1A8mskAgvVNRmeZH97ULpIWE4ZmrdvGeR/view?usp=sharing">>

!!!!!Source: CWP Audit Report for London and the South East 2018. Main author:  Deepa Mavji

!!Demographics of referred service users
The demographic characteristics of children and young people who were referred to CWP services within the collaborative are described below, all completed data was included in data analysis. Data was collected from 15 sites, each site reported data on age, gender and ethnicity of children and young people referred in their locality up until 1st April 2018.

!!Age 

Children referred to the CWP programme had a mean age of 11.47 years (SD= 3.66) and the most frequent age of the sample was 15 years old (11%), followed by 14-years old (10%) and 16-years olds (9%). The least frequent age was 1, 2 and 3 years old (less than 1%), followed by 18 years old (1%).

{{Audit Age Distribution.PNG}}

!!Gender 
54% were females and 45.8% were males, less than 1% of the sample self-disclosed and less than 1% did not wish to disclose.

{{Audit Gender.PNG}}

!!Ethnicity  

In total 54% of service user's were White, 10% were Mixed, 7% were Asian, 7% were Black, 5% were recorded as Other and 18% were unknown.

{{Audit Ethnicity.PNG}}

!!Developing this guide
This guide has been developed through a generous collaboration in London between staff at UCL, KCL and the AFNCCF.  It is being constructed out of the generosity of the teaching staff who share their expertise while teaching on this programme. This guide is constantly being updated and revised with feedback from those in training.

The author or source material is indicated on each page. Permission for use of any copyrighted material is routinely sought and, if not obtained, such material is not used.  We do not seek permission for material freely available on the web but we aim to be transparent where this is the case.

Each page is reviewed by the editorial team and by the source author before being completed. Pages in the process of being written are indicated with a banner at the top of the page indicating that the page is still being completed. We aim not to include material from other sources which we believe to be discriminatory, disrespectful or offensive. The aim is that material will be as accurate and as up to date as possible but we welcome feedback on any of the material in this guide. 


Please send any feedback or questions about the guide to [ext[PGS Online Guides|mailto:PGSonlineguides@annafreud.org]] 


!!!Local Developments in CWP Practice

Partnerships have developed a lot of their own materials for the CWP programme. Please note this is not the core intervention materials taught on the CWP programme. Please see [[Helping]] for the core materials.

*The first is a recently updated version of the CWP [[Richmond adolescent anxiety manual|Additional Adolescent Anxiety Manual]]. 

*The second is material to help children with the [[Primary to Secondary Transitions]] which has been developed by the Islington service.  
!!!''Diary Keeping: a basic stance of curiosity and encouragement'' 
*It is not a surprising to discover that for many (not all) young people who are experiencing low mood, keeping some sort of record about what they do each day is quite a challenge. 
*It is important in this process not to focus on how well the young person does the task but on what you are both learning about how the young person spends their day. 
*Diary keeping is not a test or homework (in a school sense) but a way, for the young person,  of coming to see how their behaviour maintains their low mood. So the stance for  the practitioner needs to be one of encouragement and curiosity. 
!!!''Being sensitive to privacy''
Apart from just being able to comply with the task, a young person may not wish to reveal what they do much of the time. It is important to recognise aspects of privacy in this process so that activities such as substance use, romantic/sexual relationships may APPROPRIATELY not be shared with a practitioner in the early stage (or at all).
!!!''The basic approach: getting started''
*Following a discussion of the rationale for behavioural activation, the task is to develop a collaborative plan as to how a young person will record the main activities for a period of a week. 
*There are a number of simple diary sheets that can be used in this process.  In sharing this with a young person.
*It is helpful to go through the previous day (or two days) with them as a way of introducing the chart. This helps the young person get a sense of what is involved. Often the focus will be on sleep routines, (sleeping all day etc), staying in and using the web, time on facebook etc. 
*If attending school, it i good to get a sense of how best to record things that take place at school. 
*More creative ways of recording activity may be considered with the young person. Some like to make notes on their phone or to use a diary app on their phone. Often in the beginning the information gathered will be very partial. 

!!!''The basic approach: be really interested in whatever they can recall''
*The CRUCIAL behaviour for the practitioner is to be extremely interested in what the young person tells you and much less focused on what they haven't done. 
*If, at the next contact, they haven't completed the dairy at all, then it is an opportunity to fill the diary in with them using their recall. 
*Sometimes young people will find it hard to recall what has happened on what day. This may be avoidant of the question but may also be an indication of the impact of low mood. 
*An example of a diary sheet for behavioural activation is shown below. 

<html><iframe width="100%" height="400px" 
 src="https://docs.google.com/document/d/1bFvkaLO0mpsw3jjNqO6phFX3HLLukzRCCDSVl1Py_3s/pub?embedded=true"></iframe></html>

Related Pages

[[Tips for Completing Activity Log]]
Source:Peter Fuggle, AFNCCF 

!!Education Mental Health Practitioner

The EMHP is trained by completing a one year post graduate Diploma in EMHP.

The EMHP programme aims to build better links with educational settings and offer quicker and more accessible access to low intensity evidence-based interventions, for mild to moderate mental health difficulties as part of a stepped care model of service delivery. 


Like the CWPs the EMHPs are trained to offer brief, focused evidence- based interventions in a range of settings in the form of low intensity support and guided self-help to young people who demonstrate mild/moderate:

* Anxiety (primary and secondary school age)

* Low mood (adolescents)

* Common behavioural difficulties (working with parents for under 8s)

Please see: [[EMHP Role Specification (JD)]] for a more detailed description of the role of a EMHP

!!Children’s Wellbeing Practitioner

The CWP is trained by completing a one year post graduate Certificate in CWP. 

The CWPs are based in community settings (including schools) and aim to offer brief, focused evidence- based interventions in a range of settings in the form of low intensity support and guided self-help to young people who demonstrate mild/moderate:

* Anxiety (primary and secondary school age)

* Low mood (adolescents)

* Common behavioural difficulties (working with parents for under 8s)

!!Links to other pages
This page relates to the general plan around [[Training]] a new workforce to meet the mental health needs of children and young people and the [[policies|Policy context]] surrounding this.

@@color:red;This page is being developed in light of recent changes to working due to the outbreak of COVID-19@@
''Panic attacks''

*Recognise whether, or not, you are having panic attacks
*Understand panic using specific psychoeducation, what causes it and what keeps it going (use a specific panic formulation)
*Accept that panic cannot harm you
*Learn techniques to reduce panic; this should mainly involve questioning the misinterpretation of bodily sensations with cognitive techniques as above and then facing situations the YP avoids. 
*Also, relaxation, controlled breathing and distraction can help e.g. in an exam situation. 

''Worry'' 

*Hypothetical fear – a worry about something that may happen in the future, e.g. family member dying, house being broken into, failing exams and not getting into university. Intervention = try and let worry go (utilize distraction or re-focusing of attention e.g. 5, 4, 3, 2, 1) and / or utilize worry time (writing the thought down and letting it go until planned worry time).

''Current problems''

* a worry about a problem that YP is experiencing, e.g. not being able to focus on revision, friends arguing, being bullied at school.
*Intervention = [[Problem Solving]] 
<<list-links "[tag[Diversity]]">>
!!!! Resources contributed by Kimberley Saddler, CWP at Whittington Health NHS Trust

<<link-doc "CHILD Parts of my life that affect my wellbeing handout (formulation)" "https://drive.google.com/file/d/1N7UTdTqBukpKCl4s4WYn7G6ysBgc1_7T/view?usp=sharing">>

<<link-doc "Diversity Inclusive TELEPHONE TRIAGE FORM -Whittington Health NHS Trust - Islington" "https://drive.google.com/file/d/1T0AAsyXFVz8hRQaTTH6zYBtcTHgaRABf/view?usp=sharing">>


!!!! The Children's Wellbeing Practitioner BAME Inclusion Group

https://www.linkedin.com/groups/8873855/


<a class="tc-float-right">[img width= 100 [brain.jpg]]</a>

!!!!@@Color:red; THIS PAGE IS CURRENTLY BEING WRITTEN AND IS AWAITING COMPLETION@@ 
Source: Lili Ly and NHS Education for Scotland 

!!What is Diversity?
'''…the recognition and valuing of difference'''

About //equal respect// and valuing the things that make us unique as individuals, not treating everyone the //same //

__Areas of diversity include:__

* gender, including those who are transgender;
* race or ethnicity, including refugees, asylum seekers and gypsy or travelling people;
* religion or spiritual beliefs;
* sexual orientation – being lesbian, gay or bisexual;
* disabilities, including mental health problems;
* age
Please see below for a diagram of the 'social GRRAACCEESS' which depicts all the areas of social diversity that practitioners need to consider.
(originally developed by Burgman in 1999 which has been expanded over the years). 

Image taken from [[ The National Elf Service|https://www.nationalelfservice.net/treatment/psychotherapy/social-ggrraaacceeesss-self-reflection-for-family-therapists/]]

[img[Social GGRRAAACCEEESSS.png]]


!!Mental health provision

"Every person, whatever his or her background, should expect to receive a high
standard of care from mental health services. Delivery of high-quality mental health
services is to a large extent dependent upon staff understanding and putting into
practice some key issues."

Inequalities in people’s health, including their mental health, have been linked to:

* ''socio-economic status'' – living in poverty, for example, and/or living in a socio-economically disadvantaged community
* ''life circumstances'' – being homeless, in care or in prison.
* ''social identity'' – being a woman, being a man, coming from a black or minority ethnic community, being lesbian or gay, or being old or young;
* ''health status ''– being physically disabled. 

!!EMHP practice considerations:
Below highlights diversity areas which you will need to consider when working with CYP and their families in schools.

!!!Gender
*Suicide rates and differences between men and woman: Men are more likely to commit suicide.
*Domestic abuse statistics: 1.2 million woman have experienced domestic abuse

!!!Disability
*co-morbidity of learning disability and other disorders such as ASD 
*Pupils identified with [[SEND|The SEND Framework]] accounted for approx. half of all permanent exclusions (46.7%) and fixed period exclusions (44.9%)

!!!LGBT
*34% of young LGB people had made at least one suicide attempt in their lives, compared to 18% of heterosexual young people
*48% of Trans* young people had made at least one suicide attempt in their lives
*Two in five pupils who have been bullied for being LGBT (40 per cent) have skipped school because of this bullying 
*Half of bullied LGBT pupils (52 per cent) feel that homophobic, biphobic and transphobic bullying has had a negative effect on their plans for future education 

!!!Ethnicity
*Black and ethnic minority people are more likely to be: diagnosed with MH problems, and have poor outcomes from treatment and are more likely to disengage from MH services 
*Pupils of Gypsy/ Roma and Traveller of Irish Heritage ethnic groups had the highest rate of both permanent and fixed-period exclusions
*Black Caribbean pupils were permanently excluded at nearly 3 times the rate of White British pupils
*Across the broad ethnic groups, Black and Mixed ethnicity pupils had the highest rates of both temporary and permanent exclusions

!!!Culture
*Different cultures may have different ways of constructing ‘mental health’ difficulties
*Parenting styles may also differ across cultures

!!Practice points:

Please go to [[Diversity: Shaping Practice]] for a more comprehensive overview of how diversity may shape EMHP practice.

!!Further reading:

[[The School Report|https://www.stonewall.org.uk/sites/default/files/the_school_report_2017.pdf]] -The experiences of lesbian, gay, bi and trans young people in Britain’s schools (Stonewall, 2017) 

[[Race Disparity Audit|https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/686071/Revised_RDA_report_March_2018.pdf]] (Cabinet Office, 2018) see Education section of report (rest of report focuses on adults)

Children and young people with learning disabilities - [[understanding their mental health|file:///C:/Users/lyl/AppData/Local/Microsoft/Windows/INetCache/IE/A5AN11NI/children-and-young-people.pdf]] (Young Minds)


!!Links to other pages:

Please got to [[Diversity]] for a list of pages relating to this topic.
Source: BBC THREE

!!What is it?
BBC THREE produced a series of short clips based around the idea of 'things not to say to ..' In these videos people from specific minority populations give frank and honest insights into what it is like to come from the population group specified and discuss common stereotypes they often hear. 

!!Why is it important?
These videos provide a fun and interesting introduction to diversity and will get you thinking about how diversity may impact your work. They also provide insight into the social and emotional impact that stereotyping has on the lives of those in the videos.

The videos highlight stereotypes and the importance of not assuming a persons personal experience from a generalization of a stereotype. This will be important in your work as and EMHP whilst also keeping in mind that a persons diversity may impact their mental health or their ability to access support. Please got to [[Diversity: Shaping Practice]] for more information.

!!Practice points:
These videos break down barriers around issues which you may find uncomfortable to broach with the specific populations outlined. 

The purpose of these videos is not to produce rigid guidance to practitioners about 'what not to say' to the people you work with. 

You will not always get it right for the people you work with but these videos highlight the importance of remaining curious about the diversity of the people you work with, asking them how they feel it may impact your work together.


!!''PLEASE NOTE: ''

*'' Some of these videos do contain swear words'' 
* ''These videos are ADULTS talking about their experiences.''
*''Some viewers may find the subject matter of these videos emotionally provoking'' (this is something that as practitioners you will need to address and understand why you may find it uncomfortable). 

!!The videos
!!!Faith
[[Things Not To Say To Someone Who Wears A Burqa|https://www.youtube.com/watch?v=FUVWVBrPsTM]]


!!!Disability

[[Things Not To Say To Someone Who Stammers|https://www.youtube.com/watch?v=xlDi0bMNV6g]]


[[Things Not To Say To Someone With Dyslexia|https://www.youtube.com/watch?v=ObwAzZr87jg]]

[[Things Not To Say To People With Tourette's Syndrome|https://www.youtube.com/watch?v=2-YeQUrX5M4]]

[[Things Not To Say To An Autistic Person|https://www.youtube.com/watch?v=d69tTXOvRq4]]

!!Ethnicity 
[[Things not to say to eastern Europeans|https://www.youtube.com/watch?v=l9Qm8jzomkU]]

[[Not To Say To Young Black Men|https://www.youtube.com/watch?v=2XPmyr5HRLY]]

[[Things Not To Say To A Refugee|https://www.youtube.com/watch?v=Rg3eaUj7Ovk]]

!!Sexuality
[[Things Not To Say To Gay People|https://www.youtube.com/watch?v=ujxl5WZJHL4]]

[[Things Not To Say To A Trans Person|https://www.youtube.com/watch?v=pvBwWeG4Rpc]]

!!Mental Health

[[Things Not To Say To Someone With OCD|https://www.youtube.com/watch?v=RDQPfR84cYE]]

[[Things Not To Say To Someone Who's Been Sexually Assaulted|https://www.youtube.com/watch?v=ySgTgJOqlgE]]

!!Links to other pages:

Please go to [[Diversity]] for more pages relating to this topic
* need to have an understanding of the stereotypes someone is being exposed to use it to try to engage the young person.
* Don't ever assume someones experience.
* Practitioners/ research have a tendency to focus on the negative instead of the richness of different perspectives

!!!Getting it wrong!
You will not get it right for everyone, important to ''acknowledge'' this and ''remain curious'' about their experience. 

''“I think I might make an error and offend you here so can you tell me if I do.”''

Try to use the wrong doing to build a stronger [[‘therapeutic’ relationship|Therapeutic Alliance]] and to break down barriers of awkwardness.

!!!Prejudice
Being politically correct: we all have prejudice but be aware of this and leave it at the door. 

Important to acknowledge that you may feel more comfortable talking to some people/ on some subjects rather than others- need to be aware and mindful of this.

!!!Working in schools:
*Teachers may have specific views on gender inequalities: Language used by teachers about gender stereotypes
*develop ways to have conversations about the messages being given in schools around gender 
*Running workshop in schools about male suicide rates and toxic masculinity- getting the head to talk about issues. Working on multiple levels.- 

!!Tips from MIND
MIND is a mental health charity that provides advice and support to people experiencing a mental health problem as well as campaign to improve services, raise awareness and promote understanding. 
Please go to MIND's website for their [[Top Tips|https://www.mind.org.uk/workplace/influence-and-participation-toolkit/how/planning/diversity-and-difference/]] on how to work with the framework of embracing diversity.

!!Links to other pages:

Please go to the page [[Diversity]] for a list of related pages.
Dog Poo Analogy (adapted from Stott et al., 2010; Kendall, 2012): Several people hurrying out of their block of flats fail to notice some dog poop on the path outside and step right into it!  

 
The first person thinks, “Well, that’s just my luck. This just like my whole life. I can’t do anything right. There’s no use in even trying today. I am just going to go home and go back to bed.” How would you think he is feeling? If you guessed sad, depressed or something similar, you’d probably be right!  

But now, imagine a second person leaves for the day and steps into the same pile of poop. This time, the person looks down at her shoes and thinks, “Oh no! I'm already running late! If I go home and change my shoes, l’ll be late for my meeting and my boss will think I am disorganized! But if I go to work with this poop still on my shoes, my boss will surely smell it and think I have a hygiene problem! I could get fired! What am I going to do?” How would you think she is feeling? If you guessed anxious, worried, or something along these lines, you’d also probably be right!  

Imagine a third person hurrying out steps into the same pile of poop! This time, however, the person looks down at his shoes and thinks, “What kind of world am I living in? This neighborhood is going downhill fast because people just don’t have the decency or consideration to care about cleaning up after themselves! I am certain that I know the S.O.B. whose dog made this mess! I am going to sit on my porch and wait for him to come by and then let him have it!” How would you think this person is feeling? If you guessed angry, mad or something similar, you’d probably be right again! 

How is it that three different people, encountering the same situation (stepping in the poop), can have three very different emotional reactions to the situation? Is it really about the poop? Well, yes and no! (1) it is not events in life that upset us, but rather our thoughts about these events, and (2) specific emotions are connected to specific thoughts. 
<a class="tc-float-right">[img width= 300 [sunshine-2596172_960_720.jpg]]</a>

This is a photo of some nice sunshine.

We can now embed images

To the right hand side, this is a great asset!

Will help to break up paragraphs and any dense writing.1111111111111111111

The only issue seems to be the comment function bar- must ask jeremy about this. 


!! But if we keep writing it goes down
''Today'' we are __editing__ the CWP Guide.

!! Day of the week

* Monday 
* Tuesday
* Wednesday 

The way we think: Often when we feel anxious we will be thinking that something bad will happen. Our thoughts tend to focus on potential threats and how to escape them. This can sometimes be useful e.g. if your child is about to step onto a busy road, it is good to be focused on the potential danger and getting your child out of the way.

<<list-links "[tag[COVID-19 Resources]]">>

Source: Helen Barker and colleagues 

---

!!'''Getting to Grips with Anxiety'''
The approach to helping young people with anxiety is summarised in the manual called 'getting to grips with anxiety'.  This has been drafted by Helen Barker and colleagues and provides a step by step account of how to help a young person with anxiety. 
We are indebted to Helen Barker and her team for generously sharing their work on adolescent anxiety with us.

Please use the link below for the full manual:

<<link-doc "Getting to grips with anxiety" "https://drive.google.com/file/d/1wUrDMPAYZnq0c1WPOEopQjmGV8SCS3Ri/view?usp=sharing">>

@@font-size:12px;
<<< <<link-doc "The Previous version of Getting to grips with anxiety can be found here" "https://drive.google.com/file/d/1CFJ4RymiV2RIlE4qksaUYgGz1DQntLLp/view?usp=sharing">> 
@@

---

!!''Introduction''

*This framework is designed as a guide as what might be useful content to cover in a course of guided self-help (GSH) for anxiety with adolescents. 
*Services should feel free to try this out and adjust accordingly. 
*Services should experiment with materials and resources available to them and utilise websites such as ‘get self-help’ or ‘Mind-Ed’ and other [[self-help materials|Self Help Materials]] / books / literature. 
* We encourage services to develop their own booklets. 
*Although GSH is a mixture of shorter and longer sessions; the modality these sessions take place in (e.g. phone/Skype/face to face) will likely differ between services.

!! ''Sessions overview''

[[Session Overview for Overcoming Adolescent Anxiety]]

!!''Session Plans''

For a full list of session plans based on  'Getting to Grips with Anxiety' by Helen Barker and colleagues go  to:
[[Session Plans for Overcoming Adolescent Anxiety]]


!!''Related pages:''

Please also go to 
[[Working with Adolescents with Anxiety]] for general guidance on how to work with YP who are experiencing anxiety. 

!!Supplementary Manuals
 The Kings College London CYP-IAPT teaching team have also developed some excellent manuals ''to be used alongside the 'Getting to Grips with Anxiety' manual'', for more detailed guidance with the specified areas below.

!!!Injection, blood and injury fears supplement:

<<link-doc "Supplement: Injection, blood and injury fears" "https://drive.google.com/file/d/16SRtHJyJ0sXQWoF9pGUdRFBVt5ZW_JK7/view?usp=sharing">>

!!!Managing Panic supplement:

<<link-doc "Supplement: Managing Panic" "https://drive.google.com/file/d/1qt2Q_ZK1QV1ZKkUGdsWV5-G2WfxiJAiI/view?usp=sharing">>

!!!Managing Worry supplement:

<<link-doc "Supplement: Managing Worry" "https://drive.google.com/file/d/1DwsXWSq-cIj-TuXCrSCPs6tC9tqvtiQX/view?usp=sharing">>

!!!What to do when our thoughts get in the way supplement:

<<link-doc "Supplement: What to do when our thoughts get in the way" "https://drive.google.com/file/d/1sAtXtolQIYypSd7r8dEHoVYcjaXKw1TP/view?usp=sharing">>

@@
<<< <<link-doc "The Previous version of What to do when our thoughts get in the way can be found here" "https://drive.google.com/file/d/1Yzf2FE62B95fdgleePm88HA8GxMTdmjt/view?usp=sharing">> 
@@
!!!!!Source: Peter Fuggle
!!Engagement
''The basic stance for engagement - How can I help?''
*''Engagement'' includes a wide range of practitioner skills. These can be broken down into lots of important components. These are useful but there is a risk that the core stance can become a bit over-complicated in description and technicalities. 
*Engaging young people, children and their parents in a process of guided self help requires the practitioner to adopt a non-critical stance of warmth, genuineness and empathy combined with ''a wish to understand things from the child, young person or parents point of view''.   
*The intention is to be helpful to the family and not to start with what the family has to do to follow our systems and practices but to start in the same way that one may be addressed in a shop - 'how can we help?'. This basic stance is probably more important that being technically proficient in specific practices although these may help. 
*Engagement is a process that is obviously prominent in the initial contacts with the family but essentially requires that the practitioner remains attentive to the nature of the relationship that he/she has with the client. 
!!!''Specific techniques for supporting engagement'' 
There are a number of techniques have been shown to facilitate engagement in contacts with clients. These include:
#[[Active Listening]]
#[[Summarising]]
#[[Validating]] 
!!Links to other pages
This process is much more fully covered in a series of pages around the [[Therapeutic Alliance]]. 
Please find a list of pages which relate to the subject of engagement. 
<<list-links "[tag[Engagement]]">>
Please find a useful articule from the mix on [[exam stress|http://www.themix.org.uk/work-and-study/study-and-exam-tips/exams-and-the-pressure-to-do-well-23966.html]]. 
This may be an article you want to share with YP, parents/ carers or teaching staff.

! Question:

''How'' do we __upload__ a video?

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/J3PNCBPqJ7o" frameborder="0" allowfullscreen></iframe></html>

What about images?

[img[brain.jpg]]


We have uploaded an image of some building block:


[img[sunshine.jpg]]

The beautiful sunshine!


<<link-doc "RCADS "  "https://drive.google.com/file/d/0B-tACu2wi4-4dEdqbk93SlNvTE0/view?usp=sharing">>


<<link-doc "CWP BAME inclusion group flyer" "https://drive.google.com/file/d/1OKiWCRxNMBDSgf8zHW3zV9WasUefGqnD/view?usp=sharing">>

<<link-doc "CWP BAME Inclusion Group Powerpoint Presentation" "https://drive.google.com/file/d/1OKiWCRxNMBDSgf8zHW3zV9WasUefGqnD/view?usp=sharing">>


!!!!!Source: Peter Fuggle 
!!Nine components of guided self help.
These are offered as a general steer about what is meant by guided self help. It should not be treated too rigidly. The intention is to provide a framework so that practitioners can apply this to their work with children, young people and parents. If you are not doing any of these activities, then it would be good to think this through with your supervisor. 

It may not be necessary to do all nine steps for each case. The practitioner should seek feedback at each stage. Outcome monitoring needs to take place throughout. 
#[[Engagement]] (getting to know each other) 
#[[Making sense of things]] (formulation)
#[[Deciding on what you want to change]] (setting goals)
#[[Learning about the problem]] (psycho-education) 
#[[Trying out new things]] (doing experiments)
#[[Problem Solving]] (things rarely go to plan) 
#[[Outcomes]] (Learning from new experiences) 
#[[Building a back up team]] (not doing it alone) 
#[[Agreeing a future plan]] (making a self management plan) 
Self management has many overlaps with guided self help. It could be considered that self management is supported by promoting various forms of self help. 

 <<link-pdf "Self-managment vs. self-help" "https://drive.google.com/open?id=0B1hDLHd8syMsSm9EeTdXRUc3ZlE">>

!!Linked pages
[[What is a 'low intensity' intervention?]]
<<link-pdf "Video Equipment Guidance" "https://drive.google.com/file/d/18Rty4K9EQr4yGxDvjPrMVBloSFqNb9Yq/view?usp=sharing ">>

*This is only a guidance, please check with local information governance leads 
! ''__This is a test__''


this will be an interesting journey 

what is the difference between diversity and inclusion?


https://lnkd.in/gP_ncJe

!!''Chapter 1:'' 

* What are fears and worries?
* What do we mean by fears and worries?

Worries fears and anxiety have 3 things in common:

The way we think: Often when we feel anxious we will be thinking that something bad will happen. Our thoughts tend to focus on potential threats and how to escape them. This can sometimes be useful e.g. if your child is about to step onto a busy road, it is good to be focussed on the potential danger and getting your child out of the way.
This is a tag tiddler

All pages in this guide are expected to be updated and improved but some pages are specifically unfinished. All such pages are listed below. 

<<list-links "[tag[Draft pages]]">>
This is a tag tiddler
<<list-links "[tag[EMHP]]">>
This is a tag tiddler


Eating disorders are complex disorders that can have many underlying causes which tend to manifest during adolescence. There are multiple types of eating disorders and it is crucial to recognise the symptoms early on. Eating disorders, while serious, are treatable, and it is very possible to make a full and sustained recovery.

[[Beat|https://www.beateatingdisorders.org.uk/tips]] the UK’s eating disorder charity has a very useful page outlining 'Tips for Spotting the First Signs of an Eating Disorder'. This website also has [[downloadable resources|https://www.beateatingdisorders.org.uk/types/downloadable-resources]] such as posters, leaflets and guides for friends and family.

[[Healthy London|https://www.healthylondon.org/resource/guidelines-for-referring-children-and-young-people-with-eating-disorders/]] has some really useful guidelines for primary care professionals about treating children and young people with eating disorders.

 

<<list-links "[tag[Education Resources]]">>
!!!!!Source: Peter Fuggle
!!Engagement
''The basic stance for engagement - How can I help?''
*''Engagement'' includes a wide range of practitioner skills. These can be broken down into lots of important components. These are useful but there is a risk that the core stance can become a bit over-complicated in description and technicalities. 
*Engaging young people, children and their parents in a process of guided self help requires the practitioner to adopt a non-critical stance of warmth, genuineness and empathy combined with ''a wish to understand things from the child, young person or parents point of view''.   
*The intention is to be helpful to the family and not to start with what the family has to do to follow our systems and practices but to start in the same way that one may be addressed in a shop - 'how can we help?'. This basic stance is probably more important that being technically proficient in specific practices although these may help. 
*Engagement is a process that is obviously prominent in the initial contacts with the family but essentially requires that the practitioner remains attentive to the nature of the relationship that he/she has with the client. 
!!!''Specific techniques for supporting engagement'' 
There are a number of techniques have been shown to facilitate engagement in contacts with clients. These include:
#[[Active Listening]]
#[[Summarising]]
#[[Validating]] 
!!Links to other pages
This process is much more fully covered in a series of pages around the [[Therapeutic Alliance]]. 
Please find a list of pages which relate to the subject of engagement. 
<<list-links "[tag[Engagement]]">>
Source: Joe Hickey and Peter Fuggle

!!Therapeutic alliance and engagement

For information on what a Therapeutic alliance is please go [[here.|Therapeutic Alliance]]

The strength of therapeutic alliances have a massive impact on the [[Engagement]] and [[Outcomes]] when working with CYP and their families. As such it is important to begin developing a positive relationship or alliance from the first meeting.


!!Low intensity and guided self help

''Your role:'' to provide materials that the client can then use to help themselves outside of the context of a therapeutic space

Most of your direct work with CYP will be low intensity face-to-face interventions or guided self-help (GSH).
Attention to therapeutic alliance is vital in brief and manualised work. 

*Think about their level of understanding/check in about what they make of completing the materials. 
*Important to let them engage as much as possible (they hold pen, read etc)
*Find ways in which you illustrate that we don't always know how we spend our time etc in a sensitive way during BA tasks etc (that are helping YP to see their life). It's an important first step in them becoming active and aware of their own situation. 

Ask yourself: How well are you and the young person aligned in terms of goals, tasks and bond?

!!Exploring through questionnaires
You should aim to use questionnaires when working with CYP as if done in the right way it can be a great way to start having conversations about the problems that the CYP is having. 

*You have to be clear about checking out self harm and risk in the first session. Please go to [[Risk and Safety Assessment]]
*To get detail, you have to ask lots of questions (which can seem like an interrogation). Measures (e.g. RCADS) can be used to compliment questions and efficiently get to a shared point. 
Please go to [[Using Feedback and Outcome Tools]] for more information on how measures such as the RCADS can be beneficial and how to use them correctly.

!!How to set up a first meeting

*Be clear about who is attending and why
*Set boundaries of confidentiality
*Introduce the outcome measures
*begin to [[build a therapeutic alliance|Building a Therapeutic Alliance]] with the CYP 
*Use [[Active Listening]]
*[[Risk and Safety Assessment]] (This will be done during the assesment session which may be conducted by you or by your supervisor depending on what you have agreed)

__Setting expectations__

*Prepare client for the short nature of relationship
*What are they finding difficult? create specific goals together that you can work on together 

__Physical environment__

*Check the room’s suitability and availability in advance
*Make sure there is a clock or watch
*Arrange the furniture to align with enacting collaboration (chairs next to each other rather than facing each other)

__Session materials__

*Have ready what you will need (paper, pens, worksheets, toys)

__School setting__

*Check the CYP’s teacher/tutor is aware they need to leave class
*Check where they will return to after your meeting - is there a space they can go afterwards to 'cool off' before returning to lessons?

__Time boundaries__

*Agree the length of meeting
*Consider the school timetable
*Arrive in good time and be reliable

!!What does this look like?

Please click on the box below to view a role play video of meeting a CYP for the first time. (You will need to log in to access this video).

<<link-pdf "Session 1: Low mood video"
 
"https://manuals.annafreud.org/emhp/private.html#Session%201%20Low%20Mood%20Video:%5B%5BSession%201%20Low%20Mood%20Video%5D%5D">> 


!!Links with other pages:

Please see [[Therapeutic Alliance]] for more information on  the importance of therapeutic alliances for EMHP's. 

Please go to [[Building a Therapeutic Alliance]] for guidance on how to build therapeutic alliances successfully.

Please go to [[Using Feedback and Outcome Tools]] for guidance on how using questionnaires/ outcome measures like RCADS can support the therapeutic alliance.
!!!!!Source: Vicki Curry and Kate Martin 
!!''Engagement & Shared decision making'' 
*The pages on [[Engagement]] are all interconnected and contribute to engaging CYP in a collaborative way.
*Practitioners should consider specific developmental factors as well as systemic factors which might affect the [[Therapeutic Alliance]]
*YP are often ‘sent’ or brought for treatment.
* motivational issues
*Developmental issues 
*Power imbalances
*Establishing meaningful goals 
*Confidentiality
*Maintaining change in different contexts

When building up a collaborative relationship consider the following:

*What helps you to feel at ease?
 *What might make you feel less comfortable?
*What encourages you to ‘open up’ to another person, and what puts you ‘on your guard’?
Therapist factors have been shown to have an influence on engagement: e.g. flexibility, honesty, respectfulness, trustworthiness, confidence, warmth, being interested in the client, and openness (Ackerman and Hilsenroth, 2003) as well as techniques such as:

**exploration, 
**reflection, 
**noting past success in therapy, 
**making accurate interpretations,
**facilitating the expression of affect
 **attending to the patient’s experience (Ackerman and Hilsenroth, 2003). 
Remember the importance of [[Socratic Questioning|Socratic technique]] (Fuggle et al, 2013) 

The Model of Behavioural Change (Prochaska, ~DiClemente & Norcross, 1992) is a useful framework to consider CYP / parent motivation and readiness to change.

!!''Shared decision making''
See also [[Shared Decision Making]] for further consideration of this.

*Shared decision making is a crucial part of working with CYP research has suggested there is often a gap between our/services’ intentions, CYPs experience and what happens in practice.
*Lack of involvement can lead young people to feel out of control, affect their willingness to seek help or agree with decisions that have been made, or drop out (Kate Martin’s slides, 2018). 
*Often our view of what is in a child's best interest overrides their choice. We need to challenge this.
*Need to bear in mind that the parent will often have a different viewpoint to child. 
*There may be a number of service and context factors which make it hard for professionals to feel confident in how to involve CYP in decisions e.g. complexity of disagreement within a team about a child, risk for multiple parties, lack of ‘thinking time’, pressure on services, staff feeling powerless as they are not the ‘decision makers’
*Interestingly however, CYP have shown us the following about shared decision making: 
**The process of deliberation is often more important than the outcome
**They learn and internalise decision-making processes
**Reduces resistance or passivity 
**Increases awareness and understanding of risk, boundaries and restrictions as well as possibilities
**Increases safety
!!''The process of shared decision making''
See section 'open talk' on the page [[Shared Decision Making]]  for practice points on this subject.
It is routine to ask children and young people about what they are good at. This is clearly an important part of the approach but the question can evoke a mixed set of responses which it is helpful to anticipate. 

For some children and families, they genuinely cant think of anything. This may be because they are thinking in very narrow terms such as what subjects at school a child is good at. The practitioner needs to encourage the family to think more widely.

Light prompts with a little humour may help this process.

//'I guess I was wondering about things like going on Facebook or knowing everything about Arsenal. It doesn't just have to be serious stuff. Some people are really good at helping others or looking after their younger brother....'//

Some children find these sorts of questions a bit tedious and perhaps a bit phoney - a bit like 'what they like about school?'. Sometimes doing it in a more circular way, can open things up a little. 

//'If I was to ask your grandma what you are good at, what do you think she might say?'//. 

This may prompt a little discussion between family members. 

Some children and families just never speak about what they are good at. Social modesty may make this question quite strange. This is fine but may be helped by being recognised. 

//'Maybe this is something that isn't talked about much in your family. Some families are really good at being quiet about their abilities and talents.'//

It is not necessary to get a big list of strengths. The important thing is that the practitioner has communicated an assumption that everyone is good at something and that he/she will keep an ear open for such things as they go along. 
Sequence for interactions in therapy: establishing trust.
!!!Communication 1: Teaching and learning content 
*Therapist conveys a model for understanding to try to help the CYP understand (and see if it fits for them)
*Looking at same experience but from a different, more compassionate angle 
!!!Communication 2: Mentalization
*Trying to work out what is going on between us (so that you trust that I understand you)
*Epistemic trust: A sense that therapist sees me and the version you see matches the version I am experiencing. This is a window of opportunity (they will now show interest in the next thing therapist says)
*When we are anxious or depressed we don't tend to look at people and think you trust them/ that they are going to help you. 
*This helps to re-establish the basics of social learning
!!!Commination 3: Re-emergence of social learning
*Back up team can reinforce opportunities for social learning 
!!!! Explored and Explained by Isaac Cook, EWP at SLaM

[img[Equality Wordcloud.png]]

(source: https://stateofwales.com/2018/04/equal-wales-why-equal-rights/)

<iframe width="560" height="315" src="https://www.youtube.com/embed/4K5fbQ1-zps" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

!!!! Equality Act, 2010 GOV UK
https://www.gov.uk/guidance/equality-act-2010-guidance#:~:text=The%20Equality%20Act%202010%20legally,strengthening%20protection%20in%20some%20situations.


!!!! The Children's Wellbeing Practitioner BAME Inclusion Group

https://www.linkedin.com/groups/8873855/

There area a very wide range of self help materials available. This page provides links to guidance on how to assess the quality of self help materials available to children, young people and their parents/carers. 

  <<link-pdf "Evaluating self help material" "https://drive.google.com/open?id=0B2_m9ZgGWI-jUDlvNnBBVFQ2d0E">>
In the adult IAPT programme, a guide was  produced that provided a method for assessing self help materials for clients. This can be found at the following address. 

<<link-pdf "Criteria for self help materials" "https://docs.google.com/document/d/1OTKNmfUn_TQ4wkxKGmc_t-4JgULubPsjCPNx3PiPjGU/edit"">>

The guide lists 20 criteria which could be used to assess the quality of self help materials. These are grouped into four main sections. The paper includes an evaluation tool to audit materials in a programme. 
#''Scope'' 
##targeted
##relevant
##clear
##readable
##complementary 
#''Evidence''
##accurate and reliable
##comprehensive
##balanced
##peer reviewed
##current
#''Engagement''
##empathic
##illustrated
##positive
##collaborative
##interactive
#''Implementation'' 
##goal focused
##action focused
##self monitored
##preventive
#''Transparent''
##transparent in terms of sources etc


!!!Low intensity psychological treatments with children and young people: evidence base (use anxiety disorder as an example) 
*Real need for tier 2 interventions targeting children who don't reach the threshold for CAMHS using evidence-based interventions 
*Many children are experiencing difficult problems but not receiving any help 
*Offering low intensity treatments supported by self help materials means that this may enable high intensity for the children with more severe problems  
!!!Discussion points 
*What is important to know about interventions- GPS-CBT
*Does it work? 
*Who does it work best for? 
*Do people like it?
** Some parents and therapists like this approach 
*Is it relevant or generalizable to our population? 
*Cost and resources associated with it? 
**More cost-effective than brief treatments 
*Who has been studies?
** Rural Australia, PCAMHS, ANDY. Studies not limited to people with formal diagnostic criteria 
*What is it better than? 
**Number of things that obtained similar results 
*Does it last over time? 
**Improving outcomes over time, looked at on an individual basis 
*Cultural differences- research populations haven't been diverse i.e. English second language 
!!!Anxiety in young people 
*Understood to have a particularly early onset 
*Cochrane review have shown interventions can be effective compared to waitlist controls, guidelines suggests CBT to be the optimal first-line treatment 
!!!Evidence-base 
*Used to outcome results of around 60%
*Interventions not fully delivered by the therapist e.g. accompanied by a book (given to parents), computerised CBT. 
!!!Computerised CBT (CCBT) for adolescents 
*Some evidence of effectiveness with adolescents, but no strong evidence for children with anxiety disorder. Also included a lot of therapist input or become outdated after the research to prove its evidence base. 
**Research has shown less emphases on adolescents with anxiety due to either using a bottom up approach (making child interventions less childish) or top up approach (editing adult interventions). The specific needs for adolescents and what is maintaining the anxiety is not being targeted. 
**BRAVE program for adolescents- Psychoeducation, relaxation, helpful thoughts, facing fears (begin in session 6), problem solving, self-praise then maintenance. 
**Does it work? Do young people like it? They liked the convenience of doing it online at any time of day, but felt they didn't take the information in without face-to-face therapist contact. Raised the issue of optional modules such as exam stress. 
**Did the parent sessions make a difference? 
!!!Computerised CBT (CCBT) children 
*Guided parent-led approaches using bibliotherapy to implement CBT techniques in day to day lives 
*Multiple pathways to the development of child anxiety 
*Parents of anxious children express fear and transfer information ("are you sure you're alright?") which make children feel scared about things, also promote less autonomy ("do you want me to do that for you?")
*Parents have a profound effect on the anxiety reactions of their children if they have high trait anxiety 
*Natural responses for children being anxious
*What are the implications?
**Effective to deliver interventions for child anxiety through parents because parents can learn skill which they can implement throughout the week instead of one hour therapy session. 
**Also gives parents alternative ways to respond to a child's anxiety 
*Does it work? 
**Found the general principle can work- parent only group much better than nothing and no different outcomes in the parent and child group (which has twice as many therapists) 
*Lead to the development of the CWP book 'Overcoming your child's fears and worries'
*What is the evidence? 
** 5 hour version better than nothing, shorter version less effective but hardly any difference in the long term 
**Doesn't matter who could deliver the treatment in the 5 hour version i.e. clinical psychologist, PHD student, Psychology graduate. This is due to the manualised and structured way of the intervention.  
*Do people like it?
**High level of parental satisfaction, happy to have as little treatment as possible as long as they felt like they were getting better 
*Is it better than anything else?
**Solution Focused Brief Therapy- flexible with parental involvement but primarily worked with children. Find the exceptions to problems can help you find solution to the problem. No difference in outcomes between Brief and Guided Parent Delivered CBT. Outcomes also similar to high intensity treatments. 
*Cost-effectiveness?
**GPD CBT telephone reduces travel costs, Brief travelled out to patients. Differences in admin costs, Brief needed much more extensive notes whereas GPD CBT did not as it was so structured. 
!!!Can we make GPD CBT more efficient?
*Group approaches- normalise experiences, reduces feelings of isolation and increases feelings of self-worth 
*Qualitative themes include Acceptability (clinicians don't get 'dragged' into individual problems), Accessibility (importance of how we sell the group in the beginning; limited to timings) and Treatment Outcomes and their Mechanisms (normalised behaviours; share ideas for problem solving). 
*Need to keep in mind different options for different families 
!!!Future Steps
*Putting GPD CBT online through a collaboration with a tech company and PPI groups- currently in the feasibility phase
*Getting young people more engaged in the intervention - use accompanying child app where the child can unlock games when they complete a challenge associated with the intervention
*Conducting research into cultural differences 
*Add parental tolerance strategies- extra sessions on patterns of emotional responses (Tolerating your child's negative emotions). Found to go down naturally with GPD CBT, addition on extra session made no difference
!!!Key points
*Don't worry about parent anxiety and it's effect on child anxiety outcomes 
*Good evidence low intensity interventions work in a cost-effective way but increasing resources
*Potential to work individually, in groups and online 
!!!Q&A
*Ending treatment
**Data shows gains after treatment, and those who have made gains do not use them 
**How do we capture the final outcomes using ROMs- booster session at 3 months (check progress, final data point, discuss step up if needed) 
*Follow-ups: will the young people still have the skills and tools if a significant life event happens.
**Qualitative work found that parents went back to the skills they learnt in therapy and worked through the problem 
*Adolescent population- not used but in book as people asked for it. Adolescents want to be more involved in their treatment and it's difficult to maintain the same approach. Not evaluated. 
Please find a useful articule from the mix on [[exam stress|http://www.themix.org.uk/work-and-study/study-and-exam-tips/exams-and-the-pressure-to-do-well-23966.html]]. 
This may be an article you want to share with YP, parents/ carers or teaching staff.
Every week you go to the same shop to buy your loaf of bread you cant wait to get it home- its always baked to perfection, it butters really nicely, its so tasty! 

One week, you get your bread home and find that it is covered in green mould! What do you do? Likely that you will take it back to the shop and complain!

What do you do all the times the bread is baked to perfection? Do you go in and tell them how wonderful it is? 
It is hard determining exclusionary criteria for the CWP Programme because all services are different. As such, referral criteria will often depend on the service context. 

Nevertheless, there are some problems, diagnoses, and symptoms that are definitely not appropriate for [[low intensity treatment]] within the CWP Programme. These include:  (1) Patients whose primary referral is for a psychotic disorder.  (2) Patients who experience distress associated with [[attenuated psychotic symptoms]]

In these cases, it should be obvious that a referral should be made to either a (a) Early Intervention Service or (b) [[tier-3 CAMHS]] with a psychosis pathway so that the client can receive multidisciplinary assessment and treatment. 
@@color:red;This page is being developed in light of recent changes to working due to the outbreak of COVID-19@@
Source: Peter Fuggle, AFNCCF

!!What is it?

The Experience of Service Questionnaire formerly known as Chi-ESQ was developed as a means of measuring service satisfaction in Child and Adolescent Mental Health services. The ESQ is the most widely used feedback measure in this programme and should be used as the default measure for obtaining systematic feedback from the child, young person or parent.

Details about the ESQ can be found on the [[CORC website|https://www.corc.uk.net/outcome-experience-measures/]] (Child Outcomes Research Consortium) and is summarised below:

*The ESQ allows a family’s experiences with the service to be understood alongside the child’s symptom reduction.

*The ESQ consists of 12 items and three free text sections looking at what the respondent liked about the service, what they felt needed improving, and any other comments.

!!How to use it?

This measure should be used ''near the end'' of an intervention with a young person or parent around session 6-8. There are three versions of this questionnaire:

* one for parents
* one for children aged 9-11
* one for young people aged 12-16.
 
The measure is loaded on [[POD]]

However for a paper copy of the questionnaire please see below:

<<link-pdf "Paper version of ESQ" "https://drive.google.com/drive/u/1/folders/1Hub2gtgS4x2rPeMomKGl8nKxEq-SYGSC">>

!!Links to other pages:
Please go to [[Outcomes]] for a list of relevant pages about outcomes overall.

Please go to [[Using Questionnaires]] for guidance and tips on how to use outcome measures in practice to enhance therapeutic alliance

Please go to [[POD]] for a list of all related pages.
!!!How do you feel when asked to do a role play?
*Bodily sensations: hot, butterflies in stomach, heavy breathing 
*Feelings: Anxious
*Thoughts: 'I will go red', 'I will say something wrong' 'People will judge me negatively' 'I will make a fool of myself' 
*Behaviours: Shifting in seat, trying not to be seen, avoiding eye contact 
**This shows that we all feel anxiety. But it is important to distinguish between normal anxiety and an anxiety disorder
!!!'Normal' anxiety versus anxiety 'disorder' in CYP
*Try to work out what is normal and when it becomes a disorder 
*To do this we need to think about how much distress/impact it has on YP
*We also need to think about developmental stage and what it normal e.g. children aged 2-4 find it more difficult to distinguish between fantasy and reality so anxiety might be related to fantasy, but this might be normal levels of anxiety for age group
*In order to figure out what would be appropriate treatment (e.g. signpost or LI treatment) we need to assess the impact that it has on CYP e.g. is it keeping them up every night?
!!!Cultural differences in anxiety
*Gender: Men tend to present less for anxiety
*Age: they aren't going to be able to come in and tell you they feel anxious. It might just be the behaviours that are clear (and they may struggle to identify thoughts)
*Socio-economic factors may affect what anxieties are about. It is important to objectively understand the viewpoints of the person and what these things are influenced by (we all come with our own values/beliefs etc, and it is important to put that aside to understand it from the client's perspective)
*Cultural influences e.g. 'stiff upper lip' - 'just get on with it'
*Important to understand the groups that they belong to, which affects labels they put on anxiety e.g. gang culture = anxiety is 'weakness'
*Cultural differences in who reports anxiety and the barriers to this (anxiety might hold a certain connotation in cultures where performance is highly valued). These people might present with other things e.g. within a medical model (physical complaints) because these are more acceptable in their culture
*Western conceptualisation of anxiety: important to think about the construct of anxiety that we hold and how you explain that to someone who doesn't 
There is a nice explanation of a fear thermometer on youtube. This video takes about 4 minutes and is a good overview of scaling anxiety but also could be shown to a child young person or parent. 

https://www.youtube.com/watch?v=ek8rbdC0vAY

[img[bookshelf.jpg]]


!!!!!Source: Peter Fuggle

!!!''Introduction to the Finding Out area''
This area of the guide is about providing knowledge and skills to support the work of CWP's. The purpose is to develop and expand the CWP's knowledge, skills, practice and understanding of the theory and research which sits behind CWP practice. 

!!!Wellbeing Practitioners
The pages within this section of the guide are designed to help practitioners gain a deeper understanding of the main topic areas covered in their training. For instance if practitioners wanted more information about Psychoeducation or additional self help materials and videos for their work with YP and families they can explore these topics using the links below or by searching for them.

!!!Supervisors
CWP supervisors may find these pages helpful in providing information about the low intensity guided self help approach that CWP's are trained to deliver. 

!!!Navigating 
More information about  how to do this can be found in [[User Guide]]

There are three main ways to find things in this section:

*__Search bar__- type a specific word you want to find some basic information about.

*__Library__- If you just want to see what there in this manual use the [[CWP library]] which lists all the pages in the guide, click on any page on interest. 

!!''Main Topics''
The pages in the Finding Out area are organised into topics, as listed below:

# [[Child/Adolescent Mental Health Problems]]- the nature of child and adolescent mental health problems.
# [[Child and Adolescent Development]] - aspects of child and adolescent development
#[[Working with Parents]] - supporting the key role of parents 
# [[Outcomes]]- monitoring and reporting outcomes
# [[Guided Self Help]]- information surrounding guided self help, Knowledge practice and skills
# [[Psychoeducation]]  - knowledge, information and resources for understanding mental health problems  
#[[Assessment]] - knowledge, information and resources to support practitioners in conducting assessment sessions
 
!!!Specific Mental Health Problems 

# [[Low Mood]] 
# [[Anxiety]] - for both children and adolescents
# [[Behaviour Problems]]









There is some evidence, particularly from low intensity work for anxiety,  that clients continue to improve following the conclusion of regular sessions. 

We suggest that doing a ''six weeks/three month telephone follow-up'' for all low intensity cases as part of routine care and as a way of evaluating outcome should be used for all conditions. 

Decide on what outcome measures to use at follow-up within sites, and try to stay consistent to this. 
!!''General format:''
*All manuals to have a Top bar 
*All manuals to have the same size side bar 
*All manuals to have the Anna Freud logo on the side bar
*All manuals to have the name of the manual on the side bar in same colour (black)

!!''Colours:''
*Colour on brand for links, top bars, titles, text colors (ie make the standard ‘blue’ a AF blue?)
*Different colors (as long as on brand) for top bars for different manuals
!!''Text:''
*All text to be in ‘New verdana’
*The spacing should reflect the size of the font- i.e. headings should have larger spacing around them/ underneath them and main text should have smaller spacing (By a fixed amount that is consistent across manuals)
!!''Headings:''

*All word in headings to begin with upper case except for joining words such as: a, and, of 

* ! (H1): don’t use as too big
* !! (H2): used for all Headings, and to be in bold black 
* !!! (H3): used for all subheading and to be in bold black
* !!!!! (H5): to be used for ‘Source:’ not bold (Should be at the top of the page)
!!''Linking:''
*Google doc buttons: need to be smaller, rounded edges – change colour when you hover over it?
* YouTube button- to be created small as well but different colour – link to style of youtube- to make it clear 
* Website links- to be hidden by:
 [[ 
word | website ]]
The CWP Programme aims to help children, young people and parents with four common mental health problems. These are: - 


!!''[[Child Anxiety]]:''
The main approach here is based on the work of Cathy Creswell and her team at Reading University. The specific sessions plans for this approach are shown in the [[Session Plans for Overcoming Child Anxiety]].

This is based on Cathy Creswell's ''Overcoming your child’s fears and worries'' [[book|Child Anxiety: Book]]. The terapist guide can be obtained by following the links below:

*For [[individual|http://centaur.reading.ac.uk/65537/]] programme manual 
*For [[group|http://centaur.reading.ac.uk/65533/]] programme manual

!!''[[Adolescent Anxiety]]:''

include sessions with young people using 


The main manual used to guide practice is the 'getting to grips with anxiety' by Helen Barker and colleagues:

<<link-pdf "Getting to grips with anxiety" "https://drive.google.com/file/d/1MhSkweHKlMx3gAHe8SyVqss4nSjzJhFd/view?usp=sharing">>

CWPs may also use additional materials such as Camden and Islington self-help booklets for Panic and Phobia and Stress and Worry and <<link-pdf "Moodjuice Anxiety" "http://www.moodjuice.scot.nhs.uk">>

Richmond have developed their own material: [[Richmond Adolescent Anxiety Model]] 

!!''[[Low Mood]]:''
The manual used to guide practice is the 'Guided Self-Help for Low Mood'. 

 <<link-pdf "Guided Self-Help for Low Mood: Full Manual" "https://drive.google.com/file/d/1Ua1L-0BUmNMBTJi2AkYQhdlmnWpKwl0g/view?usp=sharing">>  

CWPs may also use alternative materials however this needs to be discussed with supervisors. examples of this alternative material is the adapted low mood self-help booklets from Camden and Islington  :

  <<link-pdf "Low Mood Booklet" "https://drive.google.com/open?id=0B2_m9ZgGWI-jMDhZdEl2MkRpV1E">> <<link-pdf "Moodjuice Depression" "http://www.moodjuice.scot.nhs.uk">>

!!''[[Behaviour Problems]]:''

The Parenting training for behaviour approach has been developed and shared by the Manchester Collaborative. The manual for this intervention can be found here:

<<link-pdf "Manchester Behaviour Manual" 
"https://docs.google.com/document/d/1YVAXcYyWF5_4wxM1BfUOoogXwpxro3sSwLLoRg4zP3Y/edit#heading=h.gjdgxs">>
CWP may also use alternative handouts and resources which need to be discussed with their supervisor. some handouts form the Parenting intervention which have been developed and approved by our Parent Panel can be found on the page: [[Parenting Techniques and handouts]]
 

!!Additional material 
''Example videos of GSH Sessions'' and ''Chapter summaries for Incredible Years''can be found in the locked/private section linked below. 

Please note: you will need a password to access this section- please email mailto:PGSonlineguides@annafreud.org

<<link-pdf "Private Wiki" "https://manuals.annafreud.org/cwp/private.html">>
For the training year, sites are given funding to support the training of new staff and placement support

*Salary support (mid point band 4 Agenda for Change including any relevant High Cost Area supplements, plus 25% oncosts) for trainees will be paid by HEE via the below arrangements: 
**NHS Trusts: Existing Learning and Development Agreement. LDA payments go out quarterly throughout the financial year
**Non-NHS: HEE will put in place a Service Level Agreement to govern the arrangements and provide an invoicing schedule
*Placement support (£12000 per CWP) is paid to the university and sites will need to invoice the university quarterly for this. Please state clearly that the invoice is for ‘CWP Placement Support funding’ and the names of the CWPs whose placements are being supported.  

For partnerships allocated to KCL, invoices will need to be sent to: christine.woburn@kcl.ac.uk

For partnerships allocated to UCL/AFNCCF, invoices will need to be sent to: Finance@annafreud.org

!!!''What is Future in Mind?''
Future in Mind is a major government initiative to improve mental health services for children, young people and their parents. The Report was published in 2015 and made a series of proposals for the next 5-10 years. It was in response to increasing public concern about the mental health of children and young people and the lack of services to address this need. The CWP programme is a direct consequence of this initiative. Government documents are not everyone's idea of a relaxing read. In the key references listed below is a version of Future in Mind for children and young people and may be a good place to start if you are interested in learning more about this programme. 

!!!''Key references'' 
Short version of Future in Mind for children and young people
https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/454495/Childrens_Mental_Health_EasyRead.pdf

Full version:
https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/414024/Childrens_Mental_Health.pdf

There has been a recent report by the Education Policy Institute in March 2017 highly critical of progress against Future in Mind objectives. The link to this report is https://drive.google.com/open?id=0B1hDLHd8syMsLUVRRFlPM2N2WEU

!!!''Key points about Future In Mind.''
*Most adult mental health problems usually start before age 18. There needs  to be a large investment in CAMHS to try to save future costs in adult services.
*Recognition that waiting lists are extremely high (sometimes up to a year) and thresholds are very high (often has to be immediate risk)
*There is some indication of increasing mental health problems such as an increase in eating disorders and this is leading to a reduction of available beds.
*Future in mind has set a target to train 1700 new staff (inc CWPs).
*This is the first time that CAMHS has invested in a graduate work force
*There will be a Green paper later in the year which follows on from Future in Mind. This is likely to consider an increased role for education in child mental health. Child mental health is a CHILD matter not a HEALTH matter. All schools have a fundamental role. This moves away from a Tier system and encourages the idea that there is a collective responsibility 
*The course will encourage you to work out how things work in your own area and how this policy is being taken forward locally. 

!!!!Source: Duncan Law

!!!What is GBO-HIT?

HIT is an acronym for the ''Helpful Ideas Tracker'' which can be monitored alongside the young person or parents individual goals.
 
The Goal-Based Outcome - Helpful Ideas Tracker ([[GBO-HIT|https://goals-in-therapy.com/2018/05/02/goal-based-outcomes-helpful-ideas-tracker-the-gbo-hit/]]) is a very simple way to track if clients feel they are getting the ideas they need to help them with the things they want to change.  It can be used to track if clients feel they are getting helpful ideas and can then be used to facilitate discussions about this.

!!!Why use GBO-HIT?
Setting goals with young people and families is always important and this is certainly the case in guided self-help. One of the key focuses of guided-self-help is to share ideas and information that might help people move towards the changes they want to make in the future. Because of this it is helpful to track the persons view as to whether they fell that are getting idea that they think might help.

!!!How to use this measure?
The tool has a suggested goal: ‘I feel i have learnt as much as i need, to manage what i came for help with’ and also has space for more client led ideas or ‘learning goals’ that can also be tracked and discussed.  The GBO-HIT can be used along side the original GBO tool to track other goals the client may have
For more information on using the GBO-HIT and to download free PDF copies of the tool please visit [[Goals in therapy|https://goals-in-therapy.com/]] which is a website dedicated to the use of goals, goal-oriented practice and goal-based outcomes (GBOs), across physical and psychological health settings.

!!!!!Source: Laura Bowyer 
!!!''Normalise''
*Normalise, normalise, normalise and validate! Use examples from your practice e.g. “many families have told me that ……” / “lots of YP say when they feel anxious or scared they get funny feelings in their body”.
*Ordinary/casual way of chatting can be helpful to build relationship (just like any other conversation that the YP would have had)
!!!Finding out about the problem
* You have to check out self harm and risk in first session. To get this detail, you have to ask lots of questions (which can seem like an interrogation). Use measures (e.g. RCADS) to help get to a shared point. See: [[Using Feedback and Outcome Tools]]
*Use [[The Hot Cross Bun Technique]] to gather information (ask about thoughts, feelings, behaviours and physical sensations) 

!!!''Collaborative stance''
*Positioning of chairs can show that you are both working on the difficulty together (not facing YP as if they are the difficulty)
*With parents especially take a non-blaming stance (parents can feel guilty, blamed and judged): Begin by being positive, and highlighting things the parents are doing well that it would be helpful for them to do more of.
*Be collaborative and check in with the YP / parent throughout e.g. “is it ok if I ask you some more questions about X and then I would like to move onto Y”. 
!!!''Active listening''
*Clarification- making sure you understand and you aren't making assumptions
*You have got to make some guesses (some may be right, some may be wrong) but you have to do this to effectively manage time.
*Encourage and make explicit statements to show you are listening / care (ensure these are authentic) e.g. “You have been really brave today telling me about your difficulties with speaking in class at school” / “you’re doing a really great job giving me lots of helpful information”. 
!!!''Summarise''
*Summarise, summarise, summarise and if in doubt, or stuck in an assessment, summarise! This enables you to check out you have correctly understood the YP / parent. It also allows you / the YP or parent a chance to clarify anything. It ensures the YP / parent has been understood. It gives you time to collect your thoughts and consider what further information you need to ask about.
!!!''Avoid jargon''
*Watch out for jargon and overly technical language 

!!!''Looking at self help materials'' 
*Think about their level of understanding/check in about feelings of completing the materials. 
*Important to let them engage as much as possible (they hold pen, read etc)
*Find ways in which you illustrate that we don't always know how we spend our time etc in a sensitive way during BA tasks etc. 
!!!''Planning something to try out (diary keeping)''
*Thought diary: One technique that helps the YP to find out that they are spending time doing things that make them feel bad. Scaffold idea: more we do things we value then more we feel better/good.
*Try it yourself - because you will ask YP to do this - will help you talk differently to them when suggesting that they do it 

!!!''Seek feedback''
*Ask explicitly throughout for feedback, any questions, concerns, doubts the YP / parent has 
<<list-links "[tag[General Resources]]">>
!!!!@@Color:red; THIS PAGE IS CURRENTLY BEING WRITTEN AND IS AWAITING REVIEW@@ 

Source: Joe Hickey Peter Fuggle

''Purpose of this page:'' is to provide a general understanding of assessments.

!!What is the aim of assessments?
The priority of the initial assessment is to gain a basic understanding of what the issues are that the CYP is facing and what they would like help with. Other aims of using assessments throughout the therapeutic process are as follows:

* Establish a [[therapeutic alliance|Therapeutic Alliance]]
* Work within developmental level
* Is the EMHP service and a Low Intensity intervention appropriate?
* Collaboratively identify the main area of difficulty and if several, prioritise.
* Gather general information about the main difficulty and maintaining factors and collaboratively understand these
* Explore strengths and resources of CYP 
* Get information on history of presenting problem and past experiences of help seeking
* Assess and monitor risk
* Provide relevant information and psychoeduation 

!!Why are assessments are important?
A key part of an EMHP will be to use assessments to help track a CYP progress which helps them and their parents/ careers see the level of progress they have made or lack of. This enables conversations establishing what is working/ is not and why not.

!!How to conduct an assessment?
Please go to [[How to Conduct Assessments]]

* Self-report questionnaire.[[|using questionnaires]]
* Direct observation
* Interview.

For information about conducting risk assessments please go to [[Risk and Safety Assessment]]

!!Involving parents:
Involving parents in your work can help engage the child and work towards goals of treatment

Parents can improve outcomes for the CYP by:

* Being positive about the treatment
* Active involvement in treatment
* Supporting the child (and themselves!) in becoming more autonomous
* Assess and address parental factors that contribute towards child’s anxiety
* Provide information about how the child is doing

!!Links with other pages:

For more information please go to [[Assessment]] for a list of relevant pages.

Please go to [[Building a Therapeutic Alliance]] and [[Therapeutic Alliance]] for more information on how the theraputic alliance my impact assessments you carry out with CYP and their families 

For more information on how to conduct a first meeting please go to [[Engagement and First Meetings]]

for more information on how to conduct assessments please go to [[How to Conduct Assessments]]
Source: Natasha Byrne

After each SSDL session, please complete the session feedback via POD

To do this in the first instance you will need to: 

* Add yourself as a client using the 'Add new Client' button
* you can ignore the 'Client log in details' section but you may want to add a bespoke username as an identifier (though this is optional)
* In the 'Client details' section please ensure you choose the group label 'Supervisor and Service Development Lead', as well as your site, and 'Status' should be 'Current'

Once you have done this and can see yourself in the Client list you then:

* Click the 'Select' button 
* Find 'SSDL session feedback' in the Staff measures list (it should be the only measure there)
* Click 'Start' and complete the feedback

You can see these steps in video here: https://youtu.be/4-qiRuBJNSI 
This was created for Cohort 2 SSDLs but is still relevant
Click the link below to access a series of training videos that show different ways that practitioners and young people might work together to set and review collaborative goals

These videos have been developed by Duncan Law, Wendy Geraghty and the Young Champions

<a href="https://drive.google.com/drive/folders/1Deh7uuhPsz5mX8BiLnCzKve7tq_8Kyk7">Click here to view Goal Based Outcome training videos</a>
!!!!!Source Peter Fuggle, Duncan Law, AFNCCF

---

The Goal-based outcomes (GBO) tool has been developed by ''Duncan Law'', who has produced most of the material and used in this page. His work is generously shared for use in this guide. 

----
!!What are GBOs?

Goal-Based Outcomes (GBOs) are to be completed at the beginning of each session to evaluate progress towards a goal. 

GBOs are simply a way of deciding at the beginning of an intervention where you want to head for (see [[Setting Goals]]), and to track progress along the way, or at the end to see how far along your agreed track you have managed to get. They are also a powerful tool to facilitate shared decision making.
Items are rated on an 11-point scale from 0 (Goal not at all met) to 10 (Goal reached) and 5 is a mid-point between the two . 

!!!Using goals in therapeutic work

An excellent easy read guide to using the GBO available here

<<link-doc "Goals and goal based outcomes" "https://goalsintherapycom.files.wordpress.com/2019/02/gbo-version-2.0-guide-final-1st-feb-2019.pdf">> 

!!!Useful Websites

For more information about the GBO tool please visit the [[Goals in Therapy|https://goals-in-therapy.com/goals-and-goals-based-outcomes-gbos/]] website or the [[CORC|https://www.corc.uk.net/outcome-experience-measures/]] (Children Outcomes Research Consortium) website.
Researchers at CORC have calculated that the GBO has a proxy ''[[Reliable change|Measuring reliable change]]'' for goals is a change in score of ''2.45 points.''

 It is recommended that a parent or a child has between ''1-3  goals.''


!!!POD
The measure is loaded on [[POD]] and is easiest completed using this system. 

However a paper copy of the questionnaire can be found [[here|https://goalsintherapycom.files.wordpress.com/2018/03/gbo-version-2-march-2018-final.pdf]]: 

You may also want to complete [[GBO-HIT]] which asks specifically if the young person or parent/career feel the information they are getting will be helpful to them - even though they might not be feeling better or noticing much change yet.

!!Practice points

!!!Reaching their goals
Don't be too worried if the parent or young person does not reach their goals. Goals help them to get __motivated__ as it is very satisfying when they can see progress against goals even if they don't get as far as they would like.  

Some find it useful to have one or two large targets rather than a few small targets. The aim is always to tailor the technique to individual preferences. 

Please find a helpful video regarding [[Reviewing goals]]

!!!Videos

A series of [[videos|https://vimeo.com/album/5500156]] on the CORC website have been developed by the Children's Wellbeing Practitioner (CWP) Programme in conjunction with the Anna Freud National Centre for Children and Families and the London and South East CYP-IAPT Learning Collaborative. 

The videos show examples of ways that practitioners and young people might work together to set and review collaborative goals. These videos are intended to provide examples of good practice and areas that could be improved; with the intention that they will facilitate discussions around goal setting.


!!Links to other pages

Please see [[Goal-Oriented Practice]], [[Outcomes]] and [[POD]] for relevant pages.
!!!''Goal-oriented Practice''

<<list-links "[tag[Goal-Oriented Practice]]">> 
!!!!Source: Charlotte Hepburn and Peter Fuggle 

!!What is the shared bag and why use it?
The EMHP and CWP manuals are designed to be experienced as completely separate. However, behind the scenes, many pages of each manual are shared between the two. This is not obvious as shared and unshared pages look exactly the same. This is deliberate. 

Pages which contain information applying to both CWP and EMHP manuals go in the 'shared bag'.  Editing 'shared bag' pages should be done on the 'shared bag' manual and not in the individual CWP/EMHP manuals. This is so the information provided for EMHP's and CWP's relating to interventions  and core policies is the same.

!!Overview of editing the shared bag
Whenever editing a page, ''always check whether the page is a shared page or not''. This can be done by looking at the information tab which is at the top of every page. It can be found by clicking on the v shaped button at the top of the page and by going to 'info'. It is especially important to do this when editing pages listed below 'Pages in the shared bag' as these are pages that should remain in the shared bag and not be edited in individual manuals.

You can edit either type of page - shared or unshared but it is important to know which one you are doing. If you want to edit the shared bag so that it changes in both manuals then you need to make this edit in the 'emhp-cwp-shared' bag. If you want to make an edit that only changes the page in one manual, then you can do this by editing the page in the individual manual itself.  This is very clever technology but potentially very confusing if the person editing doesn't know which he/she is doing. 

!!Pages in the shared bag
Below is a list of the types of pages that should be in the 'shared bag'. ''These pages should not be edited in individual manuals.'' This list is still being developed: 

*'Helping' pages, such as sessions plans and handouts: this is the core interventions used by both CWP's and EMHP's and should be THE SAME

*Pages which have standards that apply to all manuals go in the shared bag such as copyright and consent policies

*Core pages about outcome measures used by both CWP's and EMHP's.
*Core pages about psychoeducation 

All pages regarding outcome measures will generally be on the shared bag over time. Best practice for individual mental health support teams may develop over time and such differences can be integrated into local versions of the manual. 


!!Editing the shared bag
To avoid confusion editing of the shared bag is currently been restricted to Charlotte Hepburn and Peter Fuggle.

*local manuals= CWP and EMHP manuals
*Shared bag= shared bag manual
!!!Local copies of shared bag pages
If a shared bag page is edited and saved in a local manual, a 'local copy' of this page is created. In other words the shared page has now been overwritten. The original shared page still exists in the shared bag but the local copy is the one that is shown in the local manual. If this 'local copy' is then deleted the original version of this page (created in the shared bag) will then be the version shown again. 

!!!Deleting a page 
Never delete a page in a manual if it is in a shared bag without checking there is a local copy of the page on the other manual. (check which bag the page is in by using the drop down arrow). If it is in the shared bag it will be deleted off the shared bag meaning it will most likely be deleted off both manuals unless a local copy of the page has been created in the other manual. 

!!!How to move a page into different bags? 
If you would like to move a page from a local manual into the shared bag so that it is shown in both manuals you need to:

#Drag a link of the desired page into the shared bag 
#Hover over the top menu bar and wait for it to turn green 
#drop the page
#you will be prompted with an import box, click import
#delete the original page from the local manual you copied it over from
#refresh your browser 
Please note if there is an image in the tiddler you will need to import this separately. 
once you have completed all these steps the page you wanted to be in the shared bag should appear in both manuals. Any editing of this page would then need to happen on the shared bag manual to insure local copies are not created which will 'overwrite' the shared version.
Source: Natasha Byrne and Duncan Law

Excerpt from CWP Operational Guidance for London and South East

View Operational Guidance here:  https://drive.google.com/file/d/1KXOkFEFMGyJ3h5EHPP6MKyl3T0Gs_cCM/view?usp=sharing

The below summarises the specific difficulties the role could be expected to address, those they should not and identifies those situations where discretion is required and a case by case decision made.

! ''Do ''
!! Common mental health difficulties that may respond to early intervention
* Low Mood / Mild to Moderately Severe Depression
* Panic Disorder
* Panic Disorder & Agoraphobia
* Generalised Anxiety Disorder / Worry
* Simple Phobia (but not blood, needle, vomit)
* Sleep problems
* Stress management
* Behavioural Difficulties

! ''May do''
!! Conditions which may respond to early intervention but require discretion
* Anger difficulties
* Low self-esteem
* Mild social anxiety disorder
* Some compulsive behaviours
* Mild health anxiety
* Assertiveness/interpersonal challenges (e.g., with peers)
* Self-harm is disclosed but is assessed as linked to low- mood but is not assessed as enduring and high risk in nature
* OCD

! ''Should not do''
!! Significant levels of need/complex conditions which are not suitable for brief early intervention
* Pain management
* PTSD
* Bipolar Disorder
* Psychosis
* Personality Disorders
* Eating Disorders
* Chronic depression/anxiety
* Established health anxiety
* Historical or current experiences of abuse or violence
* Complex interpersonal challenges
* Bereavement
* Active, enduring and significant self-harm
* Relationship problems
!!Selecting cases for CWP training 

We want CWPs to experience success and develop skills in a graded way.  Therefore, for the training year especially, we advise where possible that CWPs start with single problem cases. Such cases will allow CWPs to apply the principles of guided self-help in a straightforward way. 

!!CWPs will: 
# Help build up emotional wellbeing and resilience in young people and the system around them (e.g. schools / family) 
# Guide and support young people and the system around them (e.g. schools / family) to intervene and manage low-moderate severity common mental health and/or behavioural problems
#Signpost young people and their families to a range of physical, emotional, social, educational, and other well-being services / resources in their local areas

!!Young people and/or parents/families likely to benefit from CWP help will:

* Describe their problems in good detail with little prompting (e.g. be able to give a clear time of onset, or exacerbation of their own / their child’s difficulties and relate this where relevant to a particular life event, with little help).  
* Be able to differentiate feelings, thoughts, behaviours etc. without needing too much scaffolding. 
* Their difficulties are not so complex that it would require many sessions to complete an assessment or determine what the primary presenting difficulty is. 
* They have not gone through many other courses of treatment with no effect.
* The child / parent is able to define clear goals / things they would like to change.
* The child / parent is available and can be committed to weekly short-term support. 
* The child / parent has a good support network around. There are obvious protective factors.
* The child / parent likes the idea of a supported self-help intervention and are committed to doing self-work in between contact from the CWP.

This is not an exhaustive list, and of course clinical judgement and supervision will also play a role in deciding which cases CWPs can see. However, we recommend that young people, or parents, who present with the following difficulties, are unlikely to benefit from, or find a low-intensity treatment useful. 

!!CWP interventions are unlikely to be useful when the young person has:

* Multiple Problems (all of which are severe and impacting on the young person)
* Not fluent in English- CWP work/resources can be adapted
* Failure to respond to several previous psychological treatments / interventions
* Severely complicated environmental/interpersonal factors (e.g., poverty, housing problems, unemployment)
* Stressful interpersonal circumstances (e.g., parents are undergoing divorce, family homeless etc.)
* Severe depression/actively suicidal
* Alcohol/substance dependence
* High doses of anxiolytic medication
* Psychosis
* High degree of functional impairment
* Intellectual problems (e.g., low IQ, neurological impairment, language problems)
* Significant physical health problems
* Young person / parent has a different conceptualisation of the problem (e.g., sees it as a biological problem)
* Ongoing threat (e.g., still with a violent partner / family member, returning to school where trauma may recur/being deported to country where trauma may recur)
* Young person or parent has a strong preference for other forms of treatment (e.g., wants medication or psychoanalysis)
* Certain presenting problems which would not be usefully or appropriately addressed with the low intensity treatment options available; e.g. PTSD.

We would never suggest to exclude a person from work with a CWP based on fluency in English. We would encourage the CWP to work with an interpreter if their supervisor believed it would be useful.
 

This guidance is based on the fact most of the material is written in English and would require the parent to read the material to practice the interventions. 


!!Guide to the Selection of __Training__ Cases 

!!!Criteria for Training Case:
Axis 1 Disorder –i.e. straightforward depression/anxiety disorder as main presenting problem

Clear current and predictable difficulties

Access to thoughts and feelings

Definable problems and goals

Available for weekly short-term therapy

!!!Criteria for being unsuitable:
* Multiple Problems (this does not exclude clients who present with co-morbidity as training cases)
* Failure to respond to several previous CBT treatments
* Severely complicated environmental/interpersonal factors (although some services have adapted the CWP model to meet the needs of more socially deprived families)
* Severe depression/actively suicidal
* Alcohol/substance dependence
* High doses of anxiolytic medication
* Psychosis
* Functional impairment

This guidance is primarily written for the selection of TRAINING cases – i.e. cases the CWPs use when getting familiar with the materials / structure of sessions etc. Adding in any complexity whether its language, neurodevelopmental difficulties (ASD), or anything else (e.g. unstable living situation / multiple difficulties) will often make delivering interventions more tricky. We would always encourage CWPs to therefore select as straight forward a case as possible for the purpose of their training / writing assignments in order to enable them to become familiar with the models or treatment and materials before they are then adapted.

Of course as CWPs progress after training, they will experiment with adapting things in line with the needs of individual clients / particular populations. Again, we would never exclude someone on the basis of solely not being fluent in English, but we would highlight to the CWP the amount of adaption which would need to take place with the current materials in order to effectively carry out a low intensity intervention (e.g. very short sessions and lots of reading materials) with a YP and family who are not fluent in English; this needs discussing with the family as you say to ensure GSH is right for them, but also it may just not be ideal for a training case (i.e. the CWP is unlikely to be able to cover all the material in the session time required for a tape assignment and will typically need 1.5x or double the time when working with an interpreter / will likely need more than the 8 sessions stipulated etc).  


[[What is meant by 'mild/moderate' problems?]]

[[What is meant by a 'low intensity' intervention?]]
[img[ripped jeans and laptop.jpg]]

!!!''Guided Self Help''
Guided self help aims to increase coping and self management capacity within clearly agreed time frames and resources.

This means the practitioner is often in the role of a coach, supporting the young person to practice things and try new ideas to help cope better. 

The core principle of GSH interventions is that the expertise is seen to exist in the self help materials that are being shared with the client AND in the practitioners expertise in making this knowledge available to the young person or parent, their knowledge about common pitfalls and their creativity in overcoming these. This is ''guided'' self help in which the practitioner plays a very active role. Self help is not about letting the young person do it on their own. 

This area of the Finding out section is split into four sections as seen below:

[[Guided Self Help knowledge]]


[[Guided Self Help practice]]

[[Guided Self Help skills]] 

[[Self Help Materials]]
This is the general approach taken for the guided self help sessions - please note for full session plans see [[Helping]]. This is not 

!!!The GSH approach described:

* There will be four face to face contacts alternated with four telephone contacts.
* Times between contacts will be approximate with face to face contacts being approximately 2 weeks apart.
* Face to face contacts will generally be for 45 minutes.
* Phone contact between these face to face contacts will be for 15-30 minutes.
* Overall intervention is 8 contacts over 8 weeks with a one month follow up.
* The full package is therefore generally about 12 weeks.
* Contact time with practitioner is three hours of direct contact time and two hours of telephone contact.
* Referral received/ conducted- including completion of the Parent SDQ, Parent and/or young person RCADS. These scored up before first intervention session in which you may then want to complete it again depending on who conducted the initial assessment session.

!!!Moderating factors to this basic intervention plan
* Shared decision making assumes that some young people will take full package but some may choose other forms of help. For example, some may only want telephone contact etc.
* Low intensity interventions for low mood need to take account of the young person's wishes around the type of help
* Lengths of time between contacts during this self help approach can vary depending on the needs and wishes of the young person
* Types of contacts (phone, email or face to face) can be agreed with the young person.
Below are listed a number of key pages around knowledge of the guided self help approach.  

<<list-links "[tag[Guided Self Help knowledge]]">>
Below are listed a number of pages about GSH practice . This overlaps with GSH skills but includes all aspects of practice such as safety, reading materials etc. 
l<<list-links "[tag[Guided Self Help practice]]">>
Below are listed a number of key pages showing core skills for the guided self help approach. 
<<list-links "[tag[Guided Self Help skills]]">>
!!! Here you will find instructions on how to do things such as: 

<<list-links "[tag[How To]]">>




<<list-links "[tag[Understand]]">>

!!Videos showing you how to do the basics:
<<list-links "[tag[HowToVideo]]">>
Habituation principle – the more we face a scary situation over and over, the easier it becomes. This is because our anxiety (or fight and flight system) goes up but then plateaus and goes down if we stay in a scary situation. 
Explanations of habituation can be found on [[YouTube|https://www.youtube.com/]].

How to Train a Brain- Covers the habituation principle:

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/qG2SwE_6uVM" frameborder="0" allowfullscreen></iframe></html>
[img[joshua-ness-225844-unsplash.jpg]]

!!!!!Source: Peter Fuggle and Charlotte Hepburn
!!!Wellbeing Practitioners
This area of the guide is to support CWP practice, to provide resources, session plans and manuals to help CWPs with what to do at their next session with a young person or a parent. 

!!!Supervisors
CWP supervisors may find this area of the guide useful in understanding the content of guided self help sessions CWP are trained to deliver.  

!!!Session 0/Assessment session

Please see [[What is a Session 0]] for more information about what a session 0 is and when a CWP may may need to do a session 0.

!!!Main pages for Guided self help sessions.
Please follow the link for a comprehensive list of ALL the [[core intervention manuals|Core Intervention Manuals]] used by CWP's.
Please note: The age ranges for these interventions are a guide. The appropriateness of any interventions for a child/ young person should be considered with supervisors prior to being delivered:

!!![[Child Anxiety]]: (5-11 years)

<<list-links "[tag[Child Anxiety]tag[Anxiety practice]]">>

!!![[Adolescent Anxiety]]: (12-17 years)


<<list-links "[tag[Adolescent Anxiety]tag[Anxiety practice]]">>


!!![[Low Mood]]: (12-17 years)

<<list-links "[tag[Low Mood practice]tag[Low Mood Session Material]]">>


!!![[Behaviour Problems|]]: (5-8 years)

<<list-links "[tag[Behaviour Problems Session Material]tag[Behaviour Problems Practice]]">>
[img[cave.jpg]]

This page provides the ''core'' material for practitioners work with adolescents who have anxiety. The approach to helping young people with anxiety follows the manual called 'getting to grips with anxiety'. This has been drafted by Helen Barker and colleagues and can be found below.

!!!Core Materials:

<<list-links "[tag[Adolescent Anxiety]tag[Anxiety practice]]">>

!!!Additional Materials:
For useful additional self help materials practitioners may want to share with young people and families please go to [[Self Help Materials]]
[img[blue pattern.jpg]]

The brief guided self help for behaviour problems follows the guidance in the guided self-help for behaviour problems manual. Written by Caroline Bengo and her team and generously shared with the other CYP-IAPT Training Collaboratives.

This page provides the ''core'' material for practitioners work with parents of children who have behaviour problems.The brief guided self-help parenting intervention for behaviour problems is divided into two broad areas that can be covered over seven (or more) sessions. These aim to:

#To promote positive relationships, attachment and pro-social behaviour through sensitive responding
#To provide appropriate routines, boundaries and limit setting



!!!Core Materials:
<<list-links "[tag[Behaviour Problems Session Material]tag[Behaviour Problems Practice]]">>

!!!Additional Materials:
For useful additional self help materials practitioners may want to share with young people and families please go to [[Self Help Materials]]
[img[pink and orange.jpg]]

This page provides the ''core'' material for practitioners work with children who have anxiety. Guided self help (GSH) for child anxiety generally adopts the ''parent led approach'' developed by Cathy Creswell and colleagues at Reading University.

To access the previous version of the [[Treatment manual|http://centaur.reading.ac.uk ]] for parent led approach to child anxiety by Cathy Creswell for the full interventions manual. 

!!!Core Materials:

<<list-links "[tag[Child Anxiety]tag[Anxiety practice]]">>

!!!Additional Materials:
For useful additional self help materials practitioners may want to share with children and families please go to [[Self Help Materials]]
[img[bubbles1.jpg]]

This page provides the ''core'' material for practitioners work with young people who have low mood. This approach has a similar overall framework to the approach to anxiety problems. The manual used to guide practice for working with YP with Low mood is the 'Guided Self-Help for Low Mood' developed by Tower Hamlets CWP Service and can be found below.

!!!Core Materials:
<<list-links "[tag[Low Mood Session Material]tag[Low Mood practice]]">>

!!!Additional Materials:
For useful additional self help materials practitioners may want to share with young people and families please go to [[Self Help Materials]]
These supplementary materials have been created and kindly shared by practioners from different CAMHS sites. These have been written by the course teams and are not always directly connected to the KCL/UCL manuals. However,  they might be helpful for your practice. We suggest that you discuss these with your supervisor, before using them, as to whether they will be beneficial and are appropriate for your site. 
@@color:red;This area is being developed in light of recent changes to working due to the outbreak of COVID-19@@

This section includes information about supporting children young people and family through contact via phone calls, texts, emailing and video calling.

---

''Adaptions to the guided self help manuals'' 

(developed in light of the COVID-19 pandemic)

*[[Child anxiety manual: COVID-19 adaptations]]
*[[Adolescent anxiety manual: COVID-19 adaptions]]
*[[Low Mood Manual: COVID-19 Adaptions]]
*[[Behaviour problems manual: COVID-19 adaptions]]

----

For a list of resources developed in light of COVID-19 please see:

!!!<center>''<<tag [[COVID-19 Resources]]>>''</center>

----

There is a wide range of guidance regarding working remotely, these resources have been collated by the Anna Freud Library. Please find these [[here|https://manuals.annafreud.org/remote-working/index.html#Home:Home]]. 

---

To aid practitioners in their vital work with Children Young People and Families we will be compiling a list of pages to guide practice. The following pages are planned, if your team have developed any useful resources for working remotely in light of the outbreak of COVID19, then please share these with us using the 'Give Feedback' tab on the right-hand side of the page. 

Pages to be developed in light of the COVID19 outbreak all these pages are tagged with <<tag [[Working Remotely]]>>

<<list-links "[tag[Working Remotely]]">>

----

There is separate information about online interventions, such as online CBT. For more information about this type of support please visit the pages regarding this in the finding out section.''To go into the 'Finding out' section''

[[Computerised Therapies for Anxiety and Depression]]
!!''@@color: ;<center>Welcome to the London Guide for Wellbeing Practitioners for Children and Young People </center>@@''

!!!<center>(often known as the CWP Programme)</center>

<center>This guide has been produced by the teaching staff at UCL and KCL along with additional material from services trained by them</center>

<center>''<<image-link "About" "lightbulb icon1.jpg" "About" "220">><<image-link "Contents" "books-icon.jpg" "Contents" "220">><<image-link "Interventions" "pad of paper icon1.jpg" "CWP Interventions" "220">><<image-link "User Guide" "countryside for icon (4).jpg" "User Guide" "220">><<image-link "Contact us" "typewriter icon1.jpg" "Contact us" "220">><<image-link "Key Documents: CWP Programme" "documents icon (1).jpg" "Key Documents" "220">><<image-link "Developing the Guide" "collab icon.jpg" "Developing the Guide" "220">>''</center>



!!<center>More about the CWP role</center>
<center>This is a brief animation which provides an introduction to the CWP programme and the role of CWP's</center>


<center><html><iframe width="860" height="415" src="https://www.youtube.com/embed/RPeVsTVmXA8" frameborder="0" allowfullscreen/></html></center>







You can have as many pages open as you like. And can see what you have open by looking at the 'open pages' tab located on the right hand side panel or by scrolling down and up the pages.

If you have a lot of pages open, they are stacked one above the other a bit like iPhone tabs! A fun way to think about this is the pages open like a ‘story river’.

This can be confusing but just like a iPhone any pages you open will remain open and the quickest way to navigate back to a page you were looking at is by using the 'open pages' tab on the panel on the right hand side.
!!!!Source: Laura Bowyer 
!!''How common are anxiety problems''
*Anxiety is one of the most prevalent disorders of childhood (5-10%) (c.f. Weems and Stickle, 2005; Davis, May and Whiting, 2011)
*Anxious children are at increased risk of having social and academic difficulties (e.g. Pine, 1997; Wood, 2006)
*Untreated disorders have a high impact on the child’s life, and lead to an increased risk of other disorders (c.f. Ehrenreich and Santucci, 2009)
*Anxious children are at increased risk of becoming anxious adults (Kim-Cohen et al, 2003)
**65% of children and young people  who present for treatment of anxiety meet diagnostic criteria for at least 2 anxiety disorders
**80% of children who present for treatment of anxiety will have one or more symptoms of a disorder they were not seeking treatment for

*SAD, Simple & Social Phobia, OCD, GAD, PTSD are as common in children as adults:
**~1-3% in any 12-month period
**~15% lifetime and before 18 years of age for kids

*Notable exception is Panic Disorder/Agoraphobia:
**<13 years – Base rate is close to 0
**13-18 years – Base rate is ~0.5%
*Anxiety Disorders (multiple) are as common in children under 8 years of age as older children
*If you ask teenagers when their problems with anxiety started - the most common answers is when I first started school.

''Key reading''

*Silverman, W.K. and Ollendick, T.H., 2005. Evidence-based assessment of anxiety and its disorders in children and adolescents. Journal of Clinical Child and Adolescent Psychology, 34(3), pp.380-411.
*Schniering, C.A., Hudson, J.L. and Rapee, R.M., 2000. Issues in the diagnosis and assessment of anxiety disorders in children and adolescents. Clinical Psychology Review, 20(4), pp.453-478.
*Davis, T.E., May, A. and Whiting, S.E., 2011. Evidence-based treatment of anxiety and phobia in children and adolescents: Current status and effects on the emotional response. Clinical Psychology Review, 31(4), pp.592-602.
!!!!!Source: Peter Fonagy and colleagues (What works for Whom (second edition)  
!!''How common are behaviour problems?''
*''Conduct problems are the most common mental health disorders in children and adolescents'' (National Institute for Health and Clinical Excellence, 2013).
*The reported prevalence of Oppositional Defiant Disorder (ODD) ranged between 2.6% and 15.6% in community samples, rising to 28–65% in clinical samples. (Boylan, Vaillancourt, Boyle, and Szatmari (2007)) 
*The more serious problems included under the diagnosis of Conduct Disorder (CD) have a prevalence of 1.8–16.0% for boys and 0.8–9.2% for girls (Loeber, Burke, Lahey, Winters, & Zera, 2000). 
*Those in more disadvantaged socioeconomic groups are three to four times as likely to have a diagnosis of CD as those in more advantaged social classes (National Institute for Health and Clinical Excellence, 2011). 
*Behaviour problems are the most common reason for referral to child mental health services in the U.K. 

!!!!!Source: Peter Fonagy and colleagues in What Works for Whom (second edition)
!!''Key points''
*Prevalence has been estimated for depressive disorders of 
**2-4% for children (<13 years) 
**4-8% for young people (13-18 years) (Costello, Erklani, and Angold: 2006). 
*Depressive disorders are equally prevalent in boys and girls until adolescence.
*In adolescence,  there are twice as many girls to boys. (Angold, Erkanli, Silberg, Eaves, & Costello, 2002; Birmaher et al., 2007).
*Ethnic minority status may increase risk for low mood in adolescents. (Smith and Silva (2011).
*Sexual minority status is also associated with increased risk of depression in young people (Marshal et al., 2011). 
*The increase in prevalence in adolescence may be associated with:
**increased emphasis on social status
** reductions in supervision and support from adults
**increasing conflict with parents
**lack of sleep
**an increase in risk-taking behaviours such as substance use (Brent & Maalouf, 2009).
Funding for the Supervisor/Service Development Lead role is determined by the number of CWPs that you will be supervising. The general rule of thumb is that one CWP receives one day of supervision per week. For example, if your service has a total of 3 CWPs, you will receive funding from Health Education England (HEE) to provide supervision across 3 days.
Although we are working towards a national target of 70,000 more young people seen by mental health services by 2020, we recognise this will be a gradual process. During year 1, CWPs will focus on developing the skills required to take on a fairly large caseload moving into year 2. From July-December we would expect CWP trainees to see up to 30 cases.
Google documents will either look like big green boxes like this: 

 <<link-pdf "Example Google Doc" "https://">>

or like this:

<<link-doc "Example Google Doc" "https://">>

The reason you may see both of these types of google documents is due to the Wiki being updated.

You do not need to be signed in to google to access these documents and simply need to click on them to open them in a separate internet tab.
!!!!@@Color:red; THIS PAGE IS CURRENTLY BEING WRITTEN AND IS AWAITING REVIEW@@ 

Source: Joe Hickey 

When conducting an initial session with a young person all make sure to check in about Risk (see [[Managing Risk]])

You will notice that this page provides practice points on the different aspects of assessment structure as outlined below:

[img[Assessment structure.png]] 

!!!Connection:
Please go to [[Building a Therapeutic Alliance]]

!!!Expectations:
clarify the boundaries and limitations of your role please go to [[Engagement and First Meetings]]

!!!Exploring the main problem:
* Always check on mood, whatever the main difficulty
* Describing a day (good, bad, typical)
* Gather detail by using [[Assessment: Key Questions to Ask]]
* Key triggering situations 
* Emotions
* Bodily sensations 
* Thoughts
* Behaviours related to the main problem 
* Maintenance cycle: What’s keeping the problem going?

!!!Identifying negative thoughts

* Diaries
* Questionnaires
* Notice in the session
* Thought bubbles
* Stories

!!!Identifying behaviours

* Recent example
* Diary recording by CYP or others
* ABC charts
* Observations in session
* Others’ descriptions

!!!Identifying emotions

(Note that accuracy of emotional recognition in self and others)

* Sorting game
* Feelings cards
* Feelings faces/characters
* Feelings scrapbooks/collages
* Drawing
* Books, cartoons, TV, films, puppets
* Creating stories/poems/songs
* Link them to physical feelings
* Act them out
* Ask other members of the system


!!!Strengths and resources:
explore with the CYP and their families the existing strengths and resources at the CYP disposal
key questions may include; 

* What and who have helped up to now?
* How come things aren’t worse?
* What resources are around the CYP and family?

!!!Planning
* Explain and give the rationale for LI or GSH 
* Be clear about expectations for the intervention
* please go to [[Goal-Orientated Practice]] for a list of useful pages outlining how to plan goals with a CYP and their families.

!!!Ending 
* Check in with doubts and concerns 
* How have they found it today?
* Praise for effort and information given 
* Inform clearly of next steps 

!!General practice points:

What if you get a lot of ‘don’t know’ answers?
How can you explore further without pushing the young person?

* ‘Typical day’ question – explore patterns of thoughts/feelings/behaviours 
* Seek parent/carer views too
* Remember multi-informant options 
* Take a pause and re-engage

!!Links with other pages:
Please go to [[Assessment]] for a list of pages relating to assessments 

for how to set up a first meeting with a CYP please go to [[Engagement and First Meetings]]

For how to build a good connection please go to [[Building a Therapeutic Alliance]]
You can give us Feedback on the Wiki by simply clicking on the tab 'Give Feedback' on the right hand side of the screen or email [ext[PGS Online Guides|mailto:PGSonlineguides@annafreud.org]] 
Any learning materials that are on a google documents can be printed easily by clicking on the 'print' logo in the right hand corner.

The pages in the guide can also be printed by right clicking on the page and choosing the print option 

''PLEASE NOTE:''
if you want to print a specific page straight from the Wiki it is best to close
 all other pages you have open first. 
POD (People's Outcome Database) is an ''outcomes monitoring system'' in a website where staff or clients can log in and ''complete measures using any web enabled device''. 

Scores are calculated instantly and you can view these online with a child, young person or parent within a session.

 On the EMHP programme POD is used due to the [[The Importance of Feedback]]

A link to the pdf POD manual is shown below, which gives a comprehensive overview of POD and how to use it.

<<link-pdf "POD Manual" "https://drive.google.com/open?id=0B-tACu2wi4-4MEVNbWUtZFllUFk">>
For more information on how to use POD please see PODs [[information page|https://pod-database.org/info/]]. Which provides comprehensive guidance on how to use pod accompanied by screen shots and videos.

Brief document outlining how to add a new patient and complete a measure for a patient please see the instruction document below:
<<link-pdf "Instruction Document" "https://docs.google.com/document/d/1EtAYqGjO7gyKnfgWwL1x3D5nkpLo-VGv3rYLxSJyoOE/edit?usp=sharing">>

!!!Instruction videos:

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/OY6tuqbRD70" frameborder="0" allowfullscreen></iframe></html>

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/OiJ0i1mAoZ4" frameborder="0" allowfullscreen></iframe></html>

Pages that cover aspects of a common theme can be tagged (think of a tag as a topic thread that gathers together any number of relevant pages - much as a chapter heading "gathers" a series of pieces of information). The tags show up as coloured bars on the page. Clicking on a tag reveals a drop-down menu of all the content that is tagged with this title:

[img[using tags.png]]

Using google documents we can upload PDF's to the manual through the @@color:MediumSeaGreen ;''big green buttons'' @@. 

*Upload any PDF to your google drive and this can be linked to the manual. 

*Once you have uploaded a PDF to your google drive click on the 3 vertical dots //'More options'// and select //'share'//.

*If you select //'get shareable link'// in the top right hand corner the PDF's link will be copied to your clip board (this means to copy and paste you don't have to click copy it has done this automatically for you). This will be something like:

https://drive.google.com/file/d/16k7xkIInqwTuBtlpo6iZJI3w5jJNFPZ6/view?usp=sharing

*Each PDF on google has its own unique number/letter identifier, which can be found between the d/ and /view in the url above. 

*Use the code for the @@color:MediumSeaGreen ;''big green button'' @@ by copy and pasting it from this page (click on edit mode to view the code).   

<<link-pdf "PDF Document Title" "https://drive.google.com/open?id=16k7xkIInqwTuBtlpo6iZJI3w5jJNFPZ6">>

*Edit the title of the green button where it says 'PDF Document Title' and insert your documents unique identifier between the = and the ">>.

* Click save (tick)
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/2jzfArg3RlY" frameborder="0" allowfullscreen></html>

Use the the paper clip icon above the search engine to upload an image to the manual.

Import
Select Picture from Documents
Click Import
Rename the tiddler if you want (by clicking the pen icon and editing as normal
Add the picture by typing: //Open// double curly brackets name of picture //Close// double curly brackets  {{name of picture}} wherever you want it to include it. 

Example below (click on the edit/pencil button to view)

{{CWP- logo.PNG}}

NB: the words in between the brackets need to be EXACTLY the same as the tiddler containing the picture. Either copy and paste straight from the tiddler name at import or change to something really easy. 

To create coloured text, for example @@color:MediumSeaGreen ;big green button @@ use this code (click the pen icon to view).

*Type your chosen colour after color: and the word you want to be in colour after between the ; and closing at signs.

*You can choose any colour, a good list of HTML colours can be found here:
https://www.w3schools.com/colors/colors_names.asp
Click the pen icon to view and use the code below:

! <center>''Title''</center>
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/KxGKCOEu3hk" frameborder="0" allowfullscreen></html>

If you want to upload a video you can do so from Youtube. Copy and paste the coding below and change the unique identifier (letter/number combination) after /embed/

Example:

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/RPeVsTVmXA8" frameborder="0" allowfullscreen/></html>
This BBC guide to Exam Stress shown to have benefit for a 12 year old client: http://www.bbc.co.uk/guides/zsvcqhv

Hounslow have been using the model STEPS (Strategies to Tackle Exam Pressure and Stress) available through Edge Hill University: https://www.edgehill.ac.uk/news/2014/01/steps-strategies-tackle-exam-pressure-stress/

//Marianne to complete//
Ideally, we should resize an image prior to uploading it to the manual. This can be done in paint or any other Picture formatting app.

However, within the manual you can also control the size of the image, using the following code (open tiddler to view code): 

[img width=100 [ImageTitle.jpg]] — forces the image to be displayed at a width of 100 pixels

[img width=100% [ImageTitle.jpg]] — forces the image to be displayed at the full width of the tiddler

Edit the % to suit the size you want.
!!How do we get systematic feedback?

* Email student reps with feedback
* Tutor groups (people find this easier to speak)
** General questions for the reps to ask
* Survey 
** Menti meter - remotely
** MM to send questions to reps to feedback on before
** 6th March- introduce to practice tutor -  two week deadline
** Feeding back in the summer term!
* A few months into the cohort and then towards the end.  
 * Feeding back to tutor group - any changes and any thing that came up!
** You said we needed this, so we did this

!!General feedback

*People do use it
* pulling information off to make their own folder on it
** Session by session
* Folder and click on - linking to pages from different pages
* Heres the manual and heres the other various documents - could this all be together.
Your role as the CWP Supervisor/Service Development Lead will be to work with your service to ensure that robust assessment processes are in place for assessing the suitability of referrals into the service, to ensure that CWPs have a caseload which is appropriate for them and the skills they will have developed through training.^^^^
<<link-pdf "Background info on IPT-A" "https://childadolescentpsych.cumc.columbia.edu/articles/interpersonal-therapy-adolescents-ipta"">>

*Focusing on relationship difficulties that are at the forefront of difficulties for CYP
*Following links between depression and interpersonal context (repeat again and again) - where symptoms overlap with interpersonal world (being with people relaxed you/how did depression limit social activity etc)


This area contains pages to support improved practice with respect to inclusion. This area is being developing in partnership with the founders of the ''CWP BAME inclusion group''. Please note this area is still under development. It is the aim that with support from the CWP BAME inclusion group best practice concerning inclusion will be threaded throughout all areas of the wiki manuals in time.

The CWP BAME inclusion group provides a space for professionals to discuss, reflect and share ideas around how psychological services can become more inclusive for all. For more information concerning the CWP BAME inclusion group please see their flyer below:

<<link-doc "CWP BAME inclusion group flyer" "https://drive.google.com/file/d/1OKiWCRxNMBDSgf8zHW3zV9WasUefGqnD/view?usp=sharing">>

For some initial notes about diversity please see the following pages:

!!![[Diversity]]
@@color:red;This page is being developed in light of recent changes to working due to the outbreak of COVID-19@@

Pleaase find below an example of a ''CWP Telephone Triage Assessment''. This has been kindly shared with us by Islington Community CAMHS and could be helpful for both CWPs, EMHPs and supervisors of both of these practiitoners. 

<<link-doc "CWP Telephone Triage Assessment" "https://drive.google.com/file/d/18odcmmloYH4kyAVhBH_7kIWf-Wsbv8sN/view?usp=sharing">>
Information taken from Mentally [[Healthy Schools|https://www.mentallyhealthyschools.org.uk/about/]]

---

Mentally Healthy Schools is a free website for primary schools, offering school staff information, advice and practical resources to better understand and promote pupils’ mental health and wellbeing.

---

Download the Mentally Healthy Schools [[free toolkit on internet safety|https://www.mentallyhealthyschools.org.uk/resources/internet-safety-toolkit/?utm_source=AFLN&utm_medium=email&utm_campaign=internetsafety_2019&utm_term=AFLN&utm_content=toolkit]] , packed full of practical teaching resources for primary school staff, to help keep children safe online.

The toolkit includes lesson plans, videos, quizzes, animations, assembly plans and information and guidance. It covers topics such as cyberbullying, gaming, social media, website use and other online risks.
!!! What Happens If You Belong to More Than One [[Group|The Social Graces Model]]?


!!!! By Isaac Cook, EWP at SLaM



[img[Intersectionality - Belonging to More Than One Group.png]]


<<link-doc "Intersectionality and Systemic Therapy" "https://drive.google.com/file/d/1OPbpDfwNIuy5TPi1QMPuLFz--m0SS2-z/view?usp=sharing">>


!!!! The Children's Wellbeing Practitioner BAME Inclusion Group

https://www.linkedin.com/groups/8873855/


!!!!!Source: Laura Bowyer
!!!''Some starting points''
*Ensure the young person/ parent has learnt about some basic ideas about how anxiety work  [[Anxiety: Explaining anxiety to children and parents]]
*Get used to using a way of measuring the level of anxiety such as a fear thermometer or paper scale. [[Fear Thermometer]]
*Formulation – as well as the above focus on what might cause anxiety, have a focus on what maintains anxiety and keeps it going; anxious thinking, bodily changes, anxious behaviour.
 
!!!''The Anxiety equation''
*Anxiety equation = danger (likelihood x cost)							        	    coping (self or others) (Based loosely on Padesky, 1997). With anxiety; YP generally fear something bad will happen (high likelihood and cost)  and either avoid it, or use a range of ‘safety’ behaviours to keep ‘safe’ or prevent the bad thing from happening (low perceived ability to cope). 
!!!''Anxious behaviour can involve lots of people''
*Anxious behaviour - remember behaviour is not just what the young person does when anxious to feel better, but also what the parents / system around the child do. 

!!!''The key role of avoidance''
*Anxious behaviour also involves avoidance and things the young person does mentally in their head e.g. preparing a conversation over and over again before they approach their peers.
*The key messages are avoidance keeps fears going as the child never learns / finds out if bad things happens or not and they don’t get the opportunity to develop coping skills. Likewise, reassurance or other safety behaviours can prevent children from learning that they can cope independently.

!!!''The habituation principle''

*Habituation principle – the more we face a scary situation over and over, the easier it becomes. This is because our anxiety (or fight and flight system) goes up but then plateaus and goes down if we stay in a scary situation. 
*Explanations of habituation can be found on youtube. For example, https://www.youtube.com/watch?v=qG2SwE_6uVM
*The next time we face that same situation, our anxiety goes up (but not as much as before) and comes down quicker and so on, until we no longer feel anxious in that situation. Key message: Your anxiety may feel as though it will go on forever (unless you run away/ avoid the situation etc.), but it will in fact pass on its own.
*‘Habituation’ means getting used to a situation or experience.  

!!!''Doing things one step at a time''
*Hierarchies or ‘fear ladder’ – facing our fears step by step and not doing it all in one go. Breaking tasks down and facing our fears one step at a time without safety behaviours. 
!!!''Thinking traps''
*Anxious thoughts - In anxiety, the child thinks something bad is going to happen and thinks they will be unable to cope. They then look out for evidence to support this. 
*It is our interpretation of a situation or anticipation of what is going to happen that determines how we feel about it and how we behave.
*Young people can find themselves using a series of thinking traps: 
**Mind Reading 
**Catastrophising 
**Over Generalising
**Labelling
**Focusing on the negatives
**Predicting the Future
**What if statements

*The main point is the child thinks something bad is going to happen and thinks they will be unable to cope and then they look out for evidence to support this. 
*Aim in intervention is to develop more flexible thinking and increase coping. 
!!!''Notice persuasion''
It is very easy to fall into trying to persuade a child that something is not as bad as he/she thinks. This is understandable but often not helpful. Sometimes being a little paradoxical, seeing it worse that the child may enable more change to occur. 
[img[pad of paper.jpg]]

Core interventions can be found on the [[Helping]] pages. 

Practitioner interventions focus on the areas listed below:

''Please note:''  The age ranges for these interventions are a  guide.  The appropriateness of any interventions for a child/ young person should be considered with supervisors prior to being delivered:

* [[Helping: Behaviour Problems]] (5-8 years)- a brief (7 sessions) guided self-help parenting intervention.
* [[Helping: Adolescents Anxiety]] (12-17 years)- a brief (8 sessions) guided self-help adolescent intervention, which may or may not involve working with parents 
* [[Helping: Child Anxiety]] (5-11 years)- a brief (8 sessions) guided self-hep parenting intervention.
* [[Helping: Low Mood]] (12-17 years)- a brief (8 sessions) guided self-help adolescent intervention, which may or may not involve working with parents 

You may also find the page outlining the [[Core Intervention Manuals]] used by practitioners helpful.
*Assessment process 
**For practitioners interviewing parents will be used as the source of information in addition to standardised measures 
!!!Interviewing parents 
*Warn at the beginning about the time scale and say in advance that they might cut across them etc. 
*Parents will be worrying ensure to normalise behaviour 
*Start off safe in the information in family details 
*Be clear about the presenting problem- what does a 'wobbly' look like: specific questions are needed 
*ABC Chart- Trigger, Behaviour, Consequence 
*Developmental questions- anything usual happened in childhood to discuss with supervisors 
*Prepare for reaction to emotional questions- 'What are your worries and fears if things don't get better?' then validate these feelings 'That must be a really difficult thing to carry around' or normalise behaviours 'We hear a lot about parents having negative feelings towards their child' 
!!''Mental health and Wellbeing''
Mental health can be defined as a state of well-being where individuals are able to: 

*realise their own potential
*cope with normal stresses of life
*work productively and contribute to their community.  

Mental health involves psychological and emotional well-being. The WHO defines health as //‘a state of complete physical, mental and social well-being and not merely the absence of disease or infirmity’//.

 
Well-being has been described as the state of being comfortable, healthy or happy.  It involves a cognitive sense of satisfaction with life. More than happiness and satisfaction it includes developing as a person, being fulfilled, resilience and having an active role in the community.

 
Mental health problems can result in a loss of wellbeing. Such problems may arise from individual vulnerabilities, life experiences including trauma or abuse, isolation, discrimination and adverse family circumstances. 

A person’s state of equilibrium or balance can be affected by these challenges leading to a reduced capacity to cope with stress, changes in how they relate to others and negatively affect well-being. During these times people may seek professional support (e.g. counselling, therapy and or medication) when their normal support systems or coping strategies no longer meet their current needs.

!!''What are common mental health problems for children and young people?'' 
!!!''Medical Classification of Disorders''
The most common way of describing child mental health problems. The most detailed classification is the system of medical disorders which sets out criteria against which a person can be assessed. If a person meets this criteria, a 'diagnosis' is given.

 
*The main child mental health disorders are:
**Anxiety Disorders
**Depression/Low mood
**Self Injurious Behaviour (Self Harm)
**Conduct (behaviour) Disorders
**Attention Deficit Hyperactivity Disorder (ADHD)
**Eating Disorders
**Specific Developmental Disorders (Autism) 
**Tourette Syndrome
**Psychosis
**Substance Misuse
The use of a medical model for child mental health problems presents a number of well recognised problems (are they really an illness?) and also some people find the language confusing and unhelpful. See [[Child mental health and medical diagnosis]] for consideration of this. 

!!!''The Strength and Difficulties Questionnaire (SDQ)''  
This simpler approach considers child difficulties in terms of: 

*Emotional Problems
*Behavioural Problems
*Attentional Problems
*Developmental/learning Problems 
*Habit Problems (e.g. sleep, feeding, toileting) 
This is not a formal classification system but is consistent with the information provided by the Strength and Difficulties Questionnaire (SDQ) which is the most widely used screening questionnaire used in the UK. 

!!!!''Child Behaviour Checklist (CBCL)''
The CBCL is a broad questionnaire covering a wide range of child mental health problems which  divides mental health problems into two broad categories:

*Internalising Difficulties (anxiety, low mood etc)
*Externalising Difficulties (behaviour problems, aggression etc) 
!!''The EMHP Programme''
The EMHP Programme does not cover all mental health problems. It  focuses on the three most common mental health problems for children and young people. These are:

*Anxiety Problems (0-18 years)
*Low Mood (11-18 years)
*Behaviour Problems (0-11 years) 
These are summary notes from the first teaching session of CWP programme in 2017. 

!!!''Learning objectives for the session ''
#CYP-IAPT principles and the role of CWP including guided self-help /self-management
#What are child mental health problems - also cover case selection
!!!''CWP Core competencies covered by this session ''
These should be taken from the 25 core competency framework used for the CWP Knowledge and Skills  Questionnaire 

#Knowledge of CAMHS, multi-agency services and the CYP-IAPT programme

!!!''Main content of the session - where to find relevant pages in the wiki guide ''
#CYP-IAPT principles - go to page [[The CYP IAPT Programme]]
#The CAMHS system -[[The CAMHS System]]
#Future in Mind - [[Future in Mind]]
#Role of CWPs - [[The Role of CWPs]]
#How to track progress - [[Outcomes]]
#What are CYP mental health problems - [[What are common CYP mental health problems?]]
#Low mood, anxiety, behaviour - [[What is an anxiety problem for children and young people?]] - [[What is low mood?]]- 
#Overview of common treatments - [[What is the difference between guided self help and some traditional forms of therapy?]]
#Guided self-help /self-management - [[Introduction to guided self help]]
#Case selection - [[Guide to selecting cases]]

!!!''References for session''
<<link-pdf "Meltzer et al 1999" "https://drive.google.com/open?id=0B1hDLHd8syMsSUNoV0dDRTk2dEU">>

!!!Video
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/DRS3uJzw94M" frameborder="0" allowfullscreen></html>
!!''Year Plan''
CWPs will receive university based teaching for 2-3 days a week during term 1, with 2-3 days for in service work. For term 2, CWPs will have 1 day a week for university based teaching with 4 days for in service work. During the final term, CWPs will be placed within their service full time. 

!!''Teaching''
Much of the teaching will take place jointly between UCL and KCL. Friday teaching slots will generally be taught separately between UCL and KCL. 
The [[CWP Partnerships]] will be spilt ibetween UCL and KCL for the friday teaching sessions. Details of the UCL friday teaching sessions can be found on [[UCL Teaching Days (Fridays)]]

!!''Supervision''
The CWPs will be supervised by an experienced specialist CWP supervisor/service development lead. Supervisors will provide support in selecting cases and reaching number of cases required for assignments

!!''Team Structure''
These new CWP teams do not have a uniform structure within each [[Partnerships]] and may be working in schools, CAMHS or in voluntary sector settings. It is helpful to be clear on [[The Role of CWPs]] and [[The CAMHS System]]

!!''Content of teaching''
Over the course, CWPs will be taught [[What are common mental health problems?]] and how to intervene using [[Guided Self Help]]. Below is an example of lecture: [[Introduction to the CWP Programme in 2017]]. Teaching will be centred around [[Core Competencies for CWP Practitioners]]. These competencies will be tracked throughout the year by recording learning outcomes for CWPs. CWPs will use models described under [[Self help materials]]

Source: Jeni Cross, Colorado University 

''Purpose of this page'' Provides a brief introduction to the theory of behaviour change

!!The Theory of Behaviour Change 

The theory of behavioural change is a very influential area of theory and research. It has wider applications than mental health as it is applied to problems such as healthy lifestyles, environmental care etc. 

[[10 minute TED talk|https://www.youtube.com/watch?v=l5d8GW6GdR0]] on behavioural change which is very watchable about some key principles of behavioural change.


Some very useful aspects of how to support making change.

# Making information in a form that makes sense to the client. 
# Ensuring that information is conveyed in a interpersonal way. 
# Modelling the behaviour that you want to encourage rather than focus on the behaviours that you are trying to reduce. 
# Attitudes tend to follow behaviour. So important to try to set behavioural expectations rather than focus on attitude change. 


!!Links with other pages

Ideas about behavioural change are important to consider in relation to [[Psychoeducation]].
There is a potential for this to become a bit mechanistic and behavioural. People just fill in a feedback form or get their phones out and put a score on POD. However, encouraging feedback as a reflective process and not a behaviour is very helpful. 

We need to develop a practice of inviting students to stop and reflect on what has been helpful about the session, what they have learnt etc. This is the primary task. If possible it would be great to review learning objectives as part of the feedback at the end of the session. Again, mirroring practice with guided self- help is a key aspect of this.

This could be prompted by some verbal discussion maybe included alongside inviting people to do ratings of the session on POD. We recommend that this part of the session should take about between 5-10 minutes. 
!!!Reasons to involve parents
*Important to put agency on parents - they will be doing the majority of this work at home (increase independency)
*Parents often have anxiety themselves, so it is important to consider how they manage their own anxiety - this will have an affect on what they are encouraging their child to do 
*Important to explore how they are maintaining problem etc - e.g. instinct to protect and encourage them to try things differently
*They are the ones who will be around long term to put techniques into practice. You are the coach and parents and children are running the marathon 
!!!Overcoming potential problems
*Parents seeing you as a support for them: Being up front about your role and managing expectations/ Normalising and sign posting them to support.
*Difference of opinions/goals on what their child should be doing (to the CYP and to the CWP): Speak about common and realistic goals from beginning, building strong alliance 
*Struggling to see there is a problem/what the problem is: Sensitivity, normalising 
*Confidentiality and privacy: negotiating this with parents and opening up discussions- setting up expectations of what intervention entails from beginning 
*Practicalities (time, resources): important to be clear up front about commitment required (how many sessions/if they have holidays etc/their concerns) *Experiences of services (particularly negative): Evidence base for it
[img[jumbled words.jpg]]

Here is a list of some words and acronyms and their meaning. Please tell us about any others you have come across!

AFC: Anna Freud Centre

EMHP: Education Mental Health Practitioner

CWP: Children Wellbeing practitioner 

CAI: Child Attachment Interview

CAMHS: Child and Adolescent Mental Health Services

CBT :Cognitive Behaviour Therapy

CBT-OBI: Cognitive Behaviour Therapy and other Outcomes-Based Interventions

CORC: CAMHS Outcomes Research Consortium

EBPU: Evidence Based Practice Unit

IAPT: Improving Access to Psychological Therapies

PRU: Pupil Referral Unit

Mentalization: the ability to perceive and to communicate one's own mental states and those of others - the ability to be 'mindful of minds.' 

Neuroscience: The scientific study of the brain, its structure and its functioning

Psychoanalysis: A therapeutic method for treating personality/behavioural disorders that brings the
unconscious fantasies and desires of the sufferer into their conscious mind.

SEN – special educational need

SEND – special educational need or disability

LD – learning difficulty or disability

LA – local authority

SSEN – statement of special education need

EHCP or EHC Plan – education, health and care plan

‘The Code’ – Special educational needs and disability 
code of practice: 0-25 years 

SEMH – Social, emotional and mental health difficulties

SENCO – special educational needs coordinator

''Job role''

It will be the responsibility of the service for recruiting an appropriate Supervisor/Service Development Lead. For some services this might be someone who already works within the service and knows it well - for others they may decide to recruit someone new. 

[[Supervisor role in skills workshop]]

 

//''Jungle analogy:'' You are lost in the middle of dense jungle. You can see only one path out which is well trodden – but this is the path you have just taken to get to where you are.  You don’t want to go this way!  It doesn’t lead you out.  You need to find a different way out. This means quite a lot of hard work – you have to clear a new path through the jungle and work really hard at clearing away branches and thick jungle.  This takes time and effort chopping away to create a new path. This is a bit like learning to think differently. Your old ways of thinking are very well known to you and easy to slip back into.  It takes a lot of hard work initially to develop a new way of thinking and battle with your old thoughts!  With some hard work, this path become more and more clear over time and easier to follow… but you need to keep trying (practice, practice, practice!).//
The CWP programme has various guidance and operational documents that state expectations of CWP sites and can help sites to shape their services. This page provides links and more information about these documents.

!!!The Memorandum of Understanding: 
This document outlines the terms and key tasks/responsibilities of all involved in the CWP programme (the Workforce Team, commissioners, sites and trainees). Sites sign in agreement with this document when they accept their funding offer.

<<link-doc "The Memorandum of Understanding" "https://drive.google.com/file/d/1gj9eGfJOScszpKYdvE9ypeSsH0kHwuiR/view?usp=sharing">>

!!!The CWP Operational guidance booklet: 
Provides an introduction and operational overview of the role of CWP. This can help sites to develop their local arrangements and procedures and provides recommendations as well as minimum standards/requirements.

<<link-doc "The CWP Operational guidance booklet" "https://drive.google.com/file/d/1auGJzGS6mAp9UAUoj6befpVHQ2q5Q1WM/view?usp=sharing">>

!!!The CWP site checklist: 
This checklist is sent to sites to complete 1-2 times in the training year. Information is collected to evidence the use of Placement Support funding and allows the Workforce Team to monitor the implementation of the CWP programme and feedback to HEE

<<link-doc "The CWP site checklist" "https://drive.google.com/file/d/15djvo7s5YbFs8I8hYIUR_NCm7cIoko35/view?usp=sharing">>
We like larking about. 
!!!!Source: Duncan Law 

!!!Leading change and transformation

Developing a service for new workforce to be effective requires ''good leadership'' and ''collaborative working'' across the system.

The Anna Freud Center and UCL provide training for Clinical and Operational leads who are involved in implementing change and transformation to improve the quality of the services they offer to CYP including CWP and EMHP workforce development and implementation of NHSE CYPMH policy

The Leadership Course is a one year programme for clinical leads & service managers committed to the delivery of high quality care for children and young people. 

This Postgraduate Certificate programme provides specialist post-qualification training for anyone in a leadership role implementing transformation & change in Children and Young People's Mental Health (CYPMH) and Wellbeing provision across Education, Voluntary Sectors, NHS or Social Care. 

The course is applicable to all aspects of CYPMH service improvement with particular focus on implementing policy around CYPMH including: Future in Mind, the Green Paper, Five Year Forward View & the Long Term Plan. It is relevant to leaders and service managers with responsibility for delivering  aspects of policy including CYP IAPT, Mental Health Support 

The programme aims to provide leaders with:
* the necessary background knowledge and understanding to implement change within their CYPMH services, 
* the practical tools to manage this change effectively and 
* a framework for reflective practice and evaluation of the implementation process
* critical knowledge of the theoretical, research and implementation literature that underpins such service change.

Next steps
If you are interested in this training, you can register your interest and find out more information [[CYP-IAPT Website|https://cypiapt.wordpress.com/postgraduate-cyp-iapt-training/]] and speak to your service manager about applying. 


Information
Find course brochures, videos from the open day, student testimonials and application information on our programme webpages:

[[CYP-IAPT Website|https://cypiapt.wordpress.com/postgraduate-cyp-iapt-training/]]

[[UCL Website|https://www.ucl.ac.uk/prospective-students/graduate/taught-degrees/children-young-people-mental-health-wellbeing-services-pg-cert]]

For further information and enquires please contact irina.nedelcu@annafreud.org or hannah.wright@annafreud.org 

!!!''Key practice points''
*Using a behavioural activation approach, it is very easy for the intervention to become focused on increasing activity. This is understandable but not always helpful. 
*The theory of behavioural activation is to enable a client to come to recognise the impact of behaviour on mood. This is important for the practitioner as it may enable curiosity to be shown when things have gone badly i.e. when behaviour has led to increased low mood and depression. 
*The emphasis on learning may enable the practitioner to become less strongly positioned as a somewhat critical parent  who is trying to get their young person out of bed. 
*So the overall approach is to use daily monitoring sheets simply to identify times when the young person had done things to improve mood but also  when the reverse happening. 
*Longer term is is likely that one of the benefits of this low intensity intervention is that it may facilitate the young person in beginning to learn about themselves and be able to make more conscious decisions as to what is likely to be helpful to them. 
!!''[[Psychoeducation]]'' 
*The purpose of psycho-education is to enable a child, young person or parent  to understand that, although their life is a unique one, some aspects of what they are experiencing are things that have occurred to others and that there may be some things that might be helpful to know about the experience of others with similar difficulties. 
*What is important is to check carefully that what is being shared is something that the family would like to know. In general, with psycho-education, a useful principle is that less is more.  
*Psycho-education works better when seen as part of an overall approach rather than a specific session in a sequence of sessions. 
*The whole approach of guided self help is to enable the client to take control of their own needs and information about these needs is aimed to support this process.  
Just like guided self help, the CWPs should be given opportunities and suggestions of things to practice or read up. References or self help materials might be useful here. 

This is a key aspect of mirroring guided self help. The key principle here (overstated) is that the CWPs won’t learn things because we teach them but they will learn things by practicing some things that we suggest to them.

For more theoretical or evidence related teaching this may be less straight forward and may just be about suggesting a very specific reference (or a web site) for them to read and discuss with a colleague. 

What is important is that students are encouraged to adopt an active sense of agency around their own learning, the link with guided self help is then made explicit and not implicitly assumed. 
''Intervention Length''

* Over 80% of cases were seen for between 6 and 10 appointments

* The most common number of sessions for each intervention was 8 

* The average number of appointments was 7

''Intervention Delivery''

* The most common format of session delivery was face to face (75%), followed by a combination of face to face and telephone (23%) and a small proportion was delivered by telephone (1%).

''Intervention Location ''

The location of sessions included the following: 

* Educational setting (41%)
* CAMHS premises (30%)
* Voluntary and charity sector (13%)
* Child or young person’s home (8%)
* Youth Centre (7%) 
* Community Centre (1%) 
* Primary care setting (<1%)
Source: Deb ~McNally and the Manchester Collaborative 

* Research has demonstrated the important role of parents in child development. It has been shown that mothers' frequent use of verbal scaffolding predicts superior problem solving and self-control in toddlers (Landry, Miller-Loncar, Smith, & Stewart, 2002)
* Environments that are ‘language-rich’ is a predictor of quicker language and vocabulary acquisition of vocabulary and grammar (Tamis-LeMonda, Shannon, Cabrera, & Lamb, 2004)
* Self-regulation and self-control are critically important for children’s development into adulthood. It has been found that a child’s ability to exert self-control and regulation correlates with the ease at which the child will make the transition to school (Rimm-Kaufman, Pianta, & Cox, 2000)
* Therefore, a key component of parenting interventions (early intervention) should be to support children’s development of self-regulatory skills 
* Mothers who praise their pre-schoolers for their good manners have children with better social skills (Garner 2006; Hastings, ~McShane, Parker & Ladha, 2007).
* 36-month olds who were most likely to tackle challenges and to persist at a task were the ones whose mothers had praised and encouraged their independence at 24 months (Kelley et al 2000).
* Praise that immediately follows a behaviour increases the chances of that behaviour occurring again (Alberto & Troutman, 2009; Kerr & Nelson, 2010). 

{{manc}}

Logical Consequences Guidelines

* Make sure you can live with the consequences
* Discuss in advance 
* Appropriate
* Immediate
* Straight forward
* Non-punitive
* Give warnings and choices
* Keep it brief – it is an opportunity to learn
* Use if…then messages E.g. If you put your coat on then we can go to the park now or we can stay inside. If you throw your food then I will take it away (take away for 5 mins and then return)
Examples: Natural

* Jump in a puddle – feet get wet
* Drop your ice cream – can’t eat it
* Don’t take turns – other child won’t want to play
Examples: Logical

* Don’t come off the computer – lose computer time later
* Don’t eat dinner – no dessert
* Don’t tidy room – privileges removed 
[img[bubbles1.jpg]]

This guide does not cover low mood in children it focuses on work with adolescents as this is what is taught on this programme. Information regarding the intervention for low mood can be found on the [[Helping]] pages.

There are two main areas within the learning pages for low mood which are:

[[Low Mood practice]] - guidance for working with young people who have low mood.

[[Low Mood knowledge]] - key information surrounding low mood.
----
!!'Guided Self-Help for Low Mood'
The manual used to guide practice for working with YP with Low mood is the 'Guided Self-Help for Low Mood'. This approach has a similar overall framework to the approach to anxiety problems. Please find the full manual linked below: //Manual developed by Tower Hamlets CWP Service: Information combined from C&I Depression and Low Mood GSH book, Depression Moodjuice Self-help Guide and Get self-help website//

 <<link-doc "Behavioural Activation
(BA) for Young People
with Low Mood: Guided Self-Help Manual" "https://drive.google.com/file/d/1PNZ5P71hlhORf4V83vipGqY3gG5WdVy6/view?usp=sharing">>  

---


__Sharing handouts with young people and parents during remote working__

For further adaptions made to the manual in light of COVID-19 and the changes to working please see page:

[[Low Mood Manual: COVID-19 Adaptions]]

The authors of the behaviour problems, low mood and adolescent anxiety manuals/handouts have given practitioners permission to create a Word version of the handouts for ease of sharing when remote working with young people and parents should you wish to do so.



PLEASE NOTE: The manuals/handouts are covered by Creative Commons copyright.  

Copyright: Available under License Creative Commons Attribution No Derivatives
See further: https://creativecommons.org/licenses/by-nd/3.0/

In addition, they are designed to fit with the evidence base for working with these interventions.  

For these reasons, the content of the manuals/handouts should not be amended by practitioners, but young people/parents/carers can fill them in as part of the intervention as they would a paper copy.


---
!!!Session overview:

For a more detailed overview of the session plans please go to: [[Low Mood - Sessions Overview]]

!!!Session plans:

For session plans please go to: [[Session Plans for Overcoming Low Mood]]


!!!Session Handouts:


To access the handouts for low mood please go to:
[[Low mood: Handouts for CYP]]


The basic approach is to have sessions with the young person but these can be interspersed with contact with a parent. A guide for parents developed alongside the Low Mood manual can be found below.  You may want to call parents after the assessment (provided the young person consents to this) and then send parents this information. Parents are reporting finding it very helpful.

<<link-doc  "Parent Low Mood information" "https://drive.google.com/file/d/1uT6HP7yJLTq_qNl-u_Ym5ElXJJ8AGzus/view?usp=sharing">>


If you would like to share a specific handout with parents within this information you will find a list of the handouts for parents on the page: [[Low mood: Handouts for parents]]

For previous versions of the low mood manual please go to [[Low Mood Manual- previous versions]]
---

The full manual can be accessed through the link below: 

 <<link-doc "Guided Self-Help for Low Mood: Full Manual" "https://drive.google.com/file/d/12bn3n53aWhm5_21Za460fp_qOtPsWY_N/view?usp=sharing">>  

[[Session Plans for Overcoming Low Mood]]

---

!!Overview

*8 sessions with Adolescents - with parent involvement where appropriate and with consent. 

Parental involvement is recommended at assessment (session 0) and final session at least.  Face to face sessions are the norm for this intervention:  it is often a helpful part of the behavioural activation and in our experience young people often prefer them.  However, if young people prefer to have any of sessions 5-7 on the phone and it seems clinically appropriate to do this, that is fine

!!!''Assessment session''
An initial assessment session referred to in this guide as '''Session 0''' will take place before the intervention starts. This pre-intervention session (like a choice appointment) it is not counted as one of the intervention sessions. For more information please go to [[Session 0 for Adolescents: General Assessment]]

''Session 1:'' Goals setting, Psychoeducation and Formulation

*RCADS symptom tracker

*Goals

*Psychoeducation

*Formulation
''Session 2:'' Back-up Team and Behavioural activation

*Introduction to Behavioural Activation
*Introduce activity diary

''Session 3:'' BA The Next Steps; Values and Activity Planning

*RCADs symptom tracker & rate goals
*Review ROMs (RCADS DEP, GBO)
*Introducing values
* Translating values into activities
* Activity Planning

''Session 4:'' Review BA and The role of thoughts and unhelpful thinking styles

*Thinking Traps
* Challenging negative thinking
*Thought diary

''Session 5-7:'' BA Continued, alongside additional interventions, to be selected as appropriate

*Review homework 
*BA focuses on relationship between a balanced lifestyle and positive wellbeing 
*Monitoring the young persons week in terms of Achievement, Closeness and Enjoyment 
*Helping a young person start the journey towards building a new rewarding life that matters to them 

''Session 8:'' Relapse prevention and feedback to parents
 <<link-doc "Guided Self-Help for Low Mood: Full Manual" "https://drive.google.com/file/d/12bn3n53aWhm5_21Za460fp_qOtPsWY_N/view?usp=sharing">>  


 <<link-doc "Guided Self-Help for Low Mood: Full Manual WORD VERSION" "https://drive.google.com/file/d/1rZLRAEO4g3NTGGVPgCuAufg5nC2Tfn8k/view?usp=sharing">>  
Please see below for the adapted low mood manual in response to the current circumstances caused by COVID-19. This manual was compiled and edited by the KCL CYP-IAPT team: Helen Barker, Zoe Maiden, Laura Bowyer,
Sarah Carman, Victoria Pile, Susanna Payne; and the UCL CYP-IAPT team: Vicki Curry
With information from: Caroline Stokes (KCL); Alice Kerr & Emma Warnock-Parkes, (Centre
for Anxiety Disorders And Trauma/KCL); Lisa Shostak (KCL); Ali Lambie, (Mindfulness
Hampshire); Jynna Yarrum and Alysia James, (University of Northampton).
Young people’s perspective from: Lila and Remy Moar

---

<<link-pdf "Low mood manual: COVID-19 adaptations" "https://drive.google.com/file/d/12ZyyVDrLD4nvyDGZRL2qEm0HpvR0ijtT/view?usp=sharing">>
!!!!Source: Carolyn Edwards

Please find attached a set of practice activities you may find useful in relation to the LOW MOOD/ Behavioural activation intervention.  As before these are not marked or assessed as part of course requirements and are optional.  

If you are not involved in the activity, please be sure to get the feedback from trainees about how they found it and what they learned.  
For each activity you may wish to ask trainees to complete a ‘Practice Review Form’ to reflect on their learning from the task.


<<link-doc "Case Study: Fazian" "https://drive.google.com/file/d/1HVaGU-aFy06Z8n_JausFU_UzmJw-urDN/view?usp=sharing">>

<<link-doc "Clinical practice review form" "https://drive.google.com/file/d/17IILndc1tU_F5MIBbBgnMPGPd1VSnfjc/view?usp=sharing">>

<<link-doc "EMHP/CWP practice tasks for placement" "https://drive.google.com/file/d/1O8-WSGxb-iAdrL9RiHyumCSMU67n_Gxc/view?usp=sharing">>

<<link-doc "Article: Behavioural activation for depression" "https://drive.google.com/file/d/1kLp8H8BqOGoME0LX7ycm7s2-f9D1rP9q/view?usp=sharing">>
<<list-links "[tag[Low Mood Session Material]]">>
<<list-links "[tag[Low Mood knowledge]]">>
This is a tag tiddler 

<<list-links "[tag[Low Mood practice]]">>
!!''Notes for teaching session in 2017''
!!!''NICE mental health guidelines''
*10% or less relate directly to children: there is less evidence to look at, limited data need to draw on the adult literature 
*Reducing risk by combining treatments i.e. suicidal ideation 
*Clinical trials show 8% of people get worse after psychological therapies at the end of the treatment. But people might be shown to be on a 'recovery track' longitudinally and continue to get better in the future 
*Keep in mind supporting research in the long term 
!!!''Stepped Care'' 
When assessment time varies it create a waitlist. Goal is to reduce waitlist and facilitate better access to care. Low intensity intervention came out of this- where you can be clear about the nature of the intervention, with a clear time frame. 
Psychosocial intervention for low mood includes exercise which was found to be effective in adults 
*Not much evidence for the Stepped Care model in the beginning but evidence was increased over the last 10 years 
75% of adult disorders start in childhood, impact on education and in the long term employment if not treated. Early interventions have the potential to change a persons life course. 
*Able to see more people with IT interventions, evidence for groups is weaker than individual treatment but IAPT are considering this option to cope with the increasing patient load. 
!!!''Evidence of low intensity intervention'' 
*for guided self help and parenting training in depression (low mood) anxiety 
*Distinction between HI and LI will become clearer in the next 10 years e.g. digital interventions (David Clark, Kings) which reduced therapeutic hours from 12 to 4. More work in development but do not need to be delivered by high intensity therapists. Less training is needed but still as effective. 
*Different role in the Car model- it suggests to the therapists what they might be differently across a range of anxiety disorder 
*Clear evidence based  for digital interventions i.e. CCBT if there is facilitation by a low intensity worker. 
*Beating the Blues- commonly used adult intervention, evidence clear in outcomes and in the amount of facilitation. 
*Clear evidence if you are not facilitating things you are less likely to see benefit 
!!!''Process'' 
1. Least intrusive most effective intervention first - effective use of resource underpinned by increased access 
2. Build in a self-correcting mechanism - monitoring outcomes, if people aren't progressing as expected you have a way of monitoring that and then correcting that. If this is seen then it is possible to 'step up' 
!!!Assumption of LI intervention 
1. Efficiency - providing more structured, time limited, protocol driven = quicker, better with less intensive input, less time, less resource. This will break down if people 'go down the side of it' i.e. patients requesting their own treatments (Mindfulness). 
2. Equity of outcome - can be clinical or cost-effectiveness. Roughly equivalent outcomes in HI and LI interventions, less certainly about the long term outcomes (one year plus follow up). Ration of how much improvement in quality adjusted life years and how much is this is terms of cost, LI interventions more cost-effective. Required to think about both from a public health perspective. 
3. Acceptability - Interaction between acceptability with the young person and parents liking of books etc? Need examples which people can relate to. Rule of thumb with self-help materials is to make them accessible for everyone. 
!!!''Discussion'' 
*Harms associated with psychological interventions? 
**Create more dependence to the therapists, don't feel able to take skills into their lives, therapists putting their world view onto the client. 
**Do people get worse? Discover their issues are worse
*What is a standardised mean difference? Cohen invented a correction to the way we assess evidence- half a standard deviation (.5) is used to compare a treatment against a treatment or against a waitlist.
**Statistical problems (Book) 
*What was the number of contacts people had in the un-facilitated and lightly facilitated intervention? Answer is 1, Beating the Blues (in adults) found treatment as usual was best. 
*Thoughts on LI intervention- parents might think LI is not enough deal with this my presenting them with the available evidence. Parents might be relieved invention will be less demanding on time etc. Comparisons with other treatments within a school- can be tailored more to what people need. 
*What to say to parents? Low intensity interventions are recommended by NICE, they are just as effective as high intensity work and we believe they will work best for your situation. 
*NNT- numbers needed to treat is the lower the better (n=6). This means you would need to see 6 people to get one person better than the standard treatment. 
*QALYs for mental health compared to physical conditions compared very well- means we have good interventions which work as well as other interventions. 
*Difficulties of PWPs have been given people on the waitlist instead of being given people they can actually help 
*Specificity of interventions is beneficial
*How long is it before someone seeks treatments for social anxiety? 8-10 years 
*Effect is Johnansson study = control stayed as depressed at follow up as they were at baseline. Look at what the comparator is when you are looking at the results of research. 
 


Information has been drawn from a number of sources in the development of the handout material.  This includes Children’s Wellbeing Practitioner teaching, other CWP services and a range of websites.  In some cases material was found online that did not include references.  In most instances we have taken such material and adapted it to ensure it fits with our particular style of intervention.  Key acknowledgements are listed within the handouts. 

!!''All handouts:''
<<link-doc "All Handouts for Low Mood (CYP)" "https://docs.google.com/document/d/17TvWndurTgXkOjARPdrAujVXLb2NrEfIOU9qEWifMRg/edit?usp=sharing">>  

!!''Session 1:''
<<link-doc "Depression and Low Mood: Psychoeducation" " https://docs.google.com/document/d/1ruYpSKy13nxb13CFyreZAGn0w0BPba8BWlQn7PGIFlY/edit?usp=sharing">>
<<link-doc "Development Map of Low Mood" "https://docs.google.com/document/d/167VUIWaLoqrWbb1wOrcklO-N2CZNfjgcpsTDfiDdRyk/edit?usp=sharing">>
<<link-doc  "SMART Goal handout" "https://drive.google.com/open?id=1n-KiufWlI_3xIniCOtqv5iqNFe_ec-fDGYh_OumuvhE">>
<<link-doc "Paper version of GBO" "https://drive.google.com/drive/u/1/folders/1jaGGIN0Q_nI9eIFkJhx1TYBHxpOm0ojI">>
!!''Session 2''
 <<link-doc "The Back-up Team (CYP)" "https://docs.google.com/document/d/1WfmTz29skWDxADSQ3rN67MUPS88Jy8zu_6M1u59TmAY/edit?usp=sharing">>
<<link-doc "Behavioural Activation 1 (CYP)" "https://docs.google.com/document/d/1HLilN-S1H-6WnnbPAncz8Mn99QIbaQvzhRYiOuVDKfo/edit?usp=sharing">>  

!!''Session 3''
<<link-doc "Behavioural Activation 2 (CYP)" "https://docs.google.com/document/d/1uQ6Ik8hd3PADOcBQWSvmOfhyh_Zs3Gw97O_TxJqZk1A/edit?usp=sharing">>  

!!''Session 4''
<<link-doc "Negative Automatic Thoughts factsheet" "https://docs.google.com/document/d/1eYo3wxU0HAfd0lXt75Ba79logY4yhgz-G-jCIwtOxqA/edit?usp=sharing">>
<<link-doc "Thinking Traps" "https://docs.google.com/document/d/1uKIB6vs687FCuoYUwK52yQIdqQHm1pky0wTkLl1tFpw/edit?usp=sharing">>
<<link-doc "Challenge Negative Thinking " "https://docs.google.com/document/d/1svoln2f7jaKhLfYbexOHr7pBZzT6QPr4p8ELbW91JBw/edit?usp=sharing">>
<<link-doc "Thought Diary" "https://docs.google.com/document/d/1R2QZM747m9-WIoWYR5x1ld5etxd-R2LlVSJdNBHtliE/edit?usp=sharing">>
<<link-doc "Think Positive" "https://docs.google.com/document/d/1Z2CjcHutfYM6snQQksRzVdDj6WyCmPqywdJj1ZW_5d0/edit?usp=sharing">>

!!''Sessions 5- 7''
<<link-doc "Negative thought experiment" "https://docs.google.com/document/d/1vPOTb7xeh4k2FTTwjplK71Q9GGnHuZv0VAbT_KAGaec/edit?usp=sharing">>
<<link-doc "Putting Thoughts on Trial" "https://docs.google.com/document/d/1p-AOMr7B3IHg3UlBIFNHakdMXQKU4pvVSfyo0AHIBDY/edit?usp=sharing">>
<<link-doc "Internal Bully" "https://docs.google.com/document/d/1clKxDvH1eA1jWD0PsJcEsMhHlkEUsn_AftF5yHtm-LU/edit?usp=sharing">>
<<link-doc "Thought Acceptance" "https://docs.google.com/document/d/1AMTUadcRo5Hkt1Dk31DPAL3llWwdcZnyVhWP4N_w_Ys/edit?usp=sharing">>
<<link-doc "Recongnising your Qualities and Achievements" "https://docs.google.com/document/d/19-de69p_-IEDp9z-jh97sCnqpeSe-QcCZyEIGzknMRo/edit?usp=sharing">>
<<link-doc "Problem Solving (CYP)" "https://docs.google.com/document/d/1nskm3W7zSTv0G02SG6sSvUKGiU5a1Q9aZz9zFeNgEh4/edit?usp=sharing">>
<<link-doc "Sleep Hygiene" "https://docs.google.com/document/d/1uIpcRdEdXF_s7V3t7-4MVP6a0r0OcmuTpIQhcyNnMpI/edit?usp=sharing">>
<<link-doc "Worry Time" "https://docs.google.com/document/d/1lUqQz069CCbvpqnpnWrwKQH3_wn3XzD3WZZAg84DjgI/edit?usp=sharing">>
<<link-doc "Is Worry Helping Me?" "https://docs.google.com/document/d/1DHnwmlVvM6ISrUxtDzvvkRYM4qB2erzOZGrV4GiX82s/edit?usp=sharing">>
<<link-doc "Distraction" "https://docs.google.com/document/d/1Lq3vimhaIvmQdRcXzYe3ks3kb4Nf0wsskw4esQIzYIw/edit?usp=sharing">>

!!''Session 8''
<<link-doc "Relapse Prevention" "https://docs.google.com/document/d/1YyWU6cCJRu1iJi5NyuFepkfEFZj-PfkuulVx6OGKjt0/edit?usp=sharing">>
<<link-doc "Staying Well Plan" "https://docs.google.com/document/d/1skOzUa9z8f5W24-SeJ1SdN6qoobnKCgPMQm4Lm3fw2k/edit?usp=sharing">>
Information has been drawn from a number of sources in the development of the handout material.  This includes Children’s Wellbeing Practitioner teaching, other CWP services and a range of websites.  In some cases material was found online that did not include references.  In most instances we have taken such material and adapted it to ensure it fits with our particular style of intervention.  Key acknowledgements are listed within the handouts. 

<<link-doc  "SMART Goal handout" "https://drive.google.com/open?id=1n-KiufWlI_3xIniCOtqv5iqNFe_ec-fDGYh_OumuvhE">>
<<link-doc "Paper version of GBO" "https://drive.google.com/drive/u/1/folders/1jaGGIN0Q_nI9eIFkJhx1TYBHxpOm0ojI">>
 <<link-doc "Parent Guide: Low Mood" "https://docs.google.com/document/d/16zR1iGKv98BpWnI02GoHz1cYygXo7h76iOX6Ly7veX8/edit?usp=sharing">>
 <<link-doc "The Back-up Team (Parent)" "https://docs.google.com/document/d/1TI14Qtulb9PDRByBJRNLj_uR1ECMiwqp4aJF-_93x2k/edit?usp=sharing">>
 <<link-doc "Behavioural Activation 1 (Parent)" "https://docs.google.com/document/d/1Aaw4fG4r9Or5JzpPJzZJ3TCXM7GxYu83v-xdAo6RdoA/edit?usp=sharing">>
 <<link-doc "Behavioural Activation 2 (Parent)" "https://docs.google.com/document/d/1LdKZTZXUbIbCIjFk8yohIcGVJl1OMNKUWKHAGWxvX5A/edit?usp=sharing">>
 <<link-doc "Problem Solving (Parent)" "https://docs.google.com/document/d/1WMrr84N53ALcHTbIi1-BrJX0VD-7krTg8VaWA96gAPs/edit?usp=sharing">>
 <<link-doc "Day-night reversal problems (Parent)" "https://docs.google.com/document/d/1pdQcH6ocGg5y1HXPfq5jXqV6Cp9bkRICq8JIXBz1q5g/edit?usp=sharing">>
 <<link-doc "Useful Resources for Parents" "https://docs.google.com/document/d/10E95J--DU_-y95wNeXt1e323BAp-zRNiBeysADKcLfA/edit?usp=sharing">> 
<div class="tc-table-of-contents">
<<toc-selective-expandable 'TableOfContents'>>
</div>
@@color:red;This page is being developed in light of recent changes to working due to the outbreak of COVID-19@@
# Avoid unnecessary commands– reduce the number of commands given 
# One command at a time – demonstrate by giving a long list of commands “go and brush your teeth, when you’ve done that put your PJs on, then come downstairs and get a drink and make sure you say goodnight to dad”. 
# Keep commands brief
#Commands should be simple, clear and direct. Why? This will increase the likelihood of compliance.
#Avoid vague commands – demonstrate by saying “Behave”, “stop it”, “careful”, “you need pull your socks up”. Ask the parent did they know what you were referring to? Would the child understand what you want them to do?

# Use positive /do commands
# Avoid question commands– demonstrate by saying “How many times do I have to tell you?” or “would you mind tidying up?”. This gives children a choice and a chance to say “no”. 

# Avoid power struggles
# Offer choices - “When.... Then” and alternatives – this will increase compliance by giving them a sense of control. Get parents to generate examples applicable for their children e.g. “do you want to put your blue socks or your red socks on?”
# Age appropriate commands
# Give warnings and reminders
# Time to comply - Wait for response (5 seconds rule)
# Be polite and use eye contact 
# Use distractions and redirections 
# Ensure appropriate consequence – follow through by either praising “well done for listening” or consequence “you didn’t put your toys away, so you can’t you’re your treat” 

(Forehand & ~McMahon, 1981)
!!Making praise effective 

''Sincere and specific-'' Focus on behaviours that have been difficult for your child to demonstrate, and so it’s a big achievement when they show improvements in their behaviour. Encouraging eye contact before praising can be a nice way to show your child how much their efforts mean to you. 

''Given immediately'' the closer the praise is given to the behaviour, the more likely the child will link this positive experience to the behaviour

''Focus on behaviours and traits that they have power to change'': such as effort, perseverance, kindness, and patience, rather than outcome or talent

''Avoid comparing your child to others'': Avoid putting down yourself or another child in order to make your child feel good about themselves

''Don’t muddle the praise with criticism or teaching'' (e.g. ‘thank you for picking up your toys… finally’, ‘it’s great you tidied the bathroom, now if you’d just done this as soon as I’d asked then we could have avoided all that drama and gone to the park today’)” all the child will remember is the criticism


''Avoid waiting for perfection to praise/completed tasks'' – praise steps in the right direction if a child who  has had difficulties with physical aggression takes themselves away from a peer when angry and yells on their own instead, even though this is not the most desirable response, it is safer than hitting and this should be acknowledged. Praise during the task (don’t wait until the end)

''Make your rewards actually rewarding'': think about what your child likes (for example, if your child does not enjoy hugs, do not use this as a reward) and gain their feedback when developing rewards

''Ignore negative responses'': If the child talks back or shows minor misbehaviour after being praised, then ignore this and walk away – you’ve just shown you child that positive behaviour gains your attention better than misbehaviour, don’t then give them a bigger pay off (in terms of your attention) for misbehaving

''Rewards vs bribes'': Rewards are given after the behaviour is shown, bribes are given beforehand – only give a reward after the behaviour has been shown
!!Key points
Part of offering low intensity help to a child, young person or parent is to develop a shared understanding of the nature of the problem. This involves 
*sharing information about what the problem is like for people in general
*what we know about how such problems arise 
*how it has come about in this particular case. In CBT this is usually described as a formulation. 
*As part of the method the aim is to develop a shared understanding of the problem - i.e. how does the parent, child or young person make sense of what they are experiencing. How has it come about? 
*Making sense of the problem is seen as a component of effective help. 
*There are techniques for helping a parent or young person from making sense of their problem and these are described in a number of different pages linked to this page. 
*[[Making sense of problems using the hot cross bun]]

<<list-links "[tag[Managing Risk]]">>
!!!!Source: Barnet, Enfield and Haringey NHS Trust
---
This information is intended as a GUIDE of key areas to explore in a telephone conversation with a young people presenting with high/immediate risk concerns. However it is important to understand/follow your local protocols regarding risk. NOTE: You will not be expected to manage risk alone - please ask a senior clinician to join or support you.

---

!!!__FACTORS TO CONSIDER EXPLORING DURING TELEPHONE CONVERSATION__

__''Consent/confidentiality''__

__''Details about the young person and engagement''__

*Contact details (of YP and parent) in case you get cut off
*Other information: (e.g.) age/ school/ known to CAMHS/ clinician 
*Engagement and building rapport

__''Assessment of what's going on and current level of risk''__

*current situation/ concerns/ what trigger increased distress?
*Young person's thoughts, feelings, behaviours, urges, plans
*Situational context: who are they with / where are they/ what are they doing?
*who else is aware of these concerns?
*Does the young person currently feel safe? What needs to happen in order to feel safe?  
*Additional risk indicators: tone of voice (flat/fast paced), openness to disclose

__''Protective factors''__

*Info about the YP's: Likes/ interests/ hobbies/ plans for the weekend
*Friends/ families/ other support?

__''Immediate support''__

*Offer some initial guidance about how to access immediate support
*Clinician to contact support services/ family member
**If immediate risk- clinician might call ambulance or advice adult to take YP to A&E 
**If not immediate but high risk (13 years +)- contact SAFE
**If not immediate but high risk (under 13)- speak to senior duty CAMHS clinician/ ACCCESS clinician

__''Initial safety plan/ coping strategies (to share with young person over the phone and in a safety plan, while waiting to be seen)''__

*Grounding tecniques (e.g. 5 senses- what can you see/ hear/ feel/ touch/ taste, deep breathing to count of 4, 'square breathing', having a drink of water)
*Elicit positive and coping thoughts ('what would you say to a friend in this situation?')
*Distraction (getting the YP to focus on something else)
*Refer to self-regulation and coping sheet for further ideas

!!!__TASKS FOLLOWING THE TELEPHONE CALL__

__''Letter/ Documentation''__

*Document on telephone conversation on RIO (or service equivalent recording system)
*Summarise the initial safely plan with young person to the GP/ referrer, copy to parent/ guardian and young person (copy on RIO)
__''Debrief with a colleague that day''__

*It is important no to feel alone when managing risk.

__''Self-care''__

*What might support your self-care? (e.g. taking a break, going for a walk, talking with a colleague, not taking more phone calls that day, planning somthing for after work?).

__''Bring case to next team meeting''__

* Opportunity for reflection, to review outcomes and learning points and so the risk is held by the whole team.
!! 1) Managing role as team leader/supervisor 

!!!Challenges of the role/ relationship to CWP  
*Providing all support for CWPs i.e. manager, knowledge about the model, supervisor, service development
*Challenge of being a manager i.e. what to do if people don't do tasks as this is different to previous supervisor only role 
*Containment sacrificed when doing line manager and clinical supervisor- difference between being a clinical supervisor and line manager (difference in the relationship) 
* Feeling responsible for CWPs, especially when team is sat in a different area i.e. school team working in CAMHS
*CWPs pushing boundaries over things like study leave, arriving on time, participating in role plays 
*Relationship with cohort 1 and cohort 2 CWPs especially when there is a difference between cohorts 
*Assumption that people should be able to supervise, CPD and training on how to supervise and have access to supervision of supervision 
*Supervisor not wanting to criticise CWP within supervision even if something needed to improve, need to have discussion about how CWP would like to receive feedback. Naming that supervisor is an opportunity to learn. 
*CWPs not theraputically trained, so way they speak to clients can be conversational which can lead to messages which are not helpful to the client. Need to highlight this in the right way in supervision. 
*Restrictions by CAMHS managers and role within the service after a current time i.e. role after qualification 

!! 2) Applying the model 
*Moving away from the medical terminology in a CWP approach, think about it as a presenting problem rather than a diagnosis. This is needed to link the problem to the manual. 
*Separation Anxiety/Phobia when being taught general anxiety, same principles. Can we use phobia material from Moodjuice rather than Creswell model? Stick within the model of GSH. 
*Self-esteem? Look at RCADS and see what the measure is indicating i.e. low mood or an anxiety intervention. Formulation to see what is behind the self-esteem. 
! Question:

''How'' do we __upload__ a video?

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/J3PNCBPqJ7o" frameborder="0" allowfullscreen></iframe></html>

What about images?

[img[brain.jpg]]


We have uploaded an image of some building block:


[img[sunshine.jpg]]

The beautiful sunshine!


<<link-doc "RCADS "  "https://drive.google.com/file/d/0B-tACu2wi4-4dEdqbk93SlNvTE0/view?usp=sharing">>


<<link-doc "CWP BAME inclusion group flyer" "https://drive.google.com/file/d/1OKiWCRxNMBDSgf8zHW3zV9WasUefGqnD/view?usp=sharing">>

<<link-doc "CWP BAME Inclusion Group Powerpoint Presentation" "https://drive.google.com/file/d/1OKiWCRxNMBDSgf8zHW3zV9WasUefGqnD/view?usp=sharing">>


!!!!!Source: Joanne Woodford, Catherine Gallop, Jonathan Parker, Dr Fin Williams & Kate Sandel

!!Wellbeing Practitioner: Data Handbook  

The following handbook has been compiled to assist with data collection relevant to the Wellbeing  Practitioner-Children and Young People (WP‐CYP) role for the South West Collaborative (Exeter University).  The handbook has been designed to support with the collection of both sessions clinical outcomes as well as tracking data. It provides an excellent resource and information about outcome measurement. For CWPs working in other areas of the country, please do not assume that you use exactly the same data management systems as there will be modified systems for different parts of the country. 

The handbook has been developed by the University of Exeter on behalf of the South West CYP-IAPT Collaborative, and also informed by the National WP-CYP Research and Evaluation Group. We are very grateful for the Exeter Group to share this excellent information about outcomes measurement in the CWP programme. 

Instructions to using all clinical outcome measurements listed has been informed by the Child Outcomes Research  Consortium (CORC) [[website|http://www.corc.uk.net/]]  

<<link-pdf "Data Handbook " "https://drive.google.com/file/d/1wd9Yqtm_ExNSdwliZKvpg4FY36Zn79FQ/view?usp=sharing">>
Here is a youtube clip showing the standard strange situation procedure. 

https://www.youtube.com/watch?v=QTsewNrHUHU
!!!!!!Source:Julian Childs and colleagues  (AFNCCF)  

!!!''Calculating recovery and reliable recovery''

''Recovery'' 
This uses the reliable change methodology (see [[Measuring reliable change]]).

 ''Recovery'' is shown if a young person moves from above a threshold or cut off to below a cut off. The size of change may be less than required for reliable  change. 

''Reliable recovery'' is shown if both recovery and reliable change criteria are met: 

#the young person scores above a threshold at Time 1 and below threshold at Time 2.  
#the young person shows improvement in scores greater than the reliable change criterion are considered to be ‘reliably improved’, 

For more information on calculating recovery please see the [[CORC website|https://www.corc.uk.net/information-hub/learning-from-corcs-analysis-of-data-from-child-mental-health-services-2011-2015/]]

!!!!!!Source:Julian Childs and colleagues  (AFNCCF)  

We are indebted to the Child Outcomes Research Consortium (CORC) for the information provided on this page. The CORC website can be found [[here|https://www.corc.uk.net/]]

!!!''Calculating reliable change''

''Reliable Change'' 
This calculates whether change in scores was greater than could likely be solely attributed to measurement error.

This involves calculating a reliable change criterion score. This is the amount of change that needs to occur between Time 1 and Time 2 for change to be more than chance variation due to  measurement error. This score will be different for each measure that is used. 

''Reliable improvement'' is shown if the young person shows improvement in scores greater than the reliable change criterion. 

''Reliable deterioration'' is shown if the young person shows reduction in scores greater than the reliable change criterion.

''No reliable change'' is shown if the young person does not show a change in score greater than the reliable change criterion in either direction. 



!!!''How it is calculated''

This formula calculates a size of difference between Time 1 and Time 2 for a particular sample of cases. For example, for goals measures, this is routinely recognised as being a difference of 2.45 on a ten point self report scale.  This is called the reliable change criterion. For different measures and for different samples, the reliable will be change criterion will be different.   
 
CORC provide a excell spreadsheet that includes the formula for calculating the reliable change criteria. This can be downloaded [[here|https://www.corc.uk.net/media/1495/corc-outcomes-spreadsheet_v1_mar17.xlsx]]. 

To calculate the criterion, you will need to be able to calculate the Cronbach's Alpha coefficient and the standard deviaiton for the sample at Time 1 as these need to be entered into the spreadsheet formula that is provided. 




The Healthy London Partnership has an excellent website with resources for schools. 

The toolkit has been developed in partnership with the Greater London Authority. Supporting children with their emotional wellbeing and mental health is a growing priority for health services and for education settings. We encourage leaders and staff, health care professionals and commissioners to use the toolkit for a wide range of information and guidance on how to promote emotional wellbeing and mental health within schools. 

https://www.healthylondon.org/resource/schools-mental-health-toolkit/

https://www.healthylondon.org/wp-content/uploads/2018/11/Mental-Health-Support-in-Schools-Mapping-Exercise-Report.pdf


https://www.healthylondon.org/wp-content/uploads/2018/11/Amplified-and-HLP-School-Insights-Report-2018.pdf
! Mental health and Wellbeing

 
Mental health can be defined as a state of well-being where individuals are able to: 

* realise their own potential
*cope with normal stresses of life
*work productively and contribute to their community.  

Mental health involves psychological and emotional well-being. The WHO defines health as //‘a state of complete physical, mental and social well-being and not merely the absence of disease or infirmity’//.

 
Well-being has been described as the state of being comfortable, healthy or happy.  It involves a cognitive sense of satisfaction with life. More than happiness and satisfaction it includes developing as a person, being fulfilled, resilience and having an active role in the community.

 
Mental health problems can result in a loss of wellbeing. Such problems may arise from individual vulnerabilities, life experiences including trauma or abuse, isolation, discrimination and adverse family circumstances. 

A person’s state of equilibrium or balance can be affected by these challenges leading to a reduced capacity to cope with stress, changes in how they relate to others and negatively affect well-being. During these times people may seek professional support (e.g. counselling, therapy and or medication) when their normal support systems or coping strategies no longer meet their current needs.
For children and young people, seen in mental health services, guidance on the data required by the MHSDS  can be found below. 

* [[How to enter data?|https://digital.nhs.uk/data-and-information/data-collections-and-data-sets/data-sets/mental-health-services-data-set]]
*[[Intermediate data set|https://digital.nhs.uk/data-and-information/data-collections-and-data-sets/data-sets/mental-health-services-data-set/how-do-i-submit-data-to-the-mental-health-services-data-set]]
* [[Specification and guidance|https://digital.nhs.uk/data-and-information/data-collections-and-data-sets/data-sets/mental-health-services-data-set/mental-health-services-data-set-specifications-and-guidance]]
*Medical record systems: These can be found by searching for 'free patient care software' on google
Articles from [[The Mix|https://www.themix.org.uk/get-support]]:

* [[Will I always have anxiety?|http://www.themix.org.uk/mental-health/anxiety-ocd-and-phobias/will-i-always-have-anxiety-6127.html]] 

* [[Exams and the pressure to do well|http://www.themix.org.uk/work-and-study/study-and-exam-tips/exams-and-the-pressure-to-do-well-23966.html]]

Our Young Champions really liked this video discussing mental health. 

Although the people in the video are older, you will see a lot of their difficulties started in adolescents. 

This video shows discusses experiences of different mental health problems with people from a variety of ethic backgrounds. Our Young Champions thought it was important the video discussed self-harm as they said young people know about it its a topic that needs addressing not ignoring. 

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/watch?v=_y97VF5UJcc&list=PL3wHgZdQix8eugFvj7XiDPw1OHgLjFCO1" frameborder="0" allowfullscreen></html>

!!!This section of the guide provides additional information that may be of interest to both supervisors/teaching staff and trainee practitioners.

<<list-links "[tag[MoreContents]]">>

!!!!Source: Joe Hickey

!!What is motivational interviewing (MI)?

A style and method for having conversations about change, with young people, family members or staff (Miller & Rollnick, 1995).

*Motivation is a spectrum, rarely 0% or 100%
*All behaviour is motivated
*Young people have motivators to make a change, and to stay the same
*Ambivalence and mixed feelings about change is therefore the norm
*The approach encourages the practitioner to acknowledge ambivalence, rather than ignoring or denying it.
*Motivation varies over time
*Motivation is interpersonal and Influenced by system around the child
*The aim of MI is to create conversations around change.
*It is a directive approach but facilitative in style.
*Strategies to use across different stages of change which can be tracked using the transtheoretical model of behaviour change.

!! Practice points

__ Express empathy__ 

* Change is hard!
* Use [[Active Listening]]

__ Develop discrepancy__  

*Gently encourage awareness of the  consequences of no change 
*Highlight differences between current behaviour and goals

__ Support self-efficacy__ 

*CYP has resources to effect change
*Young person should present the arguments for change
__Roll with resistance:__ 

* Avoid argument and move topic when needed 
*Acknowledge disagreement openly
* Curiosity, not persuasion
* Resistance is valuable information


!!Applying motivational techniques to the cycle of change (TTM)

See [[The Cycle of Change]]

__Precontemplation__

Aim to highlight discrepancies between current and desired situations.

__Contemplation__

Explore ambivalence and mixed feelings.
Work through potential obstacles to change.

__Preparation__

Plan targets for realistic change, setting SMART goals.
Develop and use the young person’s network to support change.

__Action__

Support and review progress against goals. 

__Maintenance__

!!Video examples of MI

There are a number of useful examples of MI on Youtube. An example can be seen of using MI principles in an interview with a young person [[here|https://www.youtube.com/watch?v=ivPlhCD0pFY]]

!!Links with other pages

There are a number of pages around [[Engagement]] which are highly related to this topic.
This is a very helpful five minute animation from the NSPCC which sets out a series of key ideas about child development and the negative impact of stress and abuse on the developing brain. 


<html><iframe width="560" height="315" src="https://www.youtube.com/embed/hMyDFYSkZSU" frameborder="0" allowfullscreen></html>
!!!!Source: [[BBC iPlayer|https://www.bbc.co.uk/]]
This video entitled [[Nadiya: Anxiety and Me|https://www.bbc.co.uk/iplayer/episode/m00053fy/nadiya-anxiety-and-me]] is on BBC iplayer (as of 20/05/2019). Nadiya (best known as the winner of The Great British Bake Off, 2015) suffers from extreme anxiety and debilitating panic attacks, which she’s had since childhood. However, she’s never had a proper diagnosis. 

She speaks bravely and honestly about what it’s like to live with anxiety and panic attacks.
Raw, open and honest, this documentary provides an extremely good, very balanced and helpful perspective on the on anxiety disorders, shining a light and starting a debate about on an increasingly pressing issue. 

In this one-off documentary for BBC One, Nadiya sets out to find the cause of her anxiety, exploring the most effective, available treatments, whilst undergoing a course of cognitive behaviour therapy, in the hope of managing her anxiety. 

Meeting fellow sufferers Nadiya talks to Laura Bartley about her experiences of treating her anxiety with medication, visits a school in Brighton to see how they are tackling anxiety in their students, and goes online to meet Barry ~McDonagh, who offers support and therapy to an online community of around 250,000. At Kings College London, Nadiya hopes groundbreaking research into the role of genetics and environment on anxiety disorders can give her the answers she needs. 

PLEASE NOTE: This is an hour long documentary and is currently only available on BBC iPlayer. (Registration is free) once this documentary is removed off of BBC iPlayer a secondary source will aim to be found.
This is a web site set up by the Midlands Collaborative for the CWP national programme and enables communication between the collaboratives. 

https://3.basecamp.com/3393815/reports/progress
-------
This report was prepared with the support of all seven universities and partnership organisations involved in this national programme who have generously shared their data in order to obtain a national overview.This has been a collaborative effort and would not have been possible without those who contributed their time, effort and data. Please see the report for a full list of those who have contributed.

-------

Please find linked below the national report concerning the outcomes of CWP's thus far across the country. The purpose of this report is to update commissioners about the outcomes of the CWP's work nationally. 

<<link-pdf "CWP National Outcomes Report 2019" "https://drive.google.com/file/d/1FIciZj9O1l5ny-PLFhs-CPWxfsV_hLeS/view?usp=sharing">>
!!!''Purpose''
This paper sets out the headline plan, agreements in principle and process for the establishment of the new CYP PWP role. This role is being developed and delivered by Higher Education Institutes (HEIs) as part of the CYP IAPT programme in conjunction with CYP MH experts and will be funded by Health Education England (HEE). 

!!!''Five Year Forward View''
The Children and Young People’s Improving Access to Psychological Therapies programme (CYP IAPT) is a service transformation programme delivered by Health Education England in partnership with NHS England that aims to improve CYP mental health services in England. CYP IAPT does not create standalone services, but works to transform existing services providing mental health care to children and young people. “Implementing the Five Year Forward View for Mental Health” (NHS England, July 2016) sets out the need for significant expansion in access to high-quality mental health care for children and young people and delivering increased access to mental health services will require a significant expansion in the workforce. 

!!!''More therapists''
By 2020, at least 1,700 more therapists will be needed to meet the expected demand. In order to meet this demand the HEE are commissioning training for a new post that draws on the experience of the highly successful adult IAPT PWP programme, to create a new cohort of psychological practitioners capable of delivering high-quality, evidence-based interventions for mild to moderate difficulties in a way that can be efficiently brought to scale. We propose to make more effective use of the large cohorts of very able graduates in psychology and a range of other disciplines to deliver and support, under supervision, brief, outcome-focused evidence-based interventions for children and young people experiencing mental health difficulties. The PWP programme will allow us to attract graduates into CYP MH services, creating routes and a skills base that can be applied to further training in a variety of registered professional roles with children. 

!!!''Part of CYP-IAPT''
The programme will benefit from being integrated into existing CYP mental health services and the CYP IAPT programme, which brings a valuable organisational infrastructure for sustainable models of teaching, supervision and clinical governance. 

!!!''Key Principles''
* Representatives on the steering group should include HEE, representatives of all participating CYP IAPT Learning Collaboratives (per HEI for LaSE) providing training and independent clinical advisors. 
* HEE expects the final curriculum to also be agreed by the CYP IAPT overarching curriculum group established by NHS England
* PWP Supervision training should commence in February/March 2017
* PWP trainee courses should commence in April 2017 and run over 12 months

!!!''Evaluation of the CWP Programme''
* Alongside the education commissions HEE will commission an evaluation of the programme (TBC). This will need to be based on the use and application of the 6 HEE quality indicators.  Collaboratives will be required to report to HEE on stakeholder engagement, including all feedback received from HEIs, providers and students to support necessary consultation work running in parallel with the set up phase

!!!''Starting arrangements for the CWP Programme''
* In order to establish demand HEE will initially fund 30 trainees per collaborative. A second cohort may be commissioned in FY 2017/18 upon review of the programme and early evaluation
* Salary support will be set at a maximum of mid-point band 4, funded by HEE for the year of training (this will include the relevant LW where applicable). Trainees are expected to be employed at band 5 once qualified
* HEE will ensure the CYP IAPT National Accreditation Council (NAC), led by HEE, will take forward discussions around necessary accreditation processes and align the programme with an existing national accrediting organisation. 
* HEE will require assurance from the collaboratives on the suitability/ability of services to host and support trainees over the training year - this will be agreed and overseen by the steering group to provide assurance to HEE and other stakeholders that services are satisfactorily equipped to ensure trainees and risks around attrition, trainee isolation and supervision are mitigated.

!!!''Sustainability'' 
Plans from each collaborative delivering the training will be required. These will need to start to put in place arrangements for the funding of these courses to be picked up upon the cessation of central funding. Key to these plans will be a focus on ensuring trainees are able to be employed once the training year is complete. Plans will be signed off and monitored by the steering group

!!!''Supporting services''
*Collaboratives will be required to continually monitor services in their ability to support trainees and any issues will need to be flagged to HEE. HEE will reserve the right to withdraw funding for individuals part way through the course if issues are identified with particular providers/services that do not comply with the HEE Quality Framework, this would not be done without full discussion and negotiation with the collaborative. 
*HEE will pump prime the system to enable the successful establishment of the role. This will be locally determined but will need to be agreed by HEE. This may cover things such as a practice educator role to maintain close collaboration between services and HEIs, training for service leads and commissioners and in service work to support transformation to accommodate trainees
*It is anticipated that the programme will be funded for three years but as with all training programmes this will be subject to annual review - further funding will, to some extent, be dependent upon the outcome of the evaluation and will be agreed by the steering group, HEE Executive and the Department of Health
*This role is expected to  contribute to the 1700 new CYP MH therapists as set out in the 5YF implementation plan and provide another route in to becoming a CYP MH workforce
*Collaboratives will be expected to monitor first destination data and ideally plans will be put in place to monitor their progression after the year of training, this may be done in conjunction with the evaluation but collaboratives will retain a significant role in this. 
!!!!!Source: Peter Fuggle 
!!Nine components of guided self help.
These are offered as a general steer about what is meant by guided self help. It should not be treated too rigidly. The intention is to provide a framework so that practitioners can apply this to their work with children, young people and parents. If you are not doing any of these activities, then it would be good to think this through with your supervisor. 

It may not be necessary to do all nine steps for each case. The practitioner should seek feedback at each stage. Outcome monitoring needs to take place throughout. 
#[[Engagement]] (getting to know each other) 
#[[Making sense of things]] (formulation)
#[[Deciding on what you want to change]] (setting goals)
#[[Learning about the problem]] (psycho-education) 
#[[Trying out new things]] (doing experiments)
#[[Problem Solving]] (things rarely go to plan) 
#[[Outcomes]] (Learning from new experiences) 
#[[Building a back up team]] (not doing it alone) 
#[[Agreeing a future plan]] (making a self management plan) 
Self management has many overlaps with guided self help. It could be considered that self management is supported by promoting various forms of self help. 

 <<link-pdf "Self-managment vs. self-help" "https://drive.google.com/open?id=0B1hDLHd8syMsSm9EeTdXRUc3ZlE">>

!!Linked pages
[[What is a 'low intensity' intervention?]]
''[[Therapy comics|https://www.therapycomics.com/]]'' provides high-quality, illustrated materials for evidence-based interventions.  
This allows a universal resource to be available for therapists to use with anyone who struggles with typical text-based materials. 

The materials on this site have been designed for Psychological Wellbeing Practitioners, High Intensity Therapists and CBT therapists working in IAPT services in England.

Please explore the [[website|https://www.therapycomics.com/]] for a plethora of non-text based materials, see below for comics on the following subjects:  

<<link-pdf "Panic" "https://docs.wixstatic.com/ugd/133724_43705f61879745be89ea5eacf2290dc8.pdf">>

<<link-pdf "Sleep" "https://docs.wixstatic.com/ugd/133724_6942228618894d6bb067b537732e0448.pdf">>

<<link-pdf "Progressive Relaxation" "https://docs.wixstatic.com/ugd/133724_187827f942b4475bb55796b9f1a92a0e.pdf">>
Notes on meeting between Peter Fuggle and Matt Constantinou 

3rd Jan 2019

!!!''Case identification''   

Importance of having a clear identifier system for the dataset. 

Three levels of identifier. 

''Level 1. Master Analyzer ID''

Agreed that it would benefit form having a system where a National Analyzer ID is assigned to the case upon entry to the data set. 

These would have divided by region with tow initials at the beginning for the region followed by a code number. 

Aim would be to allocate 10,000 cases to each region. 
Matt to test capacity of system to support this size of dataset. 

Example of Master ID 

*SE000001

*SE000002

*SW000001

''Level 2. Project unique identifier'' 

Each service will have a patient ID system. Services using POD will generate a patient ID.  This is called a Project unique identifier

''Level 3'. Site identifier''

This will be a site name and will be a string variable. 
String (name)


!!!''Adding data: some tips''  

''1. New data must be pasted in as 'values'.'' 

Numeric values will aligned right in the column. 

Strings values will be aligned left in the column to allow for identification of errors of variables being entered as strings rather than numeric. 


''2. Missing values''
 
Key to ensure that white space in a cell is not automatically assumed to be an empty space. Guidance is in the notes of the analyser about this.  


''3. Date variables'' 
Pasting columns of data as values leads to dates being converted and need to convert them back. Notes in the analyzer about this. 

''4. Making the report''  

To make the executive report, the word document and the excell spreadsheet just need to be in the same folder in order for the report to select data form the spreadsheet. 

We agreed that:

# that the report would not include any comparison variables of data between regions. 
#that the data selected would be in a box format in order to avoid disruption of the report. 









* Over the first year of training,  c CWPs will be expected to complete a low intensity intervention for ''30 cases''
* This can include group work/one off workshops or coffee mornings 
* ''10 cases'' must have been a course of GSH across a range of presenting problems (i.e. depression/anxiety/common behavioural problems)

Information on this page was taken from [[CORC|https://www.corc.uk.net/]]. these measures were developed by Scott D Miller 

---

The Outcome Rating Scale (ORS) and Child Outcome Rating Scale (CORS) are measures that can be used to monitor children’s, young people and their families or carers feedback on progress.

The ORS is a simple, four-item session-by-session measure designed to assess areas of life functioning known to change as a result of therapeutic intervention. These include: symptom distress, interpersonal well-being, social role, and overall well-being. The ORS translates these four dimensions of functioning into four visual analogue scales which are l0cm lines, with instructions to place a mark on each line with low estimate to the left and high to the right. The ORS is designed to be accessible to a child with a 13-year-old’s reading level, making it feasible for adolescents and adults.

The CORS was developed for children age 6–12. It has the same format as the ORS but with more child friendly language and smiley and frowny faces to facilitate the child’s understanding when completing the scales (Duncan et al., 2003).

For children 5 or under there is also the Young Child Outcome Rating Scale (YCORS), which has no psychometric properties, but can be a useful way of engaging young children regarding their assessment of how they are doing.


Users may also obtain the measures in English and languages other than English at [[www.scottdmiller.com|https://scott-d-miller-ph-d.myshopify.com/collections/performance-metrics]]
This is a tag tiddler. 

<<list-links "[tag[Outcome measures]]">>
!!!Why is outcome monitoring important?
*Outcome monitoring improves the effectiveness of mental health interventions 
*Potential to improve the long-term trajectory of young people e.g. less suicidality if they respond to CBT in their youth
!!!Evidence-based practice and science 
*One of the principles of IAPT 
*Mental health measures are a simple tool which are effective in improving mental health treatments to improve lives and save lives. 
*Psychometric properties includes the concepts of reliability and validity
*What is reliability? Consistency in scores between weeks if not receiving information 
!!!Measurement in health services 
*Routine in more physical practice i.e. temperature but not so common in mental health 
*Self-report measures help us track and measure changes in mental health
*Using the measure at a number of time points i.e. beginning, middle and end of treatment is a routine outcome measurement (ROMs). 
*RCADS used to measure depressive symptoms 
*Depression is a complex construct within the psychological literature
!!!Key Points 
*If someone is scoring high on measures, it doesn't necessarily indicate a diagnosis
*Symptoms may be high, which suggests the young person isn't coping well and we would like to see those symptoms to come down before the end of treatment 
*Diagnosis not important, does the measure capture what is important to track the effectiveness of my intervention as a practitioner 
*Research suggests ROMs keep 'off track' cases 'on track' 
!!!Pros
*What are the benefits of outcome oriented work? Baseline to work from; Avoids subjectivity; Helps to keep us honest; Differences in perspectives from parents and young people
!!!Cons
*What are the negatives of outcome oriented work? Scoring doesn't reflex what they are saying; Using judgement when there is discrepancies; Under-reporting over over-reporting for acceptability


!!!Goals
*Goal Based Outcome Measure- are you measuring the right thing? If your goal is the top of the hierarchy for a short term intervention it will seem impossible to the young person. 
*Make sure your goal is achievable, measureable and properly graded. Useful to know if the intervention hasn't worked with this case to be able to build on long term goals for this young person. 
!!!What measures to use?
*Core health outcomes are used at the beginning and the end of intervention
*RCADS primary measure - has both parent and child measurement but the child report should be a preference 
*Using the RCADS on POD, you will get a raw score on POD, you can then take the raw score and compare it to the child's age and gender to discover if the score is in the high or low range 
*Idea is that high score will be seen at the beginning of the intervention which will decrease to low by the end of the intervention 
*RCADS as T-score used as part on initial assessments. Subtests listed around the bottom and we can see which subscales score higher than others. 
*Graphs easy to feedback to clients using POD
*Experience of service questionnaire- CHI-ESQ  
!!!ROM Research 
*Emphasis on regular outcome monitoring in the clinician version of Cathy Creswell's book 
*Lambert Meta-analysis- 2,500 participants in merged study. Interesting as this approach of using outcome monitoring are useful for cases that are 'off track'. When clinicians know there hasn't been a change, research highlights this is the most important thing
*If this is the case, check in with the young person to see if there is anything you can be doing differently 
*ROM feedback improves outcomes for children and adolescents 
[img[laptop typing.jpg]]

At its core, ''Outcomes'' focus on how both the client and the practitioner monitor whether new ideas and ways of behaving are helping the problem. This can be done in a wide variety of ways, not least by asking the parent or young person as part of routine check-ins and general informal conversation. However there are also ways of trying to measure this in a more systematic way. 

As well as measuring outcomes for the child, young person or parent, outcomes can also be used to evaluate how well a service is working by summarising outcomes over a particular time period. They can also be used to evaluate the effectiveness of the CWP national programme. An example of a report based on national outcomes can be found in [[National CWP Outcomes Report 2019]] For national reporting three key measures are used namely the RCADS, SDQ and Goals. These are sometimes called core measures that will be covered in training but additional measures may be used by some services according to their local protocols. 


For the EMHP/CWP programme it is proposed that a [[core set of measures|Core Outcome Measures & Feedback Tools]] are used to evaluate the benefit of the interventions for the clients. These are all taken from the CYP-IAPT basic set of measures. 

<<link-pdf "Outcomes Framework for London and the South East" "https://drive.google.com/open?id=19dWlwSybIYhh8mLqGUMd62JHECbrkFF7rP-YjMD7xlU">>

Pages about outcomes have been organised into sections on outcomes practice; outcomes measures; technical bits and outcome studies. These are listed out below. 

[[Outcomes practice]]

[[Outcome measures]]

[[Outcomes - technical bits]]

[[Outcomes research]]

This is a tag tiddler which lists out pages which are more to do with the technical aspects of outcomes work. 

<<list-links "[tag[Outcomes - technical bits]]">>
<<link-pdf "Cohort 1 Outcomes Presentation" "https://drive.google.com/open?id=10oQeu7ZdKZQDZErvrYjwF6T2HBXkP5XX">>

<<link-pdf "Cohort 1 Outcomes Report" "https://drive.google.com/open?id=125hUtp51D_x1GaQn1w7bFvxXQY_fsWht">>

!!Key Findings 
__What proportion of cases are included in the sample? __

The percentage for completion of time 2 data was: 

* 90% for GBOs
* 68% for SDQ 
* 75% for RCADS
__
What is the severity of the group? __

SDQ

At Time 1, 79% out of 112 cases were in the clinical range on any subscale. Post treatment this was reduced to 50%. 

RCADS

At Time 1, 67% out of 236 cases were in the clinical range on any subscale. Post treatment this was reduced to 38%.

__Does the data indicate CWP is effective?__

SDQ

* Almost half (44%) recovered
* Large effect size of 0.82 
* 38% of cases showed reliable improvement in IMPACT


RCADS

*50% of clients recovered 
*Medium effect size 0.69
*33% showed reliable improvement on Total Anxiety & Depression

GOALS 

*Highly significant increase with an effect size of 2.10.
*77% of cases achieved reliable improvement

__How did clients experience CWP?__

Session Feedback

96% of sessions were rated in the top 25% of the satisfaction scale for SFQ  (16 or above) and 78% for the SRS (36 or above). 

ESQ 

Young person:
Treated well (99%), Comfortable Facilities (63%)

Parent:
Good help (98%), Convenient Appointment (84%)

<<list-links "[tag[Outcomes practice]]">>
This  page lists pages related to outcomes evaluation relevant to the EMHS programme. 

<<list-links "[tag[Outcomes research]]">>
!!''Introduction''
*This framework is designed as a guide as what might be useful content to cover in a course of guided self help (GSH) for anxiety with adolescents. 
*Services should feel free to try this out and adjust accordingly. 
*Material to support these sessions is available in the form of an adapted adult PWP guided self-help booklet on anxiety. 
*Services should experiment with materials and resources available to them and utilise websites such as ‘get self-help’ or ‘mind ed’ and other self-help books / literature. We encourage services to develop their own booklets. 
*Although GSH is a mixture of shorter and longer sessions; the modality these sessions take place in (e.g. phone/Skype/face to face) will likely differ between services.
!!''Types of sessions''
*Longer sessions are 45 mins in length and are more likely to be face to face.
*Shorter sessions / check-ins are between 15-30 mins in length and are more likely to be over the phone. 
*We have suggested 8 sessions to be able to cover the material. There is still the option of doing a follow-up after this at around a month’s time, which we think will be important. 
*After the assessment, the YP is given the relevant material to read / look at in advance of session 1. 
!!!''General Plan of sessions'' 
**8 sessions with adolescents, with parent involvement in session 1 and 4  
**4 face to face sessions (30-45mins)
**4 telephone contacts (15mins)
**Appropriate guided self help material will be dependent on the main problem 
!!!!''Session 1''
*listening and validating, introduction to guided self help (GSH), assessing risk, completion of baseline outcome measures (RCADS), feedback to parents 
*EMHPs will have training on GSH principles, confidentiality and risk, introducing ROMs
*Understanding anxiety and how it impact young people 
*Decide on which GSH booklet to use based on formulation (using supervision)
!!!!''Session 2''
*Psychoeducation, formulation, recommend self-help material, monitoring task
*Fight/flight, normalisation, coping vs. safety behaviours  
*Maintenance cycle and what is keeping things going (using hot cross bun models in GSH booklets)
*Coping behaviours i.e. calm breathing/relaxation (if it fits with the presentation)
*Use booklets to facilitate psychoeducation conversation 
!!!!''Sessions 3-7''
*Work guided by formulation. The focus could be exposure, worry management, and or panic management. 
*Feedback to parent session 3 or 4. 
*Dependent on what the young person wants to focus on 
!!!!''Session 8''
*Review, relapse prevention and feedback to parents 

<<link-pdf "An overview of the framework" "https://drive.google.com/open?id=0B-tACu2wi4-4SG0zRmZ0ZGVzWTg">>
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/k96-DISPP88" frameborder="0" allowfullscreen></html>
POD is the online outcome monitoring system used on the CWP programme. Staff or clients can log in and complete measures using any web enabled device. 

After completing a measure, scores are calculated instantly and you can view these online with a child, young person or parent within a session.

On the CWP programme POD is used due to [[The importance of feedback]]

POD can be accessed through the following link: https://pod-database.org/db3/login/

The POD manual can be found here: 

<<link-pdf "POD Manual" "https://pod-database.org/info/">>
This [[guide|https://www.mentalhealth.org.uk/publications/make-it-count-guide-for-parents-and-carers]] from The Mental Health Foundation is for parents and carers to help children understand, protect and sustain their mental health. It contains lots of useful links and resources that you may wish to share with parents carers. 

''Treatment Principles'' 
You should have already learnt a variety of things about the child, their family environment and previous parenting work from the assessment. 
!!!Order of skills introduced to parents 
#Positive reinforcement (play and rewards) for limit setting - need basis of positive behaviours to try to help things so when the limit setting happens its different from the positive relationship you have established 
**Can either present the 'Attention Table;' in the table or through talked through examples
**Parent Trap also known as Attentional Trap
#Praise and Rewards for appropriate behaviours which are associated with the goals of the parents 
**Gets parents to notice the good things again 
**Different types of rewards (social/tangible) and praise- specific praise helps your child know what behaviour you are happy about 
**Special choices can be rewarding and effective for an independent oppositional child
**Be genuine about your praise and ensure it fits your personality and family environment 
**Consistent when you notice the positive behaviour but don't be consistent when using rewards and praise 
**Pitfalls of reward charts- used for too long or used for too many behaviours
#Being Specific 
**Clarify the concerns, understand what is going on in the moment (ABC chart), need to be so clear what the behaviour is even if you aren't in the room you know exactly what it is. Then what would be the alternative so what behaviour they would like to see and the steps involved to achieve this (Praise Points
#Ignoring 
**Highlight to parents that ignoring is difficult and to expect behaviour to get worse before it gets better. If you are consistent with the response the behaviour should go away. Become comfortable with the behaviours at home first before ignoring in public. 
**What are the good behaviours to ignore? Shouting and crying as misbehaviour, throwing things
#Time-Out 
**Don't discuss time out after it has happened or force the child to apologise for the behaviour that resulted in a time out 
**Child needs to calm down before coming out of time out otherwise it won't be effective 
**Introduced last as often its not needed anymore
Skills 
!!!Attending 
*Really important to develop a relationship through play 
*It is important to teach parents key things to avoid during play to keep it child-centred, use examples so they understand why questioning isn't useful 
*Interest and empathy needs to be genuine i.e. turn phone off and keep the attention fully on the child 
*Highlight 'If it feels awkward, you're probably doing it right' as any new activity is expected to feel strange in the beginning 
*Suggested to use 10 minutes a day, rather than continuous throughout the day
*From roll play- attending can be boring for parents which is another reason for the short timeframe. Important to remember for the child it isn't a boring experience
*Name processes the child is going through to help them problem solve, this is true even if the child doesn't want to play or is bored or playing
!!!Instructions and Commands 
*Way we give instructions have a massive effect on how effective they are


#Positive reinforcement (play and rewards) for limit setting - need basis of positive behaviours to try to help things so when the limit setting happens its different from the positive relationship you have established 
**Can either present the 'Attention Table;' in the table or through talked through examples
**Parent Trap also known as Attentional Trap
#Praise and Rewards for appropriate behaviours which are associated with the goals of the parents 
**Gets parents to notice the good things again 
**Different types of rewards (social/tangible) and praise- specific praise helps your child know what behaviour you are happy about 
**Special choices can be rewarding and effective for an independent oppositional child
**Be genuine about your praise and ensure it fits your personality and family environment 
**Consistent when you notice the positive behaviour but don't be consistent when using rewards and praise 
**Pitfalls of reward charts- used for too long or used for too many behaviours
#Being Specific 
**Clarify the concerns, understand what is going on in the moment (ABC chart), need to be so clear what the behaviour is even if you aren't in the room you know exactly what it is. Then what would be the alternative so what behaviour they would like to see and the steps involved to achieve this (Praise Points)
#Ignoring 
**Highlight to parents that ignoring is difficult and to expect behaviour to get worse before it gets better. If you are consistent with the response the behaviour should go away. Become comfortable with the behaviours at home first before ignoring in public. 
**What are the good behaviours to ignore? Shouting and crying as misbehaviour, throwing things
#Time Out 
**Don't discuss time out after it has happened or force the child to apologise for the behaviour that resulted in a time out 
**Child needs to calm down before coming out of time out otherwise it won't be effective 
**Introduced last as often its not needed anymore

!!!!These handouts are not the core handouts which are taught as part of the Manchester model.

!!!@@color(purple):Handouts:@@
<<link-pdf "All handouts" "https://drive.google.com/open?id=1ingyS79eCdTIY4-yZd71zHKlmpCt_Qip">>

All handouts have been reviewed by and changed in line with our Parents Panel. 
This is a tag tiddler

<<list-links "[tag[Parents]]">>
!!!''Participation''

<<list-links "[tag[Participation]]">> 

<svg xmlns="http://www.w3.org/2000/svg" width="1492" height="1034"><g fill="none" fill-rule="evenodd"><g stroke-linecap="square" stroke-width="2" opacity=".81"><path stroke="#FC8F68" d="M1151.67 264.57l4.723 8.18c2.086 3.614.87 8.223-2.718 10.294-3.587 2.07-8.186.82-10.273-2.793l-4.722-8.18 12.99-7.5z"/><path stroke="#FC8F68" d="M1138.618 285.964l-2.75-4.763c-1.52-2.63-.618-5.99 2.013-7.51l14.29-8.25"/><path stroke="#59B799" d="M1167.438 295.882l25.98-15m-4.25-7.36l4.25 7.36-14.72 8.5-4.25-7.36c-2.35-4.067-.956-9.265 3.11-11.612 4.066-2.347 9.264-.955 11.61 3.11zm-35.74-31.905l2.813 4.87c2.59 4.485 8.38 5.994 12.92 3.37 4.55-2.623 6.13-8.385 3.54-12.87l-2.81-4.87"/></g><g stroke-linecap="square" stroke-width="2" opacity=".92"><path stroke="#FC8F68" d="M1271.136 989.67l6.22 5.406c2.748 2.39 6.913 2.097 9.302-.65 2.39-2.75 2.098-6.914-.65-9.302l-6.22-5.407-8.652 9.952z"/><path stroke="#FC8F68" d="M1291.577 981.23l-3.732-3.245c-2.06-1.792-5.184-1.574-6.976.488l-9.74 11.196"/><path stroke="#59B799" d="M1295.773 1007.81l-17.844 20.525m-5.6-4.866l5.6 4.86 9.73-11.2-5.6-4.87c-3.09-2.69-7.78-2.36-10.47.73-2.69 3.09-2.36 7.78.73 10.46zm-22.99-36.37l3.73 3.24c3.43 2.98 3.8 8.19.81 11.62-2.99 3.43-8.19 3.8-11.63.81l-3.74-3.25"/></g><g stroke-linecap="square" stroke-width="2" opacity=".7"><path stroke="#FC8F68" d="M1312.778 798.6l6.687-8.875c2.954-3.92 8.567-4.674 12.537-1.682 3.97 2.99 4.792 8.594 1.838 12.515l-6.687 8.874-14.375-10.833z"/><path stroke="#FC8F68" d="M1342.164 804.466l-3.91 5.19c-2.162 2.868-6.326 3.373-9.304 1.13l-16.172-12.187"/><path stroke="#59B799" d="M1339.848 767.66l-28.75-21.665m-5.22 8.588l6.018-7.986 15.972 12.036-6.018 7.986c-3.324 4.41-9.593 5.29-14.004 1.96-4.41-3.33-5.292-9.6-1.968-14.01zm-20.322 53.554l4.062-5.39c3.74-4.963 2.838-11.95-2.014-15.605-4.852-3.656-11.816-2.598-15.556 2.364l-4.062 5.39"/></g><g stroke-linecap="square" stroke-width="2" opacity=".77"><path stroke="#FC8F68" d="M839.95 320.714l-4.71 7.538c-2.082 3.33-1.11 7.692 2.167 9.74 3.28 2.05 7.624 1.01 9.705-2.32l4.71-7.54-11.872-7.418z"/><path stroke="#FC8F68" d="M851.93 341.17l2.914-4.664c1.61-2.576.827-5.97-1.75-7.578l-13.993-8.744"/><path stroke="#59B799" d="M824.158 349.76l-24.593-15.368m5.087-6.255l-4.24 6.785 13.57 8.478 4.24-6.784c2.34-3.747 1.2-8.682-2.546-11.024-3.747-2.34-8.682-1.202-11.024 2.545zm34.34-30.425l-2.78 4.452c-2.562 4.1-8.055 5.285-12.27 2.65-4.215-2.633-5.556-8.09-2.996-12.188l2.783-4.453"/></g><g stroke-linecap="square" stroke-width="2" opacity=".95"><path stroke="#FC8F68" d="M552.212 984.43l-5.948 6.604c-2.628 2.92-7.088 3.188-9.96.6-2.873-2.586-3.072-7.05-.444-9.967l5.948-6.606 10.404 9.37z"/><path stroke="#FC8F68" d="M529.914 977.808l3.346-3.715c1.848-2.053 5.092-2.143 7.247-.203l11.705 10.54"/><path stroke="#59B799" d="M528.57 1006.202l20.808 18.736m5.353-5.946l-5.35 5.946-11.89-10.707 5.36-5.94c2.96-3.28 8.02-3.55 11.3-.59 3.29 2.96 3.55 8.02.59 11.3zm18.45-39.91l-3.51 3.9c-3.23 3.592-3.02 9.05.47 12.19 3.49 3.142 8.94 2.778 12.17-.814l3.52-3.9"/></g><g stroke-linecap="square" stroke-width="2" opacity=".91"><path stroke="#FC8F68" d="M508.233 288.483l8.24-3.33c3.642-1.47 7.77.243 9.217 3.827 1.448 3.584-.33 7.683-3.97 9.154l-8.243 3.33-5.244-12.98z"/><path stroke="#FC8F68" d="M526.298 303.834l-5.1 2.06c-2.816 1.138-5.98-.12-7.065-2.807l-5.9-14.604"/><path stroke="#59B799" d="M539.953 278.903l-10.49-25.96m-7.79 2.07l7.417-2.998 5.994 14.835-7.418 2.996c-4.097 1.656-8.76-.323-10.414-4.42-1.655-4.097.323-8.76 4.42-10.414zM487.047 284.1l4.868-1.966c4.48-1.81 6.603-7.014 4.74-11.623-1.86-4.6-7.002-6.87-11.483-5.06l-4.868 1.97"/></g><g stroke-linecap="square" stroke-width="2" opacity=".78"><path stroke="#FC8F68" d="M467.767 669.302l-4.31 7.774c-1.903 3.435-.706 7.74 2.675 9.613 3.382 1.87 7.666.6 9.57-2.83l4.31-7.78-12.245-6.79z"/><path stroke="#FC8F68" d="M480.8 689.103l2.668-4.81c1.472-2.657.513-6.004-2.144-7.477l-14.432-8"/><path stroke="#59B799" d="M453.518 699.134l-25.364-14.06m4.753-6.512l-3.88 6.997 13.995 7.75 3.88-7c2.14-3.87.745-8.74-3.12-10.88-3.865-2.15-8.733-.75-10.875 3.12zm32.7-32.18l-2.544 4.59c-2.343 4.228-7.766 5.7-12.114 3.29-4.35-2.41-5.98-7.79-3.63-12.015l2.54-4.592"/></g><g stroke-linecap="square" stroke-width="2" opacity=".84"><path stroke="#FC8F68" d="M288.03 907.045l-3.185 8.3c-1.407 3.665.587 7.84 4.454 9.325 3.86 1.485 8.14-.285 9.55-3.95l3.18-8.3-14.01-5.375z"/><path stroke="#FC8F68" d="M304.986 924.265l1.97-5.135c1.09-2.836-.327-6.017-3.163-7.105l-15.404-5.913"/><path stroke="#59B799" d="M279.005 938.928l-27.073-10.392m2.867-7.47l-2.87 7.47 14.93 5.734 2.86-7.47c1.58-4.124-.48-8.75-4.6-10.335-4.13-1.583-8.75.477-10.34 4.602zm28.26-37.35l-2.02 5.25c-1.86 4.834-7.12 7.31-11.76 5.527-4.64-1.78-6.9-7.144-5.05-11.977l2.01-5.252"/></g><g stroke-linecap="square" stroke-width="2" opacity=".85"><path stroke="#FC8F68" d="M320.454 837.98l7.774 4.308c3.435 1.904 4.7 6.19 2.826 9.57s-6.178 4.58-9.613 2.675l-7.77-4.31 6.79-12.244z"/><path stroke="#FC8F68" d="M319.894 861.68l-4.81-2.668c-2.658-1.472-3.617-4.82-2.145-7.476l8-14.432"/><path stroke="#59B799" d="M348.347 855.727l14.06-25.364m-7.483-3.004l6.997 3.87-7.75 13.99-6.99-3.88c-3.86-2.15-5.26-7.01-3.12-10.88 2.15-3.87 7.01-5.26 10.88-3.12zm-44.785-9.97l4.59 2.54c4.22 2.34 9.6.72 12.01-3.63s.93-9.77-3.29-12.12l-4.59-2.55"/></g><g stroke-linecap="square" stroke-width="2" opacity=".71"><path stroke="#FC8F68" d="M311.344 247.738l12.13 1.49c5.36.658 9.188 5.413 8.548 10.62-.64 5.208-5.503 8.896-10.862 8.238l-12.13-1.49 2.314-18.858z"/><path stroke="#FC8F68" d="M322.698 278.35l-6.948-.853c-3.837-.47-6.552-4.074-6.064-8.05l2.65-21.587"/><path stroke="#59B799" d="M355.52 257.193l4.754-38.71m-10.918-1.34l10.918 1.34-2.68 21.836-10.92-1.34c-6.03-.75-10.317-6.23-9.576-12.26.74-6.03 6.228-10.32 12.258-9.58zm-60.754 10.675l7.072.87c6.51.798 12.44-3.886 13.25-10.465.807-6.578-3.815-12.558-10.325-13.357l-7.08-.87"/></g><g stroke-linecap="square" stroke-width="2" opacity=".77"><path stroke="#FC8F68" d="M1386.816 648.688l19.632 3.816-3.923-8.403 6.785-6.32-19.632-3.81"/><path stroke="#59B799" d="M1384.717 659.486l-1.03 5.3c-.378 1.944.932 3.85 2.912 4.234l46.79 9.095c1.98.385 3.9-.89 4.28-2.834l1.03-5.3"/><path stroke="#59B799" d="M1391.395 625.13l-6.678 34.356 53.99 10.494 6.678-34.357zm31.412 6.105l-8.395 43.19m22.138-40.52l-8.396 43.193"/></g><g stroke-linecap="square" stroke-width="2" opacity=".76"><path stroke="#FC8F68" d="M1246.56 557.16l-11.744-17.41 9.42.554 3.015-8.942 11.75 17.41"/><path stroke="#59B799" d="M1237.44 563.31l-4.975 3.356c-1.824 1.23-4.29.794-5.478-.97l-28.11-41.672c-1.188-1.763-.67-4.212 1.155-5.442l4.974-3.355"/><path stroke="#59B799" d="M1267.285 543.18l-29.846 20.13-32.44-48.083 29.84-20.13zm-19.013-28.187l-38.136 25.723m30.307-37.33l-38.135 25.723"/></g><g stroke-linecap="square" stroke-width="2" opacity=".88"><path stroke="#FC8F68" d="M1291.62 407.985l15.28 7.452-1.537-7.425 6.797-3.36-15.28-7.453"/><path stroke="#59B799" d="M1287.674 416.074l-2.104 4.314c-.77 1.582-.19 3.468 1.294 4.19l35.053 17.098c1.483.723 3.327.02 4.1-1.56l2.103-4.316m-27.733-45.79l-12.713 26.064 40.446 19.726 12.713-26.065zm23.37 11.396l-15.783 32.357m26.567-27.096l-15.78 32.356"/></g><g stroke-linecap="square" stroke-width="2" opacity=".92"><path stroke="#FC8F68" d="M818.104 917.863l17.798-12.932-9.556-2.94.152-10-17.8 12.93"/><path stroke="#59B799" d="M824.57 926.762l3.526 4.854c1.293 1.78 3.783 2.196 5.533.924l41.36-30.055c1.75-1.272 2.12-3.77.83-5.548l-3.53-4.855"/><path stroke="#59B799" d="M802.82 896.828l21.75 29.934 47.73-34.68-21.747-29.933zm27.508-19.985l27.626 38.024m-15.49-46.84l27.625 38.024"/></g><g stroke-linecap="square" stroke-width="2" opacity=".75"><path stroke="#FC8F68" d="M735.676 280.347l13.435 13.435-8.61 1.286-1.28 8.614-13.43-13.435"/><path stroke="#59B799" d="M742.747 273.276l3.818-3.818c1.4-1.4 3.67-1.42 5.044-.047l32.48 32.48c1.37 1.38 1.35 3.65-.05 5.05l-3.82 3.82"/><path stroke="#59B799" d="M719.412 296.61l23.335-23.334 37.477 37.477-23.335 23.334zm21.92 21.92l29.7-29.697m-20.506 38.89l29.7-29.698"/></g><g stroke-linecap="square" stroke-width="2" opacity=".84"><path stroke="#FC8F68" d="M729.53 981.54l7.322 16.445 3.94-7.128 7.936 1.84-7.32-16.443"/><path stroke="#59B799" d="M721.31 985.202l-4.386 1.952c-1.608.716-2.338 2.617-1.622 4.225l16.92 38c.716 1.6 2.617 2.33 4.225 1.62l4.385-1.95"/><path stroke="#59B799" d="M748.715 973l-27.406 12.202 19.52 43.85 27.4-12.202zm11.39 25.58l-34.716 15.455m39.59-4.493l-34.72 15.456"/></g><g stroke-linecap="square" stroke-width="2" opacity=".94"><path stroke="#FC8F68" d="M717.937 772.93l.768-21.987 7.785 6.276 8.205-5.72-.768 21.98"/><path stroke="#59B799" d="M704.945 772.476l-5.997-.21c-2.198-.076-3.933-1.968-3.855-4.203l1.845-52.834c.078-2.24 1.94-4.01 4.14-3.93l5.996.21m36.846 62.32l-38.975-1.36 2.13-60.97 38.975 1.36zm1.257-35.98l-48.97-1.71m49.493-13.28l-48.97-1.71"/></g><g stroke-width="2" opacity=".81"><path stroke="#59B799" d="M1431.98 531.517c-1.76 2.165-4.036 3.635-6.686 4.595-5.96 2.118-21.102-.21-23.904-22.493-.647-5.25 5.307-8.18 5.307-8.18s.21-6.57 5.306-8.17c21.475-6.61 29.72 6.34 30.27 12.68.38 5.25-1.384 10-6.878 14.12-.1.29-.1.56-.2.85"/><path stroke="#FC8F68" d="M1434.41 515.08c-1.976.892-3.88 2.302-5.218 4.363-1.338 2.06-1.853 4.373-1.863 6.54m1.59-6.12c7.5 4.87 11.32 6.193 16.68 3.682m-13.21-1.42s3.16 2.498 4.01 6.34c.85 3.843-1.2 7.41-1.2 7.41s-3.44-2.5-4.22-6.3c-.79-3.8 1.28-7.534 1.28-7.534"/></g><g stroke-width="2" opacity=".81"><path stroke="#59B799" d="M31.98 329.62c-1.76 2.163-4.036 3.634-6.686 4.594-5.958 2.118-21.102-.21-23.903-22.494-.64-5.246 5.31-8.17 5.31-8.17s.21-6.567 5.31-8.172c21.48-6.607 29.72 6.343 30.27 12.688.38 5.25-1.38 10.003-6.88 14.12-.1.292-.1.56-.2.853"/><path stroke="#FC8F68" d="M34.41 313.183c-1.976.89-3.88 2.3-5.217 4.362-1.34 2.06-1.853 4.373-1.863 6.54m1.59-6.12c7.503 4.87 11.327 6.192 16.687 3.68m-13.205-1.42s3.164 2.5 4.01 6.342c.848 3.843-1.197 7.41-1.197 7.41s-3.436-2.5-4.22-6.3c-.782-3.802 1.28-7.534 1.28-7.534"/></g><g stroke-width="2" opacity=".97"><path stroke="#59B799" d="M1057.078 957.19c-2.855-.046-5.507.776-8.005 2.228-5.583 3.29-13.73 16.745 1.898 33.653 3.69 3.97 9.91 1.22 9.91 1.22s5.29 4.17 9.9 1.22c19.32-12.54 14.6-27.57 9.99-32.19-3.86-3.76-8.75-5.51-15.6-3.9-.29-.11-.5-.29-.8-.4"/><path stroke="#FC8F68" d="M1070.056 964.737c-1.813.96-3.948 1.53-6.2 1.254-2.25-.27-4.183-1.34-5.71-2.71m5.59 3.71c1.157-9.43 2.634-13.46 8.026-16.14m-7.4 11.03s.12-4.03-2.28-7.15c-2.398-3.12-6.444-3.84-6.444-3.84s-.295 4.24 2.113 7.28c2.41 3.05 6.6 3.87 6.6 3.87"/></g><g stroke-width="2" opacity=".88"><path stroke="#59B799" d="M788.732 386.72c1.624 2.82 2.277 5.91 2.22 9.195-.17 7.364-8.985 22.848-34.374 16.545-5.972-1.498-6.682-9.196-6.682-9.196s-7.05-2.983-6.68-9.196c1.73-26.115 19.23-29.644 26.357-27.58 5.866 1.79 10.3 5.7 12.497 13.4.275.233.568.344.843.577"/><path stroke="#FC8F68" d="M772.96 378.45c-.268 2.623.133 5.287 1.688 7.428 1.556 2.14 3.965 3.345 6.542 3.9m-6.32-5.297c8.594-6.24 11.698-9.9 11.257-16.83m-6.268 13.21s3.83-2.23 8.27-1.36c4.44.87 7.54 4.71 7.54 4.71s-3.94 2.53-8.31 1.61c-4.38-.91-7.65-4.85-7.65-4.85"/></g><g stroke-width="2" opacity=".74"><path stroke="#59B799" d="M456.003 225.382c-.01-4.117-1.267-7.92-3.433-11.485-4.907-7.97-24.586-19.382-48.65 3.564-5.65 5.42-1.502 14.31-1.502 14.31s-5.894 7.73-1.504 14.31c18.646 27.55 40.28 20.37 46.845 13.6 5.34-5.66 7.74-12.75 5.24-22.58.15-.42.41-.73.56-1.16"/><path stroke="#FC8F68" d="M443.994 245.205c-1.485-2.694-2.398-5.88-2.042-9.264.355-3.38 1.91-6.31 3.924-8.63m-3.924 8.64c13.344 1.41 19.05 3.48 22.927 11.46m-15.76-10.71s5.65.03 9.98-3.68 5.29-9.8 5.29-9.8-5.94-.28-10.17 3.44-5.32 10.02-5.32 10.02"/></g><g stroke-width="2" opacity=".73"><path stroke="#59B799" d="M49.43 932.448c-1.728-2.273-4.034-3.84-6.755-4.892-6.12-2.32-22.06-.262-26.098 22.664-.938 5.397 5.137 8.55 5.137 8.55s-.108 6.78 5.138 8.55c22.11 7.304 31.372-5.87 32.263-12.403.658-5.41-.948-10.35-6.484-14.724-.09-.303-.07-.58-.16-.884"/><path stroke="#FC8F68" d="M51.133 948.693c-1.944-.96-3.796-2.435-5.062-4.54-1.26-2.107-1.69-4.436-1.63-6.603m1.89 7.03c8.15-4.895 12.23-6.208 17.67-3.612m-13.76.102s3.25-2.388 4.23-6.198c.98-3.81-.94-7.446-.94-7.446s-3.52 2.377-4.43 6.148c-.91 3.772 1.02 7.574 1.02 7.574"/></g><g stroke-width="2" opacity=".89"><path stroke="#59B799" d="M68.573 63.515c2.424-2.907 3.777-6.338 4.345-10.143 1.222-8.545-6.007-28.33-36.632-26.513-7.207.44-9.512 9.18-9.512 9.18s-8.743 1.93-9.51 9.18c-3.03 30.54 16.564 38.39 25.216 37.54 7.14-.81 13.03-4.37 17.06-12.79.365-.21.726-.28 1.09-.49"/><path stroke="#FC8F68" d="M48.375 70.676c.493-2.92 1.72-5.83 4.03-8.062 2.312-2.233 5.262-3.356 8.198-3.747m-7.838 3.4c8.544 8.847 11.36 13.635 9.528 21.382"/><path stroke="#FC8F68" d="M56.35 67.42s4.002 3.39 9.314 3.326c5.312-.064 9.65-3.843 9.65-3.843s-4.056-3.75-9.3-3.615c-5.243.135-9.8 3.99-9.8 3.99"/></g><g stroke-linecap="square" opacity=".85" transform="translate(-7 -8) rotate(-53 1235.736 -433.91)" stroke-width="2"><circle cx="24" cy="23" r="3" stroke="#FC8F68"/><ellipse cx="24.5" cy="22.5" stroke="#59B799" rx="8.5" ry="22.5"/><ellipse cx="24" cy="22.5" stroke="#59B799" rx="8" ry="22.5" transform="rotate(-59.999 24 22.5)"/><ellipse cx="24" cy="22.5" stroke="#59B799" rx="8" ry="22.5" transform="rotate(59.999 24 22.5)"/></g><g stroke-linecap="square" opacity=".96" transform="translate(-7 -8) rotate(62 272.661 1401.896)" stroke-width="2"><circle cx="38" cy="37" r="5" stroke="#FC8F68"/><ellipse cx="38.5" cy="36.5" stroke="#59B799" rx="13.5" ry="36.5"/><ellipse cx="38.5" cy="36.5" stroke="#59B799" rx="13.5" ry="36.5" transform="rotate(-59.999 38.5 36.5)"/><ellipse cx="38.5" cy="36.5" stroke="#59B799" rx="13.5" ry="36.5" transform="rotate(59.999 38.5 36.5)"/></g><g stroke-linecap="square" opacity=".77" transform="translate(-7 -8) scale(1 -1) rotate(-35 321.172 -1794.377)" stroke-width="2"><circle cx="36.5" cy="33.5" r="4.5" stroke="#FC8F68"/><ellipse cx="36" cy="33.5" stroke="#59B799" rx="12" ry="33.5"/><ellipse cx="36" cy="33.5" stroke="#59B799" rx="12" ry="33.5" transform="rotate(-59.999 36 33.5)"/><ellipse cx="36" cy="33.5" stroke="#59B799" rx="12" ry="33.5" transform="rotate(59.999 36 33.5)"/></g><g stroke-linecap="square" opacity=".98" transform="translate(-7 -8) scale(1 -1) rotate(-12 -2517.426 -5572.958)" stroke-width="2"><circle cx="26" cy="23" r="3" stroke="#FC8F68"/><ellipse cx="25.5" cy="23.5" stroke="#59B799" rx="8.5" ry="23.5"/><ellipse cx="25.5" cy="23.5" stroke="#59B799" rx="8.5" ry="23.5" transform="rotate(-59.999 25.5 23.5)"/><ellipse cx="25.5" cy="23.5" stroke="#59B799" rx="8.5" ry="23.5" transform="rotate(59.999 25.5 23.5)"/></g><g stroke-linecap="square" transform="translate(-7 -8) rotate(32 -1023.15 1168.95)" stroke-width="2"><circle cx="29.5" cy="27.5" r="3.5" stroke="#FC8F68"/><ellipse cx="29" cy="27.5" stroke="#59B799" rx="10" ry="27.5"/><ellipse cx="29" cy="27.5" stroke="#59B799" rx="10" ry="27.5" transform="rotate(-59.999 29 27.5)"/><ellipse cx="29" cy="27.5" stroke="#59B799" rx="10" ry="27.5" transform="rotate(59.999 29 27.5)"/></g><g stroke-linecap="square" opacity=".83" transform="translate(-7 -8) rotate(-136 426.03 257.857)" stroke-width="2"><circle cx="34.5" cy="32.5" r="4.5" stroke="#FC8F68"/><ellipse cx="33.5" cy="32" stroke="#59B799" rx="11.5" ry="32"/><ellipse cx="33.5" cy="32" stroke="#59B799" rx="11.5" ry="32" transform="rotate(-59.999 33.5 32)"/><ellipse cx="33.5" cy="32" stroke="#59B799" rx="11.5" ry="32" transform="rotate(59.999 33.5 32)"/></g><g stroke-linecap="square" opacity=".92" transform="translate(-7 -8) rotate(-114 287.496 402.857)" stroke-width="2"><circle cx="26" cy="23" r="3" stroke="#FC8F68"/><ellipse cx="25.5" cy="23.5" stroke="#59B799" rx="8.5" ry="23.5"/><ellipse cx="25.5" cy="23.5" stroke="#59B799" rx="8.5" ry="23.5" transform="rotate(-59.999 25.5 23.5)"/><ellipse cx="25.5" cy="23.5" stroke="#59B799" rx="8.5" ry="23.5" transform="rotate(59.999 25.5 23.5)"/></g><g stroke-linecap="square" transform="translate(-7 -8) rotate(-109 252.144 87.975)" stroke-width="2"><circle cx="32" cy="30" r="4" stroke="#FC8F68"/><ellipse cx="32" cy="30" stroke="#59B799" rx="11" ry="30"/><ellipse cx="32" cy="30" stroke="#59B799" rx="11" ry="30" transform="rotate(-59.999 32 30)"/><ellipse cx="32" cy="30" stroke="#59B799" rx="11" ry="30" transform="rotate(59.999 32 30)"/></g><g stroke-linecap="square" opacity=".98" transform="translate(-7 -8) rotate(36 -571.94 527.953)" stroke-width="2"><ellipse cx="29" cy="27.5" stroke="#FC8F68" rx="4" ry="3.5"/><ellipse cx="29.5" cy="28" stroke="#59B799" rx="10.5" ry="28"/><ellipse cx="29.5" cy="28" stroke="#59B799" rx="10.5" ry="28" transform="rotate(-59.999 29.5 28)"/><ellipse cx="29.5" cy="28" stroke="#59B799" rx="10.5" ry="28" transform="rotate(59.999 29.5 28)"/></g><g stroke-linecap="square" opacity=".98" transform="translate(-7 -8) rotate(36 633.594 2201.332)" stroke-width="2"><ellipse cx="29" cy="27.5" stroke="#FC8F68" rx="4" ry="3.5"/><ellipse cx="29.5" cy="28" stroke="#59B799" rx="10.5" ry="28"/><ellipse cx="29.5" cy="28" stroke="#59B799" rx="10.5" ry="28" transform="rotate(-59.999 29.5 28)"/><ellipse cx="29.5" cy="28" stroke="#59B799" rx="10.5" ry="28" transform="rotate(59.999 29.5 28)"/></g><g stroke-width="2" opacity=".9"><path stroke="#FC8F68" stroke-linecap="square" d="M726.23 897.148l-14.556 3.63m11.894-14.303l-21.347 5.322"/><path stroke="#59B799" stroke-linecap="square" d="M709.508 875.552l-2.662-10.673"/><path stroke="#59B799" d="M715.33 874.1l7.528-15.275m-18.202 17.937l-13.818-9.953"/><path stroke="#59B799" stroke-linecap="square" d="M689.37 885.726l7.742 31.05 42.693-10.645-7.74-31.05m-48.755 7.01l53.366-13.3m-18.216 42.67l1.2 4.85"/><path stroke="#FC8F68" stroke-linecap="square" d="M694.2 921.624l10.924-18.183"/></g><g stroke-width="2" opacity=".87"><path stroke="#FC8F68" stroke-linecap="square" d="M1423.995 338.97l7.823-10.38m-.636 15.798l11.435-15.174"/><path stroke="#59B799" stroke-linecap="square" d="M1446.784 343.623l7.188 5.416"/><path stroke="#59B799" d="M1443.173 348.415l3.37 13.808m2.648-21.794l14.21-.57"/><path stroke="#59B799" stroke-linecap="square" d="M1454.225 325.44l-21.563-16.25-22.87 30.35 21.564 16.248m29.27-30.534l-28.286 37.536m-11.112-38.425l-3.195-2.407"/><path stroke="#FC8F68" stroke-linecap="square" d="M1432.072 304.99l2.558 18.205"/></g><g stroke-width="2" opacity=".75"><path stroke="#FC8F68" stroke-linecap="square" d="M1086.844 863.71l8-13.857m-17.527 8.357l12-20.785"/><path stroke="#59B799" stroke-linecap="square" d="M1070.327 840.317l-10.392-6"/><path stroke="#59B799" d="M1067.327 845.514l-18.124 3.392m23.624-12.92l-6.124-17.39"/><path stroke="#59B799" stroke-linecap="square" d="M1087.023 823.4l29.445 17-23.5 40.702-29.445-17m21.304-48.9l-29.5 51.096m49.64-5.98l4.33 2.5"/><path stroke="#FC8F68" stroke-linecap="square" d="M1121.932 838.935l-21.856 5.856"/></g><g stroke-width="2" opacity=".89"><path stroke="#FC8F68" stroke-linecap="square" d="M1165.1 566.665l4.557 13.237m4.897-16.493l6.837 19.85"/><path stroke="#59B799" stroke-linecap="square" d="M1191.373 569.252l10.4-3.582"/><path stroke="#59B799" d="M1189.745 564.524l7.765-14.307M1193 573.98l14.928 6.493"/><path stroke="#59B799" stroke-linecap="square" d="M1192.21 590.115l-29.31 10.093-13.674-39.712 29.31-10.092m21.302 43.43l-17.255-50.11m-26.194 37.574l-3.79 1.302"/><path stroke="#FC8F68" stroke-linecap="square" d="M1161.366 604.967l8.68-17.795"/></g><g stroke-width="2" opacity=".98"><path stroke="#FC8F68" stroke-linecap="square" d="M1075.206 241.077l-4.962 17.302m18.42-13.45l-7.443 25.95"/><path stroke="#59B799" stroke-linecap="square" d="M1100.185 262.804l12.496 3.583"/><path stroke="#59B799" d="M1102.39 255.113l18.963-8.086m-22.822 21.544l11.8 16.91"/><path stroke="#59B799" stroke-linecap="square" d="M1086.975 287.104l-37.49-10.75 14.885-51.908 37.49 10.75m-10.77 59.33l18.467-64.405m-52.63 20.28l-5.766-1.65"/><path stroke="#FC8F68" stroke-linecap="square" d="M1043.577 278.82l22.264-12.34"/></g><g stroke-width="2" opacity=".99"><path stroke="#FC8F68" stroke-linecap="square" d="M808.963 105.018l-14.572 8.756m21.27 2.388l-22.28 13.39"/><path stroke="#59B799" stroke-linecap="square" d="M812.756 136.572l6.695 11.143"/><path stroke="#59B799" d="M817.9 133.48l18.867 6.163m-29.154.02l-3.418 19.552"/><path stroke="#59B799" stroke-linecap="square" d="M787.72 143.447l-19.055-31.715 43.715-26.267 19.057 31.716m-46.11 35.88l54.86-32.96m-50.093-21.24l-2.575-4.28"/><path stroke="#FC8F68" stroke-linecap="square" d="M762.32 110.88l23.326 5.815"/></g><g stroke-width="2" opacity=".97"><path stroke="#FC8F68" stroke-linecap="square" d="M771.11 686.077l13.585 11.81m-4.4-22.376l21.132 18.37"/><path stroke="#59B799" stroke-linecap="square" d="M802.014 671.866L811.2 661.3"/><path stroke="#59B799" d="M796.73 667.273l-.068-21.26m9.88 29.79l21.063-2.892"/><path stroke="#59B799" stroke-linecap="square" d="M817.8 694.862l-26.244 30.19-41.51-36.085 26.244-30.188m51.384 35.39L775.6 648.9m-4.42 58.436l-3.94 4.528"/><path stroke="#FC8F68" stroke-linecap="square" d="M791.295 731.448l-1.776-25.394"/></g><g stroke-width="2" opacity=".75"><path stroke="#FC8F68" stroke-linecap="square" d="M695.108 130.526l12.99-7.5m-18.99-2.892l19.918-11.5"/><path stroke="#59B799" stroke-linecap="square" d="M692.5 102.01l-6-10.393"/><path stroke="#59B799" d="M688.17 104.51l-17.393-6.125m26.92.625l3.39-18.125"/><path stroke="#59B799" stroke-linecap="square" d="M714.918 94.84l17 29.445-39.837 23-17-29.445m42.54-30.33l-50.23 29M712 135.785l2.5 4.33"/><path stroke="#FC8F68" stroke-linecap="square" d="M737.383 125.75l-20.49-5.492"/></g><g stroke-width="2" opacity=".85"><path stroke="#FC8F68" stroke-linecap="square" d="M668.964 835.982l-14.572-8.756m21.267-2.387l-22.29-13.4"/><path stroke="#59B799" stroke-linecap="square" d="M672.756 804.43l6.696-11.144"/><path stroke="#59B799" d="M677.9 807.52l18.868-6.163m-29.155-.018l-3.417-19.56"/><path stroke="#59B799" stroke-linecap="square" d="M647.722 797.553l-19.056 31.715 43.715 26.267 19.06-31.715m-46.11-35.872l54.86 32.962m-50.09 21.234l-2.57 4.286"/><path stroke="#FC8F68" stroke-linecap="square" d="M622.32 830.122l23.327-5.817"/></g><g stroke-width="2" opacity=".91"><path stroke="#FC8F68" stroke-linecap="square" d="M921.474 663.974l3.86-13.458m5.753 16.214l5.788-20.186"/><path stroke="#59B799" stroke-linecap="square" d="M947.576 660.015l10.574 3.032"/><path stroke="#59B799" d="M946.198 664.822l8.503 13.88m-5.74-23.493l14.57-7.27"/><path stroke="#59B799" stroke-linecap="square" d="M947.322 639.136l-29.8-8.544-11.576 40.373 29.8 8.544m18.997-44.49l-14.61 50.94m-28.123-36.15l-3.845-1.11"/><path stroke="#FC8F68" stroke-linecap="square" d="M915.74 625.92l9.6 17.316"/></g><g stroke-width="2" opacity=".96"><path stroke="#FC8F68" stroke-linecap="square" d="M648.488 169.536l-13.98-.733m14.504-9.254l-20.972-1.1"/><path stroke="#59B799" stroke-linecap="square" d="M638.76 144.993l.575-10.985"/><path stroke="#59B799" d="M643.753 145.254l11.612-11.407m-21.6 10.884l-10.355-12.55"/><path stroke="#59B799" stroke-linecap="square" d="M618.473 149.938l-1.623 30.957 41.943 2.198 1.622-30.957m-47.62-8.504l52.927 2.774m-28.9 35.536l-.208 3.995"/><path stroke="#FC8F68" stroke-linecap="square" d="M612.7 183.682l14.712-13.248"/></g><g stroke-width="2" opacity=".8"><path stroke="#FC8F68" stroke-linecap="square" d="M382.318 770.247l-8.53-9.812m15.323 3.907l-13.12-15.094"/><path stroke="#59B799" stroke-linecap="square" d="M392.36 748.266l7.548-6.56"/><path stroke="#59B799" d="M395.642 752.04l14.862.33m-20.767-7.123l1.74-14.763"/><path stroke="#59B799" stroke-linecap="square" d="M376.123 737.207l-21.887 19.026 25.586 29.433 21.887-19.025m-25.1-36.48l32.14 36.98m-42.06 3.44l-3.02 2.63"/><path stroke="#FC8F68" stroke-linecap="square" d="M350.004 755.937l18.34 1.282"/></g><g stroke-width="2" opacity=".7"><path stroke="#FC8F68" stroke-linecap="square" d="M433.96 529.845l14.918 1.568m-13.768-12.508l21.88 2.3"/><path stroke="#59B799" stroke-linecap="square" d="M447.513 506.132l1.15-10.94"/><path stroke="#59B799" d="M441.546 505.505l-9.58-14.08m20.52 15.23l12.298-11.78"/><path stroke="#59B799" stroke-linecap="square" d="M468.87 513.404l-3.345 31.825-43.76-4.6 3.346-31.83m49.26.15l-54.7-5.75m23.98 39.72l-.52 4.97"/><path stroke="#FC8F68" stroke-linecap="square" d="M469.085 549.625l-13.35-16.486"/></g><g stroke-width="2" opacity=".81"><path stroke="#FC8F68" stroke-linecap="square" d="M184.1 970.596l-10.698 13.212m1.373-20.764l-15.733 19.43"/><path stroke="#59B799" stroke-linecap="square" d="M154.79 962.3l-9.327-7.55"/><path stroke="#59B799" d="M159.194 956.86l-3.328-18.135m-4.853 28.24l-18.432.514"/><path stroke="#59B799" stroke-linecap="square" d="M144.496 986.135l27.977 22.655 31.466-38.857-27.98-22.656m-40.68 39.115l39.01-48.183m13.91 51.15l3.88 3.14"/><path stroke="#FC8F68" stroke-linecap="square" d="M173.065 1014.416l-2.514-23.91"/></g><g stroke-width="2" opacity=".86"><path stroke="#FC8F68" stroke-linecap="square" d="M233.73 134.76l-4.636 14.265m-5.826-17.665l-6.8 20.923"/><path stroke="#59B799" stroke-linecap="square" d="M206.554 137.495l-10.462-3.4"/><path stroke="#59B799" d="M208.408 131.79l-8.965-14.48m5.566 24.94l-15.77 6.445"/><path stroke="#59B799" stroke-linecap="square" d="M204.51 159.964l30.434 9.888 13.597-41.846-30.43-9.89m-19.9 45.058l17-52.308m26.54 38.063l4.76 1.54"/><path stroke="#FC8F68" stroke-linecap="square" d="M237.513 174.892l-9.63-18.9"/></g><g stroke-width="2" opacity=".95"><path stroke="#FC8F68" d="M1401.025 465.154l-35.346-16.482"/><path stroke="#59B799" stroke-linecap="square" d="M1410.733 456.165c-2.98 6.394-7.782 10.44-11.256 8.82 3.474 1.62 3.46 7.897.48 14.29-2.982 6.395-7.782 10.44-11.256 8.82l-35.82-16.704c3.48 1.62 8.59-2.28 11.57-8.67 2.98-6.39 2.69-12.81-.79-14.43 3.48 1.62 8.59-2.28 11.57-8.67 2.98-6.39 2.69-12.81-.79-14.43l35.83 16.71c3.48 1.62 3.46 7.9.48 14.3z"/></g><g stroke-width="2" opacity=".93"><path stroke="#FC8F68" d="M1143.52 406.803l16.268 36.542"/><path stroke="#59B799" stroke-linecap="square" d="M1129.837 407.42c6.698-2.98 13.202-2.923 14.795.655-1.593-3.578 2.716-8.45 9.414-11.432 6.698-2.982 13.202-2.925 14.795.653l16.43 36.894c-1.59-3.578-8.24-3.954-14.93-.972-6.69 2.982-10.86 8.172-9.27 11.75-1.59-3.578-8.24-3.953-14.93-.97-6.7 2.98-10.86 8.17-9.27 11.75l-16.42-36.895c-1.59-3.578 2.72-8.45 9.42-11.432z"/></g><g stroke-width="2" opacity=".75"><path stroke="#FC8F68" d="M668.345 959.453l33.093 11.395"/><path stroke="#59B799" stroke-linecap="square" d="M659.873 968.7c2.072-6.018 5.97-10.11 9.2-8.996-3.23-1.113-3.784-6.736-1.712-12.752 2.08-6.017 5.97-10.107 9.2-8.995l33.31 11.47c-3.23-1.113-7.41 2.88-9.48 8.895-2.07 6.017-1.23 11.74 2 12.85-3.23-1.11-7.41 2.88-9.49 8.897-2.07 6.01-1.23 11.73 2 12.85l-33.31-11.47c-3.23-1.12-3.78-6.74-1.71-12.75z"/></g><g stroke-width="2" opacity=".8"><path stroke="#FC8F68" d="M477.677 860.64l28.523-26.597"/><path stroke="#59B799" stroke-linecap="square" d="M482.375 873.01c-4.812-5.16-6.764-11.126-3.96-13.74-2.804 2.614-8.62.25-13.43-4.91-4.813-5.16-6.765-11.125-3.962-13.74l28.908-26.956c-2.8 2.614-1.1 8.813 3.72 13.972 4.81 5.16 10.88 7.292 13.68 4.678-2.8 2.614-1.1 8.812 3.71 13.972 4.81 5.16 10.88 7.29 13.68 4.677l-28.91 26.957c-2.8 2.614-8.62.25-13.43-4.91z"/></g><g stroke-width="2" opacity=".94"><path stroke="#FC8F68" d="M489.898 464.668l44.7-14.523"/><path stroke="#59B799" stroke-linecap="square" d="M479.633 452.494c2.608 8.026 7.716 13.528 12.075 12.112-4.36 1.416-5.257 8.87-2.65 16.896 2.608 8.025 7.716 13.528 12.075 12.11l44.946-14.603c-4.36 1.41-9.86-3.96-12.47-11.99-2.61-8.03-1.32-15.61 3.03-17.02-4.36 1.41-9.86-3.96-12.46-11.99-2.61-8.03-1.32-15.61 3.03-17.02l-44.95 14.6c-4.36 1.41-5.26 8.87-2.65 16.89z"/></g><g stroke-width="2" opacity=".89"><path stroke="#FC8F68" d="M584.275 92.35L535.27 67.38"/><path stroke="#59B799" stroke-linecap="square" d="M598.684 79.49c-4.522 8.874-11.446 14.37-16.198 11.95 4.752 2.42 4.376 11.252-.146 20.126s-11.446 14.37-16.198 11.95L517.144 98.55c4.752 2.42 12.098-2.86 16.62-11.736 4.52-8.874 4.475-17.92-.277-20.342 4.752 2.42 12.098-2.86 16.62-11.734 4.522-8.876 4.476-17.922-.276-20.344l49 24.966c4.76 2.422 4.38 11.253-.14 20.128z"/></g><g stroke-width="2" opacity=".72"><path stroke="#FC8F68" d="M258.932 556.188l4.51 36.724"/><path stroke="#59B799" stroke-linecap="square" d="M246.66 552.657c6.728-.826 12.467 1.014 12.914 4.653-.447-3.64 4.676-6.813 11.404-7.64 6.727-.825 12.466 1.015 12.913 4.655l4.61 37.525c-.44-3.64-6.22-5.803-12.95-4.977-6.72.826-11.81 4.324-11.36 7.963-.44-3.64-6.22-5.803-12.95-4.977-6.72.82-11.81 4.32-11.36 7.96l-4.61-37.53c-.44-3.64 4.68-6.82 11.41-7.64z"/></g><g stroke-width="2" opacity=".89"><path stroke="#FC8F68" d="M232.83 39.082l32.043 18.5"/><path stroke="#59B799" stroke-linecap="square" d="M222.875 46.324c3.25-5.63 8.013-8.94 11.116-7.15-3.1-1.79-2.61-7.57.64-13.2 3.25-5.632 8.02-8.943 11.12-7.15l32 18.473c-3.1-1.792-8.14 1.36-11.39 6.99s-3.46 11.57-.36 13.362c-3.1-1.8-8.14 1.36-11.39 6.99s-3.46 11.57-.36 13.36l-32-18.48c-3.1-1.79-2.61-7.57.64-13.2z"/></g><g stroke-width="2" opacity=".76" transform="translate(-7 -8) rotate(-142 495.581 410.497)"><path stroke="#59B799" d="M18 18h11m9 13.5V45H0V0h38v12.59M8 12h12M8 23h12M8 33h21"/><path stroke="#FC8F68" d="M37 25l8 8"/><circle cx="28.5" cy="18.5" r="10.5" stroke="#FC8F68" stroke-linecap="square"/></g><g stroke-width="2" opacity=".8" transform="translate(-7 -8) scale(1 -1) rotate(-58 377.842 -1272.07)"><path stroke="#59B799" d="M29 29h17m14 21.4V72H0V0h60v20.142M12 19h20M12 36h18M12 53h34"/><path stroke="#FC8F68" d="M59 39l13 13"/><circle cx="46" cy="29" r="17" stroke="#FC8F68" stroke-linecap="square"/></g><g stroke-width="2" opacity=".78" transform="translate(-7 -8) rotate(-33 2313.593 -1727.29)"><path stroke="#59B799" d="M21.872 21.872H34.49m10.094 15.814v16.152H0V0h44.584v15.06m-35.33-.76h15.14M9.254 26.92h13.46M9.254 39.536H34.49"/><path stroke="#FC8F68" d="M43.743 29.442l10.095 10.095"/><circle cx="34.49" cy="21.872" r="12.618" stroke="#FC8F68" stroke-linecap="square"/></g><g stroke-width="2" opacity=".97" transform="translate(-7 -8) rotate(-35 644.645 -1804.11)"><path stroke="#59B799" d="M20 20h11m10 14.3V49H0V0h41v13.708M8 13h13M8 25h13M8 36h23"/><path stroke="#FC8F68" d="M40 27l9 9"/><circle cx="31.5" cy="19.5" r="11.5" stroke="#FC8F68" stroke-linecap="square"/></g><g stroke-width="2" opacity=".89" transform="translate(-7 -8) scale(-1 1) rotate(-19 -312.812 3315.316)"><path stroke="#59B799" d="M25 25h14m13 18.4V62H0V0h52v17.345M10 17h17M10 31h16M10 45h29"/><path stroke="#FC8F68" d="M50 34l12 12"/><circle cx="39.5" cy="24.5" r="14.5" stroke="#FC8F68" stroke-linecap="square"/></g><g stroke-width="2" opacity=".76" transform="translate(-7 -8) scale(-1 1) rotate(-74 37.837 1113.41)"><path stroke="#59B799" d="M23 23h14m11 17.6V58H0V0h48v16.226M10 15h16M10 29h15M10 43h27"/><path stroke="#FC8F68" d="M47 32l11 11"/><circle cx="36.5" cy="23.5" r="13.5" stroke="#FC8F68" stroke-linecap="square"/></g><g stroke-width="2" opacity=".73" transform="translate(-7 -8) scale(1 -1) rotate(73 578.384 556.64)"><path stroke="#59B799" d="M20 20h12m10 15v15H0V0h42v13.988M8 13h14M8 25h13M8 37h23"/><path stroke="#FC8F68" d="M41 27l9 9"/><circle cx="31.5" cy="19.5" r="11.5" stroke="#FC8F68" stroke-linecap="square"/></g><g stroke-width="2" opacity=".93" transform="translate(-7 -8) rotate(109 323.44 579.328)"><path stroke="#59B799" d="M19 19h11m10 14.6V48H0V0h40v13.428M8 13h13M8 24h12M8 35h22"/><path stroke="#FC8F68" d="M39 26l9 9"/><circle cx="30" cy="19" r="11" stroke="#FC8F68" stroke-linecap="square"/></g><g stroke-width="2" opacity=".9" transform="translate(-7 -8) scale(1 -1) rotate(79 493.63 492.222)"><path stroke="#59B799" d="M24 24h14m13 18.7V61H0V0h51v17.065M10 16h17M10 31h16M10 45h28"/><path stroke="#FC8F68" d="M50 33l11 11"/><circle cx="38" cy="24" r="14" stroke="#FC8F68" stroke-linecap="square"/></g><g stroke-width="2" opacity=".74" transform="translate(-7 -8) scale(-1 1) rotate(-59 74.27 1042.534)"><path stroke="#59B799" d="M23 23h13m12 16.9V57H0V0h48v15.946M10 15h16M10 29h15M10 42h27"/><path stroke="#FC8F68" d="M46 31l11 11"/><circle cx="36.5" cy="23.5" r="13.5" stroke="#FC8F68" stroke-linecap="square"/></g><g stroke-width="2" opacity=".93" transform="translate(-7 -8) rotate(-74 542.425 -190.67)"><path stroke="#59B799" d="M20 20h11m10 14.3V49H0V0h41v13.708M8 13h13M8 25h13M8 36h23"/><path stroke="#FC8F68" d="M40 27l9 9"/><circle cx="31.5" cy="19.5" r="11.5" stroke="#FC8F68" stroke-linecap="square"/></g><g stroke-width="2" opacity=".82" transform="translate(-7 -8) rotate(69 163.107 420.922)"><path stroke="#59B799" d="M25 25h15m13 19.1V63H0V0h53v17.624M11 17h17M11 32h16M11 46h29"/><path stroke="#FC8F68" d="M51 35l12 12"/><circle cx="39.5" cy="25.5" r="14.5" stroke="#FC8F68" stroke-linecap="square"/></g><g stroke-width="2" opacity=".7" transform="translate(-7 -8) rotate(65 -337.054 625.783)"><path stroke="#59B799" d="M22 22h13m12 17.2V56H0V0h47v15.666M9 15h15M9 28h14M9 41h26"/><path stroke="#FC8F68" d="M46 31l10 10"/><circle cx="35" cy="22" r="13" stroke="#FC8F68" stroke-linecap="square"/></g><g stroke-width="2" opacity=".83" transform="translate(-7 -8) rotate(-119 338.062 108.609)"><path stroke="#59B799" d="M29 29h17m14 21.4V72H0V0h60v20.142M12 19h20M12 36h18M12 53h34"/><path stroke="#FC8F68" d="M59 39l13 13"/><circle cx="46" cy="29" r="17" stroke="#FC8F68" stroke-linecap="square"/></g><g stroke-width="2" opacity=".95" transform="translate(-7 -8) scale(1 -1) rotate(-37 -1255.46 -541.013)"><path stroke="#59B799" d="M26 26h15m14 20.2V66H0V0h55v18.463M11 18h18M11 33h17M11 48h31"/><path stroke="#FC8F68" d="M54 36l12 12"/><circle cx="41.5" cy="26.5" r="15.5" stroke="#FC8F68" stroke-linecap="square"/></g><g stroke-width="2" opacity=".98"><path stroke="#FC8F68" stroke-linecap="square" d="M1278.84 917.333l-9.894.346"/><path stroke="#FC8F68" d="M1346.634 921.758l11.873-.415-.474-13.568-11.872.415"/><path stroke="#59B799" d="M1302.336 910.53l-23.384.817.467 13.363 23.38-.816"/><path stroke="#59B799" stroke-linecap="square" d="M1302.665 906.446l.7 20.085 43.517-1.51-.702-20.08z"/><path stroke="#59B799" stroke-linecap="square" d="M1340.724 905.222l-.304-8.4-26.89.904"/></g><g stroke-width="2" opacity=".77"><path stroke="#FC8F68" stroke-linecap="square" d="M1098.493 947.182l1.35 6.94"/><path stroke="#FC8F68" d="M1093.976 900.23l-1.51-7.775-8.886 1.727 1.51 7.775"/><path stroke="#59B799" d="M1090.785 931.785l3.09 15.902 9.087-1.766-3.09-15.9"/><path stroke="#59B799" stroke-linecap="square" d="M1088.488 931.99l13.59-2.64-5.724-29.447-13.59 2.642z"/><path stroke="#59B799" stroke-linecap="square" d="M1084.067 906.09l-5.63 1.085 3.533 18.007"/></g><g stroke-width="2" opacity=".77"><path stroke="#FC8F68" stroke-linecap="square" d="M1243.07 847.068l-6.798-1.95"/><path stroke="#FC8F68" d="M1284.905 854.75l6.978 2-2.287 7.976-6.978-2"/><path stroke="#59B799" d="M1255.82 856.008l-14.707-4.217 2.41-8.4 14.706 4.22"/><path stroke="#59B799" stroke-linecap="square" d="M1254.79 857.902l3.57-12.45 26.974 7.735-3.57 12.45z"/><path stroke="#59B799" stroke-linecap="square" d="M1278.82 864.124l-1.514 5.127-16.48-4.58"/></g><g stroke-width="2" opacity=".91"><path stroke="#FC8F68" stroke-linecap="square" d="M1080.59 719.24l-3.85 7.562"/><path stroke="#FC8F68" d="M1113.104 668.722l4.794-9.41-10.752-5.478-4.794 9.41"/><path stroke="#59B799" d="M1084.835 697.884l-9.397 18.443 10.54 5.37 9.396-18.443"/><path stroke="#59B799" stroke-linecap="square" d="M1082.466 695.887l15.917 8.11 17.57-34.486-15.916-8.11zm15.39-30.295l-6.622-3.434-10.688 21.348"/></g><g stroke-width="2" opacity=".81"><path stroke="#FC8F68" stroke-linecap="square" d="M1111.066 183.937l-7.066-.247"/><path stroke="#FC8F68" d="M1155.32 180.954l7.916.276-.316 9.046-7.915-.277"/><path stroke="#59B799" d="M1126.332 188.844l-15.29-.534.306-8.738 15.29.534"/><path stroke="#59B799" stroke-linecap="square" d="M1126.008 191.162l.467-13.39 29.01 1.013-.467 13.39zm25.757 1.228l-.19 5.73-18.34-.674"/></g><g stroke-width="2" opacity=".82"><path stroke="#FC8F68" stroke-linecap="square" d="M997.305 300.426l5.34 6.595"/><path stroke="#FC8F68" d="M954.11 256.672l-6.646-8.207 9.378-7.594 6.646 8.21"/><path stroke="#59B799" d="M988.185 279.358l13.593 16.785-9.592 7.767-13.593-16.785"/><path stroke="#59B799" stroke-linecap="square" d="M990.65 277.66l-14.23 11.522-24.968-30.832 14.23-11.523z"/><path stroke="#59B799" stroke-linecap="square" d="M968.372 250.44l5.764-4.735 14.894 18.66"/></g><g stroke-width="2" opacity=".92"><path stroke="#FC8F68" stroke-linecap="square" d="M617.654 913.558l-5.337 4.64"/><path stroke="#FC8F68" d="M658.724 884.35l6.476-5.628-6.433-7.4-6.475 5.63"/><path stroke="#59B799" d="M627.84 898.23l-12.906 11.22 6.41 7.373 12.905-11.218"/><path stroke="#59B799" stroke-linecap="square" d="M626.85 896.737l9.668 11.123 24.1-20.95-9.67-11.122zm20.363-18.83l-3.97-4.663-14.658 13.01"/></g><g stroke-width="2" opacity=".87"><path stroke="#FC8F68" stroke-linecap="square" d="M710.754 674.22l6.206 5.786"/><path stroke="#FC8F68" d="M674.275 632.466l-7.24-6.75-7.716 8.273 7.24 6.75"/><path stroke="#59B799" d="M692.416 664.853l14.48 13.503 7.716-8.274-14.48-13.503"/><path stroke="#59B799" stroke-linecap="square" d="M690.803 666.91l11.27-12.084-26.185-24.417-11.27 12.08zm-23.07-21.207l-4.822 5.17 16.55 15.433"/></g><g stroke-width="2" opacity=".88"><path stroke="#FC8F68" stroke-linecap="square" d="M178.61 250.083l5.246 8.395"/><path stroke="#FC8F68" d="M149.924 192.076l-5.946-9.514-10.874 6.795 5.945 9.514"/><path stroke="#59B799" d="M161.577 234.954l11.922 19.08 10.9-6.813-11.92-19.08"/><path stroke="#59B799" stroke-linecap="square" d="M158.634 236.234l16.286-10.176-22.05-35.285-16.284 10.176z"/><path stroke="#59B799" stroke-linecap="square" d="M139.348 205.098l-6.766 4.302 13.425 21.866"/></g><g stroke-width="2" opacity=".73"><path stroke="#FC8F68" stroke-linecap="square" d="M57.42 374.58l2.195-8.195"/><path stroke="#FC8F68" d="M47.876 432.052l-2.562 9.562-10.928-2.928 2.562-9.562"/><path stroke="#59B799" d="M46.83 392.24l5.125-19.123 10.928 2.928-5.124 19.124"/><path stroke="#59B799" stroke-linecap="square" d="M43.825 391.667l16.824 4.508-9.77 36.45-16.83-4.507z"/><path stroke="#59B799" stroke-linecap="square" d="M35.314 424.294l-6.83-1.83 5.856-21.857"/></g><g stroke-width="2" opacity=".73"><path stroke="#FC8F68" stroke-linecap="square" d="M15.17 264.406l-6.797 1.95"/><path stroke="#FC8F68" d="M59.315 246.648l8.247-2.365 2.703 9.425-8.248 2.365"/><path stroke="#59B799" d="M33.087 265.087L16.65 269.8l-2.693-9.392 16.437-4.714"/><path stroke="#59B799" stroke-linecap="square" d="M33.525 266.577l-3.94-13.737 29.765-8.535 3.94 13.737z"/><path stroke="#59B799" stroke-linecap="square" d="M59.208 259.09l1.475 5.717-18.02 5.692"/></g><g opacity=".93" transform="translate(-7 -8) rotate(-42 1058.267 -1650.327)"><circle cx="23.5" cy="24.5" r="22.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="10.5" cy="33.5" r="1.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="32.5" cy="27.5" r="1.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="10.5" cy="33.5" r="1.5" fill="#59B799" fill-rule="nonzero"/><circle cx="32.5" cy="27.5" r="1.5" fill="#59B799" fill-rule="nonzero"/><circle cx="24.5" cy="14.5" r="4.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><path stroke="#FC8F68" stroke-linecap="square" stroke-width="2" d="M46.4 38.4c1.81 4.03 2.16 7.167.663 8.663-3.654 3.653-16.932-3.697-29.703-16.426l.002.002C4.632 17.86-2.716 4.59.937.93 2.433-.56 5.573-.208 9.6 1.6"/></g><g opacity=".86" transform="translate(-7 -8) rotate(-86 792.749 -647.127)"><circle cx="33" cy="35" r="32" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="15.5" cy="48.5" r="2.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="47.5" cy="39.5" r="2.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="15.5" cy="48.5" r="2.5" fill="#59B799" fill-rule="nonzero"/><circle cx="47.5" cy="39.5" r="2.5" fill="#59B799" fill-rule="nonzero"/><circle cx="35.5" cy="21.5" r="6.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><path stroke="#FC8F68" stroke-linecap="square" stroke-width="2" d="M66.7 55.2c2.6 5.79 3.104 10.302.953 12.452-5.253 5.253-24.34-5.313-42.698-23.612l.003.003C6.66 25.683-3.905 6.597 1.348 1.346 3.498-.804 8.012-.3 13.8 2.298"/></g><g opacity=".93" transform="translate(-7 -8) rotate(180 669 263)"><circle cx="31" cy="33" r="30" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="14" cy="45" r="2" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="44" cy="36" r="2" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="14" cy="45" r="2" fill="#59B799" fill-rule="nonzero"/><circle cx="44" cy="36" r="2" fill="#59B799" fill-rule="nonzero"/><circle cx="33" cy="20" r="6" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><path stroke="#FC8F68" stroke-linecap="square" stroke-width="2" d="M61.867 51.2c2.412 5.372 2.88 9.555.883 11.55-4.87 4.872-22.575-4.928-39.603-21.9l.003.002C6.178 23.822-3.622 6.12 1.25 1.25 3.244-.747 7.43-.28 12.8 2.13"/></g><g opacity=".72" transform="translate(-7 -8) scale(-1 1) rotate(82 -978.753 -322.698)"><circle cx="26.5" cy="28.5" r="25.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="12" cy="39" r="2" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="38" cy="31" r="2" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="12" cy="39" r="2" fill="#59B799" fill-rule="nonzero"/><circle cx="38" cy="31" r="2" fill="#59B799" fill-rule="nonzero"/><circle cx="28" cy="17" r="5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><path stroke="#FC8F68" stroke-linecap="square" stroke-width="2" d="M53.167 44c2.073 4.616 2.474 8.212.76 9.926-4.187 4.186-19.402-4.235-34.035-18.822l.002.003C5.31 20.473-3.112 5.26 1.074 1.073 2.787-.64 6.386-.24 11 1.833"/></g><g opacity=".85" transform="translate(-7 -8) rotate(32 432.961 2175.218)"><circle cx="30.5" cy="32.5" r="29.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="14" cy="44" r="2" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="43" cy="36" r="2" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="14" cy="44" r="2" fill="#59B799" fill-rule="nonzero"/><circle cx="43" cy="36" r="2" fill="#59B799" fill-rule="nonzero"/><circle cx="32" cy="20" r="6" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><path stroke="#FC8F68" stroke-linecap="square" stroke-width="2" d="M60.9 50.4c2.374 5.288 2.834 9.406.87 11.37-4.796 4.795-22.223-4.852-38.985-21.56l.003.004C6.08 23.45-3.565 6.024 1.23 1.23 3.193-.735 7.315-.274 12.6 2.1"/></g><g opacity=".74" transform="translate(-7 -8) rotate(-41 1655.241 -1158.19)"><circle cx="31" cy="33" r="30" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="14" cy="45" r="2" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="44" cy="36" r="2" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="14" cy="45" r="2" fill="#59B799" fill-rule="nonzero"/><circle cx="44" cy="36" r="2" fill="#59B799" fill-rule="nonzero"/><circle cx="33" cy="20" r="6" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><path stroke="#FC8F68" stroke-linecap="square" stroke-width="2" d="M61.867 51.2c2.412 5.372 2.88 9.555.883 11.55-4.87 4.872-22.575-4.928-39.603-21.9l.003.002C6.178 23.822-3.622 6.12 1.25 1.25 3.244-.747 7.43-.28 12.8 2.13"/></g><g opacity=".88" transform="translate(-7 -8) scale(1 -1) rotate(21 3245.861 1824.698)"><circle cx="29" cy="31" r="28" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="13" cy="42" r="2" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="41" cy="34" r="2" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="13" cy="42" r="2" fill="#59B799" fill-rule="nonzero"/><circle cx="41" cy="34" r="2" fill="#59B799" fill-rule="nonzero"/><circle cx="30.5" cy="18.5" r="5.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><path stroke="#FC8F68" stroke-linecap="square" stroke-width="2" d="M58 48c2.26 5.036 2.7 8.958.828 10.828-4.567 4.567-21.164-4.62-37.128-20.532l.003.003C5.793 22.33-3.395 5.73 1.173 1.17 3.04-.7 6.966-.26 12 2"/></g><g opacity=".8" transform="translate(-7 -8) scale(-1 1) rotate(-26 101.223 934.64)"><circle cx="35.5" cy="38.5" r="34.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="16.5" cy="51.5" r="2.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="50.5" cy="41.5" r="2.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="16.5" cy="51.5" r="2.5" fill="#59B799" fill-rule="nonzero"/><circle cx="50.5" cy="41.5" r="2.5" fill="#59B799" fill-rule="nonzero"/><circle cx="38" cy="23" r="7" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><path stroke="#FC8F68" stroke-linecap="square" stroke-width="2" d="M71.534 59.2c2.788 6.21 3.33 11.048 1.02 13.355-5.632 5.633-26.102-5.698-45.79-25.324l.003.01C7.143 27.55-4.188 7.08 1.445 1.45 3.75-.867 8.592-.325 14.8 2.46"/></g><g opacity=".71" transform="translate(-7 -8) rotate(-58 833.183 253.419)"><circle cx="23.5" cy="24.5" r="22.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="10.5" cy="33.5" r="1.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="32.5" cy="27.5" r="1.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="10.5" cy="33.5" r="1.5" fill="#59B799" fill-rule="nonzero"/><circle cx="32.5" cy="27.5" r="1.5" fill="#59B799" fill-rule="nonzero"/><circle cx="24.5" cy="14.5" r="4.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><path stroke="#FC8F68" stroke-linecap="square" stroke-width="2" d="M46.4 38.4c1.81 4.03 2.16 7.167.663 8.663-3.654 3.653-16.932-3.697-29.703-16.426l.002.002C4.632 17.86-2.716 4.59.937.93 2.433-.56 5.573-.208 9.6 1.6"/></g><g opacity=".73" transform="translate(-7 -8) rotate(122 -10.318 121.37)"><circle cx="23.5" cy="24.5" r="22.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="10.5" cy="33.5" r="1.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="32.5" cy="27.5" r="1.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><circle cx="10.5" cy="33.5" r="1.5" fill="#59B799" fill-rule="nonzero"/><circle cx="32.5" cy="27.5" r="1.5" fill="#59B799" fill-rule="nonzero"/><circle cx="24.5" cy="14.5" r="4.5" stroke="#59B799" stroke-linecap="square" stroke-width="2"/><path stroke="#FC8F68" stroke-linecap="square" stroke-width="2" d="M46.4 38.4c1.81 4.03 2.16 7.167.663 8.663-3.654 3.653-16.932-3.697-29.703-16.426l.002.002C4.632 17.86-2.716 4.59.937.93 2.433-.56 5.573-.208 9.6 1.6"/></g><g stroke-linecap="square" stroke-width="2" opacity=".97"><path stroke="#F4EE7F" d="M1422.933 221.56l5.923-.414c2.617-.183 4.59-2.437 4.41-5.034-.183-2.598-2.45-4.555-5.068-4.372l-5.923.414.658 9.406z"/><path stroke="#F4EE7F" d="M1429.494 207.238l-3.45.24c-1.904.134-3.34 1.786-3.207 3.69l.723 10.348"/><path stroke="#AEE5D8" d="M1444.794 218.77l1.316 18.814m-5.33.373l5.33-.373-.746-10.66-5.33.372c-2.944.206-5.164 2.76-4.958 5.704.206 2.944 2.76 5.163 5.703 4.957zm-29.192-7.41l3.528-.248c3.247-.23 6.065 2.25 6.295 5.54.24 3.29-2.21 6.14-5.46 6.37l-3.53.24"/></g><g stroke-linecap="square" stroke-width="2" opacity=".99"><path stroke="#F4EE7F" d="M1339.347 104.955l4.444 7.698c1.97 3.4 6.27 4.59 9.62 2.66 3.35-1.934 4.47-6.26 2.51-9.66l-4.44-7.698-12.12 7z"/><path stroke="#F4EE7F" d="M1363.033 103.98l-2.75-4.762c-1.518-2.63-4.882-3.532-7.513-2.013l-14.29 8.25"/><path stroke="#AEE5D8" d="M1357.58 132.534l-25.116 14.5m-3.134-7.428l4 6.928 13.857-8-4-6.928c-2.21-3.827-7.102-5.138-10.93-2.928-3.825 2.21-5.136 7.1-2.927 10.928zM1318.59 95l2.624 4.547c2.416 4.185.885 9.593-3.42 12.078-4.304 2.485-9.753 1.107-12.17-3.078L1303 104"/></g><g stroke-linecap="square" stroke-width="2" opacity=".94"><path stroke="#F4EE7F" d="M1282.398 61.04l-11.41-4.38c-5.042-1.936-10.733.675-12.712 5.83-1.98 5.157.503 10.906 5.544 12.84l11.41 4.38 7.168-18.67z"/><path stroke="#F4EE7F" d="M1258.577 84.03l7.002 2.687c3.86 1.485 8.16-.342 9.6-4.08l7.79-20.306"/><path stroke="#AEE5D8" d="M1238.953 48.647l13.977-36.41m10.27 3.942l-10.27-3.95-7.884 20.54 10.27 3.94c5.67 2.18 12.033-.66 14.21-6.33 2.178-5.67-.655-12.04-6.327-14.21zm49.563 38.3l-7.002-2.69c-6.44-2.48-9.74-9.5-7.36-15.68 2.38-6.19 9.53-9.2 15.97-6.73l7 2.69"/></g><g stroke-linecap="square" stroke-width="2" opacity=".81"><path stroke="#F4EE7F" d="M1184.703 491.4l-2.436-7.97c-1.076-3.52.834-7.225 4.267-8.275 3.433-1.05 7.088.954 8.165 4.475l2.43 7.97-12.43 3.8z"/><path stroke="#F4EE7F" d="M1199.95 476.282l1.46 4.78c.81 2.642-.57 5.405-3.08 6.172l-13.627 4.166"/><path stroke="#AEE5D8" d="M1177.845 462.126l-24.864 7.602m2.2 7.172l-2.19-7.172 14.35-4.386 2.2 7.173c1.21 3.96-1.01 8.153-4.98 9.365-3.96 1.21-8.15-1.018-9.36-4.98zm23.03 34.266l-1.42-4.662c-1.31-4.292-5.8-6.723-10.02-5.43-4.22 1.29-6.58 5.816-5.27 10.108l1.43 4.662"/></g><g stroke-linecap="square" stroke-width="2" opacity=".85"><path stroke="#F4EE7F" d="M1136.855 943.2l4.143 5.915c1.83 2.613 1.296 6.145-1.192 7.887s-5.99 1.036-7.82-1.578l-4.142-5.916 9.01-6.31z"/><path stroke="#F4EE7F" d="M1128.092 960.322l-2.295-3.277c-1.267-1.81-.735-4.368 1.187-5.714l10.445-7.31"/><path stroke="#AEE5D8" d="M1150.13 965.644l18.84-13.193m-3.728-5.32l3.728 5.33-10.65 7.46-3.727-5.32c-2.06-2.94-1.345-6.99 1.596-9.05 2.94-2.06 6.99-1.34 9.05 1.6zm-28.8-21.95l2.367 3.38c2.17 3.11 6.51 3.84 9.67 1.62 3.16-2.21 3.97-6.53 1.79-9.64l-2.37-3.38"/></g><g stroke-linecap="square" stroke-width="2" opacity=".97"><path stroke="#F4EE7F" d="M1034.104 459.644l2.374-10.285c1.05-4.55-1.81-9.09-6.382-10.14-4.574-1.06-9.133 1.77-10.182 6.31l-2.375 10.28 16.56 3.82z"/><path stroke="#F4EE7F" d="M1012.67 441.354l-1.35 5.846c-.746 3.23 1.376 6.476 4.74 7.252l18.27 4.218"/><path stroke="#AEE5D8" d="M1039.954 420.97l32.154 7.423m-2.137 9.256l2.14-9.26-18.51-4.28-2.13 9.25c-1.18 5.11 2.01 10.21 7.12 11.39 5.11 1.18 10.21-2.01 11.4-7.12zm-26.95 45.6l1.44-6.21c1.32-5.72 6.97-9.3 12.62-7.99 5.65 1.3 9.16 6.99 7.84 12.71l-1.43 6.21"/></g><g stroke-linecap="square" stroke-width="2" opacity=".83"><path stroke="#F4EE7F" d="M799.726 208.87l1.732 8.15c.766 3.603-1.68 7.174-5.46 7.978-3.782.803-7.47-1.465-8.234-5.066l-1.733-8.15 13.7-2.912z"/><path stroke="#F4EE7F" d="M781.264 223.018l-1.04-4.89c-.574-2.702 1.15-5.357 3.85-5.93l14.673-3.12"/><path stroke="#AEE5D8" d="M803.236 239.816l26.41-5.613m-1.56-7.336l1.56 7.336-14.672 3.118-1.56-7.33c-.86-4.05 1.726-8.03 5.778-8.89 4.05-.86 8.034 1.73 8.895 5.78zm-21.343-37.89l1.09 5.135c1.006 4.727 5.543 7.767 10.135 6.79 4.592-.975 7.5-5.598 6.495-10.325l-1.092-5.135"/></g><g stroke-linecap="square" stroke-width="2" opacity=".98"><path stroke="#F4EE7F" d="M675.364 377.58l.823-9.41c.364-4.156-2.687-7.82-6.813-8.18-4.126-.36-7.766 2.717-8.13 6.874l-.823 9.408 14.95 1.307z"/><path stroke="#F4EE7F" d="M653.41 364.617l-.48 5.48c-.264 3.025 2.086 5.702 5.25 5.98l17.184 1.502"/><path stroke="#AEE5D8" d="M675.426 342.45l29.886 2.616m-.74 8.467l.74-8.467-16.936-1.482-.74 8.468c-.41 4.677 3.05 8.8 7.726 9.208 4.677.41 8.8-3.05 9.21-7.727zm-18 45.103l.49-5.603c.45-5.158 5.054-8.97 10.28-8.512 5.227.46 9.1 5.01 8.647 10.17l-.49 5.61"/></g><g stroke-linecap="square" stroke-width="2" opacity=".85"><path stroke="#F4EE7F" d="M530.125 925.086l11.997 2.332c5.3 1.03 8.744 6.26 7.69 11.682-1.053 5.42-6.205 8.98-11.506 7.95l-11.997-2.33 3.81-19.634z"/><path stroke="#F4EE7F" d="M538.143 957.206l-7.362-1.43c-4.06-.79-6.74-4.618-5.97-8.55l4.15-21.35"/><path stroke="#AEE5D8" d="M573.535 937.6l7.44-38.284m-10.797-2.1l10.798 2.1-4.198 21.595-10.797-2.09c-5.96-1.16-9.85-6.93-8.69-12.89 1.16-5.96 6.93-9.86 12.9-8.7zm-62.332 6.222l7.362 1.43c6.777 1.318 13.296-2.888 14.56-9.394 1.265-6.506-3.203-12.847-9.98-14.164l-7.362-1.432"/></g><g stroke-linecap="square" stroke-width="2" opacity=".89"><path stroke="#F4EE7F" d="M1346.054 652.683l-18.124 14.16-.29-10.56-10.177-2.836 18.125-14.16"/><path stroke="#AEE5D8" d="M1354.058 662.927l3.693 4.728c1.36 1.733.98 4.315-.84 5.738l-43.02 33.615c-1.82 1.422-4.42 1.167-5.77-.567l-3.69-4.72m25.02-70.31l24.63 31.52-49.64 38.79-24.62-31.52zm-29.15 22.78l30.78 39.4m-43.39-29.55l30.78 39.4"/></g><g stroke-linecap="square" stroke-width="2" opacity=".86"><path stroke="#F4EE7F" d="M1346.762 63.86l14.85-14.85-9.354-1.254-1.254-9.353-14.85 14.85"/><path stroke="#AEE5D8" d="M1355.247 72.345l3.818 3.818c1.4 1.4 3.734 1.358 5.186-.094l34.32-34.32c1.45-1.46 1.5-3.79.1-5.19l-3.82-3.82"/><path stroke="#AEE5D8" d="M1329.79 46.89l25.457 25.455 39.598-39.598L1369.39 7.29zm23.336-23.336l31.82 31.82m-21.92-41.72l31.82 31.82"/></g><g stroke-linecap="square" stroke-width="2" opacity=".92"><path stroke="#F4EE7F" d="M1204.064 405.96l19.734 7.183-2.816-9.006 7.946-5.09-19.733-7.18"/><path stroke="#AEE5D8" d="M1200.302 416.298l-2.052 5.638c-.752 2.067.267 4.354 2.266 5.08l47.235 17.193c2 .72 4.25-.37 5.01-2.44l2.05-5.64"/><path stroke="#AEE5D8" d="M1212.615 382.47l-12.313 33.828 54.502 19.837 12.313-33.83zm31.95 11.627l-15.733 43.226m28.888-38.437l-15.733 43.225"/></g><g stroke-linecap="square" stroke-width="2" opacity=".74"><path stroke="#F4EE7F" d="M1160.1 853.186l-6.743 16.69 7.866-2.118 4.187 6.987 6.743-16.69"/><path stroke="#AEE5D8" d="M1150.828 849.44l-4.45-1.8c-1.632-.658-3.507.138-4.166 1.77l-15.584 38.57c-.66 1.632.137 3.507 1.77 4.166l4.45 1.798"/><path stroke="#AEE5D8" d="M1179.57 861.052l-28.742-11.612-17.98 44.504 28.742 11.613zm-10.488 25.962l-36.16-14.61m31.665 25.736l-36.16-14.61"/></g><g stroke-linecap="square" stroke-width="2" opacity=".81"><path stroke="#F4EE7F" d="M1022.01 216.687l-10.08-20.672 10.388 1.912 4.89-9.364 10.083 20.672"/><path stroke="#AEE5D8" d="M1010.327 222.386l-5.393 2.63c-1.977.965-4.424.055-5.436-2.02l-23.935-49.075c-1.013-2.07-.224-4.56 1.754-5.52l5.392-2.63m63.57 39.09l-35.96 17.54-27.62-56.62 35.95-17.53zm-16.22-33.25l-44.94 21.92m37.92-36.3l-44.94 21.91"/></g><g stroke-linecap="square" stroke-width="2" opacity=".88"><path stroke="#F4EE7F" d="M1028.996 721.395l4.4 16.42-6.996-2.924-4.595 6.04-4.4-16.42"/><path stroke="#AEE5D8" d="M1037.69 719.066l4.636-1.242c1.7-.456 3.448.504 3.884 2.134l10.32 38.508c.435 1.63-.6 3.335-2.3 3.79l-4.635 1.243m-39.918-36.93l28.012-7.51 11.9 44.43-28.01 7.5zm6.99 26.08l35.74-9.58m-32.894 20.2l35.74-9.58"/></g><g stroke-linecap="square" stroke-width="2" opacity=".86"><path stroke="#F4EE7F" d="M629.965 759.405l9.21-16.618-8.634 1.14-3.61-7.927-9.21 16.618"/><path stroke="#AEE5D8" d="M639.585 764.738l4.723 2.618c1.732.96 3.92.354 4.862-1.345l22.27-40.17c.94-1.7.295-3.87-1.437-4.83l-4.723-2.61m-55.432 29.87l29.737 16.49 25.695-46.36-29.737-16.48zm15.03-27.11l37.61 20.85m-31.308-32.22l37.61 20.85"/></g><g stroke-linecap="square" stroke-width="2" opacity=".96"><path stroke="#F4EE7F" d="M717.436 549.588l-20.796 2.923 4.628-8.22-6.715-6.63 20.796-2.92"/><path stroke="#AEE5D8" d="M719.106 561.472l.752 5.347c.275 1.96-1.163 3.79-3.196 4.08l-48.06 6.75c-2.035.28-3.924-1.09-4.2-3.05l-.75-5.35"/><path stroke="#AEE5D8" d="M714.096 525.822l5.01 35.65-55.455 7.793-5.01-35.65zm-32.68 4.593l6.264 44.562m-20.127-42.614l6.263 44.562"/></g><g stroke-linecap="square" stroke-width="2" opacity=".8"><path stroke="#F4EE7F" d="M552.928 597.194l-21.52-4.574 7.533-6.578-4.2-9.073 21.52 4.57"/><path stroke="#AEE5D8" d="M550.433 608.93l-1.247 5.87c-.458 2.152-2.593 3.54-4.745 3.08l-50.86-10.81c-2.15-.458-3.54-2.593-3.08-4.744l1.25-5.87"/><path stroke="#AEE5D8" d="M558.334 571.762l-7.9 37.17-58.69-12.475 7.9-37.17zm-34.234-7.277l-9.98 46.95m-4.694-50.07l-9.98 46.952"/></g><g stroke-linecap="square" stroke-width="2" opacity=".95"><path stroke="#F4EE7F" d="M55.422 99.28l14.16 21.806 4.106-11.12 11.83.772-14.162-21.806"/><path stroke="#AEE5D8" d="M44.52 106.36l-6.04 3.922c-2.214 1.438-2.88 4.376-1.483 6.528l33.04 50.88c1.4 2.152 4.354 2.737 6.568 1.3l6.04-3.922"/><path stroke="#AEE5D8" d="M81.42 82.397l-36.9 23.964 38.124 58.71 36.9-23.96zm22.33 34.385l-46.965 30.5m56.225-16.243l-46.966 30.5"/></g><g stroke-width="2" opacity=".75"><path stroke="#AEE5D8" d="M803.556 946.677c3.413-1.3 6.966-1.462 10.61-.793 8.17 1.55 23.914 14.29 12.598 41.586-2.678 6.418-11.368 5.793-11.368 5.793s-4.514 7.353-11.368 5.792c-28.777-6.758-29.743-27.028-26.24-34.635 2.987-6.246 8.092-10.494 17.035-11.536.305-.265.478-.573.784-.838"/><path stroke="#F4EE7F" d="M791.446 962.82c2.798.547 5.795.413 8.49-.96 2.695-1.373 4.565-3.72 5.766-6.305m-6.657 6.76c-5.584-10.96-9.194-15.182-17.116-15.97m14.3 10.447s-1.94-4.87-.4-9.747 6.16-7.562 6.16-7.562 2.24 5.046.65 9.835c-1.59 4.788-6.34 7.65-6.34 7.65"/></g><g stroke-width="2" opacity=".85"><path stroke="#AEE5D8" d="M1368.405 743.445c-3.226 1.23-6.58 1.393-10.02.774-7.71-1.44-22.538-13.37-11.78-39.07 2.545-6.04 10.747-5.48 10.747-5.48s4.282-6.93 10.748-5.48c27.15 6.27 28.007 25.33 24.68 32.49-2.838 5.88-7.67 9.89-16.114 10.89-.29.25-.453.54-.742.79"/><path stroke="#F4EE7F" d="M1379.55 727.787c-2.673-.612-5.518-.555-8.045.732-2.526 1.28-4.244 3.55-5.32 6.07m6.22-5.42c5.076 9.96 8.318 13.82 15.317 14.64m-12.965-10.03s1.79 4.49.364 8.99c-1.42 4.5-5.69 6.98-5.69 6.98s-2.07-4.66-.6-9.08c1.47-4.42 5.85-7.06 5.85-7.06"/></g><g stroke-width="2" opacity=".75"><path stroke="#AEE5D8" d="M1269.29 717.855c-.507 2.81-1.85 5.255-3.798 7.426-4.4 4.85-19.537 10.25-33.543-8.34-3.29-4.38.69-9.95.69-9.95s-3.18-5.99.69-9.95c16.38-16.54 30.62-9.01 34.38-3.59 3.04 4.52 3.85 9.66.9 16.07.05.31.19.55.25.87"/><path stroke="#F4EE7F" d="M1263.433 702.608c-1.297 1.737-2.277 3.893-2.45 6.345-.17 2.45.5 4.723 1.543 6.623m-1.507-7.122c9.48.663 13.71-.02 17.37-4.8m-12.31 6.157s3.98.66 6.58 3.61c2.6 2.95 2.54 7.06 2.54 7.06s-4.22-.52-6.75-3.46c-2.53-2.94-2.53-7.21-2.53-7.21"/></g><g stroke-width="2" opacity=".78"><path stroke="#AEE5D8" d="M1213.627 349.492c-2.7-2.36-4.48-5.36-5.584-8.826-2.428-7.787 1.335-27.274 30.19-30.01 6.792-.63 10.26 7.184 10.26 7.184s8.45.532 10.263 7.185c7.43 28.027-9.673 38.174-17.876 38.633-6.785.282-12.82-2.187-17.848-9.454-.37-.142-.718-.15-1.09-.294"/><path stroke="#F4EE7F" d="M1233.244 353.6c-.83-2.728-2.355-5.312-4.833-7.047-2.47-1.734-5.42-2.284-8.27-2.13m8.28 2.13c-6.73 9.618-8.62 14.586-5.49 21.79m2.51-17.533s-3.39 3.998-8.42 4.924c-5.03.926-9.57-1.892-9.57-1.892s3.41-4.35 8.38-5.197c4.98-.845 9.73 2.004 9.73 2.004"/></g><g stroke-width="2" opacity=".9"><path stroke="#AEE5D8" d="M1201.233 615.518c-2.957 2.77-4.852 6.223-5.967 10.17-2.45 8.868 2.518 30.652 35.148 32.535 7.68.425 11.3-8.516 11.3-8.516s9.507-.95 11.303-8.516c7.335-31.86-12.323-42.57-21.588-42.75-7.66-.03-14.37 3-19.77 11.39-.42.18-.81.2-1.22.38"/><path stroke="#F4EE7F" d="M1224.166 610.6c-.957 2.922-2.665 5.763-5.382 7.81-2.717 2.048-5.92 2.906-8.993 3.02m9-3.02c-8.07-10.715-10.45-16.3-7.25-24.583m2.92 18.824s-3.83-4.15-9.5-4.79c-5.67-.64-10.78 2.81-10.78 2.81s3.85 4.54 9.45 5.1c5.61.56 10.96-2.94 10.96-2.94"/></g><g stroke-width="2" opacity=".76"><path stroke="#AEE5D8" d="M1090.232 51.85c1.286 2.846 3.366 5.08 6.023 6.863 5.984 3.964 23.6 5.647 33.676-17.82 2.36-5.53-3.36-10.37-3.36-10.37s1.82-7.203-3.37-10.37c-21.89-13.17-35.12-1.373-37.72 5.378-2.06 5.61-1.57 11.28 3.27 17.29.03.35-.06.64-.04.99"/><path stroke="#F4EE7F" d="M1091.67 33.957c1.723 1.505 3.25 3.522 4.067 6.04.817 2.516.77 5.045.26 7.274m.69-7.58c-10.102 3.29-14.89 3.64-20.233-.78m14.678 3.65s-4.074 1.76-6.068 5.6c-1.994 3.84-.836 8.22-.836 8.22s4.362-1.67 6.277-5.49c1.914-3.81.785-8.36.785-8.36"/></g><g stroke-width="2" opacity=".78"><path stroke="#AEE5D8" d="M1048.94 340.324c-3.618 2.354-6.253 5.613-8.165 9.526-4.236 8.803-3.148 32.4 30.65 40.226 7.958 1.823 13.435-6.846 13.435-6.846s10.128.717 13.435-6.845c13.69-31.894-4.864-46.592-14.528-48.44-8.01-1.414-15.606.54-22.84 8.315-.465.11-.878.064-1.343.173"/><path stroke="#F4EE7F" d="M1073.517 339.995c-1.576 2.777-3.902 5.355-7.102 6.986-3.2 1.63-6.654 2-9.827 1.64m10.272-1.86c-6.346-12.45-7.828-18.58-3.33-26.36m-.842 20.38s-3.233-5.11-8.832-6.98c-5.6-1.86-11.24.63-11.24.63s3.188 5.52 8.736 7.29c5.548 1.77 11.44-.73 11.44-.73"/></g><g stroke-width="2" opacity=".75"><path stroke="#AEE5D8" d="M577.943 864.9c-2.978.68-5.94.4-8.88-.58-6.587-2.235-18.146-14.626-5.6-35.923 2.966-5.005 10.09-3.474 10.09-3.474s4.595-5.566 10.09-3.474c23.05 8.95 21.493 25.86 17.706 31.75-3.2 4.82-7.93 7.75-15.45 7.57-.29.18-.47.42-.75.6"/><path stroke="#F4EE7F" d="M590.386 852.258c-2.238-.47-4.768-.474-7.27.388-2.502.86-4.493 2.422-5.967 4.17m5.96-4.17c3.27 9.515 5.79 13.322 12.48 14.74m-10.8-9.855s1.05 4.31-.82 8.22c-1.87 3.91-6.06 5.61-6.06 5.61s-1.29-4.49.61-8.32c1.89-3.82 6.21-5.66 6.21-5.66"/></g><g stroke-width="2" opacity=".81"><path stroke="#AEE5D8" d="M1065.257 556.682c-3.16-1.022-6.385-1.015-9.652-.257-7.32 1.744-20.923 13.87-9.264 37.918 2.76 5.653 10.6 4.718 10.6 4.718s4.47 6.42 10.6 4.72c25.72-7.31 25.55-25.57 21.98-32.25-3.03-5.48-7.87-9.08-16.02-9.63-.29-.22-.46-.49-.75-.72"/><path stroke="#F4EE7F" d="M1078.172 571.075c-2.637.75-5.48.844-8.072-.31-2.59-1.153-4.425-3.33-5.63-5.79m5.58 4.673c4.32-9.704 7.257-13.502 14.123-14.51m-12.015 9.777s1.55-4.584-.108-9.005c-1.66-4.42-6.048-6.673-6.048-6.673s-1.825 4.76-.13 9.098c1.697 4.337 6.212 6.746 6.212 6.746"/></g><g stroke-width="2" opacity=".93"><path stroke="#AEE5D8" d="M979.822 413.86c-3.613 1.677-7.46 2.135-11.467 1.702-8.984-1.024-27-13.543-16.67-43.957 2.448-7.152 11.93-7.17 11.93-7.17s4.376-8.31 11.932-7.167c31.74 5.012 34.245 26.85 30.986 35.355-2.795 6.99-8.034 11.99-17.672 13.83-.31.31-.47.657-.79.97"/><path stroke="#F4EE7F" d="M992.895 395.65c-3.07-.207-6.343.312-9.26 2.065-2.916 1.752-4.91 4.4-6.17 7.206m6.17-7.2c6.623 11.02 10.784 15.11 19.56 15.08m-16.36-9.75s2.447 5.09 1.155 10.44c-1.293 5.36-6.054 8.59-6.054 8.59s-2.79-5.25-1.444-10.51c1.347-5.26 6.233-8.69 6.233-8.69"/></g><g stroke-width="2" opacity=".74"><path stroke="#AEE5D8" d="M770.18 601.705c-2.812.5-5.26 1.813-7.433 3.715-4.853 4.297-10.282 19.057 8.284 32.673 4.38 3.194 9.96-.696 9.96-.696s5.99 3.082 9.95-.696c16.58-15.99 9.07-29.85 3.66-33.5-4.51-2.95-9.64-3.74-16.06-.85-.31-.05-.55-.19-.86-.24"/><path stroke="#F4EE7F" d="M784.36 606.638c-1.598 1.287-3.584 2.256-5.847 2.414-2.263.158-4.364-.525-6.125-1.577m6.195 2.574c-.663-9.49.018-13.72 4.8-17.38m-5.16 12.24s-.652-3.98-3.602-6.59c-2.95-2.61-7.06-2.55-7.06-2.55s.52 4.21 3.47 6.74c2.95 2.53 7.21 2.53 7.21 2.53"/></g><g stroke-width="2" opacity=".81"><path stroke="#AEE5D8" d="M456.393 967.26c1.69-3.163 4.216-5.573 7.344-7.427 7.04-4.118 26.875-4.834 36.033 22.665 2.14 6.477-4.693 11.614-4.693 11.614s1.382 8.353-4.692 11.615c-25.638 13.545-39.37-.837-41.665-8.727-1.8-6.548-.752-12.983 5.197-19.517.056-.394-.014-.733.042-1.127"/><path stroke="#F4EE7F" d="M456.804 987.297c2.47-1.422 4.645-3.49 5.778-6.294 1.133-2.804 1.005-5.802.215-8.54m-.215 8.54c-10.886-4.398-16.152-5.124-22.468-.45m17.65-1.497s-4.658-2.405-6.692-7.098-.31-9.75-.31-9.75 5.005 2.335 6.948 6.99c1.942 4.657.236 9.932.236 9.932"/></g><g stroke-width="2" opacity=".77"><path stroke="#AEE5D8" d="M418.132 287.69c3.083-1.554 6.418-2.04 9.93-1.746 7.872.708 24.073 11.344 16.274 38.35-1.85 6.35-10.117 6.57-10.117 6.57s-3.49 7.412-10.12 6.57c-27.87-3.73-30.92-22.908-28.42-30.467 2.16-6.215 6.53-10.732 14.85-12.558.26-.29.39-.59.65-.88"/><path stroke="#F4EE7F" d="M408.683 304.426c2.722.33 5.546-.025 7.924-1.57 2.378-1.543 3.85-3.98 4.656-6.6m-5.076 6.873c-6.394-9.85-10.155-13.55-17.308-13.8m13.94 8.61s-2.25-4.29-1.3-8.91c.94-4.63 4.92-7.54 4.92-7.54s2.54 4.41 1.55 8.96c-1 4.55-5.08 7.63-5.08 7.63"/></g><g stroke-linecap="square" opacity=".79" transform="translate(-7 -8) scale(1 -1) rotate(-31 -1300.807 -2480.977)" stroke-width="2"><circle cx="27.5" cy="26.5" r="3.5" stroke="#F4EE7F"/><ellipse cx="28" cy="26.5" stroke="#AEE5D8" rx="10" ry="26.5"/><ellipse cx="28" cy="26.5" stroke="#AEE5D8" rx="10" ry="26.5" transform="rotate(-59.999 28 26.5)"/><ellipse cx="28" cy="26.5" stroke="#AEE5D8" rx="10" ry="26.5" transform="rotate(59.999 28 26.5)"/></g><g stroke-linecap="square" opacity=".91" transform="translate(-7 -8) rotate(66 145.78 1472.936)" stroke-width="2"><ellipse cx="29" cy="27.5" stroke="#F4EE7F" rx="4" ry="3.5"/><ellipse cx="29.5" cy="28" stroke="#AEE5D8" rx="10.5" ry="28"/><ellipse cx="29.5" cy="28" stroke="#AEE5D8" rx="10.5" ry="28" transform="rotate(-59.999 29.5 28)"/><ellipse cx="29.5" cy="28" stroke="#AEE5D8" rx="10.5" ry="28" transform="rotate(59.999 29.5 28)"/></g><g stroke-linecap="square" opacity=".91" transform="translate(-7 -8) scale(-1 1) rotate(-84 -324.365 1065.053)" stroke-width="2"><circle cx="32" cy="30" r="4" stroke="#F4EE7F"/><ellipse cx="32" cy="30.5" stroke="#AEE5D8" rx="11" ry="30.5"/><ellipse cx="32" cy="30.5" stroke="#AEE5D8" rx="11" ry="30.5" transform="rotate(-59.999 32 30.5)"/><ellipse cx="32" cy="30.5" stroke="#AEE5D8" rx="11" ry="30.5" transform="rotate(59.999 32 30.5)"/></g><g stroke-linecap="square" opacity=".73" transform="translate(-7 -8) rotate(23 229.23 3411.91)" stroke-width="2"><circle cx="40" cy="37" r="5" stroke="#F4EE7F"/><ellipse cx="39" cy="36.5" stroke="#AEE5D8" rx="13" ry="36.5"/><ellipse cx="39" cy="36.5" stroke="#AEE5D8" rx="13" ry="36.5" transform="rotate(-59.999 39 36.5)"/><ellipse cx="39" cy="36.5" stroke="#AEE5D8" rx="13" ry="36.5" transform="rotate(59.999 39 36.5)"/></g><g stroke-linecap="square" opacity=".72" transform="translate(-7 -8) rotate(-105 859.33 -15.659)" stroke-width="2"><circle cx="31" cy="29" r="4" stroke="#F4EE7F"/><ellipse cx="30.5" cy="28.5" stroke="#AEE5D8" rx="10.5" ry="28.5"/><ellipse cx="30.5" cy="28.5" stroke="#AEE5D8" rx="10.5" ry="28.5" transform="rotate(-59.999 30.5 28.5)"/><ellipse cx="30.5" cy="28.5" stroke="#AEE5D8" rx="10.5" ry="28.5" transform="rotate(59.999 30.5 28.5)"/></g><g stroke-linecap="square" opacity=".94" transform="translate(-7 -8) rotate(-29 1532.812 -1832.925)" stroke-width="2"><circle cx="26" cy="23" r="3" stroke="#F4EE7F"/><ellipse cx="25.5" cy="23.5" stroke="#AEE5D8" rx="8.5" ry="23.5"/><ellipse cx="25.5" cy="23.5" stroke="#AEE5D8" rx="8.5" ry="23.5" transform="rotate(-59.999 25.5 23.5)"/><ellipse cx="25.5" cy="23.5" stroke="#AEE5D8" rx="8.5" ry="23.5" transform="rotate(59.999 25.5 23.5)"/></g><g stroke-linecap="square" opacity=".92" transform="translate(-7 -8) scale(1 -1) rotate(-42 387.994 -1201.933)" stroke-width="2"><circle cx="35.5" cy="33.5" r="4.5" stroke="#F4EE7F"/><ellipse cx="35" cy="33" stroke="#AEE5D8" rx="12" ry="33"/><ellipse cx="35" cy="33" stroke="#AEE5D8" rx="12" ry="33" transform="rotate(-59.999 35 33)"/><ellipse cx="35" cy="33" stroke="#AEE5D8" rx="12" ry="33" transform="rotate(59.999 35 33)"/></g><g stroke-linecap="square" opacity=".97" transform="translate(-7 -8) rotate(-40 435.838 -955.582)" stroke-width="2"><circle cx="32" cy="30" r="4" stroke="#F4EE7F"/><ellipse cx="32" cy="30" stroke="#AEE5D8" rx="11" ry="30"/><ellipse cx="32" cy="30" stroke="#AEE5D8" rx="11" ry="30" transform="rotate(-59.999 32 30)"/><ellipse cx="32" cy="30" stroke="#AEE5D8" rx="11" ry="30" transform="rotate(59.999 32 30)"/></g><g stroke-linecap="square" opacity=".75" transform="translate(-7 -8) rotate(30 -996.608 342.624)" stroke-width="2"><circle cx="40" cy="37" r="5" stroke="#F4EE7F"/><ellipse cx="39.5" cy="37" stroke="#AEE5D8" rx="13.5" ry="37"/><ellipse cx="39.5" cy="37" stroke="#AEE5D8" rx="13.5" ry="37" transform="rotate(-59.999 39.5 37)"/><ellipse cx="39.5" cy="37" stroke="#AEE5D8" rx="13.5" ry="37" transform="rotate(59.999 39.5 37)"/></g><g stroke-linecap="square" opacity=".76" transform="translate(-7 -8) rotate(-99 566.754 421.054)" stroke-width="2"><circle cx="36.5" cy="33.5" r="4.5" stroke="#F4EE7F"/><ellipse cx="36" cy="33.5" stroke="#AEE5D8" rx="12" ry="33.5"/><ellipse cx="36" cy="33.5" stroke="#AEE5D8" rx="12" ry="33.5" transform="rotate(-59.999 36 33.5)"/><ellipse cx="36" cy="33.5" stroke="#AEE5D8" rx="12" ry="33.5" transform="rotate(59.999 36 33.5)"/></g><g stroke-linecap="square" opacity=".93" transform="translate(-7 -8) rotate(-150 234.878 324.356)" stroke-width="2"><circle cx="36.5" cy="33.5" r="4.5" stroke="#F4EE7F"/><ellipse cx="36.5" cy="34" stroke="#AEE5D8" rx="12.5" ry="34"/><ellipse cx="36.5" cy="34" stroke="#AEE5D8" rx="12.5" ry="34" transform="rotate(-59.999 36.5 34)"/><ellipse cx="36.5" cy="34" stroke="#AEE5D8" rx="12.5" ry="34" transform="rotate(59.999 36.5 34)"/></g><g stroke-linecap="square" opacity=".89" transform="translate(-7 -8) scale(-1 1) rotate(-14 1442.632 1018.146)" stroke-width="2"><ellipse cx="38" cy="35.5" stroke="#F4EE7F" rx="5" ry="4.5"/><ellipse cx="38" cy="35.5" stroke="#AEE5D8" rx="13" ry="35.5"/><ellipse cx="38" cy="35.5" stroke="#AEE5D8" rx="13" ry="35.5" transform="rotate(-59.999 38 35.5)"/><ellipse cx="38" cy="35.5" stroke="#AEE5D8" rx="13" ry="35.5" transform="rotate(59.999 38 35.5)"/></g><g stroke-linecap="square" opacity=".86" transform="translate(-7 -8) rotate(-83 264.98 88.989)" stroke-width="2"><circle cx="36.5" cy="33.5" r="4.5" stroke="#F4EE7F"/><ellipse cx="36" cy="33.5" stroke="#AEE5D8" rx="12" ry="33.5"/><ellipse cx="36" cy="33.5" stroke="#AEE5D8" rx="12" ry="33.5" transform="rotate(-59.999 36 33.5)"/><ellipse cx="36" cy="33.5" stroke="#AEE5D8" rx="12" ry="33.5" transform="rotate(59.999 36 33.5)"/></g><g stroke-linecap="square" opacity=".96" transform="translate(-7 -8) rotate(44 -299.05 259.99)" stroke-width="2"><circle cx="39" cy="36" r="5" stroke="#F4EE7F"/><ellipse cx="38" cy="36" stroke="#AEE5D8" rx="13" ry="36"/><ellipse cx="38" cy="36" stroke="#AEE5D8" rx="13" ry="36" transform="rotate(-59.999 38 36)"/><ellipse cx="38" cy="36" stroke="#AEE5D8" rx="13" ry="36" transform="rotate(59.999 38 36)"/></g><g stroke-width="2" opacity=".83"><path stroke="#F4EE7F" stroke-linecap="square" d="M1226.526 911.848l-12.614 3.145m15.033 6.558l-19.406 4.84"/><path stroke="#AEE5D8" stroke-linecap="square" d="M1222.145 935.614l2.42 9.703"/><path stroke="#AEE5D8" d="M1226.997 934.404l12.606 9.225m-22.31-6.81l-6.8 14.06"/><path stroke="#AEE5D8" stroke-linecap="square" d="M1201.53 935.6l-7.016-28.138 38.812-9.677 7.015 28.14m-42.45 15.737l48.52-12.096m-32.48-26.942l-.96-3.88"/><path stroke="#F4EE7F" stroke-linecap="square" d="M1190.877 905.277l15.76 9.47"/></g><g stroke-width="2" opacity=".75"><path stroke="#F4EE7F" stroke-linecap="square" d="M1271.733 178.2l12.313-15.76m-.493 24.996l18.47-23.64"/><path stroke="#AEE5D8" stroke-linecap="square" d="M1307.76 187.313l11.82 9.235"/><path stroke="#AEE5D8" d="M1303.45 192.83l4.162 22.285m4.458-33.318l22.63-1.354"/><path stroke="#AEE5D8" stroke-linecap="square" d="M1319.31 159.535l-33.884-26.473-36.324 46.493 33.884 26.473m47.554-47.87l-45.56 58.31m-17.408-60.555l-4.728-3.694"/><path stroke="#F4EE7F" stroke-linecap="square" d="M1285.18 125.256l3.447 28.073"/></g><g stroke-width="2" opacity=".81"><path stroke="#F4EE7F" stroke-linecap="square" d="M815.04 457.166l11.08 14.184m-22.113-5.565l17.24 22.065"/><path stroke="#AEE5D8" stroke-linecap="square" d="M799.23 487.284l-11.032 8.62"/><path stroke="#AEE5D8" d="M794.92 481.768l-21.227-1.182m29.23 11.426l-3.988 20.883"/><path stroke="#AEE5D8" stroke-linecap="square" d="M821.37 504.25l31.52-24.626-33.862-43.34-31.52 24.626m32.655 53.166l-42.48-54.373m58.584-1.355l4.728-3.694"/><path stroke="#F4EE7F" stroke-linecap="square" d="M859.292 479.698l-25.266-3.103"/></g><g stroke-width="2" opacity=".79"><path stroke="#F4EE7F" stroke-linecap="square" d="M878.17 393.986l-4.944 15.217m-6.47-18.925l-7.415 22.825"/><path stroke="#AEE5D8" stroke-linecap="square" d="M848.783 397.055l-11.413-3.708"/><path stroke="#AEE5D8" d="M850.637 391.35l-9.606-15.74m5.9 27.152l-17.02 7.086"/><path stroke="#AEE5D8" stroke-linecap="square" d="M847.073 421.735l33.287 10.816 14.833-45.65-33.287-10.81m-22.393 49.5l18.54-57.06m29.723 41.2l4.756 1.55"/><path stroke="#F4EE7F" stroke-linecap="square" d="M882.928 437.59l-10.272-20.16"/></g><g stroke-width="2" opacity=".9"><path stroke="#F4EE7F" stroke-linecap="square" d="M711.583 488.546l9.21-16.617m-21.455 9.83l13.575-24.49"/><path stroke="#AEE5D8" stroke-linecap="square" d="M690.382 460.788L678.138 454"/><path stroke="#AEE5D8" d="M686.99 466.91l-20.783 4.488m27.57-16.732l-7.208-20.002"/><path stroke="#AEE5D8" stroke-linecap="square" d="M710.08 439.692l35.86 19.877-27.15 48.97-35.86-19.88m24.42-58.5l-33.935 61.23m58.95-7.34l5.248 2.9"/><path stroke="#F4EE7F" stroke-linecap="square" d="M752.736 457.62l-25.83 7.407"/></g><g stroke-width="2" opacity=".98"><path stroke="#F4EE7F" stroke-linecap="square" d="M628.905 594.913l-16.936 1.48m18.06 11.47l-25.9 2.266"/><path stroke="#AEE5D8" stroke-linecap="square" d="M618.482 624.935l1.133 12.95"/><path stroke="#AEE5D8" d="M624.46 624.412l14.257 13.81m-26.213-12.764l-11.643 16.076"/><path stroke="#AEE5D8" stroke-linecap="square" d="M592.967 620.14l-3.225-36.858 50.806-4.445 3.225 36.86m-57.17 12.027l63.757-5.578m-35.713-41.043l-.436-4.98"/><path stroke="#F4EE7F" stroke-linecap="square" d="M584.412 579.733l18.417 15.453"/></g><g stroke-width="2" opacity=".83"><path stroke="#F4EE7F" stroke-linecap="square" d="M1017.205 629.014l-1.464 13.923m12.41-12.773l-2.3 21.88"/><path stroke="#AEE5D8" stroke-linecap="square" d="M1039.923 642.463l10.94 1.15"/><path stroke="#AEE5D8" d="M1040.446 637.49l14.078-9.58m-15.123 19.525l11.78 12.3"/><path stroke="#AEE5D8" stroke-linecap="square" d="M1033.75 662.93l-31.825-3.345 4.495-42.765 31.825 3.345m-1.145 49.15l5.645-53.705m-38.625 23.09l-4.972-.523"/><path stroke="#F4EE7F" stroke-linecap="square" d="M997.53 663.144l15.386-12.46"/></g><g stroke-width="2" opacity=".97"><path stroke="#F4EE7F" stroke-linecap="square" d="M200.46 875.752l8.698 9.66m-15.387-3.637l13.39 14.862"/><path stroke="#AEE5D8" stroke-linecap="square" d="M190.802 897.905l-7.432 6.69"/><path stroke="#AEE5D8" d="M187.456 894.19l-14.866-.072m20.888 6.76l-1.483 14.79"/><path stroke="#AEE5D8" stroke-linecap="square" d="M207.23 908.68l21.552-19.406-26.096-28.983-21.55 19.41m25.724 36.05l-32.786-36.41m41.995-4.17l2.97-2.67"/><path stroke="#F4EE7F" stroke-linecap="square" d="M233.02 889.496l-18.36-.962"/></g><g stroke-width="2" opacity=".81"><path stroke="#F4EE7F" stroke-linecap="square" d="M159.412 721.06l15.174-11.433m-6.147 23.414l23.16-17.45"/><path stroke="#AEE5D8" stroke-linecap="square" d="M191.25 738.39l9.028 11.978"/><path stroke="#AEE5D8" d="M185.66 742.602l-1.748 22.604m12.93-31.03l22.21 4.55"/><path stroke="#AEE5D8" stroke-linecap="square" d="M209.4 715.948l-25.878-34.342-46.32 34.906 25.877 34.34M220 716.724l-58.3 43.932m-.542-62.2l-3.61-4.79"/><path stroke="#F4EE7F" stroke-linecap="square" d="M184.506 674.604l-3.74 26.61"/></g><g stroke-width="2" opacity=".74"><path stroke="#F4EE7F" stroke-linecap="square" d="M107.81 994.096l-14.724-2.862m12.626 13.66l-21.596-4.198"/><path stroke="#AEE5D8" stroke-linecap="square" d="M92.242 1016.538l-2.1 10.798"/><path stroke="#AEE5D8" d="M98.132 1017.683l8.317 14.86m-19.12-16.96l-13.28 10.663"/><path stroke="#AEE5D8" stroke-linecap="square" d="M71.6 1007.432l6.106-31.412 43.192 8.396-6.106 31.412m-49.054-4.442l53.99 10.495m-20.426-41.66l.954-4.9"/><path stroke="#F4EE7F" stroke-linecap="square" d="M74.543 971.33l11.862 17.587"/></g><g stroke-width="2" opacity=".97"><path stroke="#F4EE7F" stroke-linecap="square" d="M42.31 677.302l-11.994-.42m11.68 9.415l-17.99-.63"/><path stroke="#AEE5D8" stroke-linecap="square" d="M32.582 697.975l-.315 8.995"/><path stroke="#AEE5D8" d="M37.578 698.15l8.61 11.307m-17.604-11.62l-9.378 10.678"/><path stroke="#AEE5D8" stroke-linecap="square" d="M14.767 692.35l.907-25.984 35.978 1.256-.907 25.984m-40.15 3.6l44.973 1.57m-21.905-31.782l.14-3.997"/><path stroke="#F4EE7F" stroke-linecap="square" d="M12.78 663.263l11.575 12.412"/></g><g stroke-width="2" opacity=".97"><path stroke="#F4EE7F" d="M1409.897 963.07l-26.45-36.406"/><path stroke="#AEE5D8" stroke-linecap="square" d="M1424.952 959.548c-6.603 4.797-13.72 6.208-16.317 2.635 2.596 3.573-.946 9.907-7.55 14.704-6.602 4.798-13.72 6.21-16.316 2.636L1358 942.68c2.596 3.573 9.946 2.48 16.55-2.318 6.602-4.797 9.912-11.45 7.316-15.022 2.596 3.573 9.946 2.48 16.55-2.318 6.602-4.797 9.912-11.45 7.316-15.022l26.77 36.843c2.595 3.573-.947 9.907-7.55 14.705z"/></g><g stroke-width="2" opacity=".91"><path stroke="#F4EE7F" d="M1361.602 320.403l-9.898 56.134"/><path stroke="#AEE5D8" stroke-linecap="square" d="M1381.036 316.72c-10.08-1.776-18.887.577-19.856 6.075.97-5.498-6.5-10.72-16.582-12.5-10.08-1.776-18.887.577-19.856 6.075l-9.997 56.696c.97-5.498 9.86-8.34 19.943-6.563 10.08 1.778 17.464 7.49 16.495 12.988.97-5.49 9.86-8.34 19.942-6.56 10.082 1.78 17.465 7.49 16.496 12.99l10-56.69c.97-5.49-6.5-10.72-16.58-12.5z"/></g><g stroke-width="2" opacity=".79"><path stroke="#F4EE7F" d="M853.954 609.958l23.188 24.866"/><path stroke="#AEE5D8" stroke-linecap="square" d="M859.088 599.7c-4.553 4.246-6.662 9.353-4.388 11.79-2.274-2.437-7.515-.69-12.068 3.556-4.552 4.245-6.66 9.352-4.388 11.79l23.44 25.136c-2.273-2.438-.366-7.76 4.187-12.006 4.56-4.246 10-5.776 12.27-3.34-2.27-2.436-.36-7.76 4.19-12.005 4.56-4.24 10-5.77 12.27-3.33l-23.44-25.13c-2.27-2.43-7.51-.69-12.07 3.56z"/></g><g stroke-width="2" opacity=".87"><path stroke="#F4EE7F" d="M948.597 550.722l54.79-4.794"/><path stroke="#AEE5D8" stroke-linecap="square" d="M943.193 569.263c-.87-9.922 2.148-18.256 7.544-18.728-5.396.472-9.814-7.212-10.682-17.135-.868-9.922 2.148-18.256 7.544-18.728l55.64-4.868c-5.4.472-8.9 8.85-8.03 18.77.87 9.923 5.76 17.565 11.16 17.093-5.4.472-8.89 8.85-8.03 18.77.87 9.923 5.76 17.565 11.16 17.093l-55.64 4.868c-5.4.472-9.82-7.212-10.68-17.135z"/></g><g stroke-width="2" opacity=".74"><path stroke="#F4EE7F" d="M614.295 491.526l-28.926-34.472"/><path stroke="#AEE5D8" stroke-linecap="square" d="M607.235 505.282c6.253-5.246 9.344-11.812 6.505-15.195 2.84 3.383 9.842 1.48 16.094-3.767 6.252-5.246 9.343-11.812 6.504-15.195l-29.273-34.886c2.84 3.38 0 10.24-6.252 15.49-6.252 5.24-13.507 6.85-16.346 3.46 2.84 3.38 0 10.25-6.252 15.49s-13.507 6.85-16.346 3.46l29.27 34.88c2.84 3.38 9.84 1.47 16.09-3.77z"/></g><g stroke-width="2" opacity=".78"><path stroke="#F4EE7F" d="M537.657 788.01l28.21-32.452"/><path stroke="#AEE5D8" stroke-linecap="square" d="M523.72 783.846c5.743 4.99 12.26 6.854 14.995 3.71-2.734 3.144.018 9.34 5.76 14.33 5.743 4.993 12.26 6.856 14.995 3.71l28.186-32.423c-2.734 3.144-9.495 1.56-15.237-3.43-5.75-4.992-8.26-11.467-5.52-14.612-2.74 3.15-9.5 1.57-15.24-3.43-5.74-4.99-8.25-11.46-5.52-14.61l-28.19 32.43c-2.74 3.15.02 9.34 5.76 14.33z"/></g><g stroke-width="2" opacity=".88"><path stroke="#F4EE7F" d="M546.04 223.468l24.112-49.433"/><path stroke="#AEE5D8" stroke-linecap="square" d="M526.794 221.87c8.952 4.365 17.79 4.588 20.127-.206-2.33 4.794 3.28 11.62 12.23 15.987 8.96 4.37 17.79 4.59 20.13-.2l24.11-49.42c-2.34 4.8-11.38 5-20.33.63-8.95-4.36-14.36-11.62-12.02-16.41-2.34 4.8-11.38 5-20.33.63-8.95-4.36-14.36-11.61-12.02-16.41l-24.11 49.43c-2.34 4.8 3.28 11.62 12.23 15.99z"/></g><g stroke-width="2" opacity=".78"><path stroke="#F4EE7F" d="M406.787 822.445l26.355 31.408"/><path stroke="#AEE5D8" stroke-linecap="square" d="M393.232 827.293c5.722-4.802 12.113-6.567 14.684-3.503-2.57-3.064.277-9.05 6-13.852 5.72-4.802 12.112-6.567 14.683-3.503l26.51 31.595c-2.57-3.064-9.19-1.57-14.92 3.23-5.72 4.802-8.34 11.06-5.77 14.125-2.57-3.064-9.19-1.57-14.92 3.23-5.73 4.802-8.34 11.06-5.77 14.126l-26.51-31.59c-2.57-3.06.27-9.05 6-13.85z"/></g><g stroke-width="2" opacity=".99"><path stroke="#F4EE7F" d="M370.75 33.658l-37.037 28.936"/><path stroke="#AEE5D8" stroke-linecap="square" d="M384.56 41.587c-5.196-6.65-11.878-10.073-15.49-7.25 3.612-2.823 1.906-10.135-3.29-16.784-5.194-6.65-11.876-10.073-15.488-7.252l-37.24 29.1c3.61-2.82 10.614.35 15.81 7 5.194 6.65 6.58 14.22 2.967 17.04 3.61-2.82 10.61.36 15.81 7 5.19 6.65 6.58 14.21 2.96 17.04l37.24-29.09c3.61-2.82 1.9-10.13-3.29-16.78z"/></g><g stroke-width="2" opacity=".78"><path stroke="#F4EE7F" d="M110.194 47.475l51.642-11.922"/><path stroke="#AEE5D8" stroke-linecap="square" d="M107.142 65.37c-2.147-9.3-.413-17.608 4.622-18.77-5.035 1.162-10.236-5.545-12.383-14.845-2.14-9.3-.41-17.608 4.63-18.77L155.91 1c-5.033 1.162-7.215 9.574-5.068 18.874 2.147 9.3 7.796 15.904 12.83 14.742-5.034 1.162-7.216 9.574-5.07 18.874 2.148 9.3 7.797 15.904 12.83 14.742l-51.908 11.984c-5.034 1.162-10.235-5.545-12.382-14.845z"/></g><g stroke-width="2" opacity=".89" transform="translate(-7 -8) rotate(90 26.5 996.5)"><path stroke="#AEE5D8" d="M28 28h16m13 20.3V69H0V0h57v19.303M12 18h19M12 35h18M12 51h32"/><path stroke="#F4EE7F" d="M56 38l13 13"/><circle cx="44" cy="28" r="16" stroke="#F4EE7F" stroke-linecap="square"/></g><g stroke-width="2" opacity=".87" transform="translate(-7 -8) rotate(-136 878.555 173.676)"><path stroke="#AEE5D8" d="M29 29h17m14 21.4V72H0V0h60v20.142M12 19h20M12 36h18M12 53h34"/><path stroke="#F4EE7F" d="M59 39l13 13"/><circle cx="46" cy="29" r="17" stroke="#F4EE7F" stroke-linecap="square"/></g><g stroke-width="2" opacity=".9" transform="translate(-7 -8) rotate(-158 601.11 378.726)"><path stroke="#AEE5D8" d="M24 24h14m12 18v18H0V0h50v16.785M10 16h17M10 30h15M10 44h28"/><path stroke="#F4EE7F" d="M49 33l11 11"/><circle cx="38" cy="24" r="14" stroke="#F4EE7F" stroke-linecap="square"/></g><g stroke-width="2" opacity=".99" transform="translate(-7 -8) rotate(-162 494.258 111.39)"><path stroke="#AEE5D8" d="M25 25h14m13 18.4V62H0V0h52v17.345M10 17h17M10 31h16M10 45h29"/><path stroke="#F4EE7F" d="M50 34l12 12"/><circle cx="39.5" cy="24.5" r="14.5" stroke="#F4EE7F" stroke-linecap="square"/></g><g stroke-width="2" opacity=".85" transform="translate(-7 -8) rotate(-44 1396.085 -497.633)"><path stroke="#AEE5D8" d="M28 28h16m14 21v21H0V0h58v19.582M12 19h19M12 35h18M12 51h33"/><path stroke="#F4EE7F" d="M57 38l13 13"/><circle cx="44.5" cy="28.5" r="16.5" stroke="#F4EE7F" stroke-linecap="square"/></g><g stroke-width="2" opacity=".84" transform="translate(-7 -8) rotate(-161 359.081 106.463)"><path stroke="#AEE5D8" d="M30 30h17m15 21.8V74H0V0h62v20.7M12 20h20M12 37h19M12 54h35"/><path stroke="#F4EE7F" d="M60 41l14 14"/><circle cx="47.5" cy="29.5" r="17.5" stroke="#F4EE7F" stroke-linecap="square"/></g><g stroke-width="2" opacity=".84" transform="translate(-7 -8) rotate(128 -37.515 573.22)"><path stroke="#AEE5D8" d="M20 20h12m10 15v15H0V0h42v13.988M8 13h14M8 25h13M8 37h23"/><path stroke="#F4EE7F" d="M41 27l9 9"/><circle cx="31.5" cy="19.5" r="11.5" stroke="#F4EE7F" stroke-linecap="square"/></g><g stroke-width="2" opacity=".87" transform="translate(-7 -8) scale(1 -1) rotate(-30 -1353.579 -893.657)"><path stroke="#AEE5D8" d="M21 21h12m10 15.4V52H0V0h43v14.547M9 14h14M9 26h13M9 38h24"/><path stroke="#F4EE7F" d="M42 28l10 10"/><circle cx="33" cy="21" r="12" stroke="#F4EE7F" stroke-linecap="square"/></g><g stroke-width="2" opacity=".84" transform="translate(-7 -8) rotate(-100 440.454 193.744)"><path stroke="#AEE5D8" d="M26 26h15m13 19.5V65H0V0h54v18.184M11 17h18M11 33h17M11 48h30"/><path stroke="#F4EE7F" d="M53 36l12 12"/><circle cx="41" cy="26" r="15" stroke="#F4EE7F" stroke-linecap="square"/></g><g stroke-width="2" opacity=".81" transform="translate(-7 -8) scale(-1 1) rotate(-72 379.055 453.299)"><path stroke="#AEE5D8" d="M25 25h15m13 19.1V63H0V0h53v17.624M11 17h17M11 32h16M11 46h29"/><path stroke="#F4EE7F" d="M51 35l12 12"/><circle cx="39.5" cy="25.5" r="14.5" stroke="#F4EE7F" stroke-linecap="square"/></g><g stroke-width="2" opacity=".72" transform="translate(-7 -8) rotate(-179 68.19 397.716)"><path stroke="#AEE5D8" d="M26 26h15m13 19.5V65H0V0h54v18.184M11 17h18M11 33h17M11 48h30"/><path stroke="#F4EE7F" d="M53 36l12 12"/><circle cx="41" cy="26" r="15" stroke="#F4EE7F" stroke-linecap="square"/></g><g stroke-width="2" opacity=".77" transform="translate(-7 -8) scale(-1 1) rotate(6 -5063.258 -1519.708)"><path stroke="#AEE5D8" d="M25 25h14m13 18.4V62H0V0h52v17.345M10 17h17M10 31h16M10 45h29"/><path stroke="#F4EE7F" d="M50 34l12 12"/><circle cx="39.5" cy="24.5" r="14.5" stroke="#F4EE7F" stroke-linecap="square"/></g><g stroke-width="2" opacity=".82"><path stroke="#F4EE7F" stroke-linecap="square" d="M439 944.94v8.487"/><path stroke="#F4EE7F" d="M445.034 885.167v-10.56h-12.068v10.56"/><path stroke="#AEE5D8" d="M433.086 923.985v20.7h11.828v-20.7"/><path stroke="#AEE5D8" stroke-linecap="square" d="M430.068 923.28h17.864v-38.703h-17.864zm-.04-33.98l-7.46-.052.17 23.873"/></g><g stroke-width="2" opacity=".86"><path stroke="#F4EE7F" stroke-linecap="square" d="M1233.75 271.163l2.894 9.467"/><path stroke="#F4EE7F" d="M1208.378 210.104l-3.28-10.728 12.262-3.75 3.28 10.73"/><path stroke="#AEE5D8" d="M1232.624 247.913l6.578 21.515-12.295 3.76-6.578-21.516"/><path stroke="#AEE5D8" stroke-linecap="square" d="M1236.552 246.722l-18.792 5.746-12.448-40.715 18.792-5.745zm-11.085-36.662l7.832-2.56 7.22 25.36"/></g><g stroke-width="2" opacity=".95"><path stroke="#F4EE7F" stroke-linecap="square" d="M1117.287 364.926l-8.74 4.648"/><path stroke="#F4EE7F" d="M1180.16 339.184l10.49-5.577-6.375-11.988-10.49 5.57"/><path stroke="#AEE5D8" d="M1135.423 348.51l-20.66 10.986 6.278 11.807 20.66-10.985"/><path stroke="#AEE5D8" stroke-linecap="square" d="M1133.928 344.697l9.435 17.745L1181.81 342l-9.436-17.745z"/><path stroke="#AEE5D8" stroke-linecap="square" d="M1167.6 326.912l-3.957-7.418-23.77 12.6"/></g><g stroke-width="2" opacity=".87"><path stroke="#F4EE7F" stroke-linecap="square" d="M1006.813 669.263l1.107-6.984"/><path stroke="#F4EE7F" d="M1004.03 718.172l-1.342 8.475-9.684-1.534 1.342-8.474"/><path stroke="#AEE5D8" d="M999.213 686.022l2.675-16.89 9.65 1.53-2.675 16.888"/><path stroke="#AEE5D8" stroke-linecap="square" d="M996.834 685.166l14.556 2.305-4.995 31.54-14.556-2.3zm-4.59 28.056l-6.058-.896 3.265-19.324"/></g><g stroke-width="2" opacity=".93"><path stroke="#F4EE7F" stroke-linecap="square" d="M867.225 543.752l-7.69 3.586"/><path stroke="#F4EE7F" d="M912.075 517.012l8.374-3.904 4.46 9.57-8.38 3.905"/><path stroke="#AEE5D8" d="M885.245 541.024l-16.313 7.607-4.347-9.32 16.313-7.6"/><path stroke="#AEE5D8" stroke-linecap="square" d="M886.583 543.35l-6.606-14.168 30.693-14.312 6.606 14.167zm27.16-12.463l2.776 6.078-19.31 9.188"/></g><g stroke-width="2" opacity=".95"><path stroke="#F4EE7F" stroke-linecap="square" d="M856.733 742.966l-8.156 2.338"/><path stroke="#F4EE7F" d="M910.91 721.546l9.517-2.73 3.118 10.876-9.516 2.73"/><path stroke="#AEE5D8" d="M877.325 742.946l-19.032 5.457-3.12-10.875 19.033-5.458"/><path stroke="#AEE5D8" stroke-linecap="square" d="M878.38 745.818l-4.8-16.743 36.275-10.4 4.8 16.74z"/><path stroke="#AEE5D8" stroke-linecap="square" d="M910.73 736.31l1.95 6.796-21.75 6.237"/></g><g stroke-width="2"><path stroke="#F4EE7F" stroke-linecap="square" d="M487.6 369.617l-7.974-2.902"/><path stroke="#F4EE7F" d="M538.822 394.28l9.302 3.386 3.87-10.63-9.303-3.387"/><path stroke="#AEE5D8" d="M508.14 371.073l-18.606-6.772-3.87 10.64 18.606 6.77"/><path stroke="#AEE5D8" stroke-linecap="square" d="M509.106 368.415l-5.804 15.947 34.552 12.576 5.804-15.947zm30.566 11.125l2.418-6.645-21.263-7.74"/></g><g stroke-width="2" opacity=".94"><path stroke="#F4EE7F" stroke-linecap="square" d="M371.872 1022.466l-5.958 7.906"/><path stroke="#F4EE7F" d="M406.356 966.05l6.75-8.96 10.242 7.717-6.752 8.96"/><path stroke="#AEE5D8" d="M390.02 1007.89l-13.54 17.967-10.268-7.737 13.54-17.968"/><path stroke="#AEE5D8" stroke-linecap="square" d="M393.29 1010.367L377.6 998.54l25.622-34 15.693 11.825zm23.147-30.52l6.675 4.834-16.27 20.76"/></g><g stroke-width="2" opacity=".86"><path stroke="#F4EE7F" stroke-linecap="square" d="M314.25 428.81l6.645-2.418"/><path stroke="#F4EE7F" d="M268.1 440.39l-8.064 2.935 3.354 9.214 8.062-2.94"/><path stroke="#AEE5D8" d="M300.155 439.892l16.068-5.85-3.342-9.18-16.06 5.848"/><path stroke="#AEE5D8" stroke-linecap="square" d="M300.677 441.354l-4.888-13.43-29.1 10.592 4.88 13.428z"/><path stroke="#AEE5D8" stroke-linecap="square" d="M275.498 450.393l2.168 5.493 17.923-5.987"/></g><g stroke-width="2" opacity=".86"><path stroke="#F4EE7F" stroke-linecap="square" d="M1441.143 571.704l6.645-2.418"/><path stroke="#F4EE7F" d="M1394.992 583.285l-8.062 2.934 3.353 9.21 8.063-2.94"/><path stroke="#AEE5D8" d="M1427.048 582.786l16.07-5.85-3.343-9.18-16.068 5.848"/><path stroke="#AEE5D8" stroke-linecap="square" d="M1427.57 584.248l-4.887-13.43-29.097 10.592 4.887 13.43z"/><path stroke="#AEE5D8" stroke-linecap="square" d="M1402.39 593.287l2.17 5.493 17.922-5.987"/></g><g stroke-width="2" opacity=".86"><path stroke="#F4EE7F" stroke-linecap="square" d="M88.562 925.724l4.867 6.95"/><path stroke="#F4EE7F" d="M60.03 874.457l-6.056-8.65-9.885 6.922 6.05 8.65"/><path stroke="#AEE5D8" d="M71.698 911.95l11.872 16.955 9.69-6.784-11.873-16.95"/><path stroke="#AEE5D8" stroke-linecap="square" d="M70.118 913.333l14.267-9.99L62.74 872.43l-14.267 9.99zM50.11 886.45l-6.14 4.236 13.83 19.46"/></g><g stroke-width="2" opacity=".76"><path stroke="#F4EE7F" stroke-linecap="square" d="M97.393 433.38l-4.745-7.036"/><path stroke="#F4EE7F" d="M122.856 480.57l5.166 7.66 8.755-5.904-5.166-7.66"/><path stroke="#AEE5D8" d="M112.294 445.814l-10.57-15.668-8.95 6.04 10.567 15.667"/><path stroke="#AEE5D8" stroke-linecap="square" d="M114.088 443.755l-13.328 8.99 19.48 28.88 13.327-8.99z"/><path stroke="#AEE5D8" stroke-linecap="square" d="M131.432 469.538l5.51-3.78-11.818-17.82"/></g><g opacity=".7" transform="translate(-7 -8) rotate(-17 2019.665 -4536.758)"><circle cx="32.5" cy="34.5" r="31.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="14" cy="47" r="2" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="46" cy="38" r="2" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="14" cy="47" r="2" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="46" cy="38" r="2" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="34" cy="21" r="6" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><path stroke="#F4EE7F" stroke-linecap="square" stroke-width="2" d="M64.767 53.6c2.525 5.624 3.014 10.003.925 12.092-5.1 5.1-23.634-5.16-41.46-22.93l.003.005C6.468 24.94-3.79 6.407 1.308 1.307 3.396-.78 7.78-.29 13.4 2.232"/></g><g opacity=".72" transform="translate(-7 -8) scale(-1 1) rotate(52 -1576.246 -756.138)"><circle cx="30" cy="32" r="29" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="13" cy="43" r="2" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="42" cy="35" r="2" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="13" cy="43" r="2" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="42" cy="35" r="2" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="31.5" cy="18.5" r="5.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><path stroke="#F4EE7F" stroke-linecap="square" stroke-width="2" d="M59.934 49.6c2.336 5.204 2.79 9.257.855 11.19-4.72 4.72-21.87-4.775-38.37-21.218v.003C5.98 23.08-3.51 5.928 1.21 1.21 3.143-.723 7.2-.27 12.4 2.065"/></g><g opacity=".7" transform="translate(-7 -8) rotate(109 410.8 433.566)"><circle cx="33.5" cy="36.5" r="32.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="15.5" cy="49.5" r="2.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="48.5" cy="39.5" r="2.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="15.5" cy="49.5" r="2.5" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="48.5" cy="39.5" r="2.5" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="35.5" cy="21.5" r="6.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><path stroke="#F4EE7F" stroke-linecap="square" stroke-width="2" d="M67.667 56c2.638 5.875 3.15 10.45.966 12.633-5.328 5.328-24.692-5.39-43.316-23.955l.003.004C6.757 26.057-3.96 6.692 1.367 1.366 3.547-.816 8.127-.304 14 2.332"/></g><g opacity=".78" transform="translate(-7 -8) rotate(99 127.63 832.19)"><circle cx="30.5" cy="32.5" r="29.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="14" cy="44" r="2" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="43" cy="36" r="2" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="14" cy="44" r="2" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="43" cy="36" r="2" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="32" cy="20" r="6" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><path stroke="#F4EE7F" stroke-linecap="square" stroke-width="2" d="M60.9 50.4c2.374 5.288 2.834 9.406.87 11.37-4.796 4.795-22.223-4.852-38.985-21.56l.003.004C6.08 23.45-3.565 6.024 1.23 1.23 3.193-.735 7.315-.274 12.6 2.1"/></g><g opacity=".76" transform="translate(-7 -8) rotate(152 599.938 692.081)"><circle cx="23" cy="24" r="22" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="10.5" cy="32.5" r="1.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="32.5" cy="26.5" r="1.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="10.5" cy="32.5" r="1.5" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="32.5" cy="26.5" r="1.5" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="24.5" cy="14.5" r="4.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><path stroke="#F4EE7F" stroke-linecap="square" stroke-width="2" d="M45.434 37.6c1.77 3.945 2.114 7.017.648 8.482-3.577 3.578-16.578-3.62-29.084-16.084L17 30C4.538 17.496-2.66 4.495.92.918c1.464-1.465 4.54-1.12 8.482.65"/></g><g opacity=".83" transform="translate(-7 -8) rotate(160 361.22 189.038)"><circle cx="28.5" cy="30.5" r="27.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="13" cy="41" r="2" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="40" cy="33" r="2" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="13" cy="41" r="2" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="40" cy="33" r="2" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="30.5" cy="18.5" r="5.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><path stroke="#F4EE7F" stroke-linecap="square" stroke-width="2" d="M57.034 47.2c2.223 4.952 2.654 8.81.814 10.648-4.49 4.49-20.812-4.543-36.51-20.19l.003.002C5.7 21.962-3.34 5.64 1.16 1.15 2.99-.687 6.858-.255 11.8 1.966"/></g><g opacity=".8" transform="translate(-7 -8) scale(-1 1) rotate(15 -399.255 -2587.833)"><circle cx="25.5" cy="27.5" r="24.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="11.5" cy="36.5" r="1.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="35.5" cy="29.5" r="1.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="11.5" cy="36.5" r="1.5" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="35.5" cy="29.5" r="1.5" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="27" cy="16" r="5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><path stroke="#F4EE7F" stroke-linecap="square" stroke-width="2" d="M50.267 41.6c1.96 4.365 2.34 7.764.718 9.384-3.96 3.96-18.343-4.004-32.178-17.794l.002.002C5.02 19.356-2.95 4.972 1.01 1.015c1.62-1.62 5.022-1.24 9.384.717"/></g><g opacity=".84" transform="translate(-7 -8) rotate(87 -69.177 541.09)"><circle cx="22" cy="23" r="21" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="9.5" cy="31.5" r="1.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="30.5" cy="25.5" r="1.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="9.5" cy="31.5" r="1.5" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="30.5" cy="25.5" r="1.5" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="23" cy="14" r="4" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><path stroke="#F4EE7F" stroke-linecap="square" stroke-width="2" d="M43.5 36c1.696 3.777 2.025 6.72.62 8.12-3.424 3.427-15.872-3.464-27.845-15.398l.002.002C4.344 16.75-2.546 4.304.88.878 2.28-.525 5.224-.195 9 1.498"/></g><g transform="translate(-7 -8) scale(1 -1) rotate(30 428.076 845.872)"><circle cx="31" cy="33" r="30" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="14" cy="45" r="2" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="44" cy="36" r="2" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="14" cy="45" r="2" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="44" cy="36" r="2" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="33" cy="20" r="6" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><path stroke="#F4EE7F" stroke-linecap="square" stroke-width="2" d="M61.867 51.2c2.412 5.372 2.88 9.555.883 11.55-4.87 4.872-22.575-4.928-39.603-21.9l.003.002C6.178 23.822-3.622 6.12 1.25 1.25 3.244-.747 7.43-.28 12.8 2.13"/></g><g opacity=".99" transform="translate(-7 -8) rotate(47 -380.861 650.024)"><circle cx="25.5" cy="27.5" r="24.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="11.5" cy="36.5" r="1.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="35.5" cy="29.5" r="1.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="11.5" cy="36.5" r="1.5" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="35.5" cy="29.5" r="1.5" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="27" cy="16" r="5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><path stroke="#F4EE7F" stroke-linecap="square" stroke-width="2" d="M50.267 41.6c1.96 4.365 2.34 7.764.718 9.384-3.96 3.96-18.343-4.004-32.178-17.794l.002.002C5.02 19.356-2.95 4.972 1.01 1.015c1.62-1.62 5.022-1.24 9.384.717"/></g><g opacity=".7" transform="translate(-7 -8) scale(1 -1) rotate(50 627.118 176.621)"><circle cx="33.5" cy="36.5" r="32.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="15.5" cy="49.5" r="2.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="48.5" cy="39.5" r="2.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="15.5" cy="49.5" r="2.5" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="48.5" cy="39.5" r="2.5" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="35.5" cy="21.5" r="6.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><path stroke="#F4EE7F" stroke-linecap="square" stroke-width="2" d="M67.667 56c2.638 5.875 3.15 10.45.966 12.633-5.328 5.328-24.692-5.39-43.316-23.955l.003.004C6.757 26.057-3.96 6.692 1.367 1.366 3.547-.816 8.127-.304 14 2.332"/></g><g opacity=".87" transform="translate(-7 -8) rotate(-4 7056.064 -530.815)"><circle cx="25.5" cy="27.5" r="24.5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="12" cy="37" r="2" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="36" cy="30" r="2" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><circle cx="12" cy="37" r="2" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="36" cy="30" r="2" fill="#AEE5D8" fill-rule="nonzero"/><circle cx="27" cy="16" r="5" stroke="#AEE5D8" stroke-linecap="square" stroke-width="2"/><path stroke="#F4EE7F" stroke-linecap="square" stroke-width="2" d="M51.234 42.4c1.997 4.45 2.384 7.913.73 9.565C47.932 56 33.27 47.885 19.17 33.828l.003.002C5.117 19.73-3 5.067 1.036 1.034c1.65-1.652 5.12-1.264 9.565.73"/></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="1443" height="1072"><g fill="none" fill-rule="evenodd" stroke="#FC8F68" stroke-width="2"><g opacity=".83" transform="translate(1 -9) scale(1 -1) rotate(-55 -181.058 -99.615)"><path d="M49.997 19c3.195 8.235-1.814 13.634-6.997 14M11 47c-4 .962-4 7-4 7m36-7c4 .962 4 7 4 7M3.003 19C-.192 27.235 4.817 32.634 10 33"/><path stroke-linecap="square" d="M32.02 10.267c2.836 2.196 10.246 4.025 12.26 2.013 1.92-1.92.182-9.33-2.014-12.26 3.02-.182 6.13.824 8.51 3.203 4.3 4.3 4.3 11.252 0 15.552-4.3 4.3-11.254 4.3-15.554 0-2.287-2.378-3.385-5.49-3.202-8.508zM2 39.5S13.657 27 27.5 27 53 39.5 53 39.5 41.16 52 27.5 52C13.657 52 2 39.5 2 39.5zm19.98-29.234c-2.836 2.196-10.246 4.026-12.26 2.013C7.8 10.35 9.54 2.94 11.735.02c-3.02-.183-6.13.915-8.51 3.202-4.3 4.3-4.3 11.253 0 15.553 4.3 4.3 11.254 4.3 15.554 0 2.28-2.38 3.38-5.49 3.2-8.51z"/><circle cx="21" cy="36" r="1" stroke-linecap="square"/><circle cx="33" cy="36" r="1" stroke-linecap="square"/></g><g opacity=".93" transform="translate(1 -9) rotate(20 -2231.078 4061.298)"><path d="M53.87 20c3.597 8.824-2.04 14.608-7.87 15M12 49c-4 1.1-4 8-4 8m38-8c4 1.1 4 8 4 8M3.13 20C-.468 28.824 5.17 34.608 11 35"/><path stroke-linecap="square" d="M34.02 10.734c2.966 2.295 10.713 4.208 12.817 2.104 2.01-2.008.192-9.755-2.104-12.816 3.157-.19 6.41.86 8.895 3.347 4.496 4.49 4.496 11.76 0 16.26-4.495 4.49-11.764 4.49-16.26 0-2.39-2.49-3.54-5.74-3.347-8.9zM2 41.5S14.114 28 28.5 28 55 41.5 55 41.5 42.696 55 28.5 55C14.114 55 2 41.5 2 41.5zm20.98-30.767c-2.966 2.296-10.713 4.21-12.817 2.104C8.153 10.83 9.97 3.08 12.267.02 9.11-.17 5.857.978 3.372 3.37c-4.496 4.496-4.496 11.765 0 16.26 4.495 4.496 11.764 4.496 16.26 0 2.39-2.486 3.54-5.738 3.347-8.895z"/><circle cx="22" cy="38" r="1" stroke-linecap="square"/><circle cx="35" cy="38" r="1" stroke-linecap="square"/></g><g opacity=".91" transform="translate(1 -9) rotate(76 551.738 833.248)"><path d="M46.997 17c3.195 7.647-1.814 12.66-6.997 13M10 43c-3 .962-3 7-3 7m33-7c3 .962 3 7 3 7M3.003 17C-.192 24.647 4.817 29.66 10 30"/><path stroke-linecap="square" d="M30.018 9.334c2.578 1.996 9.315 3.66 11.145 1.83C42.91 9.417 41.33 2.68 39.333.02c2.745-.167 5.573.748 7.735 2.91 3.91 3.91 3.91 10.23 0 14.138-3.91 3.91-10.23 3.91-14.14 0-2.078-2.162-3.076-4.99-2.91-7.734zM2 36.5S12.743 25 25.5 25 49 36.5 49 36.5 38.09 48 25.5 48C12.743 48 2 36.5 2 36.5zM19.982 9.333c-2.578 1.996-9.315 3.66-11.145 1.83C7.09 9.416 8.67 2.68 10.667.018 7.922-.148 5.094.85 2.932 2.928c-3.91 3.91-3.91 10.23 0 14.14s10.23 3.91 14.14 0c2.078-2.162 3.076-4.99 2.91-7.735z"/><circle cx="19" cy="33" r="1" stroke-linecap="square"/><circle cx="31" cy="33" r="1" stroke-linecap="square"/></g><g opacity=".72" transform="translate(1 -9) rotate(63 185.57 940.806)"><path d="M59.746 22C63.74 31.412 57.478 37.582 51 38M12 55c-4 1.1-4 8-4 8m42-8c4 1.1 4 8 4 8M4.254 22C.26 31.412 6.522 37.582 13 38"/><path stroke-linecap="square" d="M38.022 11.667c3.223 2.495 11.644 4.574 13.932 2.287 2.183-2.183.208-10.603-2.288-13.93 3.43-.208 6.966.936 9.67 3.638 4.886 4.887 4.886 12.787 0 17.673-4.887 4.887-12.79 4.887-17.675 0-2.59-2.702-3.84-6.237-3.63-9.668zM2 46.5S15.486 32 31.5 32 61 46.5 61 46.5 47.304 61 31.5 61C15.486 61 2 46.5 2 46.5zm22.978-34.834c-3.223 2.496-11.644 4.575-13.932 2.288C8.863 11.77 10.838 3.35 13.334.022c-3.43-.208-6.966 1.04-9.67 3.64-4.886 4.885-4.886 12.787 0 17.673 4.887 4.887 12.79 4.887 17.675 0 2.59-2.703 3.84-6.238 3.63-9.67z"/><circle cx="24" cy="42" r="1" stroke-linecap="square"/><circle cx="39" cy="42" r="1" stroke-linecap="square"/></g><g opacity=".72" transform="translate(1 -9) rotate(63 459.4 1161.328)"><path d="M59.746 22C63.74 31.412 57.478 37.582 51 38M12 55c-4 1.1-4 8-4 8m42-8c4 1.1 4 8 4 8M4.254 22C.26 31.412 6.522 37.582 13 38"/><path stroke-linecap="square" d="M38.022 11.667c3.223 2.495 11.644 4.574 13.932 2.287 2.183-2.183.208-10.603-2.288-13.93 3.43-.208 6.966.936 9.67 3.638 4.886 4.887 4.886 12.787 0 17.673-4.887 4.887-12.79 4.887-17.675 0-2.59-2.702-3.84-6.237-3.63-9.668zM2 46.5S15.486 32 31.5 32 61 46.5 61 46.5 47.304 61 31.5 61C15.486 61 2 46.5 2 46.5zm22.978-34.834c-3.223 2.496-11.644 4.575-13.932 2.288C8.863 11.77 10.838 3.35 13.334.022c-3.43-.208-6.966 1.04-9.67 3.64-4.886 4.885-4.886 12.787 0 17.673 4.887 4.887 12.79 4.887 17.675 0 2.59-2.703 3.84-6.238 3.63-9.67z"/><circle cx="24" cy="42" r="1" stroke-linecap="square"/><circle cx="39" cy="42" r="1" stroke-linecap="square"/></g><g opacity=".99" transform="translate(1 -9) rotate(3 -4997.716 9913.348)"><path d="M67.62 25c4.395 10.588-2.494 17.53-9.62 18M15 62c-5 1.237-5 9-5 9m47-9c5 1.237 5 9 5 9M4.38 25C-.015 35.588 6.874 42.53 14 43"/><path stroke-linecap="square" d="M43.026 13.067c3.738 2.795 13.507 5.123 16.16 2.562 2.533-2.45.24-11.88-2.653-15.61 3.98-.24 8.08 1.05 11.216 4.07 5.66 5.47 5.66 14.32 0 19.79-5.67 5.47-14.84 5.47-20.51 0-3.02-3.03-4.46-6.99-4.22-10.83zM3 52.5S18.314 36 36.5 36 70 52.5 70 52.5 54.446 69 36.5 69C18.314 69 3 52.5 3 52.5zm25.974-39.434c-3.738 2.795-13.507 5.124-16.16 2.562-2.533-2.445-.24-11.877 2.653-15.603C11.487-.208 7.387 1.19 4.25 4.1c-5.667 5.473-5.667 14.323 0 19.795 5.67 5.473 14.835 5.473 20.503 0 3.015-3.027 4.462-6.986 4.22-10.83z"/><circle cx="27" cy="47" r="1" stroke-linecap="square"/><circle cx="44" cy="47" r="1" stroke-linecap="square"/></g><g opacity=".81" transform="translate(1 -9) scale(1 -1) rotate(83 520.446 -86)"><path d="M58.746 21C62.74 30.412 56.478 36.582 50 37M12 54c-4 1.1-4 8-4 8m42-8c4 1.1 4 8 4 8M4.254 21C.26 30.412 6.522 36.582 13 37"/><path stroke-linecap="square" d="M37.022 11.667c3.223 2.495 11.644 4.574 13.932 2.287 2.183-2.183.208-10.603-2.288-13.93 3.43-.208 6.966.936 9.67 3.638 4.886 4.887 4.886 12.787 0 17.673-4.887 4.887-12.79 4.887-17.675 0-2.59-2.702-3.84-6.237-3.63-9.668zM2 45.5S15.257 31 31 31s29 14.5 29 14.5S46.536 60 31 60C15.257 60 2 45.5 2 45.5zm22.978-33.834c-3.223 2.496-11.644 4.575-13.932 2.288C8.863 11.77 10.838 3.35 13.334.022c-3.43-.208-6.966 1.04-9.67 3.64-4.886 4.885-4.886 12.787 0 17.673 4.887 4.887 12.79 4.887 17.675 0 2.59-2.703 3.84-6.238 3.63-9.67z"/><circle cx="24" cy="41" r="1" stroke-linecap="square"/><circle cx="38" cy="41" r="1" stroke-linecap="square"/></g><g opacity=".94" transform="translate(1 -9) rotate(120 39.646 97.8)"><path d="M47.997 17c3.195 7.647-1.814 12.66-6.997 13M10 44c-3 .962-3 7-3 7m34-7c3 .962 3 7 3 7M3.003 17C-.192 24.647 4.817 29.66 10 30"/><path stroke-linecap="square" d="M31.02 9.334c2.706 1.996 9.78 3.66 11.7 1.83C44.556 9.417 42.897 2.68 40.8.02c2.882-.167 5.85.748 8.122 2.91 4.104 3.91 4.104 10.23 0 14.138-4.105 3.91-10.742 3.91-14.847 0-2.183-2.162-3.23-4.99-3.056-7.734zM2 37s10.97-12 24-12 24 12 24 12-11.143 12-24 12C12.97 49 2 37 2 37zM20.98 9.333c-2.706 1.996-9.78 3.66-11.7 1.83C7.444 9.416 9.103 2.68 11.2.018 8.318-.148 5.35.85 3.078 2.928c-4.104 3.91-4.104 10.23 0 14.14 4.105 3.91 10.742 3.91 14.847 0 2.183-2.162 3.23-4.99 3.056-7.735z"/><circle cx="20" cy="34" r="1" stroke-linecap="square"/><circle cx="32" cy="34" r="1" stroke-linecap="square"/></g><g opacity=".81" transform="translate(1 -9) rotate(75 463.122 723.77)"><circle cx="19.5" cy="33.5" r="1.5" stroke-linecap="square"/><circle cx="28.5" cy="33.5" r="1.5" stroke-linecap="square"/><circle cx="14.5" cy="17.5" r="2.5" stroke-linecap="square"/><circle cx="33.5" cy="17.5" r="2.5" stroke-linecap="square"/><path stroke-linecap="square" d="M27.143 42h-6.286C16.517 42 13 38.418 13 34s3.518-8 7.857-8h6.286C31.483 26 35 29.582 35 34s-3.518 8-7.857 8z"/><path d="M16 4.597C13.24 2.103 8.423 0 0 0c0 9.52.783 13.366 3.61 16M32 4.597C34.76 2.103 39.577 0 48 0c0 9.52-.783 13.366-3.61 16"/><circle cx="24.5" cy="25.5" r="22.5" stroke-linecap="square"/></g><g opacity=".83" transform="translate(1 -9) scale(-1 1) rotate(-51 -125.2 1281.544)"><circle cx="22" cy="39" r="2" stroke-linecap="square"/><circle cx="33" cy="39" r="2" stroke-linecap="square"/><circle cx="17" cy="20" r="3" stroke-linecap="square"/><circle cx="39" cy="20" r="3" stroke-linecap="square"/><path stroke-linecap="square" d="M31.714 47h-7.428C19.156 47 15 42.97 15 38s4.157-9 9.286-9h7.428C36.844 29 41 33.03 41 38s-4.157 9-9.286 9z"/><path d="M18 5.46C14.895 2.496 9.476 0 0 0c0 11.307.88 15.872 4.062 19M37 5.46C40.105 2.496 45.524 0 55 0c0 11.307-.88 15.872-4.062 19"/><circle cx="27.5" cy="29.5" r="25.5" stroke-linecap="square"/></g><g opacity=".89" transform="translate(1 -9) scale(-1 1) rotate(-69 -268.9 901.479)"><circle cx="18.5" cy="31.5" r="1.5" stroke-linecap="square"/><circle cx="27.5" cy="31.5" r="1.5" stroke-linecap="square"/><circle cx="13.5" cy="16.5" r="2.5" stroke-linecap="square"/><circle cx="31.5" cy="16.5" r="2.5" stroke-linecap="square"/><path stroke-linecap="square" d="M25.5 39h-6c-4.142 0-7.5-3.358-7.5-7.5 0-4.142 3.358-7.5 7.5-7.5h6c4.142 0 7.5 3.358 7.5 7.5 0 4.142-3.358 7.5-7.5 7.5z"/><path d="M15 4.31C12.413 1.97 7.896 0 0 0c0 8.926.734 12.53 3.385 15M30 4.31C32.587 1.97 37.104 0 45 0c0 8.926-.734 12.53-3.385 15"/><circle cx="23" cy="24" r="21" stroke-linecap="square"/></g><g opacity=".89" transform="translate(1 -9) scale(-1 1) rotate(-69 -517.012 1078.007)"><circle cx="18.5" cy="31.5" r="1.5" stroke-linecap="square"/><circle cx="27.5" cy="31.5" r="1.5" stroke-linecap="square"/><circle cx="13.5" cy="16.5" r="2.5" stroke-linecap="square"/><circle cx="31.5" cy="16.5" r="2.5" stroke-linecap="square"/><path stroke-linecap="square" d="M25.5 39h-6c-4.142 0-7.5-3.358-7.5-7.5 0-4.142 3.358-7.5 7.5-7.5h6c4.142 0 7.5 3.358 7.5 7.5 0 4.142-3.358 7.5-7.5 7.5z"/><path d="M15 4.31C12.413 1.97 7.896 0 0 0c0 8.926.734 12.53 3.385 15M30 4.31C32.587 1.97 37.104 0 45 0c0 8.926-.734 12.53-3.385 15"/><circle cx="23" cy="24" r="21" stroke-linecap="square"/></g><g opacity=".85" transform="translate(1 -9) rotate(30 245.34 990.261)"><circle cx="28.5" cy="50.5" r="2.5" stroke-linecap="square"/><circle cx="43.5" cy="50.5" r="2.5" stroke-linecap="square"/><circle cx="21.5" cy="26.5" r="3.5" stroke-linecap="square"/><circle cx="50.5" cy="26.5" r="3.5" stroke-linecap="square"/><path stroke-linecap="square" d="M40.857 62h-9.714C24.437 62 19 56.627 19 50s5.437-12 12.143-12h9.714C47.563 38 53 43.373 53 50s-5.437 12-12.143 12z"/><path d="M24 7.182C19.86 3.286 12.634 0 0 0c0 14.877 1.175 20.884 5.416 25M48 7.182C52.14 3.286 59.366 0 72 0c0 14.877-1.175 20.884-5.416 25"/><circle cx="35.5" cy="38.5" r="33.5" stroke-linecap="square"/></g><g opacity=".71" transform="translate(1 -9) scale(1 -1) rotate(-14 -1387.415 -1670.837)"><circle cx="23" cy="41" r="2" stroke-linecap="square"/><circle cx="35" cy="41" r="2" stroke-linecap="square"/><circle cx="18" cy="21" r="3" stroke-linecap="square"/><circle cx="41" cy="21" r="3" stroke-linecap="square"/><path stroke-linecap="square" d="M32.357 50h-7.714C19.317 50 15 45.747 15 40.5s4.317-9.5 9.643-9.5h7.714C37.683 31 42 35.253 42 40.5S37.683 50 32.357 50z"/><path d="M19 5.746C15.723 2.63 10.002 0 0 0c0 11.902.93 16.707 4.288 20M39 5.746C42.277 2.63 47.998 0 58 0c0 11.902-.93 16.707-4.288 20"/><circle cx="29" cy="31" r="27" stroke-linecap="square"/></g><g opacity=".71" transform="translate(1 -9) scale(1 -1) rotate(-58 -714.672 -937.392)"><circle cx="16.078" cy="28.661" r="1.398" stroke-linecap="square"/><circle cx="24.467" cy="28.661" r="1.398" stroke-linecap="square"/><circle cx="12.583" cy="14.68" r="2.097" stroke-linecap="square"/><circle cx="28.661" cy="14.68" r="2.097" stroke-linecap="square"/><path stroke-linecap="square" d="M22.62 34.952h-5.394c-3.722 0-6.74-2.973-6.74-6.64 0-3.668 3.018-6.642 6.74-6.642h5.393c3.72 0 6.74 2.974 6.74 6.64 0 3.67-3.02 6.642-6.74 6.642z"/><path d="M13.282 4.017C10.992 1.837 6.992 0 0 0c0 8.32.65 11.68 2.997 13.98m24.266-9.963C29.553 1.837 33.553 0 40.545 0c0 8.32-.65 11.68-2.998 13.98"/><circle cx="20.272" cy="21.67" r="18.874" stroke-linecap="square"/></g><g opacity=".7" transform="translate(1 -9) rotate(-178 143.584 31.982)"><circle cx="23" cy="40" r="2" stroke-linecap="square"/><circle cx="34" cy="40" r="2" stroke-linecap="square"/><circle cx="17" cy="21" r="3" stroke-linecap="square"/><circle cx="40" cy="21" r="3" stroke-linecap="square"/><path stroke-linecap="square" d="M32.357 49h-7.714C19.317 49 15 44.747 15 39.5s4.317-9.5 9.643-9.5h7.714C37.683 30 42 34.253 42 39.5S37.683 49 32.357 49z"/><path d="M19 5.46C15.723 2.496 10.002 0 0 0c0 11.307.93 15.872 4.288 19M38 5.46C41.277 2.496 46.998 0 57 0c0 11.307-.93 15.872-4.288 19"/><circle cx="28.5" cy="30.5" r="26.5" stroke-linecap="square"/></g><g opacity=".99" transform="translate(1 -9) scale(-1 1) rotate(-2 18553.822 4398.777)"><circle cx="25" cy="44" r="2" stroke-linecap="square"/><circle cx="38" cy="44" r="2" stroke-linecap="square"/><circle cx="19" cy="23" r="3" stroke-linecap="square"/><circle cx="44" cy="23" r="3" stroke-linecap="square"/><path stroke-linecap="square" d="M35.643 55h-8.286C21.637 55 17 50.3 17 44.5S21.637 34 27.357 34h8.286C41.363 34 46 38.7 46 44.5S41.363 55 35.643 55z"/><path d="M21 6.033C17.378 2.76 11.055 0 0 0c0 12.497 1.028 17.543 4.74 21M42 6.033C45.622 2.76 51.945 0 63 0c0 12.497-1.028 17.543-4.74 21"/><circle cx="31.5" cy="33.5" r="29.5" stroke-linecap="square"/></g><g opacity=".95" transform="translate(1 -9) rotate(98 -32.906 185.481)"><circle cx="28.5" cy="49.5" r="2.5" stroke-linecap="square"/><circle cx="42.5" cy="49.5" r="2.5" stroke-linecap="square"/><circle cx="21.5" cy="25.5" r="3.5" stroke-linecap="square"/><circle cx="49.5" cy="25.5" r="3.5" stroke-linecap="square"/><path stroke-linecap="square" d="M40.214 62h-9.428C24.276 62 19 56.627 19 50s5.277-12 11.786-12h9.428C46.724 38 52 43.373 52 50s-5.277 12-11.786 12z"/><path d="M24 6.895C19.86 3.155 12.634 0 0 0c0 14.282 1.175 20.05 5.416 24M47 6.895C51.14 3.155 58.366 0 71 0c0 14.282-1.175 20.05-5.416 24"/><circle cx="35" cy="38" r="33" stroke-linecap="square"/></g><g opacity=".75" transform="translate(1 -9) scale(-1 1) rotate(-78 331.414 386.978)"><circle cx="28.5" cy="49.5" r="2.5" stroke-linecap="square"/><circle cx="42.5" cy="49.5" r="2.5" stroke-linecap="square"/><circle cx="21.5" cy="25.5" r="3.5" stroke-linecap="square"/><circle cx="49.5" cy="25.5" r="3.5" stroke-linecap="square"/><path stroke-linecap="square" d="M40.214 60h-9.428C24.276 60 19 54.85 19 48.5S24.277 37 30.786 37h9.428C46.724 37 52 42.15 52 48.5S46.723 60 40.214 60z"/><path d="M23 6.895C19.033 3.155 12.108 0 0 0c0 14.282 1.126 20.05 5.19 24M47 6.895C50.967 3.155 57.892 0 70 0c0 14.282-1.126 20.05-5.19 24"/><circle cx="34.5" cy="37.5" r="32.5" stroke-linecap="square"/></g><g opacity=".84" transform="translate(1 -9) scale(1 -1) rotate(13 1962.308 122.691)"><circle cx="25" cy="44" r="2" stroke-linecap="square"/><circle cx="38" cy="44" r="2" stroke-linecap="square"/><circle cx="19" cy="23" r="3" stroke-linecap="square"/><circle cx="44" cy="23" r="3" stroke-linecap="square"/><path stroke-linecap="square" d="M35.643 55h-8.286C21.637 55 17 50.3 17 44.5S21.637 34 27.357 34h8.286C41.363 34 46 38.7 46 44.5S41.363 55 35.643 55z"/><path d="M21 6.033C17.378 2.76 11.055 0 0 0c0 12.497 1.028 17.543 4.74 21M42 6.033C45.622 2.76 51.945 0 63 0c0 12.497-1.028 17.543-4.74 21"/><circle cx="31.5" cy="33.5" r="29.5" stroke-linecap="square"/></g><path d="M1388.698 809.21c-16.973-10.595-30.7-44.138-30.7-44.138s34.912-3.18 53.168 8.216c19.682 12.287 13.298 33.276 13.298 33.276s-15.94 15.023-35.766 2.647zm6.48-20.906l43.176 26.98" stroke-linecap="square" opacity=".81"/><path d="M1439.504 471.97c.008-18.314-19.37-45.237-19.37-45.237s-19.4 25.554-19.41 45.252c-.01 21.237 19.38 26.46 19.38 26.46s19.39-5.086 19.4-26.476zm-19.37-5.64V513" stroke-linecap="square" opacity=".95"/><path d="M1224.884 720.425c-6.176 17.96-34.267 37.815-34.267 37.815s-10.395-31.607-3.753-50.924c7.16-20.826 27.935-19.403 27.935-19.403s17.29 11.535 10.08 32.512zm-20.914-.963l15.654-45.464m-75.466 351.584c-9.49-16.45-40.853-30.582-40.853-30.582s-4.173 33.01 6.033 50.705c11.003 19.077 31.124 13.716 31.124 13.716s14.78-14.62 3.696-33.83zm-20.346 4.936l24.04 41.64" stroke-linecap="square" opacity=".97"/><path d="M1330.098 501.34c-12.04-6.956-37.098-4.434-37.098-4.434s9.438 22.458 22.386 29.94c13.96 8.07 24.756-2.696 24.756-2.696s4.017-14.682-10.044-22.81zm-11.378 10.415l30.618 17.678" stroke-linecap="square" opacity=".88"/><path d="M1061.73 164.563c13.01-5.8 38.27-.547 38.27-.547s-12.02 21.87-26.013 28.106c-15.086 6.725-24.932-5.398-24.932-5.398s-2.52-15.388 12.676-22.16zm9.847 12.108l-32.3 14.38" stroke-linecap="square" opacity=".82"/><path d="M891.928 270.82c8.008-17.965.755-52.848.755-52.848s-30.2 16.598-38.814 35.923c-9.29 20.833 7.45 34.43 7.45 34.43s21.25 3.48 30.6-17.505zm-16.502-14.09l-20.132 45.22" stroke-linecap="square" opacity=".98"/><path d="M995.807 155.117c-11.345 10.207-17.212 37.22-17.212 37.22s26.643-2.234 38.846-13.213c13.16-11.836 5.59-26.756 5.59-26.756s-13.96-9.173-27.21 2.75zm8.01 14.51l28.377-25.55" stroke-linecap="square" opacity=".92"/><path d="M543.155 655.732c-4.71 14.516-27.002 30.863-27.002 30.863s-8.795-25.25-3.73-40.863c5.462-16.833 22.173-15.98 22.173-15.98s14.06 9.025 8.56 25.98zm-16.513-1.417l11.8-36.315" stroke-linecap="square" opacity=".95"/><path d="M245.248 1040.648c-3.508-9.13 1-26.26 1-26.26s14.563 9.027 18.337 18.846c4.07 10.586-4.597 16.9-4.597 16.9s-10.642 1.176-14.74-9.486zm8.58-6.518l8.93 23.267" stroke-linecap="square" opacity=".73"/><path d="M397.513 751.35c-9.108 13.49-8.21 42.962-8.21 42.962s27-9.188 36.796-23.7c10.56-15.645-1.13-29.13-1.13-29.13s-16.82-5.892-27.46 9.867zm11.56 13.65l22.934-34" stroke-linecap="square" opacity=".97"/><path d="M367.92 983.85c-17.537 1.85-45.27-14-45.27-14s22.518-21.15 41.382-23.142c20.337-2.146 27.292 15.895 27.292 15.895s-2.92 19.084-23.404 21.246zm-7.297-17.99l45.007-4.73" stroke-linecap="square" opacity=".95"/><path d="M443.196 375.075c-9.024 9.67-12.05 33.434-12.05 33.434s22.835-3.95 32.542-14.35c10.465-11.22 2.797-23.52 2.797-23.52s-12.748-6.87-23.29 4.43zm7.24 12.748L473.586 363" stroke-linecap="square" opacity=".8"/><path d="M317.798 342.115c7.017 15.063 33.278 29.772 33.278 29.772s6.155-28.455-1.392-44.658c-8.136-17.47-26.084-14.33-26.084-14.33s-13.997 11.62-5.802 29.21zm17.738-3.552l-17.332-37.17" stroke-linecap="square" opacity=".78"/><path d="M306.66 184.087c-5.11-13.295 1.457-38.246 1.457-38.246s21.21 13.15 26.707 27.45c5.925 15.42-6.696 24.62-6.696 24.62s-15.5 1.71-21.468-13.81zm12.607-9.2l12.67 33.008m-74.587 345.73c-12.087 8.16-38.49 7.355-38.49 7.355s8.232-24.187 21.232-32.963c14.015-9.462 26.097 1.01 26.097 1.01s5.27 15.067-8.84 24.598zm-12.695-10.043l30.483-20.562" stroke-linecap="square" opacity=".88"/><path d="M194.22 281.964c15.222 1.07 38.73-13.474 38.73-13.474s-20.116-17.613-36.49-18.765c-17.654-1.242-23.124 14.57-23.124 14.57s3.1 16.418 20.883 17.67zm4.87-15.842L161 263.46" stroke-linecap="square" opacity=".97"/><g opacity=".91"><path d="M890.793 494.47c2.215 1.374 4.665 2.436 7.282 3.093 6.746 1.695 13.434.47 18.794-2.88 5.36-3.348 9.39-8.823 10.82-15.63.55-2.64.67-5.307.41-7.9m-14.1-20.67l-26.2-13.687-.03.018c-2.1-1.145-4.75-1.173-6.95.203-2.2 1.375-3.34 3.77-3.23 6.155l-.03.018.81 29.55"/><path d="M911.61 449.624c1.546-3.862 1.32-8.422-1.032-12.184-1.618-2.59-3.99-4.418-6.66-5.414 1.148 4.11-.285 8.78-3.57 11.685m-21.674 26.5c-4.148-.3-8.147-2.5-10.498-6.27-1.618-2.59-2.222-5.52-1.946-8.36 3.19 2.84 8.015 3.6 12.068 1.92m22.598 4.09c.932-3.12 2.983-5.94 6.01-7.83 6.442-4.02 14.816-2.24 18.704 3.98.316.51.574.99.812 1.52m-32.32 6.57c-3.21-.53-6.64.1-9.664 1.98-6.44 4.03-8.51 12.34-4.623 18.56.317.51.633.95 1.005 1.4"/><path stroke-linecap="square" d="M902.03 470.94l17.302-10.812c6.37-3.98 14.855-1.89 18.952 4.666l-17.3 10.81c-6.37 3.98-14.855 1.892-18.953-4.665zm0 0l-17.3 10.81c-6.37 3.98-8.21 12.522-4.113 19.08l17.3-10.812c6.37-3.98 8.212-12.522 4.114-19.08"/><path stroke-linecap="square" d="M910.194 467.018c-1.464-2.342-.94-5.308 1.166-6.625 2.108-1.317 5.003-.487 6.466 1.855m-30.53 19.077c-1.463-2.34-.94-5.308 1.167-6.625 2.108-1.317 5.003-.486 6.466 1.856m7.1-15.05c1.31 2.106 3.06 8.7.95 10.016-2.11 1.317-7.27-3.14-8.59-5.248-1.32-2.108-3.06-8.7-.96-10.017 2.1-1.317 7.27 3.14 8.58 5.248z"/></g><g opacity=".84"><path d="M1203.926 771.91c2.164-.697 4.488-1.072 6.9-1.06 6.217.03 11.946 2.578 16.183 6.67 4.23 4.09 6.98 9.727 7.22 15.938.09 2.41-.2 4.747-.82 6.933m-16.7 15.86l-26.23 7.67-.02-.02c-2.11.66-4.49.22-6.18-1.42-1.69-1.63-2.22-3.99-1.64-6.12l-.02-.02 6.74-26.48m24.45 27.78c.68 3.72-.33 7.7-3.09 10.56-1.9 1.97-4.33 3.11-6.88 3.46 1.75-3.4 1.31-7.81-1.09-11.03m-14.67-27.83c-3.74-.55-7.69.6-10.45 3.45-1.9 1.97-2.96 4.44-3.21 7 3.34-1.87 7.76-1.58 11.06.71"/><path d="M1206.784 804.94c.21 2.996 1.488 5.92 3.832 8.185 4.99 4.818 12.89 4.73 17.647-.196.387-.41.715-.79 1.037-1.23m-28.282-12.31c-3-.11-5.962-1.3-8.303-3.56-4.99-4.82-5.176-12.72-.42-17.64.388-.4.76-.74 1.187-1.08"/><path stroke-linecap="square" d="M1210.697 795.13l13.38 12.92c4.926 4.758 12.65 4.75 17.255-.017l-13.38-12.92c-4.926-4.758-12.652-4.75-17.255.017zm0 0l-13.38-12.92c-4.927-4.757-5.188-12.48-.584-17.246l13.38 12.92c4.926 4.758 5.187 12.48.584 17.246m5.78 6.972c-1.536 1.59-1.49 4.12.098 5.656 1.59 1.534 4.12 1.49 5.656-.1m-23.73-22.923c-1.53 1.59-1.49 4.122.1 5.656 1.59 1.54 4.12 1.5 5.66-.09m2.73 14.45c1.63-1.69 4.62-7.36 3.03-8.89-1.59-1.53-7.15 1.65-8.78 3.34-1.63 1.69-4.61 7.36-3.02 8.9 1.59 1.54 7.15-1.65 8.78-3.33z"/></g><g opacity=".96"><path d="M1118.95 95.323c2.216-.45 4.547-.565 6.913-.292 6.098.71 11.383 3.82 15 8.29 3.615 4.47 5.562 10.29 4.983 16.4-.225 2.37-.823 4.63-1.723 6.7m-18.504 13.7l-26.06 4.14-.02-.02c-2.1.38-4.33-.35-5.77-2.12-1.44-1.78-1.69-4.11-.88-6.09l-.02-.02 9.46-24.62"/><path d="M1123.362 140.498c.23 3.774-1.26 7.603-4.345 10.102-2.123 1.72-4.676 2.557-7.25 2.592 2.152-3.163 2.25-7.593.256-11.083m-10.54-28.64c-3.645-1.01-7.7-.35-10.785 2.15-2.123 1.72-3.474 4.04-4.044 6.55 3.542-1.45 7.896-.62 10.894 2.05m20.214 4.22c-.225 2.91.6 5.86 2.552 8.28 4.157 5.13 11.84 5.8 17.163 1.49.433-.35.807-.69 1.182-1.09m-25.95-14.89c-2.9-.39-5.61-1.82-7.56-4.23-4.16-5.13-3.21-12.79 2.11-17.1.43-.35.84-.65 1.3-.93"/><path stroke-linecap="square" d="M1122.21 118.418l11.706 14.455c4.31 5.322 11.98 6.256 17.13 2.085l-11.706-14.455c-4.31-5.322-11.98-6.256-17.13-2.085zm0 0l-11.705-14.455c-4.31-5.322-3.628-13.017 1.522-17.188l11.706 14.455c4.31 5.322 3.628 13.017-1.522 17.188m5.67 6.994c-1.71 1.39-1.98 3.91-.59 5.626 1.39 1.717 3.91 1.982 5.63.592m-20.76-25.646c-1.71 1.39-1.98 3.91-.59 5.626 1.39 1.716 3.91 1.98 5.63.59m1.97 15.138c1.72-1.39 5.09-6.426 3.7-8.143-1.39-1.717-7.02.536-8.73 1.926-1.71 1.4-5.09 6.43-3.7 8.15 1.39 1.72 7.02-.53 8.74-1.92z"/></g><g opacity=".91"><path d="M993.776 59.726c-2.052.02-4.14-.27-6.176-.903-5.25-1.63-9.287-5.216-11.57-9.696-2.282-4.48-2.81-9.854-1.043-15.06.685-2.02 1.678-3.877 2.9-5.527m18.728-7.297l23.352 1.3.012.023c1.88.07 3.69 1.12 4.62 2.936.92 1.818.71 3.895-.34 5.464l.01.024-12.68 19.656M998.48 20.5c.586-3.124 2.633-6.04 5.754-7.63 2.148-1.093 4.477-1.403 6.658-1.052-2.47 2.272-3.464 5.885-2.5 9.035"/><path d="M1012.386 47.79c2.87 1.363 6.433 1.42 9.553-.17 2.14-1.094 3.76-2.797 4.76-4.767-3.29.662-6.8-.657-8.78-3.29m-17.44-6.827c.66-2.487.44-5.214-.82-7.703-2.7-5.297-9.13-7.43-14.36-4.765-.43.217-.8.437-1.18.702m20 18.888c2.4.923 4.47 2.713 5.73 5.2 2.7 5.295.65 11.75-4.58 14.414-.43.217-.83.39-1.27.544"/><path stroke-linecap="square" d="M995.86 39.585l-7.355-14.435c-2.708-5.314-9.29-7.387-14.704-4.63l7.36 14.436c2.71 5.314 9.29 7.387 14.71 4.63zm0 0l7.354 14.434c2.708 5.31.515 11.85-4.898 14.61l-7.354-14.43c-2.708-5.32-.515-11.86 4.898-14.62m-3.178-6.24c1.968-1.01 2.852-3.22 1.975-4.94-.878-1.72-3.185-2.31-5.153-1.3m12.712 24.95c1.968-1 2.852-3.21 1.975-4.93-.87-1.73-3.18-2.31-5.15-1.31m1.25-12.98c-1.72.88-5.52 4.57-4.64 6.29.88 1.72 6.11.81 7.83-.06 1.72-.88 5.53-4.58 4.65-6.3-.87-1.72-6.1-.82-7.82.06z"/></g><g opacity=".93"><path d="M982.44 104.485c.39 1.815.515 3.71.332 5.616-.474 4.92-2.88 9.07-6.39 11.81s-8.12 4.08-13.002 3.35c-1.894-.28-3.702-.86-5.37-1.68m-9.677-14.01l-3.22-20.91.018-.01c-.29-1.68.29-3.45 1.7-4.55 1.42-1.1 3.27-1.24 4.83-.54l.02-.01 19.51 8.19m-23.52 15.83c-2.87-.05-5.85-1.45-7.86-4.02-1.38-1.77-2.11-3.83-2.22-5.85 2.49 1.88 5.88 2.22 8.48.87m23.33-7.96c.65-2.8.01-6.03-2-8.61-1.39-1.77-3.21-2.97-5.14-3.57 1.22 2.87.74 6.25-1.21 8.44"/><path d="M958.118 102.592c-2.312-.197-4.672.434-6.63 1.963-4.163 3.253-4.853 9.328-1.54 13.568.27.345.532.643.836.942m12.054-20.177c.37-2.29 1.563-4.42 3.517-5.948 4.164-3.253 10.224-2.453 13.537 1.787.27.346.495.673.712 1.04"/><path stroke-linecap="square" d="M964.463 105.84l-11.348 8.865c-4.178 3.265-4.808 9.44-1.408 13.79l11.347-8.865c4.178-3.264 4.81-9.438 1.41-13.79zm0 0l11.347-8.866c4.178-3.264 10.32-2.382 13.722 1.97l-11.348 8.866c-4.178 3.264-10.32 2.382-13.72-1.97"/><path stroke-linecap="square" d="M959.562 110.937c-1.02-1.305-2.905-1.537-4.21-.517-1.306 1.02-1.538 2.906-.518 4.21m19.7-15.39c-1.02-1.306-2.905-1.537-4.21-.517-1.306 1.02-1.538 2.905-.518 4.21m-11.093.42c1.105 1.414 5.06 4.295 6.365 3.275 1.306-1.02-.532-5.555-1.637-6.97-1.1-1.414-5.06-4.294-6.36-3.274-1.3 1.02.53 5.554 1.64 6.97z"/></g><g opacity=".9"><path d="M673.05 1060.094c-1.135 1.53-2.53 2.92-4.166 4.083-4.218 2.998-9.286 4.03-14.07 3.27-4.785-.756-9.287-3.303-12.37-7.458-1.197-1.62-2.095-3.37-2.702-5.18m3.866-19.02l13.994-17.29h.025c1.105-1.42 2.91-2.23 4.815-1.93 1.905.3 3.374 1.62 3.986 3.31h.025l7.965 20.76"/><path d="M644.802 1034.28c-2.273-2.236-3.5-5.475-2.977-8.78.36-2.276 1.487-4.24 3.08-5.715.436 3.196 2.875 6.026 6.092 7.088m22.756 11.992c2.852-1.424 5.02-4.125 5.544-7.43.36-2.276-.105-4.493-1.164-6.387-1.402 2.905-4.596 4.843-7.984 4.858m-15.05 8.76c-1.51-1.955-3.69-3.338-6.27-3.747-5.5-.88-10.69 3.04-11.6 8.74-.08.46-.12.89-.13 1.34m24.65-5.31c2.03-1.39 4.54-2.02 7.12-1.61 5.5.87 9.22 6.2 8.32 11.9-.08.46-.17.88-.3 1.32"/><path stroke-linecap="square" d="M657.98 1047.464l-15.49-2.454c-5.702-.903-11.033 2.84-11.907 8.357l15.488 2.454c5.71.91 11.04-2.83 11.91-8.35zm0 0l15.487 2.453c5.703.903 9.617 6.11 8.743 11.627l-15.488-2.453c-5.703-.9-9.617-6.1-8.743-11.62m-7.5-1.18c.29-1.84-.97-3.56-2.81-3.86-1.84-.29-3.57.97-3.86 2.81m27.48 4.35c.29-1.84-.97-3.56-2.81-3.86-1.84-.29-3.57.97-3.86 2.81m-9.77-8.37c-.29 1.84.43 6.9 2.27 7.19 1.84.29 4.09-4.29 4.38-6.13.29-1.84-.44-6.9-2.28-7.19-1.84-.29-4.09 4.3-4.39 6.14z"/></g><g opacity=".79"><path d="M904.367 573.23c-1.56 1.618-3.396 3.028-5.47 4.137-5.343 2.858-11.33 3.274-16.686 1.636-5.35-1.638-10.08-5.33-12.91-10.688-1.1-2.08-1.83-4.274-2.22-6.49m8.35-20.453l19.29-18 .03.01c1.53-1.485 3.79-2.133 5.98-1.465 2.19.67 3.7 2.468 4.14 4.554l.03.01 5.93 25.71"/><path d="M877.068 539.786c-2.3-3.002-3.207-7.01-2.046-10.805.8-2.61 2.447-4.73 4.56-6.2-.015 3.83 2.383 7.56 5.986 9.33m23.793 17.55c3.59-1.2 6.58-4.01 7.74-7.81.8-2.61.62-5.29-.31-7.69-2.12 3.18-6.2 4.93-10.18 4.39m-18.16 8.1c-1.44-2.54-3.78-4.52-6.74-5.43-6.31-1.93-13.06 1.81-15.06 8.36-.16.54-.28 1.03-.37 1.56m29.84-2.16c2.62-1.3 5.67-1.62 8.63-.72 6.32 1.93 9.82 8.81 7.81 15.36-.16.53-.34 1.01-.56 1.5"/><path stroke-linecap="square" d="M889.706 556.198l-17.214-5.263c-6.337-1.937-13.046 1.63-14.984 7.968l17.214 5.262c6.338 1.938 13.046-1.63 14.984-7.967zm0 0l17.213 5.263c6.33 1.94 9.9 8.65 7.96 14.99l-17.22-5.26c-6.34-1.94-9.91-8.64-7.97-14.98m-7.65-2.34c.64-2.11-.55-4.35-2.66-4.99-2.12-.64-4.35.55-5 2.66m30.6 9.36c.64-2.11-.55-4.35-2.66-4.99-2.11-.64-4.35.55-5 2.66m-9.14-11.16c-.65 2.11-.63 8.17 1.48 8.82 2.11.65 5.52-4.37 6.16-6.48.64-2.11.62-8.17-1.49-8.82-2.12-.65-5.52 4.37-6.17 6.48z"/></g><g opacity=".79"><path d="M641.284 569.46c-.043 1.88-.375 3.788-1.028 5.652-1.68 4.803-5.158 8.49-9.418 10.568-4.26 2.078-9.306 2.547-14.127.916-1.87-.634-3.57-1.547-5.08-2.67m-7.43-17.516l1.84-21.433.03-.01c.12-1.735 1.15-3.387 2.87-4.227 1.72-.84 3.66-.633 5.1.343l.02-.01 18.02 11.747"/><path d="M604.82 564.99c-3.055-.522-5.842-2.43-7.275-5.37-.987-2.02-1.19-4.223-.75-6.29 2.135 2.314 5.655 3.22 8.805 2.277m24.952-3.166c1.47-2.73 1.68-6.1.248-9.04-.986-2.02-2.596-3.53-4.496-4.46.51 3.11-.944 6.44-3.627 8.34m-7.025 15.25c-2.316-.63-4.882-.44-7.254.72-5.046 2.46-7.225 8.38-4.866 13.22.192.4.39.74.627 1.1m16.88-17.66c.93-2.21 2.67-4.11 5.03-5.26 5.04-2.46 11.05-.53 13.4 4.3.19.4.34.76.47 1.17"/><path stroke-linecap="square" d="M621.62 567.923l-13.48 6.576c-4.965 2.42-7.026 8.4-4.605 13.37l13.482-6.58c4.964-2.42 7.025-8.41 4.604-13.37zm0 0l13.483-6.575c4.964-2.42 10.95-.36 13.37 4.604l-13.48 6.576c-4.964 2.42-10.95.36-13.372-4.605m-5.39 2.63c-.72-1.49-2.72-2.01-4.46-1.16-1.74.846-2.56 2.74-1.83 4.23m24.27-11.837c-.72-1.49-2.72-2.01-4.46-1.162-1.74.847-2.56 2.742-1.83 4.23m-11.83-1.458c.79 1.614 4.26 5.156 6 4.308 1.74-.847 1.09-5.763.3-7.376-.78-1.614-4.25-5.156-5.99-4.308-1.73.847-1.08 5.763-.29 7.376z"/></g><g opacity=".83"><path d="M759.453 159.674c-.7-1.72-1.152-3.565-1.302-5.474-.38-4.92 1.27-9.427 4.25-12.736 2.98-3.31 7.29-5.422 12.23-5.55 1.92-.05 3.8.206 5.58.722m11.97 12.118l6.81 20.032-.01.017c.58 1.61.32 3.447-.88 4.78-1.2 1.33-3 1.785-4.66 1.377l-.01.017-20.63-4.67m20.41-19.68c2.84-.45 6.02.413 8.45 2.6 1.67 1.506 2.75 3.406 3.21 5.38-2.78-1.42-6.18-1.17-8.5.617m-21.59 11.884c-.15 2.875 1.04 5.942 3.47 8.13 1.68 1.505 3.68 2.372 5.69 2.626-1.7-2.615-1.81-6.02-.27-8.52"/><path d="M783.734 157.314c2.31-.207 4.526-1.238 6.187-3.084 3.54-3.927 3.17-10.03-.83-13.63-.32-.292-.63-.54-.98-.782m-8.36 21.964c.04 2.318-.77 4.625-2.43 6.468-3.53 3.927-9.64 4.19-13.64.59-.32-.293-.6-.576-.88-.9"/><path stroke-linecap="square" d="M776.922 155.218l9.635-10.702c3.548-3.94 3.097-10.13-1.008-13.825l-9.64 10.71c-3.55 3.94-3.1 10.13 1.01 13.83zm0 0l-9.636 10.7c-3.547 3.94-9.75 4.14-13.855.444l9.64-10.7c3.55-3.942 9.75-4.14 13.86-.444"/><path stroke-linecap="square" d="M780.863 149.347c1.23 1.108 3.128 1.01 4.236-.222 1.1-1.232 1.01-3.13-.23-4.237m-16.73 18.578c1.23 1.11 3.12 1.01 4.23-.222 1.11-1.23 1.01-3.128-.22-4.237m10.85-2.34c-1.33-1.2-5.73-3.35-6.84-2.118-1.11 1.23 1.49 5.37 2.82 6.57 1.33 1.2 5.73 3.35 6.83 2.12 1.1-1.23-1.49-5.38-2.83-6.58z"/></g><path d="M642.146 788.073c-1.685-1.213-3.22-2.715-4.513-4.486-3.335-4.564-4.545-10.1-3.805-15.364.74-5.264 3.43-10.253 7.893-13.72 1.74-1.347 3.62-2.367 5.58-3.07m20.66 3.913l19.21 14.935v.03c1.58 1.18 2.5 3.13 2.2 5.22-.29 2.08-1.71 3.71-3.55 4.41v.03l-22.57 9.07m6.63-32.75c2.44-2.48 6.02-3.85 9.72-3.33 2.55.36 4.77 1.55 6.45 3.25-3.55.52-6.65 3.19-7.75 6.67m-12.97 25.8c1.66 3.06 4.73 5.36 8.43 5.88 2.55.36 5.01-.17 7.1-1.34-3.27-1.47-5.51-4.89-5.61-8.55"/><path d="M665.017 769.072c2.13-1.74 3.62-4.227 4.03-7.147.873-6.214-3.524-11.97-9.82-12.854-.513-.07-.98-.1-1.485-.11m6.317 27.05c1.56 2.26 2.29 5.06 1.88 7.98-.88 6.21-6.69 10.53-12.99 9.65-.52-.07-.98-.16-1.46-.3"/><path stroke-linecap="square" d="M655.683 770.79l2.338-16.637c.87-6.126-3.31-11.777-9.33-12.622l-2.34 16.64c-.86 6.13 3.32 11.78 9.34 12.62zm0 0l-2.338 16.636c-.86 6.125-6.436 10.405-12.452 9.56l2.34-16.637c.86-6.13 6.434-10.41 12.45-9.56m1.114-7.93c2.187.31 4.18-1 4.448-2.91.27-1.92-1.287-3.72-3.474-4.02m-4.03 28.72c2.19.3 4.18-1 4.45-2.91.27-1.92-1.28-3.72-3.47-4.02m8.96-9.85c-2.05-.29-7.64.51-7.91 2.42-.27 1.91 4.89 4.22 6.94 4.51 2.05.29 7.65-.51 7.92-2.42.27-1.92-4.89-4.22-6.94-4.51z"/><g opacity=".71"><path d="M430.76 460.786c.286-2.602.185-5.29-.36-7.963-1.408-6.89-5.464-12.512-10.886-16.033-5.42-3.52-12.208-4.94-19.074-3.423-2.664.59-5.16 1.59-7.42 2.91m-12.778 21.51l-1.81 30.268.03.02c-.193 2.443.876 4.897 3.053 6.31 2.177 1.415 4.853 1.392 7.008.224l.03.01 26.913-13.97"/><path d="M379.934 461.166c-4.153.23-8.19 2.363-10.606 6.084-1.663 2.56-2.318 5.483-2.092 8.324 3.24-2.777 8.077-3.45 12.1-1.7m34.01 8.99c1.476 3.887 1.17 8.442-1.246 12.163-1.663 2.56-4.066 4.347-6.754 5.297 1.22-4.09-.132-8.783-3.367-11.746m-7.11-22.107c-3.3.6-6.77.01-9.76-1.94-6.37-4.13-8.08-12.81-3.82-19.37.34-.53.69-1 1.09-1.47m20.02 27.71c.8 3.26 2.77 6.17 5.76 8.12 6.37 4.14 14.99 2.17 19.25-4.39.35-.53.63-1.03.9-1.59"/><path stroke-linecap="square" d="M404.684 460.545l-17.613-11.437c-6.48-4.21-8.32-12.882-4.11-19.367l17.61 11.44c6.49 4.21 8.33 12.88 4.12 19.37zm0 0l17.612 11.438c6.484 4.21 15.155 2.368 19.366-4.117L424.05 456.43c-6.485-4.212-15.155-2.37-19.366 4.115m-8.387-5.446c-1.504 2.31-4.413 3.09-6.497 1.74-2.085-1.36-2.555-4.33-1.05-6.65m31.03 20.15c-1.504 2.31-4.413 3.09-6.498 1.74-2.084-1.35-2.554-4.33-1.05-6.65m-16.644-.08c1.354-2.09 6.592-6.45 8.676-5.1 2.085 1.35.226 7.91-1.128 10-1.353 2.08-6.59 6.45-8.675 5.09-2.08-1.36-.22-7.92 1.13-10z"/></g><g opacity=".81"><path d="M550.51 160.208c-2.365 1.094-4.926 1.85-7.604 2.183-6.9.86-13.39-1.17-18.303-5.14-4.912-3.98-8.247-9.9-8.84-16.83-.23-2.69-.024-5.35.554-7.89m16.51-18.8l27.673-10.39.026.02c2.22-.88 4.854-.58 6.87 1.05 2.018 1.63 2.855 4.15 2.455 6.5l.03.02-4.41 29.23"/><path d="M535.314 113.16c-1.063-4.023-.283-8.52 2.51-11.968 1.92-2.373 4.498-3.898 7.27-4.562-1.64 3.94-.787 8.75 2.12 12.033m18.283 28.938c4.155.21 8.392-1.49 11.184-4.94 1.93-2.37 2.88-5.21 2.95-8.06-3.51 2.43-8.39 2.59-12.21.43m-22.92 1.3c-.54-3.21-2.23-6.26-5.01-8.5-5.9-4.78-14.43-4.03-19.05 1.67-.37.47-.69.91-.99 1.41m31.28 10.45c3.25-.13 6.58.91 9.35 3.15 5.9 4.78 6.95 13.28 2.33 18.98-.37.47-.74.86-1.16 1.26"/><path stroke-linecap="square" d="M542.224 135.483l-15.853-12.838c-5.83-4.727-14.51-3.688-19.38 2.32l15.86 12.84c5.84 4.726 14.52 3.687 19.38-2.322zm0 0l15.854 12.838c5.837 4.73 6.625 13.43 1.76 19.44l-15.855-12.83c-5.837-4.72-6.625-13.43-1.76-19.44"/><path stroke-linecap="square" d="M534.6 130.596c1.738-2.146 1.582-5.154-.35-6.718-1.93-1.564-4.906-1.092-6.644 1.054m27.978 22.656c1.737-2.146 1.58-5.154-.35-6.718-1.932-1.564-4.907-1.092-6.645 1.054m-5.22-15.805c-1.57 1.93-4.1 8.26-2.17 9.82 1.93 1.56 7.59-2.23 9.16-4.16 1.56-1.93 4.1-8.26 2.17-9.83-1.93-1.57-7.6 2.23-9.16 4.16z"/></g><g opacity=".81"><path d="M321.94 499.862c1.774.59 3.664.922 5.608.942 5.012.05 9.528-1.934 12.778-5.184s5.236-7.767 5.184-12.778c-.02-1.945-.35-3.834-.94-5.607m-14.143-11.314l-20.612-5.49-.017.02c-1.657-.47-3.516-.08-4.827 1.24-1.31 1.31-1.7 3.17-1.23 4.83l-.01.02 5.5 20.61"/><path d="M328.174 465.345c.5-3.06-.397-6.316-2.71-8.628-1.59-1.59-3.605-2.5-5.704-2.757 1.495 2.772 1.205 6.396-.713 9.067m-10.41 21.855c-3.06.5-6.316-.397-8.627-2.71-1.59-1.59-2.5-3.605-2.758-5.704 2.772 1.494 6.396 1.205 9.067-.713m17.41-.97c.08-2.32 1-4.585 2.75-6.34 3.73-3.738 9.85-3.682 13.65.123.31.31.57.607.83.944m-22.21 10.213c-2.32.087-4.58 1.012-6.33 2.766-3.74 3.74-3.68 9.85.12 13.66.31.31.6.58.94.84"/><path stroke-linecap="square" d="M325.477 482.185l10.607-10.607c3.905-3.905 10.237-3.905 14.142 0l-10.607 10.607c-3.91 3.905-10.24 3.905-14.15 0zm0 0L314.87 492.79c-3.905 3.906-3.905 10.238 0 14.143l10.607-10.606c3.905-3.906 3.905-10.237 0-14.142m4.95-4.95c-1.172-1.172-1.014-3.23.353-4.596 1.367-1.37 3.425-1.53 4.597-.36m-19.092 19.09c-1.172-1.17-1.014-3.23.353-4.6s3.425-1.53 4.596-.36m2.475-11.67c1.26 1.27 3.48 5.7 2.12 7.07-1.37 1.36-5.8-.85-7.07-2.12-1.27-1.27-3.49-5.71-2.13-7.07 1.36-1.37 5.8.85 7.07 2.12z"/></g><g opacity=".92"><path d="M282.54 918.604c1.1-1.29 2.025-2.777 2.706-4.43 1.755-4.254 1.635-8.853.02-12.85-1.614-3.995-4.722-7.387-8.94-9.23-1.638-.714-3.336-1.14-5.024-1.305m-15.387 7.29l-12.562 15.83.01.02c-1.04 1.26-1.396 3.01-.747 4.61.648 1.6 2.118 2.61 3.742 2.8l.01.02 20.036 2.66M254.33 899.5c-2.395-1.445-5.48-1.8-8.294-.66-1.937.782-3.458 2.146-4.458 3.8 2.898-.306 5.85 1.154 7.39 3.643m15.313 17.842c-.72 2.705-2.69 5.1-5.51 6.24-1.93.78-3.97.856-5.84.362 2.3-1.794 3.41-4.895 2.79-7.754"/><path d="M261.245 907.794c-1.93-.94-3.523-2.57-4.396-4.727-1.86-4.594.31-9.802 4.85-11.635.37-.15.71-.263 1.09-.36m.69 22.29c-.73 2.014-.74 4.295.13 6.45 1.85 4.594 7.03 6.83 11.57 5 .37-.15.69-.306 1.03-.498"/><path stroke-linecap="square" d="M268.577 908.068l-5.17-12.795c-1.903-4.71.29-10.04 4.9-11.902l5.168 12.8c1.904 4.71-.29 10.04-4.898 11.9zm0 0l5.17 12.795c1.903 4.71 7.182 7.02 11.79 5.16l-5.17-12.797c-1.902-4.71-7.18-7.02-11.79-5.158m-2.248-5.563c-1.54.62-3.29-.122-3.91-1.658-.62-1.536.12-3.285 1.66-3.905m8.99 22.252c-1.54.62-3.29-.12-3.91-1.658-.62-1.536.12-3.284 1.66-3.905m-8.94-6.09c1.53-.62 6.06-1 6.68.54.62 1.54-2.9 4.41-4.44 5.03-1.54.62-6.07 1-6.69-.53-.62-1.53 2.9-4.41 4.44-5.03z"/></g><path d="M1352.57 1062.176l2.437-19.85m-12.223 25.7l3.29-26.797m-11.37 18.75l2.437-19.85m32.99 26.72c-.3 2.45-2.55 4.22-5.01 3.92-2.45-.31-4.22-2.56-3.92-5.02l2.74-22.34m-35.73-4.39l-2.74 22.33c-.3 2.45-2.56 4.22-5.01 3.91-2.45-.3-4.22-2.56-3.91-5.02m2.15-33.88c2-16.28 16.45-27.82 32.4-25.86 15.95 1.95 27.18 16.64 25.18 32.92l-1.39 11.3-57.57-7.07 1.39-11.31zm43.85-4.3l-7.94-.98m-12.9-1.59l-7.94-.98" stroke-linecap="square" opacity=".85"/><path d="M1016.723 718.136l-11.472 16.383m7.55-26.46l-14.91 21.29m4.92-20.97l-11.47 16.38m41.1 2.32c1.37-1.95.83-4.71-1.2-6.13s-4.8-.99-6.17.97l-12.42 17.75m-28.68-20.07l12.43-17.75c1.37-1.95.83-4.71-1.2-6.13s-4.8-.99-6.17.97m-20.45 25.71c-9.18 13.1-6.15 30.95 6.78 40.01 12.93 9.05 30.74 5.79 39.92-7.32l6.38-9.1-46.69-32.7-6.37 9.1zm30.13 31.94l-6.55-4.59m-10.65-7.45l-6.55-4.59" stroke-linecap="square" opacity=".87"/><path d="M1050.83 33.048l15.372 11.168m-15.744-22.564l21.034 15.283m-10.08-18.45l15.37 11.168m-38.1 15.58c-1.93-1.4-2.316-4.185-.86-6.187 1.453-2.002 4.22-2.494 6.15-1.093l17.528 12.735m19.985-27.507l-17.53-12.73c-1.927-1.4-2.314-4.18-.86-6.19 1.455-2 4.223-2.49 6.15-1.09m27.47 17.49c12.62 9.17 15.444 26.67 6.33 39.21-9.116 12.55-26.626 15.27-39.246 6.1l-8.77-6.37 32.91-45.3 8.76 6.37zm-18.08 38.78l4.702-6.47m7.053-9.71l4.703-6.47" stroke-linecap="square" opacity=".76"/><path d="M904.466 1056.747l-12.288-8.604m20.4 5.738l-16.385-11.47m15.73 3.69l-12.288-8.6m-1.26 30.86c1.5 1.05 3.633.62 4.738-.95 1.104-1.57.778-3.73-.723-4.78l-13.653-9.56m14.913-21.29l13.652 9.56c1.502 1.05 3.634.62 4.74-.95 1.103-1.57.777-3.73-.724-4.78m-19.906-15.16c-9.83-6.88-23.25-4.57-30.08 5.19-6.83 9.76-4.413 23.16 5.417 30.04l6.82 4.78 24.66-35.22-6.83-4.78zm-23.815 22.39l3.44-4.91m5.163-7.37l3.442-4.91" stroke-linecap="square" opacity=".74"/><path d="M953.173 826.255l-15.38 4.41m18.257-12.517l-20.186 5.788m13.726-10.177l-15.38 4.41m24.264 21.13c1.85-.53 2.93-2.48 2.4-4.33-.53-1.85-2.48-2.93-4.33-2.4l-16.822 4.82m-7.442-25.96l16.822-4.83c1.85-.53 2.93-2.48 2.4-4.33-.53-1.85-2.48-2.93-4.33-2.4m-25.65 5.27c-11.92 3.42-18.755 15.82-15.32 27.8 3.435 11.98 15.804 18.87 27.724 15.45l8.277-2.38-12.403-43.25-8.278 2.37zm3.23 34.44l-1.654-5.77m-3.032-10.58l-1.653-5.77m-3.443-74l6.916 15.53m-2.047-24.27l9.35 21.01m-.52-18.38l6.91 15.53m-35.21-5.31c-.86-1.93.08-4.24 2.09-5.13 2.01-.9 4.35-.05 5.21 1.87l7.79 17.51m27.4-12.2l-7.8-17.51c-.86-1.93.08-4.24 2.09-5.13 2.01-.9 4.35-.05 5.21 1.87m12.55 25.73c5.53 12.42 0 26.87-12.39 32.39-12.4 5.52-26.84-.04-32.37-12.47l-3.84-8.63 44.79-19.9 3.84 8.626zm-30.73 21.95l6.39-2.85m10.05-4.47l6.39-2.85" stroke-linecap="square" opacity=".78"/><path d="M982.923 410.983l-11.51 11.115m19.97-9.553l-15.106 14.588m15.677-6.798l-11.51 11.114m-6.167-31.58c1.385-1.34 3.612-1.3 4.95.08 1.336 1.38 1.297 3.61-.087 4.95l-12.59 12.15m18.757 19.42l12.59-12.16c1.383-1.34 3.61-1.3 4.948.08 1.337 1.38 1.298 3.61-.087 4.95m-17.393 19.57c-8.92 8.61-23.08 8.33-31.735-.64-8.657-8.97-8.445-23.13.475-31.74l6.194-5.98 31.26 32.37-6.2 5.98zM957.15 428.9l4.17 4.316m7.64 7.916l4.17 4.316" stroke-linecap="square" opacity=".96"/><path d="M846.135 170.27l-4.558-13.238m.513 19.92l-6.186-17.966m-1.115 15.19l-4.56-13.237m27.84 7.15c.56 1.64-.25 3.43-1.81 3.97s-3.3-.37-3.87-2.02l-5.16-14.97m-22.7 7.81l5.15 14.97c.57 1.64-.24 3.43-1.8 3.97-1.56.53-3.3-.37-3.87-2.02m-9.58-21.68c-3.64-10.59 1.85-22.03 12.33-25.64 10.47-3.61 21.85 2.02 25.49 12.61l2.53 7.35-37.82 13.02-2.54-7.36zm26.34-15.65l-4.73 1.62m-9.45 3.25l-4.72 1.64" stroke-linecap="square" opacity=".86"/><path d="M921.51 206.482l-14.72-16.35m26.094 15.53l-19.405-21.55m22.15 9.657l-14.72-16.35m-12.82 44.05c1.78 1.97 4.9 2.08 6.95.24 2.04-1.84 2.26-4.96.48-6.94l-16.17-17.96m28.98-26.1l16.17 17.96c1.78 1.97 4.91 2.08 6.95.24s2.26-4.96.48-6.94m-22.87-28.38c-11.78-13.08-31.71-14.21-44.67-2.54-12.97 11.67-13.93 31.61-2.15 44.69l8.18 9.08 46.82-42.16-8.18-9.08zm-41.46 24.19l5.94-5.36m11.15-10.03l5.94-5.36" stroke-linecap="square" opacity=".88"/><path d="M835.764 595.445l-15.588 9m16.785-18.928l-20.78 12m11.59-15.928l-15.59 9m33.32 17.71c1.91-1.1 2.57-3.56 1.47-5.47-1.1-1.91-3.56-2.57-5.46-1.47l-17.32 10m-16-27.71l17.32-10c1.91-1.1 2.57-3.56 1.47-5.47-1.1-1.91-3.56-2.57-5.46-1.47m-27 13.28c-12.47 7.2-16.71 23.04-9.51 35.51 7.2 12.47 23.04 16.71 35.51 9.51l8.66-5-26-45.04-8.66 5zm12.57 37.77l-3.5-6.06m-6-10.4l-3.5-6.06" stroke-linecap="square" opacity=".73"/><path d="M701.72 463.142l-10.61 10.608m18.385-9.9l-14.142 14.14m14.85-6.363l-10.607 10.607m-5.893-29.463c1.296-1.29 3.312-1.4 4.478-.23 1.17 1.17 1.06 3.18-.23 4.48l-11.79 11.78m18.39 18.39l11.79-11.78c1.3-1.29 3.31-1.4 4.48-.23 1.17 1.17 1.06 3.18-.23 4.48m-16.06 18.9c-8.2 8.2-21.43 8.19-29.66-.04-8.22-8.22-8.24-21.45-.04-29.66l5.7-5.69 29.7 29.7-5.69 5.7zm-26.13-17.72l4.25 4.24m6.36 6.36l4.25 4.25m674.49-358.53l-10.61 10.6m18.39-9.9l-14.14 14.15m14.85-6.36l-10.61 10.61m-5.89-29.46c1.3-1.29 3.31-1.4 4.48-.23 1.17 1.17 1.06 3.18-.24 4.48l-11.78 11.79m18.38 18.39l11.79-11.78c1.3-1.29 3.31-1.4 4.48-.23 1.17 1.17 1.06 3.18-.24 4.48m-16.06 18.9c-8.2 8.21-21.43 8.19-29.66-.04-8.22-8.22-8.24-21.45-.04-29.65l5.7-5.69 29.7 29.7-5.7 5.7zm-26.13-17.71l4.24 4.248m6.36 6.366l4.25 4.246" stroke-linecap="square" opacity=".75"/><path d="M504.78 407.415l5.62-13.907m-1.93 20.79l7.493-18.543m-.056 16.156l5.62-13.9m-29.424 6.09c-.687 1.7.003 3.6 1.533 4.22 1.53.62 3.343-.26 4.03-1.96l6.244-15.45m24.106 9.74l-6.243 15.46c-.687 1.7.003 3.6 1.533 4.22 1.53.62 3.343-.27 4.03-1.97m11.115-22.17c4.35-10.75-.84-22.93-11.62-27.28s-22.97.8-27.31 11.55l-3.01 7.47 38.94 15.74 3.02-7.47zm-26.51-17.12l5.57 2.25m8.35 3.37l5.57 2.25m734.38-40.48l5.62-13.9m-1.93 20.79l7.5-18.54m-.05 16.16l5.62-13.9m-29.42 6.09c-.68 1.7.01 3.593 1.54 4.21s3.35-.27 4.03-1.97l6.25-15.45m24.11 9.74l-6.24 15.45c-.69 1.7 0 3.595 1.53 4.214 1.53.617 3.34-.27 4.03-1.97m11.12-22.172c4.34-10.75-.843-22.93-11.63-27.282-10.78-4.36-22.97.797-27.313 11.55l-3.014 7.47 38.946 15.734 3.02-7.47zM1273 318.09l5.564 2.25m8.346 3.37l5.56 2.242" stroke-linecap="square" opacity=".94"/><path d="M610.82 189.22l-6.49 19.972m-.858-29.72l-8.652 26.63m-2.07-22.753l-6.49 19.97m43.35-10.45c.794-2.44-.483-5.07-2.837-5.83-2.354-.77-4.93.61-5.722 3.05l-7.21 22.19m-36.14-11.74l7.21-22.2c.8-2.44-.48-5.07-2.83-5.83-2.35-.77-4.93.61-5.72 3.05m-13.76 32.63c-5.31 16.36 3.35 33.74 19.41 38.96 16.07 5.22 33.29-3.76 38.61-20.11l3.7-11.36-58.01-18.85-3.69 11.36zm40.64 23.78l-7.6-2.48m-14.26-4.64l-7.61-2.47" stroke-linecap="square" opacity=".74"/><path d="M341.17 638.503l-14.974-11.697m24.626 9.087l-19.7-15.39m19.897 5.392l-14.98-11.697m-3.9 38.83c1.8 1.41 4.39 1.147 5.74-.587 1.35-1.73.98-4.3-.82-5.71l-16.41-12.83m20.93-26.79L358 619.94c1.807 1.41 4.39 1.147 5.747-.587 1.356-1.73.987-4.303-.82-5.714m-23.5-20.9c-11.98-9.36-29.045-7.41-38.25 4.38-9.208 11.78-6.976 28.81 5.002 38.17l8.32 6.5 33.24-42.56-8.32-6.5zm-31.28 26.32l4.31-5.52m7.385-9.46l4.31-5.52" stroke-linecap="square" opacity=".88"/><path d="M266 582v17m-8-23v23m-7-17v17m30-19.167c0-2.108-1.8-3.833-4-3.833s-4 1.725-4 3.833V599m-30 0v-19.167c0-2.108-1.8-3.833-4-3.833s-4 1.725-4 3.833m-1 28.61c0 13.6 10.93 24.557 24.5 24.557s24.5-10.956 24.5-24.556V599h-49v9.444zM271 616h-7m-11 0h-7" stroke-linecap="square" opacity=".98"/><path d="M151.42 330.857l16.18 11.756m-16.554-23.152l21.843 15.87M162 316.3l16.18 11.755m-39.364 15.9c-2.002-1.454-2.45-4.283-.996-6.285 1.455-2.002 4.284-2.45 6.286-.995L162.31 349.9m21.16-29.126l-18.208-13.226c-2.002-1.455-2.45-4.283-.995-6.286 1.454-2.002 4.283-2.45 6.285-.995m28.368 18.138c12.945 9.406 15.767 27.45 6.327 40.444-9.44 12.99-27.474 15.88-40.42 6.48l-8.99-6.53 34.094-46.93 8.99 6.53zm-18.083 40.014l4.702-6.48m7.64-10.52l4.7-6.47" stroke-linecap="square" opacity=".83"/><path d="M28.678 623.953l5.245 12.98m-12.306-14.44l6.742 16.688m-10.81-10.73l5.24 12.98m16.63-22.9c-.62-1.53-2.38-2.27-3.91-1.65-1.53.62-2.28 2.38-1.66 3.91l5.62 13.91m-22.26 8.99l-5.61-13.91c-.62-1.53-2.38-2.27-3.91-1.66-1.53.62-2.28 2.38-1.66 3.91m7.5 21.24c4.04 10.02 15.37 14.82 25.38 10.78s14.82-15.37 10.77-25.39l-2.81-6.96-36.16 14.61 2.81 6.95zm28.95-5.76l-4.64 1.87m-8.35 3.37l-4.63 1.88" stroke-linecap="square" opacity=".75"/><g opacity=".78" transform="translate(1 -9) scale(1 -1) rotate(4 15972.884 13594.432)"><path d="M12.926 25l-1.487 5.444C9.29 38.287 15.27 46 23.5 46s14.205-7.714 12.06-15.557l-1.477-5.41M25.786 0C25.29 1.182 25 2.5 25 3.855 25 9.458 29.658 14 35.404 14c2.924 0 5.706-1.3 7.596-3.194"/><circle cx="15.5" cy="13.5" r="4.5"/><path stroke-linecap="square" d="M0 18.353C0 12.227 10.297 0 23 0s23 12.227 23 18.353C46 21.603 35.703 26 23 26S0 21.412 0 18.353z"/></g><g opacity=".8" transform="translate(1 -9) rotate(83 462.185 759.272)"><path d="M18.927 39l-2.26 8.295C13.41 59.245 22.5 71 35 71c12.5 0 21.592-11.755 18.333-23.706l-2.247-8.242M40.222 0C39.452 1.858 39 3.928 39 6.06 39 14.862 46.246 22 55.184 22c4.548 0 8.876-2.044 11.816-5.02"/><circle cx="24" cy="21" r="7"/><path stroke-linecap="square" d="M0 28.235C0 18.81 15.894 0 35.5 0S71 18.81 71 28.235C71 33.235 55.106 40 35.5 40S0 32.94 0 28.235z"/></g><g opacity=".83" transform="translate(1 -9) rotate(102 359.236 528.864)"><path d="M15.31 30l-1.784 6.48C10.956 45.82 18.13 55 28 55c9.87 0 17.046-9.183 14.473-18.52L40.7 30.04M30.96 0C30.356 1.436 30 3.035 30 4.682 30 11.485 35.693 17 42.716 17c3.573 0 6.974-1.58 9.284-3.878"/><circle cx="18.5" cy="16.5" r="5.5"/><path stroke-linecap="square" d="M0 21.882C0 14.578 12.312 0 27.5 0S55 14.578 55 21.882C55 25.757 42.688 31 27.5 31S0 25.53 0 21.882z"/></g><g opacity=".72" transform="translate(1 -9) scale(1 -1) rotate(71 756.875 359.223)"><path d="M14.157 29l-1.666 6.22C10.09 44.186 16.79 53 26 53s15.91-8.816 13.51-17.78l-1.657-6.18M29.917 0C29.34 1.436 29 3.035 29 4.682 29 11.485 34.434 17 41.138 17c3.41 0 6.657-1.58 8.862-3.878"/><circle cx="17.5" cy="16.5" r="5.5"/><path stroke-linecap="square" d="M0 21.176C0 14.108 11.864 0 26.5 0S53 14.108 53 21.176C53 24.926 41.136 30 26.5 30S0 24.706 0 21.176z"/></g><g opacity=".79" transform="translate(1 -9) rotate(-58 870.136 -370.222)"><path d="M16.465 33l-1.904 7C11.82 50.082 19.48 60 30 60s18.182-9.918 15.438-20.002l-1.892-6.954M34.048 0C33.388 1.604 33 3.392 33 5.232 33 12.836 39.21 19 46.872 19 50.77 19 54.48 17.235 57 14.665"/><circle cx="20" cy="18" r="6"/><path stroke-linecap="square" d="M0 24C0 15.99 13.43 0 30 0s30 15.99 30 24c0 4.25-13.43 10-30 10S0 28 0 24z"/></g><g opacity=".98" transform="translate(1 -9) scale(1 -1) rotate(-55 218.082 -599.406)"><path d="M12.926 26l-1.487 5.444C9.29 39.287 15.27 47 23.5 47s14.205-7.714 12.06-15.557l-1.477-5.41M26.786 0C26.29 1.267 26 2.678 26 4.13 26 10.135 30.658 15 36.404 15c2.924 0 5.706-1.394 7.596-3.422"/><circle cx="15.5" cy="13.5" r="4.5"/><path stroke-linecap="square" d="M0 19.06C0 12.696 10.52 0 23.5 0S47 12.697 47 19.06C47 22.433 36.48 27 23.5 27S0 22.235 0 19.06z"/></g><g opacity=".95" transform="translate(1 -9) rotate(-96 516.182 110.261)"><path d="M16.542 34l-1.963 7.258C11.75 51.716 19.64 62 30.5 62s18.75-10.286 15.92-20.743l-1.95-7.212M35.047 0C34.387 1.604 34 3.392 34 5.232 34 12.836 40.21 19 47.872 19 51.77 19 55.48 17.235 58 14.665"/><circle cx="20" cy="18" r="6"/><path stroke-linecap="square" d="M0 24.706C0 16.46 13.88 0 31 0c17.12 0 31 16.46 31 24.706C62 29.08 48.12 35 31 35 13.88 35 0 28.824 0 24.706z"/></g><g opacity=".84" transform="translate(1 -9) scale(-1 1) rotate(-68 603.463 813.132)"><path d="M18.773 37l-2.142 8.036C13.55 56.614 22.16 68 34 68c11.843 0 20.455-11.388 17.368-22.966l-2.13-7.984M38.18 0C37.437 1.773 37 3.75 37 5.783 37 14.187 43.987 21 52.606 21c4.386 0 8.56-1.95 11.394-4.79"/><circle cx="23" cy="21" r="7"/><path stroke-linecap="square" d="M0 27.53C0 18.34 15.222 0 34 0s34 18.34 34 27.53C68 32.403 52.778 39 34 39S0 32.118 0 27.53z"/></g><g opacity=".75" transform="translate(1 -9) scale(-1 1) rotate(-24 1217.479 1353.985)"><path d="M18.773 36l-2.142 8.036C13.55 55.614 22.16 67 34 67c11.843 0 20.455-11.388 17.368-22.966l-2.13-7.984M38.136 0C37.42 1.773 37 3.75 37 5.783 37 14.187 43.728 21 52.028 21 56.25 21 60.27 19.05 63 16.21"/><circle cx="22.5" cy="19.5" r="6.5"/><path stroke-linecap="square" d="M0 26.824C0 17.87 14.998 0 33.5 0 52.002 0 67 17.87 67 26.824 67 31.574 52.002 38 33.5 38 14.998 38 0 31.294 0 26.824z"/></g><g opacity=".73" transform="translate(1 -9) rotate(94 -175.022 558.361)"><path d="M15.31 30l-1.784 6.74C10.956 46.45 18.13 56 28 56c9.87 0 17.046-9.55 14.473-19.26l-1.773-6.7M31.96 0C31.356 1.52 31 3.214 31 4.957 31 12.16 36.693 18 43.716 18c3.573 0 6.974-1.672 9.284-4.106"/><circle cx="18.5" cy="16.5" r="5.5"/><path stroke-linecap="square" d="M0 22.588C0 15.048 12.536 0 28 0s28 15.048 28 22.588c0 4-12.536 9.412-28 9.412S0 26.353 0 22.588z"/></g><g opacity=".73" transform="translate(1 -9) rotate(94 556.208 775.652)"><path d="M15.31 30l-1.784 6.74C10.956 46.45 18.13 56 28 56c9.87 0 17.046-9.55 14.473-19.26l-1.773-6.7M31.96 0C31.356 1.52 31 3.214 31 4.957 31 12.16 36.693 18 43.716 18c3.573 0 6.974-1.672 9.284-4.106"/><circle cx="18.5" cy="16.5" r="5.5"/><path stroke-linecap="square" d="M0 22.588C0 15.048 12.536 0 28 0s28 15.048 28 22.588c0 4-12.536 9.412-28 9.412S0 26.353 0 22.588z"/></g><g opacity=".97" transform="translate(1 -9) scale(-1 1) rotate(38 -1062.388 -.336)"><path d="M17.696 36l-2.082 7.777C12.614 54.98 20.987 66 32.5 66c11.514 0 19.887-11.02 16.886-22.225l-2.07-7.726M37.136 0C36.42 1.773 36 3.75 36 5.783 36 14.187 42.728 21 51.028 21 55.25 21 59.27 19.05 62 16.21"/><circle cx="21.5" cy="19.5" r="6.5"/><path stroke-linecap="square" d="M0 26.118C0 17.398 14.775 0 33 0s33 17.4 33 26.118C66 30.743 51.225 37 33 37S0 30.47 0 26.118z"/></g><g opacity=".75" transform="translate(1 -9) rotate(95 67.61 209.922)"><path d="M17.62 34l-2.024 7.518C12.682 52.348 20.816 63 32 63c11.185 0 19.32-10.653 16.403-21.484l-2.01-7.47M35.09 0C34.405 1.69 34 3.57 34 5.508 34 13.512 40.47 20 48.45 20c4.06 0 7.925-1.858 10.55-4.563"/><circle cx="21.5" cy="19.5" r="6.5"/><path stroke-linecap="square" d="M0 25.412C0 16.93 14.103 0 31.5 0S63 16.93 63 25.412C63 29.912 48.897 36 31.5 36S0 29.647 0 25.412z"/></g><g opacity=".92" transform="translate(1 -9) scale(1 -1) rotate(31 185.697 121.998)"><path d="M15.388 31l-1.844 6.74C10.887 47.45 18.302 57 28.5 57s17.614-9.55 14.956-19.26l-1.833-6.698M31.96 0C31.356 1.52 31 3.214 31 4.957 31 12.16 36.693 18 43.716 18c3.573 0 6.974-1.672 9.284-4.106"/><circle cx="18.5" cy="16.5" r="5.5"/><path stroke-linecap="square" d="M0 22.588C0 15.048 12.76 0 28.5 0S57 15.048 57 22.588c0 4-12.76 9.412-28.5 9.412S0 26.353 0 22.588z"/></g><g opacity=".97" transform="translate(1 -9) rotate(-143 529.822 220.37)"><path d="M0 26h6M6 6l5 5m30-5l-5 5M5 47l6-6m32 6l-6-6m5-15h6M18 4l-4-4m16 4l4-4m-2.545 8C37.102 11.52 41 18.64 41 26.88 41 38.56 33.205 48 23.5 48S6 38.56 6 26.88c0-8.24 3.898-15.36 9.545-18.8M24 11v37"/><circle cx="16" cy="19" r="3" stroke-linecap="square"/><circle cx="32" cy="19" r="3" stroke-linecap="square"/><circle cx="15" cy="31" r="4" stroke-linecap="square"/><circle cx="33" cy="31" r="4" stroke-linecap="square"/><path stroke-linecap="square" d="M24 2c-4.12 0-7.446 3.058-8 6.942 0 0 4.04 3.058 8 3.058s8-2.975 8-3.058C31.446 5.058 28.12 2 24 2z"/></g><g opacity=".91" transform="translate(1 -9) scale(-1 1) rotate(39 -2137.417 -1499.277)"><path d="M0 27h7M7 7l6 6m31-6l-6 6M5 48l6-6m34 6l-6-6m4-15h7M19 4l-4-4m16 4l4-4m-1.09 8C39.88 11.696 44 19.172 44 27.824 44 40.088 35.76 50 25.5 50S7 40.088 7 27.824c0-8.652 4.12-16.128 10.09-19.74M25 12v38"/><circle cx="16.5" cy="20.5" r="3.5" stroke-linecap="square"/><circle cx="33.5" cy="20.5" r="3.5" stroke-linecap="square"/><circle cx="16" cy="32" r="4" stroke-linecap="square"/><circle cx="34" cy="32" r="4" stroke-linecap="square"/><path stroke-linecap="square" d="M25.5 2c-4.376 0-7.91 3.058-8.5 6.942 0 0 4.292 3.058 8.5 3.058S34 9.025 34 8.942C33.41 5.058 29.876 2 25.5 2z"/></g><g opacity=".77" transform="translate(1 -9) rotate(-9 2393.508 -6415.031)"><path d="M0 29h7M7 7l6 6m34-6l-6 6M5 53l7-7m37 7l-7-7m5-17h7M20 4l-4-4m17 4l4-4m-.91 9C42.546 12.96 47 20.97 47 30.24 47 43.38 38.09 54 27 54S7 43.38 7 30.24c0-9.27 4.455-17.28 10.91-21.15M27 13v41"/><circle cx="17.5" cy="21.5" r="3.5" stroke-linecap="square"/><circle cx="35.5" cy="21.5" r="3.5" stroke-linecap="square"/><circle cx="17.5" cy="35.5" r="4.5" stroke-linecap="square"/><circle cx="36.5" cy="35.5" r="4.5" stroke-linecap="square"/><path stroke-linecap="square" d="M27 2c-4.634 0-8.376 3.364-9 7.636 0 0 4.545 3.364 9 3.364s9-3.273 9-3.364C35.376 5.364 31.634 2 27 2z"/></g><g opacity=".77" transform="translate(1 -9) rotate(-9 6176.073 -6961.14)"><path d="M0 29h7M7 7l6 6m34-6l-6 6M5 53l7-7m37 7l-7-7m5-17h7M20 4l-4-4m17 4l4-4m-.91 9C42.546 12.96 47 20.97 47 30.24 47 43.38 38.09 54 27 54S7 43.38 7 30.24c0-9.27 4.455-17.28 10.91-21.15M27 13v41"/><circle cx="17.5" cy="21.5" r="3.5" stroke-linecap="square"/><circle cx="35.5" cy="21.5" r="3.5" stroke-linecap="square"/><circle cx="17.5" cy="35.5" r="4.5" stroke-linecap="square"/><circle cx="36.5" cy="35.5" r="4.5" stroke-linecap="square"/><path stroke-linecap="square" d="M27 2c-4.634 0-8.376 3.364-9 7.636 0 0 4.545 3.364 9 3.364s9-3.273 9-3.364C35.376 5.364 31.634 2 27 2z"/></g><g opacity=".97" transform="translate(1 -9) rotate(16 -2873.944 3386.783)"><path d="M0 35h9M9 9l7 7m41-7l-7 7M7 64l8-8m44 8l-8-8m6-21h9M25 5l-5-5m21 5l5-5m-2.09 11C51.654 15.84 57 25.63 57 36.96 57 53.02 46.31 66 33 66S9 53.02 9 36.96c0-11.33 5.345-21.12 13.09-25.85M33 15v51"/><circle cx="22.5" cy="26.5" r="4.5" stroke-linecap="square"/><circle cx="44.5" cy="26.5" r="4.5" stroke-linecap="square"/><circle cx="20.5" cy="42.5" r="5.5" stroke-linecap="square"/><circle cx="45.5" cy="42.5" r="5.5" stroke-linecap="square"/><path stroke-linecap="square" d="M33 2c-5.663 0-10.238 3.975-11 9.025 0 0 5.554 3.975 11 3.975s11-3.868 11-3.975C43.238 5.975 38.663 2 33 2z"/></g><g opacity=".87" transform="translate(1 -9) scale(1 -1) rotate(89 666.743 -158.14)"><path d="M0 31h8M8 8l6 6m37-6l-6 6M6 57l7-7m40 7l-7-7m5-19h8M23 5l-5-5m19 5l5-5m-2.727 10C46.21 14.312 51 23.034 51 33.128 51 47.436 41.423 59 29.5 59S8 47.436 8 33.128c0-10.094 4.79-18.816 11.727-23.03M30 14v45"/><circle cx="20" cy="24" r="4" stroke-linecap="square"/><circle cx="39" cy="24" r="4" stroke-linecap="square"/><circle cx="19" cy="38" r="5" stroke-linecap="square"/><circle cx="40" cy="38" r="5" stroke-linecap="square"/><path stroke-linecap="square" d="M30 2c-5.15 0-9.307 3.67-10 8.33 0 0 5.05 3.67 10 3.67s10-3.57 10-3.67C39.307 5.67 35.15 2 30 2z"/></g><g opacity=".9" transform="translate(1 -9) scale(-1 1) rotate(-69 -99.152 647.487)"><path d="M0 33h8M8 8l7 7m39-7l-7 7M6 60l8-8m42 8l-8-8m6-19h8M24 5l-5-5m19 5l5-5m-2.273 10C47.99 14.576 53 23.832 53 34.544 53 49.728 42.977 62 30.5 62S8 49.728 8 34.544c0-10.712 5.01-19.968 12.273-24.44M31 14v48"/><circle cx="21" cy="25" r="4" stroke-linecap="square"/><circle cx="41" cy="25" r="4" stroke-linecap="square"/><circle cx="19" cy="40" r="5" stroke-linecap="square"/><circle cx="42" cy="40" r="5" stroke-linecap="square"/><path stroke-linecap="square" d="M31.5 2c-5.406 0-9.772 3.975-10.5 9.025 0 0 5.302 3.975 10.5 3.975S42 11.132 42 11.025C41.272 5.975 36.906 2 31.5 2z"/></g><g opacity=".81" transform="translate(1 -9) scale(1 -1) rotate(11 5071.29 1435.31)"><path d="M0 26h6M6 6l5 5m30-5l-5 5M5 47l6-6m32 6l-6-6m5-15h6M18 4l-4-4m16 4l4-4m-2.545 8C37.102 11.52 41 18.64 41 26.88 41 38.56 33.205 48 23.5 48S6 38.56 6 26.88c0-8.24 3.898-15.36 9.545-18.8M24 11v37"/><circle cx="16" cy="19" r="3" stroke-linecap="square"/><circle cx="32" cy="19" r="3" stroke-linecap="square"/><circle cx="15" cy="31" r="4" stroke-linecap="square"/><circle cx="33" cy="31" r="4" stroke-linecap="square"/><path stroke-linecap="square" d="M24 2c-4.12 0-7.446 3.058-8 6.942 0 0 4.04 3.058 8 3.058s8-2.975 8-3.058C31.446 5.058 28.12 2 24 2z"/></g><g opacity=".76" transform="translate(1 -9) rotate(55 159.358 751.69)"><path d="M0 36h9M9 9l7 7m42-7l-7 7M7 65l8-8m46 8l-8-8m6-21h9M25 5l-5-5m22 5l5-5m-1.636 11C53.432 16.016 59 26.162 59 37.904 59 54.548 47.864 68 34 68S9 54.548 9 37.904c0-11.742 5.568-21.888 13.636-26.79M34 16v52"/><circle cx="22.5" cy="27.5" r="4.5" stroke-linecap="square"/><circle cx="45.5" cy="27.5" r="4.5" stroke-linecap="square"/><circle cx="21.5" cy="44.5" r="5.5" stroke-linecap="square"/><circle cx="46.5" cy="44.5" r="5.5" stroke-linecap="square"/><path stroke-linecap="square" d="M34.5 2C28.58 2 23.797 6.28 23 11.72c0 0 5.807 4.28 11.5 4.28S46 11.835 46 11.72C45.203 6.28 40.42 2 34.5 2z"/></g><g opacity=".76" transform="translate(1 -9) rotate(-47 562.04 -314.855)"><path d="M0 38h9M9 9l8 8m45-8l-8 8M7 69l9-9m48 9l-9-9m7-22h9M27 6l-6-6m23 6l6-6m-3.182 12C55.208 17.192 61 27.694 61 39.848 61 57.076 49.418 71 35 71S9 57.076 9 39.848c0-12.154 5.79-22.656 14.182-27.73M36 17v54"/><circle cx="23.5" cy="28.5" r="4.5" stroke-linecap="square"/><circle cx="47.5" cy="28.5" r="4.5" stroke-linecap="square"/><circle cx="23" cy="46" r="6" stroke-linecap="square"/><circle cx="49" cy="46" r="6" stroke-linecap="square"/><path stroke-linecap="square" d="M36 2c-6.178 0-11.168 4.28-12 9.72 0 0 6.06 4.28 12 4.28s12-4.165 12-4.28C47.168 6.28 42.178 2 36 2z"/></g><g opacity=".72" transform="translate(1 -9) scale(-1 1) rotate(26 -620.627 -553.967)"><path d="M0 36h9M9 9l7 7m42-7l-7 7M7 65l8-8m46 8l-8-8m6-21h9M25 5l-5-5m22 5l5-5m-1.636 11C53.432 16.016 59 26.162 59 37.904 59 54.548 47.864 68 34 68S9 54.548 9 37.904c0-11.742 5.568-21.888 13.636-26.79M34 16v52"/><circle cx="22.5" cy="27.5" r="4.5" stroke-linecap="square"/><circle cx="45.5" cy="27.5" r="4.5" stroke-linecap="square"/><circle cx="21.5" cy="44.5" r="5.5" stroke-linecap="square"/><circle cx="46.5" cy="44.5" r="5.5" stroke-linecap="square"/><path stroke-linecap="square" d="M34.5 2C28.58 2 23.797 6.28 23 11.72c0 0 5.807 4.28 11.5 4.28S46 11.835 46 11.72C45.203 6.28 40.42 2 34.5 2z"/></g><g opacity=".72" transform="translate(1 -9) scale(1 -1) rotate(10 1335.22 373.091)"><path d="M0 31h8M8 8l6 6m36-6l-6 6M6 56l7-7m39 7l-7-7m5-18h8M22 5l-5-5m19 5l5-5m-1.727 10C46.21 14.224 51 22.768 51 32.656 51 46.672 41.423 58 29.5 58S8 46.672 8 32.656c0-9.888 4.79-18.432 11.727-22.56M29 14v44"/><circle cx="19" cy="23" r="4" stroke-linecap="square"/><circle cx="39" cy="23" r="4" stroke-linecap="square"/><circle cx="19" cy="38" r="5" stroke-linecap="square"/><circle cx="40" cy="38" r="5" stroke-linecap="square"/><path stroke-linecap="square" d="M29 2c-5.15 0-9.307 3.67-10 8.33 0 0 5.05 3.67 10 3.67s10-3.57 10-3.67C38.307 5.67 34.15 2 29 2z"/></g><g opacity=".92"><path d="M1432.53 319.287l-16.873-2.07"/><path stroke-linecap="square" d="M1420.445 294.63l12.295 25.187-18.023 21.464 10.828 1.33c7.175.88 13.693-4.1 14.555-11.12l2.604-21.2c.863-7.02-4.256-13.43-11.43-14.32l-10.83-1.33zm-10.865 22.847c-1.145 9.32-9.69 15.938-19.087 14.784l-12.76-1.56 7.415-7.65-5.345-9.22 7.417-7.65-5.345-9.22 12.76 1.57c9.4 1.16 16.09 9.65 14.945 18.97z"/></g><g opacity=".81"><path d="M1181.88 954.606l-17.933 1.57"/><path stroke-linecap="square" d="M1168.032 979.91l13.122-25.24-17.306-22.578 10.868-.95c7.202-.63 13.552 4.697 14.182 11.9l1.9 21.735c.63 7.2-4.697 13.55-11.9 14.182l-10.866.95zm-11.014-22.627c-.843-9.628-9.426-16.742-19.172-15.89l-13.236 1.16 7.38 8.136-5.854 9.29 7.38 8.14-5.855 9.29 13.24-1.16c9.75-.86 16.97-9.35 16.12-18.98z"/></g><g opacity=".97"><path d="M1426.327 554.498l-16.444 7.322"/><path stroke-linecap="square" d="M1401.542 538.167l24.498 15.91-4.568 28.854 10.38-4.62c6.88-3.06 10.025-11.01 7.023-17.75l-9.06-20.34c-3-6.74-11.013-9.72-17.892-6.66l-10.38 4.63zm1.54 25.586c4.043 9.082.076 19.67-8.862 23.65l-12.137 5.403 2.408-10.924-9.73-5.52 2.41-10.924-9.73-5.52 12.14-5.404c8.94-3.98 19.46.157 23.51 9.24z"/></g><g opacity=".84"><path d="M774.35 737.12l13.997.244"/><path stroke-linecap="square" d="M786.68 718.332l-12.43 19.286 11.748 19.708-8.635-.15c-5.723-.1-10.28-4.944-10.177-10.817l.31-17.73c.102-5.88 4.825-10.56 10.547-10.46l8.636.15zm6.648 20.12c-.135 7.73 6.15 14.108 14.04 14.246l10.712.187-5.234-7.093 5.48-6.905-5.236-7.092 5.48-6.906-10.714-.19c-7.89-.14-14.393 6.02-14.528 13.75z"/></g><g opacity=".84"><path d="M312.35 918.12l13.996.243"/><path stroke-linecap="square" d="M324.678 899.33l-12.43 19.287L324 938.325l-8.635-.15c-5.723-.1-10.28-4.943-10.177-10.816l.31-17.73c.102-5.88 4.825-10.56 10.547-10.46l8.635.15zm6.65 20.12c-.135 7.73 6.15 14.11 14.04 14.247l10.712.187-5.234-7.092 5.478-6.906-5.234-7.092 5.48-6.906-10.714-.187c-7.89-.13-14.393 6.02-14.528 13.75z"/></g><g opacity=".99"><path d="M1166.385 190.146l-3.15-13.64"/><path stroke-linecap="square" d="M1182.2 174.18l-16.138 16.788-21.864-8.015 2.045 8.858c1.356 5.87 7.095 9.56 12.818 8.24l17.28-3.99c5.73-1.32 9.27-7.15 7.91-13.02l-2.04-8.86zm-21.063-2.322c-7.534 1.74-15.08-3.082-16.855-10.77l-2.41-10.44 8.025 3.646 5.616-6.795 8.026 3.64 5.61-6.8 2.41 10.44c1.77 7.68-2.9 15.33-10.43 17.06z"/></g><g opacity=".76"><path d="M888.047 891.355l-4.355-17.466"/><path stroke-linecap="square" d="M859.92 881.878l28.105 9.39 20.41-21.486 2.748 11.026c1.822 7.307-2.626 14.708-9.933 16.53l-22.052 5.498c-7.307 1.822-14.708-2.625-16.53-9.932l-2.75-11.026zm22.08-14.78c9.645-2.406 15.484-12.298 13.04-22.098l-3.317-13.307-7.074 8.83-10.4-4.475-7.08 8.83-10.39-4.476 3.32 13.307c2.44 9.8 12.24 15.79 21.89 13.38z"/></g><g opacity=".94"><path d="M772.56 982.905l-4.787-13.155"/><path stroke-linecap="square" d="M786.31 965.13l-13.718 17.86-21.99-4.863 2.954 8.116c1.958 5.378 7.905 8.15 13.284 6.194l16.23-5.908c5.38-1.96 8.152-7.91 6.195-13.29l-2.954-8.12zm-20.247-.08c-7.266 2.646-15.256-.98-17.847-8.098l-3.518-9.665 8.337 2.438 4.82-7.227 8.336 2.44 4.82-7.228 3.52 9.666c2.59 7.117-1.2 15.03-8.46 17.675z"/></g><g opacity=".92"><path d="M720.713 740.375l8.388 12.436"/><path stroke-linecap="square" d="M745.392 739.41l-25.297.943-10.352 23.102-5.337-7.913c-3.538-5.245-2.053-12.433 3.317-16.054l16.204-10.93c5.37-3.622 12.59-2.306 16.127 2.938l5.338 7.914zm-13.35 18.655c-7.098 4.787-8.988 14.394-4.223 21.458l6.47 9.593 3.19-9.13 9.66.463 3.19-9.14 9.66.46-6.47-9.6c-4.77-7.07-14.39-8.91-21.48-4.13z"/></g><g opacity=".73"><path d="M671.188 630.982l13.715 8.24"/><path stroke-linecap="square" d="M694.004 620.192l-23.074 11.22.927 25.64-8.57-5.152c-5.682-3.413-7.583-10.68-4.247-16.233l10.066-16.753c3.336-5.552 10.646-7.285 16.326-3.872l8.572 5.15zm-5.073 22.035c-4.4 7.338-1.84 16.975 5.74 21.526l10.29 6.18-1.15-9.732 9.14-3.55-1.15-9.73 9.14-3.55-10.28-6.18c-7.58-4.55-17.29-2.29-21.7 5.05z"/></g><g opacity=".77"><path d="M690.79 409.823l14.345-4.385"/><path stroke-linecap="square" d="M709.07 425.15l-18.773-15.698 6.786-23.512-9.13 2.79c-6.048 1.85-9.49 8.138-7.683 14.043l5.448 17.822c1.806 5.906 8.174 9.194 14.224 7.345l9.128-2.79zm.847-21.174c-2.423-7.923 2.22-16.364 10.368-18.855l11.066-3.38-3.34 8.87 7.73 5.48-3.34 8.87 7.73 5.48-11.06 3.39c-8.15 2.49-16.72-1.91-19.14-9.83z"/></g><g opacity=".92"><path d="M540.64 985.28l-11.315 1.79"/><path stroke-linecap="square" d="M533.204 1002.404l7.38-17.48-12.42-14.34 7.07-1.12c4.687-.744 9.102 2.54 9.86 7.333l2.292 14.464c.76 4.8-2.425 9.28-7.11 10.03l-7.072 1.12zM524.32 987.5c-1.02-6.443-6.914-10.864-13.163-9.875l-8.485 1.344 5.167 5.16-3.32 6.5 5.16 5.16-3.32 6.5 8.48-1.35c6.25-.99 10.48-7.02 9.46-13.46z"/></g><g opacity=".81"><path d="M392.35 241.663l13.788 2.43"/><path stroke-linecap="square" d="M400.696 263.443l-9.06-21.906 16.006-17.486-8.953-1.57c-5.94-1.04-11.6 2.92-12.64 8.85l-3.16 17.91c-1.05 5.94 2.91 11.59 8.85 12.64l8.95 1.58zm10.453-18.973c1.39-7.887 8.81-13.17 16.58-11.8l10.55 1.862-6.54 6.21 4.01 8.07-6.54 6.21 4.01 8.07-10.55-1.86c-7.77-1.37-12.94-8.875-11.55-16.762z"/></g><g opacity=".75"><path d="M423.247 124.424l18.27 8.134"/><path stroke-linecap="square" d="M427.795 156.004l-4.714-31.654 26.68-17.678-11.21-4.99c-7.43-3.31-16.13.033-19.44 7.463l-9.98 22.423c-3.3 7.43.04 16.136 7.47 19.444l11.21 4.992zm20.32-21.055c4.382-9.84 16.112-14.18 26.203-9.68l13.704 6.1-10.818 5.85 2.886 11.95-10.817 5.85L472.16 167l-13.704-6.102c-10.092-4.493-14.72-16.11-10.34-25.95z"/></g><g opacity=".75"><path d="M1376.118 29.732l18.27 8.135"/><path stroke-linecap="square" d="M1380.666 61.312l-4.714-31.654 26.678-17.677-11.212-4.99c-7.43-3.31-16.136.04-19.444 7.47l-9.984 22.43c-3.308 7.43.034 16.14 7.464 19.45l11.212 4.99zm20.32-21.055c4.38-9.84 16.112-14.172 26.203-9.68l13.7 6.102-10.82 5.85 2.88 11.96-10.82 5.85 2.88 11.95-13.71-6.1c-10.09-4.5-14.72-16.11-10.34-25.95z"/></g><path d="M193.278 1023.703l5.917 12.688"/><path stroke-linecap="square" d="M180.223 1043.03l12.748-19.986 23.51 3.082-3.84-8.24c-2.54-5.46-9.04-7.822-14.5-5.276l-16.48 7.684c-5.46 2.546-7.82 9.038-5.27 14.498l3.85 8.24zm21.538-2.32c7.26-3.383 15.85-.33 19.18 6.82l4.53 9.71-8.83-1.79-4.3 7.92-8.83-1.792-4.3 7.92-4.52-9.71c-3.33-7.152-.15-15.692 7.1-19.077z"/><g opacity=".95"><path d="M21.165 333.743l18.17 5.556"/><path stroke-linecap="square" d="M29.82 363.578l-8.683-30.366 24.18-20.318-11.737-3.59c-7.778-2.377-15.976 1.885-18.31 9.52L8.227 341.86c-2.334 7.634 2.08 15.752 9.857 18.13l11.737 3.588zm16.355-22.71c3.15-10.3 14.02-16.106 24.28-12.97l13.936 4.262-9.81 7.194 4.12 11.454L68.88 358l4.116 11.456-13.934-4.26c-10.262-3.138-16.03-14.03-12.88-24.33z"/></g><g opacity=".71"><path d="M37.12 276.777L31.833 264.9"/><path stroke-linecap="square" d="M49.09 259.406l-11.785 17.786-21.103-3.143 3.328 7.47c2.205 4.95 8.01 7.18 12.963 4.97l14.95-6.66c4.952-2.21 7.18-8.01 4.975-12.97l-3.328-7.47zm-19.29.927c-6.56 2.92-14.27-.088-17.223-6.72l-4.01-9.004 7.944 1.85 3.94-7.15 7.95 1.86 3.94-7.15 4.01 9c2.96 6.63.03 14.37-6.53 17.29z"/></g><path d="M1435.82 363.558l6.143 31.6c1.04 5.347-2.486 10.572-7.833 11.612l-41.322 8.032-9.922-51.045 41.322-8.032c5.347-1.04 10.573 2.486 11.612 7.833zm-69.378 30.9l9.816-1.907m-5.372 14.29l9.816-1.91m-14.586-22.63l9.816-1.91m6.954-16.63l-2.29-11.78 14.725-2.86c2.7-.52 5.32 1.17 5.83 3.76l1.38 7.07" stroke-linecap="square" opacity=".99"/><path d="M1370.05 490.656l-16.097 12.577c-2.724 2.13-3.21 6.1-1.083 8.823l16.447 21.05 26.004-20.316-16.44-21.05c-2.13-2.725-6.1-3.212-8.82-1.084zm20.495 43.633l-3.694-4.73m-3.84 8.07l-3.69-4.73m16.3-5.13l-3.69-4.73m3.4-10.27l6.31-4.93-6-7.69c-1.1-1.41-3.13-1.67-4.52-.59l-3.78 2.95" stroke-linecap="square" opacity=".93"/><path d="M982.1 925.432l-8.418 25.905c-1.424 4.384.997 9.136 5.38 10.56l33.877 11.008 13.59-41.847-33.88-11.007c-4.39-1.42-9.14 1-10.56 5.39zm55.398 33.372l-7.608-2.472m2.616 11.364l-7.608-2.472m14.098-17.5l-7.61-2.472m-4.85-14.194l3.4-10.462-12.127-3.94c-2.23-.722-4.66.57-5.41 2.872l-2.04 6.277" stroke-linecap="square" opacity=".97"/><path d="M837.297 505.094l13.122 21c2.22 3.553 1.2 8.232-2.27 10.397l-26.78 16.74-21.2-33.92 26.77-16.73c3.46-2.16 8.11-1.03 10.33 2.53zm-40.4 41.023l5.937-3.71m1.06 11.13l5.935-3.708m-16.01-12.41l5.93-3.71m.42-14.42l-4.77-7.64 9.54-5.96c1.75-1.1 4.04-.62 5.09 1.06l2.86 4.58m545.4-434.25l13.12 21c2.22 3.55 1.2 8.23-2.27 10.4l-26.78 16.73-21.2-33.92 26.77-16.73c3.46-2.17 8.11-1.03 10.34 2.52zm-40.4 41.02l5.93-3.71m1.06 11.13l5.93-3.71m-16.01-12.41l5.93-3.71m.42-14.42l-4.77-7.64 9.54-5.96c1.75-1.09 4.04-.61 5.09 1.07l2.86 4.58" stroke-linecap="square" opacity=".94"/><path d="M803.09 120.056l23.925-11.67c4.05-1.974 5.746-6.902 3.77-10.95l-15.258-31.288-38.65 18.85 15.26 31.287c1.976 4.048 6.904 5.745 10.953 3.77zm-13.43-61.32l3.507 7.192m6.358-9.777l3.507 7.19m-22.382 2.02l3.507 7.19M776.877 85l-8.987 4.385 5.26 10.785c.965 1.978 3.372 2.806 5.35 1.842l5.392-2.63" stroke-linecap="square" opacity=".85"/><path d="M649.21 480.068l9.836 19.306c1.664 3.267.353 7.302-2.914 8.966l-25.245 12.863-15.89-31.185 25.246-12.863c3.267-1.665 7.302-.354 8.966 2.913zm-39.406 32.798l6.237-3.178m-.36 10.29l6.24-3.18m-13.96-11.968l6.24-3.178m.81-11.634l-3.63-7.128 8.69-4.426c1.59-.812 3.55-.193 4.35 1.375l2.18 4.27" stroke-linecap="square" opacity=".74"/><path d="M506.192 444.96l5.02 23.616c.85 3.996-1.725 7.96-5.722 8.81l-30.88 6.565-8.11-38.14 30.882-6.56c3.996-.85 7.96 1.73 8.81 5.72zm-51.954 24.92l6.847-1.457m-3.02 9.843l6.847-1.455m-10.797-17.13l6.847-1.45m5.538-12.42l-1.87-8.81 11.003-2.34c2.018-.42 4.005.81 4.417 2.75l1.122 5.28" stroke-linecap="square" opacity=".71"/><path d="M445.818 823.03l30.482-5.376c5.158-.91 10.123 2.567 11.033 7.725l7.028 39.86-49.24 8.68-7.02-39.86c-.91-5.16 2.57-10.13 7.73-11.04zm28.728 68.044l-1.736-9.848m13.207 5.794l-1.737-9.848m-21.9 14.016l-1.735-9.848m-15.524-7.417l-11.81 2.084-2.47-14.034c-.45-2.573 1.3-5.053 3.9-5.51l7.1-1.25" stroke-linecap="square" opacity=".77"/><path d="M218.244 451.166L202 469.854c-2.75 3.162-2.412 8 .75 10.75l24.44 21.242 26.24-30.188-24.437-21.244c-3.163-2.75-8-2.41-10.75.752zm34.24 47.494l-6.038-5.25m-1.376 10.73l-6.038-5.248m18.503-9.09l-6.037-5.25m1.933-12.894l6.57-7.548-8.49-7.38c-1.55-1.35-4.01-1.1-5.45.56l-3.93 4.53" stroke-linecap="square" opacity=".83"/><g stroke-linecap="square" opacity=".92" transform="translate(1 -9) scale(-1 1) rotate(35 -2191.815 -1410.983)"><path d="M21 21c0-2.2-1.8-4-4-4s-4 1.8-4 4m31 0c0-2.2-1.8-4-4-4s-4 1.8-4 4"/><circle cx="28.5" cy="28.5" r="28.5"/><path d="M43 30c0 8.25-6.75 15-15 15s-15-6.75-15-15h30z"/></g><g stroke-linecap="square" opacity=".83" transform="translate(1 -9) rotate(-158 576.435 370.989)"><path d="M20 21c0-2.2-1.575-4-3.5-4S13 18.8 13 21m29 0c0-2.2-1.575-4-3.5-4S35 18.8 35 21"/><circle cx="28" cy="28" r="28"/><path d="M43 30c0 8.25-6.75 15-15 15s-15-6.75-15-15h30z"/></g><g stroke-linecap="square" opacity=".97" transform="translate(1 -9) rotate(138 610.083 499.223)"><path d="M27 27c0-2.75-2.25-5-5-5s-5 2.25-5 5m40 0c0-2.75-2.25-5-5-5s-5 2.25-5 5"/><circle cx="37" cy="37" r="37"/><path d="M56 39c0 11-8.775 20-19.5 20S17 50 17 39h39z"/></g><g stroke-linecap="square" opacity=".94" transform="translate(1 -9) scale(-1 1) rotate(89 -618.424 -411.584)"><path d="M24 24c0-2.2-2.025-4-4.5-4S15 21.8 15 24m36 0c0-2.2-2.025-4-4.5-4S42 21.8 42 24"/><circle cx="33" cy="33" r="33"/><path d="M50 35c0 9.9-7.875 18-17.5 18S15 44.9 15 35h35z"/></g><g stroke-linecap="square" opacity=".9" transform="translate(1 -9) scale(1 -1) rotate(-87 381.502 -497.146)"><path d="M22 22c0-2.2-1.8-4-4-4s-4 1.8-4 4m31 0c0-2.2-1.8-4-4-4s-4 1.8-4 4"/><circle cx="29.5" cy="29.5" r="29.5"/><path d="M45 31c0 8.8-6.975 16-15.5 16S14 39.8 14 31h31z"/></g><g stroke-linecap="square" opacity=".79" transform="translate(1 -9) rotate(-66 1208.747 -75.415)"><path d="M19 19c0-1.65-1.575-3-3.5-3S12 17.35 12 19m28 0c0-1.65-1.575-3-3.5-3S33 17.35 33 19"/><circle cx="26" cy="26" r="26"/><path d="M40 28c0 7.7-6.3 14-14 14s-14-6.3-14-14h28z"/></g><g stroke-linecap="square" opacity=".76" transform="translate(1 -9) scale(1 -1) rotate(-41 -738.478 -1387.286)"><path d="M22 21c0-2.2-1.8-4-4-4s-4 1.8-4 4m31 0c0-2.2-1.8-4-4-4s-4 1.8-4 4"/><circle cx="29" cy="29" r="29"/><path d="M45 31c0 8.25-6.975 15-15.5 15S14 39.25 14 31h31z"/></g><g stroke-linecap="square" opacity=".95" transform="translate(1 -9) scale(-1 1) rotate(-16 874.1 2658.704)"><path d="M22 22c0-2.2-1.8-4-4-4s-4 1.8-4 4m31 0c0-2.2-1.8-4-4-4s-4 1.8-4 4"/><circle cx="29.5" cy="29.5" r="29.5"/><path d="M45 31c0 8.8-6.975 16-15.5 16S14 39.8 14 31h31z"/></g><g stroke-linecap="square" opacity=".99" transform="translate(1 -9) rotate(-42 1060.81 -546.27)"><path d="M26 26c0-2.75-2.025-5-4.5-5S17 23.25 17 26m37 0c0-2.75-2.025-5-4.5-5S45 23.25 45 26"/><circle cx="35.5" cy="35.5" r="35.5"/><path d="M55 38c0 10.45-8.55 19-19 19s-19-8.55-19-19h38z"/></g><g stroke-linecap="square" opacity=".87" transform="translate(1 -9) rotate(-154 388.046 21.85)"><path d="M19 18c0-1.65-1.575-3-3.5-3S12 16.35 12 18m27 0c0-1.65-1.575-3-3.5-3S32 16.35 32 18"/><circle cx="25.5" cy="25.5" r="25.5"/><path d="M39 27c0 7.7-6.075 14-13.5 14S12 34.7 12 27h27z"/></g><g stroke-linecap="square" opacity=".85" transform="translate(1 -9) scale(1 -1) rotate(-22 -1115.3 -1636.949)"><path d="M20 21c0-2.2-1.575-4-3.5-4S13 18.8 13 21m29 0c0-2.2-1.575-4-3.5-4S35 18.8 35 21"/><circle cx="27.5" cy="27.5" r="27.5"/><path d="M42 29c0 8.25-6.525 15-14.5 15S13 37.25 13 29h29z"/></g><g stroke-linecap="square" opacity=".95" transform="translate(1 -9) rotate(113 212.167 286.423)"><path d="M27 27c0-2.75-2.25-5-5-5s-5 2.25-5 5m39 0c0-2.75-2.25-5-5-5s-5 2.25-5 5"/><circle cx="36.5" cy="36.5" r="36.5"/><path d="M56 39c0 10.45-8.775 19-19.5 19S17 49.45 17 39h39z"/></g><g stroke-linecap="square" opacity=".95" transform="translate(1 -9) scale(-1 1) rotate(-50 -11.645 587.008)"><path d="M19 20c0-2.2-1.575-4-3.5-4S12 17.8 12 20m29 0c0-2.2-1.575-4-3.5-4S34 17.8 34 20"/><circle cx="26.5" cy="26.5" r="26.5"/><path d="M40 28c0 7.7-6.3 14-14 14s-14-6.3-14-14h28z"/></g><g stroke-linecap="square" opacity=".89" transform="translate(1 -9) scale(1 -1) rotate(-11 -4583.72 -1380.083)"><path d="M20 21c0-2.2-1.575-4-3.5-4S13 18.8 13 21m29 0c0-2.2-1.575-4-3.5-4S35 18.8 35 21"/><circle cx="28" cy="28" r="28"/><path d="M43 30c0 8.25-6.75 15-15 15s-15-6.75-15-15h30z"/></g><g stroke-linecap="square" opacity=".96" transform="translate(1 -9) scale(1 -1) rotate(-50 -43.84 -207.265)"><path d="M24 24c0-2.2-2.025-4-4.5-4S15 21.8 15 24m36 0c0-2.2-2.025-4-4.5-4S42 21.8 42 24"/><circle cx="33" cy="33" r="33"/><path d="M50 35c0 9.9-7.875 18-17.5 18S15 44.9 15 35h35z"/></g><g stroke-linecap="square" opacity=".74" transform="translate(1 -9) rotate(-95 455.6 361.541)"><path d="M22 22c0-2.2-1.8-4-4-4s-4 1.8-4 4m31 0c0-2.2-1.8-4-4-4s-4 1.8-4 4"/><circle cx="29.5" cy="29.5" r="29.5"/><path d="M45 31c0 8.8-6.975 16-15.5 16S14 39.8 14 31h31z"/></g><g stroke-linecap="square" opacity=".8" transform="translate(1 -9) rotate(41 -1103.446 469.134)"><path d="M19 19c0-1.65-1.575-3-3.5-3S12 17.35 12 19m28 0c0-1.65-1.575-3-3.5-3S33 17.35 33 19"/><circle cx="26" cy="26" r="26"/><path d="M40 28c0 7.7-6.3 14-14 14s-14-6.3-14-14h28z"/></g><g opacity=".87"><path d="M1421.482 612.79c.533-.41 1.023-.71 1.622-.964 4.116-1.748 8.978.344 10.805 4.647 1.82 4.304-.05 9.254-4.17 11-.6.255-1.23.43-1.82.497"/><path stroke-linecap="square" d="M1397.224 611.947c-1.504-3.544-5.575-5.238-9.047-3.764l-4.734 2.01m19.304-.59c-1.504-3.544.106-7.65 3.577-9.123l4.734-2.01m.623 47.536c1.51 3.544-.1 7.65-3.57 9.123l-4.73 2m13.84-13.48c1.51 3.54 5.58 5.23 9.05 3.76l4.74-2.01m-44.94-8.63c-4.01-9.45.53-20.32 10.19-24.42l4.75-2.02c9.66-4.1 20.64.19 24.65 9.63 4.01 9.44-.53 20.32-10.19 24.42l-4.75 2.01c-9.66 4.1-20.63-.19-24.64-9.64z"/></g><g opacity=".9"><path d="M1341.9 780.88c.704.217 1.324.34 2.04.377 4.91.258 9.14-3.576 9.4-8.52.26-4.943-3.547-9.198-8.46-9.455-.714-.038-1.433.015-2.067.162"/><path stroke-linecap="square" d="M1318.34 790.93c-.2 3.845-3.447 6.83-7.214 6.632l-5.135-.27m20.34-5.943c-.2 3.84 2.72 7.15 6.48 7.35l5.14.26m-17.56-46.99c.2-3.85-2.71-7.15-6.48-7.35l-5.13-.27m19.61 8.03c.2-3.85 3.45-6.83 7.22-6.63l5.14.27m-40.33 24.42c-.56 10.8 7.59 19.92 18.32 20.49l5.28.27c10.72.56 19.79-7.66 20.35-18.46.57-10.8-7.59-19.93-18.31-20.49l-5.27-.28c-10.72-.57-19.78 7.66-20.35 18.46z"/></g><g opacity=".75"><path d="M963.22 217.675c-.327-.808-.534-1.526-.65-2.363-.81-5.757 3.207-11.124 8.925-11.928 5.72-.804 11.06 3.248 11.87 9.005.117.83.13 1.68.026 2.45"/><path stroke-linecap="square" d="M953.79 246.265c-4.356.613-7.384 4.933-6.728 9.602l.894 6.366m4.722-23.89c-4.358.612-8.46-2.706-9.115-7.374l-.895-6.37m57.666 15.12c4.357-.61 8.46 2.7 9.115 7.37l.89 6.36m-11.12-21.66c4.35-.62 7.38-4.94 6.73-9.6l-.9-6.37m-25.15 51c-12.63 1.77-24.23-7.09-26.02-19.89l-.89-6.3c-1.8-12.81 6.9-24.52 19.53-26.3 12.63-1.78 24.22 7.08 26.02 19.89l.88 6.29c1.8 12.8-6.9 24.52-19.53 26.29z"/></g><g opacity=".96"><path d="M857.455 16.17c.453-.583.89-1.04 1.455-1.48 3.876-3.028 9.54-2.314 12.588 1.586 3.048 3.9 2.37 9.57-1.506 12.598-.564.44-1.183.81-1.787 1.054"/><path stroke-linecap="square" d="M832.393 21.45c-2.37-3.035-6.944-3.46-10.164-.944l-4.39 3.43m20.07-6.797c-2.38-3.04-1.68-7.58 1.54-10.09l4.39-3.43m13.17 49.35c2.37 3.03 1.67 7.57-1.55 10.09l-4.39 3.43m11.45-17.83c2.37 3.03 6.94 3.45 10.16.94l4.39-3.43m-48.15 3.35c-6.83-8.74-5.36-21.19 3.29-27.95l4.25-3.33c8.65-6.76 21.08-5.17 27.91 3.57 6.83 8.74 5.36 21.19-3.29 27.95l-4.26 3.32c-8.65 6.76-21.09 5.17-27.92-3.57z"/></g><g opacity=".8"><path d="M835.307 302.836c.868-.02 1.613.036 2.44.212 5.686 1.21 9.403 6.6 8.26 11.98-1.145 5.38-6.732 8.792-12.418 7.583-.83-.17-1.64-.44-2.32-.79"/><path stroke-linecap="square" d="M812.432 285.4c.915-4.305-1.858-8.574-6.162-9.49l-5.868-1.247m20.834 12.608c.914-4.3 5.184-7.07 9.488-6.16l5.87 1.25m-33.518 47.06c-.915 4.31-5.184 7.08-9.488 6.16l-5.87-1.25m24.162-3.04c-.915 4.31 1.858 8.58 6.16 9.49l5.87 1.25m-37.675-39.19c2.594-12.2 14.456-19.93 26.628-17.34l5.986 1.28c12.17 2.59 19.86 14.47 17.27 26.68-2.6 12.21-14.46 19.93-26.63 17.34l-5.99-1.27c-12.17-2.59-19.87-14.47-17.27-26.67z"/></g><g opacity=".71"><path d="M659.444 434.867c.68.287 1.233.592 1.805 1.022 3.92 2.96 4.7 8.61 1.72 12.57-2.98 3.95-8.63 4.76-12.56 1.8-.57-.43-1.09-.94-1.48-1.46"/><path stroke-linecap="square" d="M647.857 412.025c2.317-3.075 1.75-7.448-1.263-9.717l-4.107-3.095m11.76 17.626c2.317-3.08 6.677-3.74 9.69-1.47l4.106 3.09m-43.656 24.7c-2.317 3.07-6.677 3.73-9.69 1.46l-4.107-3.1m20.186 6.44c-2.317 3.07-1.75 7.45 1.263 9.72l4.1 3.09m-15.2-44.64c6.51-8.64 18.62-10.39 27.2-3.93l4.21 3.18c8.57 6.46 10.23 18.59 3.72 27.22s-18.63 10.38-27.2 3.92l-4.22-3.18c-8.58-6.46-10.24-18.59-3.73-27.23z"/></g><g opacity=".89"><path d="M708.597 86.744c.144-.657.327-1.203.622-1.782 2.03-3.984 7.09-5.508 11.26-3.385 4.16 2.122 5.91 7.118 3.88 11.103-.3.58-.67 1.12-1.08 1.55"/><path stroke-linecap="square" d="M689.472 101.69c-3.43-1.748-7.638-.428-9.35 2.932l-2.335 4.582m14.863-13.75c-3.43-1.75-4.836-5.928-3.124-9.29l2.335-4.58m29.69 36.45c3.43 1.748 4.84 5.927 3.13 9.288l-2.33 4.582m2.39-20.107c3.43 1.748 7.64.428 9.35-2.932l2.34-4.582"/><path stroke-linecap="square" d="M697.784 126.127c-9.14-4.657-12.746-15.733-8.094-24.865l2.288-4.49c4.653-9.13 15.733-12.725 24.874-8.067 9.14 4.657 12.746 15.733 8.093 24.864l-2.288 4.49c-4.652 9.13-15.732 12.72-24.873 8.06z"/></g><g opacity=".89"><path d="M1410.534 92.743c.144-.656.326-1.202.622-1.78 2.03-3.986 7.1-5.51 11.264-3.387 4.166 2.123 5.913 7.12 3.883 11.103-.296.58-.667 1.12-1.076 1.55"/><path stroke-linecap="square" d="M1391.41 107.69c-3.432-1.748-7.64-.43-9.35 2.932l-2.336 4.582m14.863-13.75c-3.43-1.75-4.836-5.928-3.124-9.29l2.335-4.58m29.687 36.45c3.43 1.747 4.836 5.927 3.124 9.287l-2.34 4.59m2.39-20.11c3.43 1.75 7.63.43 9.35-2.93l2.33-4.58"/><path stroke-linecap="square" d="M1399.72 132.127c-9.14-4.658-12.746-15.734-8.093-24.865l2.288-4.49c4.652-9.132 15.732-12.725 24.873-8.067 9.14 4.657 12.747 15.733 8.094 24.864l-2.288 4.49c-4.653 9.13-15.733 12.72-24.873 8.06z"/></g><g opacity=".88"><path d="M544.165 438.99c-.456-.582-.793-1.117-1.084-1.77-2-4.494.07-9.818 4.59-11.83 4.52-2.015 9.86.015 11.86 4.508.29.654.5 1.344.59 1.99"/><path stroke-linecap="square" d="M543.63 465.498c-3.517 1.565-5.035 5.9-3.373 9.633l2.266 5.09m-1.74-21.11c-3.517 1.57-7.754-.2-9.416-3.94l-2.266-5.09m51.99-1.25c3.52-1.56 7.76.21 9.42 3.94l2.27 5.09m-14.53-15.42c3.52-1.56 5.04-5.9 3.38-9.63l-2.26-5.09m-9.31 47.93c-10.13 4.51-21.93-.1-26.5-10.35l-2.24-5.04c-4.56-10.25-.09-22.11 10.04-26.62 10.13-4.51 21.94.1 26.51 10.36l2.25 5.04c4.56 10.25.09 22.11-10.04 26.63z"/></g><g opacity=".91"><path d="M428.465 1020.11c-.164.65-.36 1.19-.666 1.764-2.1 3.948-7 5.488-10.88 3.422-3.89-2.065-5.35-6.986-3.25-10.934.3-.574.68-1.11 1.09-1.538"/><path stroke-linecap="square" d="M446.896 1007.258c2.914 1.55 6.626.32 8.25-2.733l2.212-4.162m-13.28 12.193c2.915 1.55 3.97 5.314 2.348 8.367l-2.213 4.162m-28.22-34.258c-2.914-1.55-3.97-5.314-2.347-8.367l2.213-4.162m-2.69 17.827c-2.92-1.55-6.63-.32-8.25 2.733l-2.22 4.162m37.15-18.753c8.32 4.426 11.42 14.73 6.95 23.133l-2.2 4.132c-4.47 8.402-14.74 11.596-23.07 7.17s-11.42-14.73-6.96-23.132l2.19-4.132c4.47-8.402 14.74-11.597 23.06-7.17z"/></g><g opacity=".7"><path d="M613.15 772.797c.73.09 1.364.104 2.074.017 4.882-.6 8.383-5.11 7.78-10.023-.604-4.91-5.092-8.44-9.974-7.84-.71.09-1.41.27-2.01.52"/><path stroke-linecap="square" d="M590.702 786.908c.47 3.82-2.465 7.355-6.52 7.853l-5.53.68m18.997-9.38c.47 3.82 4.17 6.54 8.22 6.05l5.53-.68m-25.7-45.2c-.47-3.82-4.17-6.54-8.23-6.04l-5.53.68m20.7 4.51c-.47-3.82 2.46-7.35 6.52-7.85l5.53-.68m-36.29 32.66c1.35 11.01 11.38 18.76 22.52 17.39l5.48-.67c11.14-1.37 19-11.31 17.65-22.32-1.35-11-11.39-18.75-22.53-17.38l-5.48.68c-11.14 1.37-19 11.31-17.65 22.32z"/></g><g opacity=".88"><path d="M284.56 648.496c.36-.485.71-.866 1.165-1.234 3.128-2.533 7.81-1.982 10.407 1.224 2.596 3.206 2.16 7.9-.967 10.433-.455.36-.957.67-1.45.88"/><path stroke-linecap="square" d="M263.21 653.913c-2.076-2.564-5.973-2.883-8.66-.707l-3.664 2.967m16.988-6.036c-2.077-2.564-1.578-6.443 1.11-8.618l3.662-2.97m11.332 41c2.077 2.56 1.578 6.44-1.11 8.62l-3.662 2.96m9.435-15.36c2.08 2.56 5.98 2.88 8.67.7l3.67-2.97m-40.58 3.91c-5.76-7.11-4.59-17.51 2.61-23.35l3.55-2.87c7.21-5.84 17.62-4.81 23.38 2.3 5.76 7.11 4.6 17.51-2.61 23.34l-3.54 2.87c-7.2 5.83-17.62 4.81-23.37-2.3z"/></g><g opacity=".91"><path d="M295.796 983.254c.585.153 1.07.335 1.58.62 3.52 1.95 4.764 6.498 2.765 10.106-2 3.608-6.51 4.964-10.03 3.013-.51-.284-.99-.634-1.36-1.013"/><path stroke-linecap="square" d="M282.776 965.49c1.6-2.887.435-6.62-2.59-8.296l-4.122-2.285m11.96 13.48c1.6-2.89 5.382-3.88 8.406-2.2l4.123 2.28m-33.776 25.87c-1.6 2.88-5.383 3.87-8.406 2.2l-4.12-2.29m17.78 2.99c-1.6 2.88-.43 6.62 2.59 8.29l4.12 2.28m-18.83-36.17c4.44-8.01 14.52-10.82 22.63-6.33l3.99 2.21c8.11 4.49 11.06 14.53 6.63 22.54-4.43 8-14.51 10.82-22.62 6.33l-3.99-2.21c-8.11-4.5-11.06-14.54-6.62-22.54z"/></g><g opacity=".82"><path d="M254.368 419.958c-.838.25-1.573.386-2.418.415-5.81.203-10.736-4.578-10.947-10.624-.21-6.05 4.37-11.16 10.18-11.37.844-.03 1.693.05 2.44.24"/><path stroke-linecap="square" d="M282.816 432.303c.173 4.947 4.17 8.86 8.88 8.696l6.425-.23m-24.3-8.16c.18 4.94-3.54 9.13-8.25 9.29l-6.42.22m22.03-56.81c-.17-4.95 3.54-9.13 8.26-9.3l6.43-.23m-23.67 9.83c-.17-4.95-4.17-8.86-8.88-8.7l-6.42.22"/><path stroke-linecap="square" d="M305.964 407.48c.464 13.3-9.74 24.355-22.908 24.815l-6.476.226c-13.168.46-24.12-9.85-24.584-23.15-.464-13.3 9.74-24.35 22.908-24.81l6.476-.22c13.168-.46 24.12 9.86 24.584 23.16z"/></g><g opacity=".87"><path d="M151.42 963.818c.18.408.3.772.374 1.2.517 2.932-1.42 5.748-4.306 6.256-2.886.51-5.67-1.474-6.188-4.407-.075-.426-.098-.862-.058-1.254"/><path stroke-linecap="square" d="M155.052 948.977c2.525-.445 4.264-2.665 3.864-4.932l-.545-3.092m-2.5 12.615c2.53-.445 4.92 1.045 5.32 3.313l.55 3.1m-29.63-6.95c-2.52.45-4.91-1.04-5.31-3.31l-.54-3.09m6.68 11c-2.52.45-4.26 2.67-3.86 4.93l.55 3.09"/><path stroke-linecap="square" d="M141.165 939.253c6.547-1.154 12.735 3.19 13.892 9.75l.57 3.227c1.156 6.56-3.174 12.76-9.72 13.913-6.547 1.155-12.735-3.19-13.892-9.75l-.57-3.227c-1.156-6.56 3.173-12.76 9.72-13.913z"/></g><path d="M190.557 627.603c.13.727.176 1.358.126 2.07-.343 4.908-4.664 8.64-9.602 8.295-4.93-.346-8.69-4.643-8.35-9.55.05-.713.19-1.42.42-2.032"/><path stroke-linecap="square" d="M203.474 604.448c3.84.27 7.216-2.846 7.5-6.922l.39-5.558m-8.378 19.463c3.84.27 6.75 3.83 6.465 7.9l-.38 5.56m-46.49-23.3c-3.84-.27-6.75-3.82-6.46-7.9l.39-5.55m5.59 20.44c-3.84-.27-7.21 2.85-7.5 6.93l-.39 5.56m30.72-37.94c11.07.77 19.32 10.39 18.54 21.59l-.38 5.51c-.78 11.2-10.3 19.57-21.36 18.8-11.06-.77-19.32-10.39-18.54-21.58l.39-5.51c.79-11.19 10.3-19.57 21.37-18.79z"/><g opacity=".95"><path d="M103.03 467.466c-.695-.406-1.252-.812-1.814-1.354-3.86-3.728-4.048-9.852-.418-13.61 3.63-3.76 9.757-3.785 13.617-.058.56.543 1.057 1.153 1.416 1.764"/><path stroke-linecap="square" d="M112.454 492.255c-3.057 3.165-3.153 8.077-.214 10.915l4.008 3.87m-9.55-20.342c-3.056 3.165-7.96 3.432-10.9.594l-4.008-3.87m49.144-20.66c3.057-3.165 7.962-3.432 10.9-.594l4.01 3.87m-20.664-8.833c3.056-3.165 3.152-8.077.213-10.915l-4.007-3.87"/><path stroke-linecap="square" d="M142.867 492.432c-8.09 8.377-21.356 8.57-29.78.434l-4.144-4c-8.425-8.137-8.694-21.4-.605-29.778 8.09-8.377 21.356-8.57 29.78-.435l4.144 4c8.425 8.137 8.694 21.4.605 29.78z"/></g><g opacity=".95"><path d="M77.643 913.334c.052-.937.013-1.74-.16-2.635-1.195-6.15-7.253-10.19-13.46-8.98-6.21 1.2-10.313 7.22-9.118 13.36.173.89.46 1.76.838 2.5"/><path stroke-linecap="square" d="M97.258 939.064c4.86-.944 9.62 2.322 10.58 7.258l1.307 6.73M95.54 930.23c4.86-.945 8.05-5.756 7.09-10.692l-1.308-6.73m-53.146 35.797c-4.86.944-8.05 5.756-7.09 10.692l1.31 6.73m4.063-26.257c-4.86.945-9.62-2.32-10.58-7.257l-1.31-6.73m42.91 42.592c13.61-2.645 22.41-15.737 19.75-29.39l-1.31-6.713c-2.66-13.653-15.72-22.495-29.33-19.85-13.61 2.646-22.41 15.738-19.76 29.39l1.3 6.714c2.65 13.653 15.72 22.495 29.32 19.85z"/></g><g opacity=".87"><path d="M54.904 736.443c.34.876.55 1.652.66 2.556.764 6.21-3.748 11.92-10.026 12.69-6.278.77-12.038-3.68-12.8-9.9-.112-.91-.11-1.82.022-2.64"/><path stroke-linecap="square" d="M65.608 705.91c4.913-.602 8.43-5.18 7.82-10.17l-.837-6.807m-5.88 25.91c4.92-.602 9.44 2.988 10.05 7.98l.84 6.805m-61.61-17.624c-4.91.604-9.43-2.986-10.04-7.978l-.84-6.806m11.98 23.717c-4.91.604-8.43 5.18-7.82 10.172l.84 6.8m27.66-53.77c13.76-1.69 26.18 8.04 27.87 21.84l.84 6.79c1.7 13.8-7.99 26.25-21.75 27.94-13.76 1.69-26.18-8.05-27.87-21.85l-.84-6.79c-1.69-13.81 8-26.25 21.76-27.94z"/></g><g opacity=".84"><path d="M79.355 795.224c.686-.278 1.243-.58 1.814-1.01 3.92-2.96 4.57-8.796 1.42-12.97-3.15-4.172-8.93-5.164-12.86-2.204-.57.43-1.09.937-1.47 1.466"/><path stroke-linecap="square" d="M67.58 819.48c2.318 3.074 1.544 7.6-1.72 10.06l-4.448 3.353m11.76-17.627c2.317 3.075 6.882 3.58 10.145 1.12l4.45-3.353m-45.462-27.096c-2.317-3.075-6.883-3.58-10.146-1.12l-4.45 3.353m20.18-6.446c-2.32-3.075-1.55-7.602 1.72-10.06l4.45-3.354m-15.59 47.435c6.84 9.08 19.69 10.828 28.85 3.927l4.5-3.394c9.16-6.902 11.02-19.74 4.17-28.818-6.84-9.08-19.7-10.828-28.86-3.927l-4.51 3.395c-9.16 6.9-11.02 19.738-4.18 28.817z"/></g><g stroke-linecap="square" opacity=".76" transform="translate(1 -9) scale(-1 1) rotate(-87 -149.956 1153.258)"><path d="M32 37c-2.75 0-5 2.25-5 5s2.25 5 5 5m0-30c-2.75 0-5 2.25-5 5s2.25 5 5 5"/><circle cx="42" cy="32" r="32"/><path d="M47 17c8.25 0 15 6.75 15 15s-6.75 15-15 15V17zm-5 47H0v-1.167C0 59.567 2.718 57 6.176 57c4.077 0 7.412 3.15 7.412 7"/></g><g stroke-linecap="square" opacity=".75" transform="translate(1 -9) scale(-1 1) rotate(-47 7.85 1897.644)"><path d="M31 35c-2.75 0-5 2.025-5 4.5s2.25 4.5 5 4.5m0-28c-2.75 0-5 2.025-5 4.5s2.25 4.5 5 4.5"/><circle cx="39.5" cy="30.5" r="30.5"/><path d="M44 16c7.7 0 14 6.3 14 14s-6.3 14-14 14V16zm-4 45H0v-1.167C0 56.567 2.588 54 5.882 54c3.883 0 7.06 3.15 7.06 7"/></g><g stroke-linecap="square" opacity=".74" transform="translate(1 -9) scale(1 -1) rotate(86 1067.466 178.285)"><path d="M30 35c-2.75 0-5 2.025-5 4.5s2.25 4.5 5 4.5m0-28c-2.75 0-5 2.025-5 4.5s2.25 4.5 5 4.5"/><circle cx="39" cy="30" r="30"/><path d="M44 16c7.7 0 14 6.3 14 14s-6.3 14-14 14V16zm-5 44H0v-1.167C0 55.567 2.524 53 5.735 53c3.786 0 6.883 3.15 6.883 7"/></g><g stroke-linecap="square" opacity=".98" transform="translate(1 -9) scale(1 -1) rotate(50 1454.035 811.27)"><path d="M32 37c-2.75 0-5 2.25-5 5s2.25 5 5 5m0-30c-2.75 0-5 2.25-5 5s2.25 5 5 5"/><ellipse cx="41.5" cy="32" rx="31.5" ry="32"/><path d="M46 17c8.25 0 15 6.75 15 15s-6.75 15-15 15V17zm-5 47H0v-1.167C0 59.567 2.653 57 6.03 57c3.98 0 7.235 3.15 7.235 7"/></g><g stroke-linecap="square" opacity=".75" transform="translate(1 -9) rotate(173 537.226 230.445)"><path d="M20 23c-1.65 0-3 1.35-3 3s1.35 3 3 3m0-18c-1.65 0-3 1.35-3 3s1.35 3 3 3"/><circle cx="26" cy="20" r="20"/><path d="M29 11c4.95 0 9 4.05 9 9s-4.05 9-9 9V11zm-3 29H0v-.833C0 36.833 1.682 35 3.824 35c2.523 0 4.588 2.25 4.588 5"/></g><g stroke-linecap="square" opacity=".75" transform="translate(1 -9) rotate(173 646.984 126.245)"><path d="M20 23c-1.65 0-3 1.35-3 3s1.35 3 3 3m0-18c-1.65 0-3 1.35-3 3s1.35 3 3 3"/><circle cx="26" cy="20" r="20"/><path d="M29 11c4.95 0 9 4.05 9 9s-4.05 9-9 9V11zm-3 29H0v-.833C0 36.833 1.682 35 3.824 35c2.523 0 4.588 2.25 4.588 5"/></g><g stroke-linecap="square" opacity=".83" transform="translate(1 -9) scale(1 -1) rotate(-16 -2904.932 -3052.25)"><path d="M26 31c-2.2 0-4 1.8-4 4s1.8 4 4 4m0-25c-2.2 0-4 1.8-4 4s1.8 4 4 4"/><circle cx="34.5" cy="26.5" r="26.5"/><path d="M39 14c6.6 0 12 5.4 12 12s-5.4 12-12 12V14zm-4 39H0v-1c0-2.8 2.265-5 5.147-5 3.397 0 6.177 2.7 6.177 6"/></g><g stroke-linecap="square" opacity=".98" transform="translate(1 -9) rotate(-15 3659.44 -1438.486)"><path d="M31 35c-2.75 0-5 2.025-5 4.5s2.25 4.5 5 4.5m0-28c-2.75 0-5 2.025-5 4.5s2.25 4.5 5 4.5"/><circle cx="39.5" cy="30.5" r="30.5"/><path d="M44 16c7.7 0 14 6.3 14 14s-6.3 14-14 14V16zm-4 45H0v-1.167C0 56.567 2.588 54 5.882 54c3.883 0 7.06 3.15 7.06 7"/></g><g stroke-linecap="square" opacity=".89" transform="translate(1 -9) scale(1 -1) rotate(-40 -1054.24 -1335.815)"><path d="M21 24c-1.65 0-3 1.35-3 3s1.35 3 3 3m0-19c-1.65 0-3 1.35-3 3s1.35 3 3 3"/><circle cx="28" cy="21" r="21"/><path d="M31 11c5.5 0 10 4.275 10 9.5S36.5 30 31 30V11zm-3 31H0v-.833C0 38.833 1.812 37 4.118 37c2.717 0 4.94 2.25 4.94 5"/></g><g stroke-linecap="square" opacity=".91" transform="translate(1 -9) matrix(-.5 .86603 .86603 .5 262.886 98)"><path d="M21 24c-1.65 0-3 1.35-3 3s1.35 3 3 3m0-19c-1.65 0-3 1.35-3 3s1.35 3 3 3"/><ellipse cx="27" cy="20.5" rx="21" ry="20.5"/><path d="M30 11c5.5 0 10 4.275 10 9.5S35.5 30 30 30V11zm-3 30H0v-.833C0 37.833 1.747 36 3.97 36c2.62 0 4.765 2.25 4.765 5"/></g><g stroke-linecap="square" opacity=".79" transform="translate(1 -9) scale(1 -1) rotate(52 643.186 127.897)"><path d="M22 26c-1.65 0-3 1.575-3 3.5s1.35 3.5 3 3.5m0-21c-1.65 0-3 1.575-3 3.5s1.35 3.5 3 3.5"/><circle cx="29.5" cy="22.5" r="22.5"/><path d="M33 12c5.5 0 10 4.725 10 10.5S38.5 33 33 33V12zm-4 33H0v-.833C0 41.833 1.876 40 4.265 40c2.814 0 5.117 2.25 5.117 5"/></g><g stroke-linecap="square" opacity=".84" transform="translate(1 -9) scale(1 -1) rotate(31 835.952 256.806)"><path d="M31 36c-2.75 0-5 2.25-5 5s2.25 5 5 5m0-29c-2.75 0-5 2.25-5 5s2.25 5 5 5"/><circle cx="40" cy="31" r="31"/><path d="M45 17c7.7 0 14 6.525 14 14.5S52.7 46 45 46V17zm-5 45H0v-1.167C0 57.567 2.588 55 5.882 55c3.883 0 7.06 3.15 7.06 7"/></g><g stroke-linecap="square" opacity=".74" transform="translate(1 -9) rotate(164 20.452 473.874)"><path d="M29 33c-2.2 0-4 2.025-4 4.5s1.8 4.5 4 4.5m0-26c-2.2 0-4 2.025-4 4.5s1.8 4.5 4 4.5"/><circle cx="38" cy="29" r="29"/><path d="M42 16c7.15 0 13 6.075 13 13.5S49.15 43 42 43V16zm-4 42H0v-1.167C0 53.567 2.46 51 5.588 51c3.688 0 6.706 3.15 6.706 7"/></g><g stroke-linecap="square" opacity=".71" transform="translate(1 -9) scale(1 -1) rotate(-13 -1893.972 -229.127)"><path d="M21 24c-1.65 0-3 1.35-3 3s1.35 3 3 3m0-19c-1.65 0-3 1.35-3 3s1.35 3 3 3"/><circle cx="28" cy="21" r="21"/><path d="M31 11c5.5 0 10 4.275 10 9.5S36.5 30 31 30V11zm-3 31H0v-.833C0 38.833 1.812 37 4.118 37c2.717 0 4.94 2.25 4.94 5"/></g><path d="M72.098 441.34C60.058 434.385 35 436.907 35 436.907s9.437 22.457 22.386 29.94c13.96 8.07 24.756-2.696 24.756-2.696s4.017-14.68-10.044-22.81zM60.72 451.756l30.618 17.678" stroke-linecap="square" opacity=".88"/><g opacity=".99" transform="translate(1 -9) scale(-1 1) rotate(-63 37.075 1489.532)"><path d="M21 19h10m-21 0l-7-5m46 0l-7 5"/><circle cx="15" cy="19" r="5" stroke-linecap="square"/><circle cx="36" cy="19" r="5" stroke-linecap="square"/><path stroke-linecap="square" d="M17 33c0 4.95 3.825 9 8.5 9s8.5-4.05 8.5-9H17z"/><circle cx="26" cy="26" r="26" stroke-linecap="square"/></g><g opacity=".94" transform="translate(1 -9) scale(1 -1) rotate(-56 513.416 -1070.738)"><path d="M26 24h13m-26 0l-9-7m57 0l-9 7"/><circle cx="19.5" cy="23.5" r="6.5" stroke-linecap="square"/><circle cx="45.5" cy="23.5" r="6.5" stroke-linecap="square"/><path stroke-linecap="square" d="M22 41c0 6.05 4.95 11 11 11s11-4.95 11-11H22z"/><circle cx="32.5" cy="32.5" r="32.5" stroke-linecap="square"/></g><g opacity=".72" transform="translate(1 -9) rotate(168 516.326 532.225)"><path d="M28 26h14m-28-1L4 18m62 0l-10 7"/><circle cx="21" cy="26" r="7" stroke-linecap="square"/><circle cx="49" cy="26" r="7" stroke-linecap="square"/><path stroke-linecap="square" d="M23 44c0 6.6 5.175 12 11.5 12S46 50.6 46 44H23z"/><circle cx="35" cy="35" r="35" stroke-linecap="square"/></g><g opacity=".84" transform="translate(1 -9) rotate(-116 672.08 28.395)"><path d="M25 23h12m-24 0l-9-7m55 0l-9 6"/><circle cx="18" cy="23" r="6" stroke-linecap="square"/><circle cx="43" cy="23" r="6" stroke-linecap="square"/><path stroke-linecap="square" d="M21 39c0 5.5 4.725 10 10.5 10S42 44.5 42 39H21z"/><circle cx="31" cy="31" r="31" stroke-linecap="square"/></g><g opacity=".87" transform="translate(1 -9) rotate(-167 426.776 215.535)"><path d="M29 27h15m-29 0L5 19m63 0l-10 8"/><circle cx="22.5" cy="26.5" r="7.5" stroke-linecap="square"/><circle cx="51.5" cy="26.5" r="7.5" stroke-linecap="square"/><path stroke-linecap="square" d="M24 46c0 6.6 5.4 12 12 12s12-5.4 12-12H24z"/><circle cx="36.5" cy="36.5" r="36.5" stroke-linecap="square"/></g><g opacity=".72" transform="translate(1 -9) scale(-1 1) rotate(41 -690.391 -990.407)"><path d="M19 18h10m-19 0l-7-5m42 0l-7 5"/><circle cx="15" cy="18" r="5" stroke-linecap="square"/><circle cx="34" cy="18" r="5" stroke-linecap="square"/><path stroke-linecap="square" d="M16 30c0 4.4 3.6 8 8 8s8-3.6 8-8H16z"/><circle cx="24" cy="24" r="24" stroke-linecap="square"/></g><g opacity=".91" transform="translate(1 -9) matrix(-.86603 .5 .5 .86603 759.44 198)"><path d="M26 24h13m-26 0l-9-7m57 0l-9 7"/><circle cx="19.5" cy="23.5" r="6.5" stroke-linecap="square"/><circle cx="45.5" cy="23.5" r="6.5" stroke-linecap="square"/><path stroke-linecap="square" d="M22 41c0 6.05 4.95 11 11 11s11-4.95 11-11H22z"/><circle cx="32.5" cy="32.5" r="32.5" stroke-linecap="square"/></g><g opacity=".75" transform="translate(1 -9) scale(1 -1) rotate(-56 -463.591 -1310.38)"><path d="M20 18h10m-20 0l-7-5m44 0l-7 5"/><circle cx="15" cy="18" r="5" stroke-linecap="square"/><circle cx="35" cy="18" r="5" stroke-linecap="square"/><path stroke-linecap="square" d="M17 32c0 4.4 3.825 8 8.5 8s8.5-3.6 8.5-8H17z"/><circle cx="25" cy="25" r="25" stroke-linecap="square"/></g><g opacity=".85" transform="translate(1 -9) rotate(125 154.563 614.194)"><path d="M29 27h15m-29 0L5 19m63 0l-10 8"/><circle cx="22.5" cy="26.5" r="7.5" stroke-linecap="square"/><circle cx="51.5" cy="26.5" r="7.5" stroke-linecap="square"/><path stroke-linecap="square" d="M24 46c0 6.6 5.4 12 12 12s12-5.4 12-12H24z"/><circle cx="36.5" cy="36.5" r="36.5" stroke-linecap="square"/></g><g opacity=".87" transform="translate(1 -9) scale(-1 1) rotate(3 -13715.358 -12992.93)"><path d="M19 17h9m-18 0l-7-5m42 0l-7 5"/><circle cx="13.5" cy="17.5" r="4.5" stroke-linecap="square"/><circle cx="32.5" cy="17.5" r="4.5" stroke-linecap="square"/><path stroke-linecap="square" d="M16 30c0 4.4 3.6 8 8 8s8-3.6 8-8H16z"/><circle cx="23.5" cy="23.5" r="23.5" stroke-linecap="square"/></g><g opacity=".84" transform="translate(1 -9) scale(1 -1) rotate(32 772.096 473.874)"><path d="M19 18h10m-19 0l-7-5m42 0l-7 5"/><circle cx="15" cy="18" r="5" stroke-linecap="square"/><circle cx="34" cy="18" r="5" stroke-linecap="square"/><path stroke-linecap="square" d="M16 30c0 4.4 3.6 8 8 8s8-3.6 8-8H16z"/><circle cx="24" cy="24" r="24" stroke-linecap="square"/></g><g opacity=".8" transform="translate(1 -9) rotate(-173 193.657 27.29)"><path d="M24 22h12m-24 0l-8-6m54 0l-9 6"/><circle cx="18" cy="22" r="6" stroke-linecap="square"/><circle cx="43" cy="22" r="6" stroke-linecap="square"/><path stroke-linecap="square" d="M20 39c0 5.5 4.5 10 10 10s10-4.5 10-10H20z"/><circle cx="30.5" cy="30.5" r="30.5" stroke-linecap="square"/></g><g transform="translate(1 -9) rotate(100 -82.494 513.622)"><path d="M24 22h12m-24 0l-8-6m54 0l-9 6"/><circle cx="18" cy="22" r="6" stroke-linecap="square"/><circle cx="43" cy="22" r="6" stroke-linecap="square"/><path stroke-linecap="square" d="M20 39c0 5.5 4.5 10 10 10s10-4.5 10-10H20z"/><circle cx="30.5" cy="30.5" r="30.5" stroke-linecap="square"/></g><g opacity=".76" transform="translate(1 -9) scale(-1 1) rotate(81 -582.235 487.139)"><path d="M26.078 23.47h13.04m-26.08 0l-9.126-6.52m56.07 0l-9.13 6.52"/><circle cx="19.559" cy="23.471" r="6.52" stroke-linecap="square"/><circle cx="44.333" cy="23.471" r="6.52" stroke-linecap="square"/><path stroke-linecap="square" d="M20.863 40.422c0 5.737 4.694 10.43 10.43 10.43 5.738 0 10.433-4.693 10.433-10.43H20.863z"/><circle cx="31.946" cy="31.946" r="31.946" stroke-linecap="square"/></g><g transform="translate(1 -9) rotate(110 -128.277 283.233)"><path d="M28 26h14m-28 0L4 19m63 0l-10 7"/><circle cx="21" cy="26" r="7" stroke-linecap="square"/><circle cx="50" cy="26" r="7" stroke-linecap="square"/><path stroke-linecap="square" d="M24 45c0 6.6 5.4 12 12 12s12-5.4 12-12H24z"/><circle cx="35.5" cy="35.5" r="35.5" stroke-linecap="square"/></g><g opacity=".83"><path d="M35.184 568.72l.404 23.144c.042 2.397-1.87 4.374-4.273 4.416l-23.197.405c-2.402.042-4.383-1.867-4.425-4.264l-.53-30.37c-.042-2.39 1.87-4.37 4.273-4.41l13.048-.22"/><path d="M30.63 568.963l.304 17.408c.014.81-.634 1.47-1.45 1.48l-19.18.34c-.815.02-1.487-.62-1.5-1.42l-.394-22.49c-.01-.8.64-1.46 1.45-1.47l11.07-.19"/><path stroke-linecap="square" d="M46.67 555.346l.182 10.356c.028 1.634-1.244 2.98-2.842 3.01l-20.25.353c-1.598.027-2.917-1.275-2.945-2.91l-.18-10.354c-.03-1.63 1.243-2.98 2.84-3.01l20.25-.35c1.6-.03 2.917 1.28 2.946 2.91zm-28.66 36.608l2.603-.045m6.112-22.9l-.284-16.28m12 16.06l-.28-16.28m4.06 8.39l-.02-1.31"/></g><g opacity=".93" transform="translate(1 -9) rotate(154 24.477 38.853)"><path d="M18 17h9M9 17l-6-5m40 0l-6 5"/><circle cx="13.5" cy="16.5" r="4.5" stroke-linecap="square"/><circle cx="32.5" cy="16.5" r="4.5" stroke-linecap="square"/><path stroke-linecap="square" d="M15 29c0 4.4 3.375 8 7.5 8s7.5-3.6 7.5-8H15z"/><circle cx="23" cy="23" r="23" stroke-linecap="square"/></g><path stroke-linecap="square" d="M1225.813 15.545l5.394-13.352 14.186 5.732c1.49-3.687 5.686-5.468 9.373-3.98 3.687 1.49 5.468 5.687 3.98 9.374l15.853 6.4-4.72 11.68c-4.61-1.86-9.86.36-11.72 4.97-1.86 4.61.36 9.85 4.97 11.71l-6.07 15.02-14.19-5.73c1.86-4.61-.37-9.86-4.98-11.72-4.61-1.87-9.86.36-11.72 4.97l-12.52-5.06 6.74-16.69c-3.69-1.49-5.47-5.69-3.98-9.38 1.49-3.69 5.68-5.47 9.37-3.98z" opacity=".96"/><path stroke-linecap="square" d="M809.976 877.036l7.542 10.01 10.636-8.015c2.082 2.77 6.012 3.32 8.776 1.24 2.764-2.08 3.316-6.01 1.233-8.77l11.887-8.95-6.6-8.75c-3.456 2.61-8.367 1.92-10.97-1.54-2.604-3.45-1.914-8.36 1.54-10.97L825.537 830l-10.636 8.014c2.61 3.456 1.92 8.367-1.54 10.97-3.45 2.604-8.36 1.914-10.97-1.54l-9.38 7.07 9.43 12.512c-2.76 2.083-3.31 6.012-1.23 8.776 2.09 2.764 6.02 3.316 8.78 1.234zm454.214-304.91l7.543 10.01 10.635-8.015c2.083 2.77 6.012 3.32 8.776 1.24 2.764-2.08 3.316-6.01 1.234-8.77l11.886-8.95-6.6-8.75c-3.455 2.61-8.366 1.92-10.97-1.54-2.604-3.45-1.913-8.36 1.542-10.97l-8.486-11.26-10.635 8.02c2.604 3.46 1.913 8.37-1.542 10.97-3.455 2.61-8.366 1.92-10.97-1.54l-9.384 7.07 9.42 12.52c-2.77 2.08-3.32 6.01-1.24 8.77s6.01 3.32 8.77 1.23z" opacity=".9"/><path stroke-linecap="square" d="M908.408 705.67l8.92 16.092-17.1 9.478c2.464 4.444.86 10.044-3.585 12.507-4.444 2.463-10.044.858-12.507-3.586l-19.11 10.6-7.806-14.08c5.555-3.08 7.562-10.08 4.483-15.63-3.08-5.55-10.078-7.56-15.633-4.48l-10.036-18.1 17.1-9.48c3.078 5.56 10.077 7.57 15.632 4.49 5.556-3.08 7.563-10.08 4.483-15.63l15.08-8.36 11.15 20.12c4.44-2.46 10.04-.86 12.51 3.59 2.46 4.44.85 10.04-3.59 12.51z" opacity=".86"/><path stroke-linecap="square" d="M569.396 1024.625l9.583-7.222 7.67 10.182c2.64-1.994 6.41-1.465 8.4 1.18 1.99 2.648 1.46 6.41-1.18 8.404l8.57 11.38-8.39 6.32c-2.49-3.31-7.2-3.97-10.51-1.48-3.31 2.49-3.97 7.19-1.48 10.5l-10.79 8.12-7.67-10.19c3.3-2.5 3.97-7.2 1.47-10.51-2.5-3.31-7.2-3.97-10.51-1.48l-6.77-8.98 11.98-9.03c-1.99-2.65-1.47-6.41 1.18-8.4 2.65-2 6.41-1.47 8.4 1.18z" opacity=".8"/><path stroke-linecap="square" d="M671.24 927.22l-9.972 11.472-12.188-10.595c-2.754 3.167-7.554 3.503-10.722.75-3.167-2.754-3.503-7.555-.75-10.722l-13.622-11.842 8.725-10.038c3.96 3.442 9.96 3.023 13.41-.937 3.44-3.96 3.02-9.96-.93-13.402L656.4 869l12.19 10.595c-3.447 3.96-3.027 9.96.933 13.403 3.96 3.442 9.96 3.022 13.41-.938l10.76 9.35-12.466 14.34c3.167 2.752 3.503 7.553.75 10.72-2.754 3.168-7.555 3.504-10.722.75z" opacity=".99"/><path stroke-linecap="square" d="M736.584 283.723l-12.04-12.468-13.25 12.793c-3.324-3.443-8.81-3.54-12.254-.214-3.443 3.325-3.538 8.812-.214 12.255l-14.806 14.29 10.536 10.91c4.304-4.16 11.162-4.04 15.318.26 4.156 4.3 4.037 11.16-.267 15.32l13.545 14.02L736.4 338.1c-4.156-4.305-4.036-11.163.268-15.32 4.304-4.156 11.162-4.036 15.318.27l11.69-11.29-15.052-15.586c3.443-3.325 3.54-8.81.214-12.255-3.325-3.45-8.812-3.54-12.254-.22z" opacity=".82"/><path stroke-linecap="square" d="M607.572 811.175l-14.867-3.16-3.358 15.796c-4.106-.87-8.142 1.75-9.014 5.86-.873 4.11 1.748 8.14 5.854 9.02l-3.753 17.66 13.01 2.77c1.09-5.13 6.134-8.4 11.267-7.31 5.14 1.09 8.41 6.14 7.32 11.27l16.73 3.56 3.36-15.79c-5.13-1.09-8.41-6.13-7.31-11.27 1.09-5.13 6.14-8.4 11.27-7.31l2.97-13.94-18.58-3.95c.88-4.11-1.74-8.14-5.85-9.01-4.1-.87-8.14 1.75-9.01 5.85z" opacity=".8"/><path stroke-linecap="square" d="M471.793 901.354l-14.86-6.616-7.03 15.79c-4.103-1.828-8.91.018-10.738 4.12-1.827 4.105.02 8.913 4.122 10.74l-7.857 17.646 13.003 5.79c2.284-5.13 8.293-7.437 13.423-5.153 5.13 2.29 7.436 8.3 5.152 13.43l16.718 7.45 7.03-15.79c-5.13-2.28-7.436-8.29-5.153-13.42 2.284-5.13 8.294-7.43 13.423-5.15l6.203-13.93-18.58-8.27c1.82-4.1-.02-8.91-4.13-10.74-4.11-1.82-8.91.02-10.74 4.12z" opacity=".9"/><path stroke-linecap="square" d="M462.67 57.85L452.483 68.4l-11.21-10.825c-2.813 2.913-7.455 2.994-10.37.18-2.912-2.812-2.993-7.455-.18-10.368l-12.528-12.1 8.915-9.23c3.64 3.517 9.443 3.415 12.96-.227 3.517-3.64 3.416-9.444-.226-12.96L451.306 1l11.21 10.825c-3.517 3.642-3.416 9.445.226 12.96 3.642 3.518 9.445 3.417 12.962-.225l9.89 9.552L472.86 47.3c2.912 2.813 2.993 7.456.18 10.37-2.813 2.912-7.456 2.993-10.37.18z"/><path stroke-linecap="square" d="M333.415 860.24l7.01-10.39-11.04-7.447c1.934-2.87 1.177-6.764-1.692-8.7-2.87-1.935-6.765-1.178-8.7 1.69l-12.34-8.32-6.13 9.09c3.585 2.42 4.532 7.288 2.112 10.875-2.42 3.587-7.287 4.533-10.874 2.114l-7.88 11.69 11.04 7.446c2.42-3.587 7.29-4.533 10.88-2.114 3.59 2.42 4.54 7.288 2.12 10.874l9.74 6.57 8.76-12.987c2.87 1.94 6.77 1.18 8.7-1.69 1.94-2.87 1.18-6.76-1.69-8.7z" opacity=".87"/><path stroke-linecap="square" d="M139.21 1007.086l16.93 6.5-6.906 17.986c4.675 1.794 7.01 7.04 5.216 11.713-1.795 4.675-7.04 7.01-11.714 5.215l-7.717 20.104-14.82-5.687c2.24-5.843-.68-12.398-6.52-14.642-5.85-2.243-12.4.676-14.64 6.52l-19.04-7.31 6.9-17.99c5.84 2.244 12.4-.675 14.64-6.52 2.24-5.842-.68-12.397-6.52-14.64l6.09-15.87 21.16 8.122c1.79-4.675 7.04-7.01 11.71-5.216 4.67 1.8 7.01 7.04 5.21 11.72z" opacity=".74"/><g opacity=".71"><path d="M1424.887 959.742l-7.742-31.05c-.802-3.215-4.058-5.17-7.273-4.37l-31.05 7.742c-3.215.802-5.172 4.058-4.37 7.273l10.16 40.753c.803 3.215 4.06 5.17 7.274 4.37l17.465-4.355"/><path d="M1418.095 961.435l-5.807-23.287c-.267-1.072-1.352-1.724-2.424-1.456l-25.228 6.29c-1.072.267-1.724 1.352-1.456 2.424l7.5 30.08c.266 1.07 1.35 1.723 2.424 1.456l14.554-3.63"/><path stroke-linecap="square" d="M1444.766 973.337l-3.387-13.585c-.54-2.143-2.71-3.447-4.85-2.913l-27.17 6.77c-2.15.53-3.45 2.7-2.92 4.85l3.38 13.58c.53 2.14 2.7 3.45 4.85 2.91l27.16-6.78c2.14-.54 3.45-2.71 2.91-4.85zm-50.908-38.838l3.88-.97m15.505 29.11l5.322 21.34m10.203-25.22l5.322 21.34m2.92-13.1l.483 1.94"/></g><g opacity=".84"><path d="M1361.798 842.994l-8.53 36.954c-.885 3.827-4.694 6.215-8.51 5.334l-36.85-8.507c-3.815-.88-6.192-4.697-5.31-8.524l11.2-48.5c.883-3.82 4.692-6.21 8.508-5.33l20.727 4.79"/><path d="M1353.873 841.76l-6.325 27.394c-.29 1.26-1.573 2.04-2.865 1.742l-30.4-7.018c-1.292-.298-2.103-1.56-1.812-2.823l8.17-35.383c.29-1.26 1.58-2.04 2.87-1.743l17.54 4.04"/><path stroke-linecap="square" d="M1385.088 826.577l-3.722 16.12c-.587 2.545-3.148 4.126-5.718 3.533l-32.588-7.524c-2.57-.593-4.18-3.137-3.592-5.68l3.722-16.122c.588-2.544 3.148-4.125 5.72-3.53l32.586 7.522c2.57.594 4.18 3.137 3.592 5.68zm-59.13 47.18l4.873 1.126m17.32-35.002l5.85-25.33m12.67 29.61l5.85-25.33m3.68 15.22l.45-1.95"/></g><g opacity=".95"><path d="M1351.066 663.7l-30.792-17.778c-3.19-1.84-7.27-.743-9.115 2.453l-17.82 30.862c-1.85 3.197-.76 7.28 2.43 9.12l40.41 23.334c3.19 1.85 7.27.75 9.11-2.45l10.02-17.36"/><path d="M1347.35 669.636l-23.162-13.37c-1.066-.617-2.437-.237-3.063.848l-14.733 25.52c-.626 1.083-.27 2.46.796 3.076l29.916 17.27c1.066.617 2.437.237 3.063-.847l8.5-14.723"/><path stroke-linecap="square" d="M1377.588 658.227l-13.778-7.954c-2.174-1.255-4.932-.55-6.16 1.576l-15.555 26.94c-1.227 2.12-.46 4.86 1.715 6.12l13.778 7.95c2.173 1.25 4.93.55 6.158-1.58l15.556-26.95c1.227-2.13.46-4.87-1.714-6.13zm-70.526 11.244l2-3.46m35.31 8.84l21.652 12.5m-12.65-28.09l21.65 12.5m-8.258-11.69l1.732 1"/></g><g opacity=".83"><path d="M1089.27 631.2l-34.322 1.8c-3.555.185-6.59-2.59-6.778-6.2l-1.827-34.862c-.19-3.61 2.538-6.687 6.093-6.873l45.05-2.36c3.554-.188 6.588 2.588 6.777 6.198l1.028 19.61"/><path d="M1089.266 623.19l-26.022 1.363c-1.198.063-2.218-.84-2.28-2.017l-1.45-27.695c-.063-1.17.857-2.18 2.055-2.24l33.61-1.76c1.19-.06 2.22.84 2.28 2.02l.83 15.98"/><path stroke-linecap="square" d="M1109.955 647.14l-15.252.8c-2.406.125-4.46-1.71-4.584-4.1l-1.59-30.292c-.13-2.39 1.72-4.43 4.13-4.556l15.25-.8c2.4-.125 4.46 1.71 4.58 4.1l1.59 30.292c.12 2.39-1.73 4.43-4.13 4.555zm-55.813-40.135l.21 3.995m34.424 7.208l23.967-1.256m-23.078 18.233l23.967-1.256m-12.668 6.67l1.998-.11"/></g><g opacity=".83"><path d="M754.767 1056.166l-27.313 1.43c-2.828.15-5.243-2.06-5.393-4.932l-1.45-27.74c-.15-2.874 2.02-5.323 4.85-5.47l35.85-1.88c2.83-.148 5.24 2.06 5.39 4.933l.82 15.605"/><path d="M754.763 1049.79l-20.707 1.086c-.953.05-1.765-.668-1.814-1.605l-1.155-22.03c-.05-.93.683-1.73 1.637-1.78l26.746-1.4c.953-.05 1.765.67 1.814 1.61l.666 12.72"/><path stroke-linecap="square" d="M771.227 1068.85l-12.137.635c-1.915.1-3.548-1.36-3.648-3.26l-1.263-24.106c-.1-1.91 1.37-3.53 3.28-3.63l12.13-.64c1.91-.1 3.55 1.36 3.65 3.26l1.26 24.1c.1 1.9-1.38 3.52-3.29 3.62zm-44.414-31.937l.167 3.178m27.393 5.74l19.072-1m-18.364 14.51l19.08-1m-10.08 5.31l1.59-.08"/></g><g opacity=".83"><path d="M986.61 824.33l-3.098-35.42c-.32-3.667 2.4-6.9 6.076-7.222l35.5-3.106c3.677-.322 6.917 2.39 7.238 6.06l4.067 46.488c.32 3.668-2.4 6.902-6.075 7.223l-19.97 1.747"/><path d="M993.563 823.472l-2.33-26.642c-.108-1.226.815-2.308 2.063-2.417l29.354-2.568c1.248-.11 2.345.796 2.453 2.022l3.01 34.412c.108 1.22-.816 2.3-2.064 2.41l-16.94 1.48"/><path stroke-linecap="square" d="M970.443 846.056l-1.386-15.85c-.22-2.5 1.586-4.7 4.03-4.914l30.994-2.712c2.45-.214 4.61 1.64 4.83 4.14l1.39 15.85c.22 2.5-1.58 4.7-4.03 4.915l-30.99 2.71c-2.44.215-4.6-1.64-4.82-4.14zm39.996-59.166l-3.99.35m-6.91 35.737l2.17 24.905m-20.11-23.336l2.18 24.905m-7.11-12.42l.17 1.99"/></g><g opacity=".91"><path d="M1010.468 580.094l-27.304-24.584c-2.828-2.546-3.036-6.923-.466-9.778l24.82-27.564c2.57-2.855 6.944-3.105 9.772-.56l35.836 32.268c2.827 2.546 3.036 6.924.466 9.778l-13.96 15.505"/><path d="M1015.884 574.206L995.5 555.852c-.938-.845-1-2.305-.137-3.263l20.297-22.55c.862-.96 2.32-1.05 3.26-.21l26.328 23.7c.94.84 1 2.3.138 3.26l-11.71 13"/><path stroke-linecap="square" d="M1013.9 607.405l-11.824-10.645c-1.865-1.68-2.013-4.557-.33-6.427l21.34-23.698c1.682-1.87 4.56-2.024 6.425-.344l11.83 10.65c1.87 1.68 2.02 4.56.33 6.43l-21.34 23.7c-1.68 1.87-4.56 2.03-6.42.35zm-11.918-72.63l-3.346 3.717m21.475 31.446l18.58 16.728m-30.62-3.35l18.58 16.727m-15.09-4.166l1.49 1.338"/></g><g opacity=".9"><path d="M955.448 1026.264l28.966 2.026c3 .21 5.6-2.056 5.812-5.062l2.03-29.02c.21-3.005-2.052-5.61-5.052-5.82l-38.018-2.66c-3-.21-5.602 2.057-5.812 5.062l-1.14 16.324"/><path d="M955.647 1019.26l21.89 1.532c1.007.07 1.88-.676 1.95-1.67l1.63-23.342c.07-.992-.69-1.852-1.698-1.923l-28.28-1.977c-1.01-.07-1.88.676-1.95 1.668l-.94 13.467"/><path stroke-linecap="square" d="M938.627 1039.122l12.697.888c2.003.14 3.738-1.335 3.875-3.293l1.73-24.83c.13-1.957-1.38-3.66-3.38-3.8l-12.7-.887c-2.01-.14-3.74 1.334-3.88 3.293l-1.74 24.83c-.14 1.957 1.37 3.66 3.38 3.8zm47.765-32.748l-.28 3.99m-29.417 4.96l-19.95-1.395m18.974 15.36l-19.96-1.4m10.55 6.75l-2-.14"/></g><g opacity=".95"><path d="M878.733 355.407l-2.397 34.287c-.248 3.55-3.312 6.23-6.843 5.982l-34.1-2.385c-3.53-.24-6.19-3.32-5.943-6.87l3.147-45c.248-3.55 3.312-6.23 6.843-5.98l19.18 1.34"/><path d="M870.73 355.178l-1.77 25.31c-.08 1.165-1.1 2.042-2.275 1.96l-27.666-1.935c-1.18-.082-2.07-1.093-1.99-2.258l2.28-32.692c.08-1.165 1.1-2.042 2.27-1.96l15.96 1.116"/><path stroke-linecap="square" d="M897.018 337.636l-1.02 14.6c-.162 2.305-2.18 4.04-4.505 3.878l-29.484-2.062c-2.33-.162-4.09-2.162-3.92-4.466l1.02-14.6c.16-2.304 2.17-4.04 4.5-3.878l29.48 2.062c2.32.163 4.08 2.162 3.92 4.466zm-46.65 50.688l3.99.28m11.42-34.288l1.604-22.944m15.355 24.13l1.604-22.944m6.08 13.456l.14-1.995"/></g><g opacity=".99"><path d="M923.065 49.814l-18.24-20.258c-1.89-2.098-1.742-5.31.33-7.174L925.15 4.376c2.072-1.864 5.282-1.675 7.17.423l23.94 26.58c1.89 2.1 1.742 5.31-.33 7.17l-11.247 10.13"/><path d="M926.724 46.405L912.96 31.118c-.635-.704-.572-1.793.14-2.434l16.745-15.078c.712-.64 1.802-.59 2.435.114l17.78 19.747c.634.704.57 1.793-.14 2.434l-9.662 8.7"/><path stroke-linecap="square" d="M922.815 70.46l-8.09-8.986c-1.277-1.418-1.166-3.6.247-4.872l17.92-16.134c1.412-1.273 3.593-1.155 4.87.263l8.09 8.99c1.277 1.42 1.166 3.6-.248 4.87l-17.918 16.14c-1.414 1.28-3.595 1.16-4.87-.26zm-3.202-54.37l-2.23 2.01m12.865 24.747l12.714 14.12m-23.118-4.752l12.714 14.12M922.15 62.25l1.34 1.486"/></g><g opacity=".87"><path d="M827.436 776.07l26.03-19.614c2.696-2.032 6.534-1.484 8.573 1.223l19.69 26.13c2.04 2.7 1.51 6.54-1.19 8.58l-34.17 25.74c-2.7 2.03-6.54 1.48-8.58-1.23l-11.08-14.71"/><path d="M831.618 781.684l19.715-14.856c.907-.684 2.2-.5 2.886.413l16.16 21.46c.68.91.51 2.21-.4 2.89l-25.47 19.19c-.91.69-2.2.5-2.89-.41l-9.33-12.38"/><path stroke-linecap="square" d="M803.195 774.303l11.18-8.425c1.765-1.33 4.303-.937 5.67.876l17.32 22.983c1.365 1.813 1.042 4.36-.722 5.69l-11.18 8.426c-1.765 1.33-4.303.937-5.67-.876l-17.318-22.983c-1.366-1.813-1.044-4.36.72-5.69zm65.405 2.052l-2.407-3.195m-31.77 12.672l-17.57 13.24m7.94-26.018l-17.57 13.24m5.972-12.014l-1.597 1.204"/></g><g opacity=".71"><path d="M769.256 362.812l31.235-3.283c3.24-.34 6.14 1.99 6.47 5.21l3.27 31.1c.34 3.22-2.01 6.11-5.24 6.45L764 406.6c-3.234.34-6.13-2-6.47-5.22l-1.84-17.495"/><path d="M769.922 368.775l23.187-2.437c1.06-.112 2.02.687 2.14 1.786l2.71 25.858c.11 1.1-.66 2.08-1.73 2.192l-29.95 3.148c-1.07.112-2.03-.687-2.14-1.786l-1.57-14.918"/><path stroke-linecap="square" d="M749.977 348.75l13.923-1.463c2.197-.23 4.16 1.313 4.385 3.45l2.845 27.072c.225 2.13-1.374 4.05-3.57 4.28l-13.925 1.46c-2.197.23-4.16-1.32-4.384-3.45l-2.84-27.07c-.22-2.14 1.38-4.06 3.57-4.29zm52.808 33.665l-.418-3.978m-31.562-3.722l-21.88 2.3m20.208-18.212l-21.88 2.3m11.307-7.222l-1.99.21"/></g><g opacity=".92"><path d="M567.357 566.474l-24.828-5.732c-2.58-.594-5.14 1.007-5.73 3.575l-5.73 24.802c-.6 2.56 1.01 5.13 3.58 5.72l32.59 7.52c2.57.59 5.13-1.01 5.73-3.58l3.22-13.95"/><path d="M566.76 571.467l-18.71-4.32c-.86-.198-1.72.34-1.918 1.2l-4.68 20.267c-.197.86.34 1.72 1.2 1.92l24.165 5.578c.86.2 1.72-.338 1.92-1.2l2.698-11.692"/><path stroke-linecap="square" d="M584.38 557.06l-11.162-2.575c-1.76-.407-3.514.67-3.914 2.403l-5.074 21.978c-.4 1.733.703 3.47 2.464 3.875l11.16 2.58c1.762.41 3.514-.67 3.915-2.4l5.07-21.98c.4-1.73-.71-3.47-2.47-3.87zm-45.91 22.245l.676-2.924m25.934-1.19l17.54 4.05m-14.84-15.74l17.538 4.05m-8.62-7.12l1.95.45"/></g><g opacity=".92"><path d="M1352.357 222.69l-24.828-5.732c-2.58-.594-5.14 1.007-5.73 3.576l-5.73 24.802c-.6 2.568 1.01 5.13 3.58 5.725l32.59 7.53c2.57.6 5.13-1 5.73-3.57l3.22-13.95"/><path d="M1351.76 227.684l-18.71-4.32c-.86-.198-1.72.338-1.918 1.2l-4.68 20.266c-.198.862.34 1.72 1.2 1.92l24.165 5.578c.86.2 1.72-.338 1.92-1.2l2.698-11.69"/><path stroke-linecap="square" d="M1369.38 213.278l-11.162-2.577c-1.76-.4-3.514.67-3.914 2.41l-5.074 21.98c-.4 1.74.703 3.47 2.464 3.88l11.16 2.58c1.762.41 3.514-.67 3.915-2.4l5.07-21.97c.4-1.73-.71-3.47-2.47-3.88zm-45.91 22.243l.676-2.92m25.934-1.19l17.538 4.05m-14.84-15.74l17.54 4.05m-8.62-7.12l1.95.45"/></g><path d="M602.293 362.32L571.2 349.124c-3.22-1.366-6.927.11-8.28 3.3l-13.072 30.795c-1.354 3.19.16 6.88 3.38 8.25l40.808 17.32c3.22 1.36 6.927-.11 8.28-3.3l7.353-17.33"/><path d="M599.903 368.91L576.548 359c-1.075-.457-2.32.053-2.78 1.137l-10.836 25.53c-.46 1.084.037 2.333 1.113 2.79l30.166 12.804c1.08.46 2.32-.05 2.78-1.14l6.26-14.72"/><path stroke-linecap="square" d="M626.155 353.982l-13.473-5.72c-2.125-.9-4.588.108-5.5 2.254l-11.547 27.206c-.91 2.146.074 4.618 2.2 5.52l13.473 5.72c2.125.902 4.588-.107 5.5-2.253l11.547-27.21c.91-2.15-.074-4.62-2.2-5.52zm-65.03 18.024l1.563-3.682m34.814 5l21.17 8.987m-14.918-23.71l21.17 8.99m-9.23-11.52l1.84.78"/><g opacity=".84"><path d="M686.277 47.59l7.598-30.473c.787-3.156-1.123-6.35-4.265-7.133L659.266 2.42c-3.142-.785-6.327 1.138-7.114 4.294l-9.973 39.998c-.79 3.156 1.12 6.35 4.26 7.132l17.07 4.256"/><path d="M680.464 46.102l5.64-22.622c.26-1.042-.398-2.102-1.47-2.37l-25.228-6.29c-1.072-.267-2.15.36-2.41 1.402l-7.286 29.22c-.26 1.04.4 2.102 1.47 2.37l14.555 3.628"/><path stroke-linecap="square" d="M697.518 68.64l3.387-13.585c.535-2.143-.722-4.302-2.805-4.82l-26.414-6.587c-2.084-.52-4.207.797-4.74 2.94l-3.388 13.584c-.534 2.144.722 4.303 2.806 4.822l26.413 6.586c2.084.52 4.207-.797 4.74-2.94zM671.53 11.66l3.882.968m-.707 31.772l-5.323 21.347M690.23 48.27l-5.323 21.348m8.725-10.192l-.484 1.94"/></g><g opacity=".96"><path d="M574.496 957.495l9.26-26.895c.96-2.785 3.988-4.268 6.765-3.31l26.82 9.233c2.78.956 4.25 3.99 3.3 6.774l-12.15 35.3c-.96 2.785-3.98 4.267-6.76 3.31l-15.08-5.193"/><path d="M581.033 960.01l6.92-20.098c.32-.925 1.31-1.422 2.216-1.11l21.3 7.335c.9.312 1.38 1.314 1.06 2.24l-8.94 25.96c-.32.926-1.31 1.423-2.22 1.112l-12.29-4.24"/><path stroke-linecap="square" d="M556.125 967.846l3.937-11.433c.62-1.804 2.63-2.748 4.486-2.108l23.533 8.103c1.86.64 2.86 2.62 2.24 4.424l-3.93 11.432c-.62 1.804-2.63 2.748-4.48 2.108l-23.53-8.103c-1.85-.64-2.86-2.62-2.23-4.43zm47.596-30.724l-3.78-1.302m-15.11 25.466l-6.18 17.965m-7.05-22.52l-6.18 17.97m-2.09-12.35l-.65 1.89"/></g><g opacity=".99"><path d="M623 648.26v38.518c0 3.99-3.235 7.222-7.227 7.222h-38.546c-3.992 0-7.227-3.233-7.227-7.222v-50.556c0-3.99 3.235-7.222 7.227-7.222h21.682"/><path d="M614 648.8v28.8c0 1.326-1.074 2.4-2.4 2.4h-31.2c-1.326 0-2.4-1.074-2.4-2.4v-37.2c0-1.326 1.074-2.4 2.4-2.4h18"/><path stroke-linecap="square" d="M642 626.727v16.546c0 2.61-2.14 4.727-4.778 4.727h-33.444c-2.64 0-4.778-2.117-4.778-4.727v-16.546c0-2.61 2.14-4.727 4.778-4.727h33.444c2.64 0 4.778 2.117 4.778 4.727zM594 687h5m9-39v-26m20 26v-26m7 14v-2"/></g><g opacity=".83"><path d="M509.74 503.405l-23.85-4.636c-2.47-.48-4.857 1.1-5.332 3.54l-4.58 23.56c-.473 2.44 1.144 4.8 3.614 5.28l31.303 6.08c2.47.48 4.856-1.11 5.33-3.55l2.576-13.26"/><path d="M508.257 508.21l-17.5-3.4c-.807-.158-1.59.39-1.752 1.22l-3.804 19.567c-.16.832.37 1.632 1.17 1.79l22.61 4.393c.81.157 1.59-.39 1.75-1.222l2.2-11.288"/><path stroke-linecap="square" d="M525.827 494.308l-10.62-2.065c-1.675-.325-3.29.73-3.606 2.356l-4 20.61c-.31 1.62.79 3.21 2.46 3.53l10.62 2.06c1.68.32 3.29-.73 3.61-2.36l4.01-20.62c.32-1.63-.78-3.21-2.46-3.53zm-42.937 22.215l.573-2.945m24.704-1.31l16.687 3.244m-14.397-15.024l16.687 3.244m-8.862-6.816l1.963.38"/></g><g opacity=".91"><path d="M453.153 667.996l36.06 9.663c3.735 1 5.957 4.81 4.962 8.52l-9.6 35.82c-.994 3.71-4.826 5.9-8.56 4.9l-47.33-12.68c-3.736-1.01-5.957-4.82-4.963-8.53l5.4-20.16"/><path d="M450.963 675.692l27.156 7.276c1.25.335 1.99 1.615 1.65 2.86l-7.85 29.3c-.34 1.246-1.62 1.983-2.87 1.648l-35.08-9.4c-1.25-.334-2-1.614-1.66-2.86l4.53-16.903"/><path stroke-linecap="square" d="M437.844 644.224l15.982 4.283c2.522.675 4.025 3.24 3.358 5.73l-8.454 31.554c-.667 2.49-3.253 3.96-5.774 3.29l-15.982-4.28c-2.522-.67-4.025-3.24-3.358-5.73l8.454-31.55c.667-2.49 3.253-3.96 5.774-3.28zm44.123 60.48l1.294-4.83m-33.41-18.268l-25.11-6.73m30.03-11.623l-25.11-6.73m15.34-3.137l-1.93-.518"/></g><g opacity=".8"><path d="M350.288 250.344l23.356-6.697c2.418-.693 3.823-3.192 3.138-5.58l-6.615-23.07c-.685-2.39-3.2-3.765-5.62-3.07l-30.653 8.788c-2.42.694-3.824 3.193-3.14 5.582l3.722 12.977"/><path d="M349.427 245.39l17.138-4.914c.79-.227 1.24-1.07 1.005-1.884l-5.494-19.16c-.233-.815-1.062-1.292-1.85-1.065l-22.137 6.347c-.79.226-1.24 1.07-1.01 1.884l3.17 11.054"/><path stroke-linecap="square" d="M340.083 265.754l10.4-2.982c1.64-.47 2.6-2.143 2.144-3.736l-5.79-20.186c-.455-1.593-2.156-2.502-3.797-2.032l-10.4 2.982c-1.64.47-2.6 2.143-2.143 3.736l5.788 20.186c.457 1.593 2.158 2.503 3.798 2.032zm28.172-39.287l.827 2.884m-21.417 12.39l-16.34 4.69m19.648 6.85l-16.34 4.69m10.99 2.05l-1.923.55"/></g><g opacity=".77"><path d="M337.665 94.74l-8.31 22.83c-.86 2.364.392 4.99 2.8 5.866l23.235 8.457c2.406.876 5.054-.33 5.915-2.695l10.906-29.965c.87-2.365-.39-4.99-2.79-5.867l-13.07-4.757"/><path d="M343.373 96.598l-6.332 17.398c-.29.8.12 1.684.92 1.974l18.73 6.817c.8.29 1.68-.124 1.97-.925l8.18-22.472c.29-.8-.12-1.684-.91-1.974l-10.8-3.933"/><path stroke-linecap="square" d="M331.196 77.425l-3.7 10.166c-.583 1.61.252 3.39 1.867 3.97l20.464 7.45c1.615.59 3.397-.23 3.98-1.84l3.7-10.16c.585-1.6-.25-3.38-1.865-3.97l-20.465-7.45c-1.614-.58-3.397.24-3.98 1.84zm16.165 46.225l-2.81-1.026m1.63-24.946L352 81.703m-17.09 11.87l5.81-15.973m-6.835 7.088l.684-1.88"/></g><g opacity=".74"><path d="M271 797.222v-35.555c0-3.683-2.99-6.667-6.682-6.667h-35.636c-3.69 0-6.682 2.984-6.682 6.667v46.666c0 3.683 2.99 6.667 6.682 6.667h20.045"/><path d="M264 796.97v-26.74c0-1.233-1.014-2.23-2.267-2.23h-29.466c-1.253 0-2.267.997-2.267 2.23v34.54c0 1.233 1.014 2.23 2.267 2.23h17"/><path stroke-linecap="square" d="M289 817.455v-15.91c0-2.51-1.99-4.545-4.444-4.545h-31.112c-2.454 0-4.444 2.035-4.444 4.545v15.91c0 2.51 1.99 4.545 4.444 4.545h31.112c2.454 0 4.444-2.035 4.444-4.545zM244 762h4m10 35v25m18-25v25m6-13v2"/></g><g opacity=".99"><path d="M213.005 972.9l-35.074-8.746c-3.63-.905-5.83-4.6-4.92-8.255l8.8-35.29c.91-3.66 4.6-5.88 8.23-4.98l46.04 11.47c3.63.9 5.84 4.6 4.93 8.25l-4.95 19.84"/><path d="M215.706 965.328l-26.614-6.636c-1.226-.305-1.973-1.537-1.67-2.752l7.13-28.592c.302-1.215 1.54-1.95 2.765-1.646l34.376 8.57c1.226.307 1.973 1.538 1.67 2.753l-4.113 16.495"/><path stroke-linecap="square" d="M228.57 995.33l-15.437-3.848c-2.436-.607-3.917-3.08-3.308-5.52l7.714-30.94c.6-2.442 3.07-3.93 5.51-3.322l15.43 3.85c2.43.606 3.91 3.078 3.31 5.52l-7.72 30.94c-.61 2.44-3.08 3.928-5.52 3.32zm-43.892-57.32l-1.21 4.852m32.996 16.47l24.257 6.05m-28.61 11.416l24.26 6.05m-15.28 3.404l1.94.484"/></g><g opacity=".8"><path d="M114.488 733.58l24.724-23.875c2.56-2.473 6.63-2.413 9.088.133l23.744 24.59c2.46 2.545 2.377 6.613-.183 9.086l-32.45 31.336c-2.56 2.473-6.62 2.413-9.08-.133l-13.35-13.83"/><path d="M120.282 739.106l18.25-17.624c.84-.812 2.185-.782 3.003.066l19.266 19.95c.82.847.81 2.19-.03 3.003l-23.57 22.77c-.84.81-2.18.79-3-.06l-11.12-11.51"/><path stroke-linecap="square" d="M89.01 734.552l10.527-10.167c1.662-1.604 4.322-1.545 5.94.132l20.532 21.26c1.62 1.678 1.58 4.34-.08 5.943l-10.53 10.167c-1.66 1.604-4.33 1.545-5.94-.132l-20.54-21.26c-1.62-1.678-1.59-4.338.07-5.943zm68.583-6.453l-2.78-2.88m-31.428 17.84l-16.545 15.97m4.736-28.21L95.03 746.81m4.49-14.067l-1.44 1.39"/></g><g opacity=".79"><path d="M217.2 204.008l-17.756-34.848c-1.84-3.61-6.267-5.037-9.89-3.19L154.56 183.8c-3.623 1.845-5.07 6.267-3.23 9.876l23.304 45.738c1.84 3.61 6.267 5.038 9.89 3.19l19.684-10.028"/><path d="M210.298 208.084l-13.386-26.27c-.617-1.21-2.1-1.69-3.314-1.07l-28.57 14.557c-1.215.62-1.7 2.1-1.083 3.31l17.29 33.94c.616 1.21 2.1 1.69 3.313 1.07l16.484-8.4"/><path stroke-linecap="square" d="M243.956 214.67l-7.8-15.31c-1.23-2.415-4.18-3.38-6.585-2.154l-30.49 15.537c-2.4 1.225-3.36 4.178-2.12 6.593l7.8 15.31c1.23 2.415 4.18 3.38 6.59 2.154l30.49-15.537c2.41-1.225 3.36-4.178 2.13-6.593zm-71.394-32.187l4.455-2.27m26.616 30.21l12.258 24.057m4.68-32.683l12.26 24.057m.32-16.997l.91 1.782"/></g><g stroke-linecap="square" opacity=".72" transform="translate(1 -9) scale(-1 1) rotate(52 -1570.654 -1000.92)"><path d="M17 35.96h10.2S34 36.785 34 31"/><circle cx="15.5" cy="18.5" r="3.5"/><circle cx="35.5" cy="18.5" r="3.5"/><circle cx="25.5" cy="25.5" r="25.5"/></g><g stroke-linecap="square" opacity=".94" transform="translate(1 -9) scale(-1 1) rotate(46 -1448.33 -1149.55)"><path d="M22 45.943h13.2S44 47.1 44 39"/><circle cx="19.5" cy="24.5" r="4.5"/><circle cx="45.5" cy="24.5" r="4.5"/><circle cx="32.5" cy="32.5" r="32.5"/></g><g stroke-linecap="square" opacity=".95" transform="translate(1 -9) rotate(82 148.566 982.035)"><path d="M22 45.943h13.2S44 47.1 44 39"/><circle cx="19.5" cy="24.5" r="4.5"/><circle cx="45.5" cy="24.5" r="4.5"/><circle cx="32.5" cy="32.5" r="32.5"/></g><g stroke-linecap="square" opacity=".89" transform="translate(1 -9) rotate(75 84.842 1327.546)"><path d="M18 36.96h10.8S36 37.785 36 32"/><circle cx="15.5" cy="19.5" r="3.5"/><circle cx="37.5" cy="19.5" r="3.5"/><circle cx="26.5" cy="26.5" r="26.5"/></g><g stroke-linecap="square" opacity=".73" transform="translate(1 -9) scale(-1 1) rotate(46 -1447.424 -883.448)"><path d="M21 43.95h12.6S42 44.944 42 38"/><circle cx="19.5" cy="23.5" r="4.5"/><circle cx="45.5" cy="23.5" r="4.5"/><circle cx="32" cy="32" r="32"/></g><g stroke-linecap="square" opacity=".73" transform="translate(1 -9) scale(1 -1) rotate(74 1124.853 228.057)"><path d="M17 35.96h10.2S34 36.785 34 31"/><circle cx="15.5" cy="18.5" r="3.5"/><circle cx="35.5" cy="18.5" r="3.5"/><circle cx="25.5" cy="25.5" r="25.5"/></g><g stroke-linecap="square" opacity=".7" transform="translate(1 -9) scale(-1 1) rotate(-52 -17.832 1315.122)"><path d="M17 34.96h10.2S34 35.785 34 30"/><circle cx="15.5" cy="18.5" r="3.5"/><circle cx="35.5" cy="18.5" r="3.5"/><circle cx="25" cy="25" r="25"/></g><g stroke-linecap="square" opacity=".74" transform="translate(1 -9) scale(1 -1) rotate(-38 -520.64 -1542.033)"><path d="M21 43.95h12.6S42 44.944 42 38"/><circle cx="19.5" cy="23.5" r="4.5"/><circle cx="45.5" cy="23.5" r="4.5"/><circle cx="32" cy="32" r="32"/></g><g stroke-linecap="square" opacity=".83" transform="translate(1 -9) rotate(160 284.084 557.318)"><path d="M17 35.96h10.2S34 36.785 34 31"/><circle cx="15.5" cy="19.5" r="3.5"/><circle cx="36.5" cy="19.5" r="3.5"/><circle cx="26" cy="26" r="26"/></g><g stroke-linecap="square" opacity=".92" transform="translate(1 -9) scale(1 -1) rotate(-42 286.768 -948.01)"><path d="M19 39.95h11.4S38 40.944 38 34"/><circle cx="16.5" cy="20.5" r="3.5"/><circle cx="38.5" cy="20.5" r="3.5"/><circle cx="28" cy="28" r="28"/></g><g stroke-linecap="square" opacity=".88" transform="translate(1 -9) scale(1 -1) rotate(-33 45.562 -1104.676)"><path d="M16 32.96h9.6S32 33.785 32 28"/><circle cx="14" cy="17" r="3"/><circle cx="33" cy="17" r="3"/><circle cx="23.5" cy="23.5" r="23.5"/></g><g stroke-linecap="square" opacity=".98" transform="translate(1 -9) scale(1 -1) rotate(-48 -692.48 -655.485)"><path d="M22 45.943h13.2S44 47.1 44 39"/><circle cx="19.5" cy="24.5" r="4.5"/><circle cx="45.5" cy="24.5" r="4.5"/><circle cx="32.5" cy="32.5" r="32.5"/></g><g stroke-linecap="square" opacity=".89" transform="translate(1 -9) rotate(3 -7510.898 3186.207)"><path d="M16 32.96h9.6S32 33.785 32 28"/><circle cx="14" cy="17" r="3"/><circle cx="33" cy="17" r="3"/><circle cx="23.5" cy="23.5" r="23.5"/></g><g stroke-linecap="square" opacity=".98"><path d="M1053.253 1017.81c2.69 3.314 6.723 6.018 11.604 7.418 2.178.624 4.347.923 6.446.96l6.09 6.635 2.335-8.145c4.125-1.703 7.25-4.754 8.403-8.78.57-1.964.61-3.977.21-5.945"/><path d="M1067.64 974.89c-13.272-3.805-26.46 1.583-29.458 12.035-1.29 4.503-.47 9.208 1.933 13.414l-3.57 12.44 13.89-2.66c1.954 1.06 4.073 1.96 6.352 2.61 13.272 3.8 26.46-1.58 29.458-12.04 2.997-10.45-5.332-22.01-18.605-25.82z"/></g><g stroke-linecap="square" opacity=".95"><path d="M1016.02 669.497c-2.414-2.8-4.15-6.68-4.693-11.11-.243-1.976-.216-3.9.02-5.723l-4.74-6.22 7.064-.867c1.94-3.334 4.87-5.607 8.37-6.036 1.7-.2 3.38.04 4.97.67"/><path d="M1054.948 662.703c1.48 12.06-4.9 22.766-14.255 23.915-4.03.495-7.95-.874-11.23-3.547l-11.14 1.37 4.142-11.69c-.65-1.84-1.134-3.81-1.388-5.88-1.48-12.06 4.9-22.76 14.254-23.91 9.36-1.15 18.14 7.7 19.62 19.76z"/></g><g stroke-linecap="square" opacity=".95"><path d="M1269.018 964.594c-2.412-2.8-4.148-6.682-4.69-11.11-.244-1.977-.217-3.9.02-5.724l-4.743-6.22 7.065-.867c1.938-3.334 4.87-5.607 8.362-6.036 1.703-.21 3.38.04 4.966.67"/><path d="M1307.947 957.8c1.48 12.06-4.9 22.766-14.254 23.914-4.03.495-7.95-.873-11.23-3.547l-11.14 1.368 4.14-11.694c-.65-1.84-1.132-3.81-1.387-5.88-1.48-12.06 4.9-22.76 14.255-23.91 9.36-1.15 18.14 7.7 19.62 19.76z"/></g><g stroke-linecap="square" opacity=".95"><path d="M1392.018 272.593c-2.412-2.8-4.148-6.682-4.69-11.11-.244-1.977-.217-3.9.02-5.723l-4.743-6.22 7.065-.867c1.94-3.334 4.87-5.607 8.362-6.036 1.703-.21 3.38.04 4.966.67"/><path d="M1430.947 265.798c1.48 12.06-4.9 22.767-14.254 23.916-4.03.495-7.95-.874-11.23-3.547l-11.14 1.368 4.14-11.695c-.65-1.846-1.132-3.812-1.387-5.883-1.48-12.06 4.9-22.767 14.255-23.915 9.36-1.15 18.14 7.696 19.62 19.756z"/></g><g stroke-linecap="square" opacity=".81"><path d="M1421.29 705.443c4.205 2.98 7.8 7.637 9.904 13.42.94 2.58 1.488 5.178 1.715 7.71l8.48 6.822-9.56 3.477c-1.68 5.12-5.06 9.14-9.79 10.86-2.31.837-4.71 1.05-7.11.722"/><path d="M1370.603 726.02c-5.856-16.09-.48-32.816 12.008-37.36 5.39-1.96 11.2-1.324 16.56 1.305l14.88-5.414-1.98 17.38c1.48 2.33 2.77 4.88 3.77 7.64 5.86 16.09.48 32.82-12 37.36-12.48 4.55-27.36-4.81-33.21-20.9z"/></g><g stroke-linecap="square" opacity=".77"><path d="M1057.578 423.79c-.084 3.61-1.38 7.517-3.91 11.002-1.13 1.556-2.423 2.89-3.804 4.013l-.637 7.595-5.76-4.184c-3.627 1.03-7.283.64-10.13-1.427-1.388-1.01-2.454-2.33-3.2-3.85"/><path d="M1025.576 402.394c6.98-9.607 18.818-12.904 26.44-7.365 3.286 2.38 5.244 6.02 5.86 10.16l9.08 6.59-10.855 5.52c-.75 1.76-1.71 3.49-2.91 5.14-6.98 9.6-18.82 12.9-26.44 7.36-7.62-5.54-8.15-17.82-1.17-27.43z"/></g><g stroke-linecap="square" opacity=".87"><path d="M946.37 658.764c-4.783.007-9.985 1.616-14.65 4.882-2.08 1.457-3.87 3.136-5.383 4.94l-10.076.627 5.45 7.774c-1.43 4.793-.97 9.664 1.72 13.506 1.31 1.874 3.04 3.33 5.04 4.365"/><path d="M974.15 701.925c13.12-9.187 18.025-24.817 10.957-34.91-3.045-4.35-7.82-6.95-13.315-7.78l-8.418-12.024-7.837 14.33c-2.38 1-4.73 2.26-6.983 3.84-13.12 9.19-18.026 24.82-10.958 34.91 7.068 10.1 23.434 10.83 36.554 1.65z"/></g><g stroke-linecap="square" opacity=".77"><path d="M943.19 495.793c-3.78-.67-8.153-.157-12.37 1.72-1.88.838-3.57 1.89-5.06 3.076l-8.062-.94 3.033 6.81c-1.91 3.52-2.34 7.37-.84 10.74.73 1.64 1.86 3.01 3.27 4.1"/><path d="M957.695 533.29c11.605-5.166 17.825-16.512 13.894-25.34-1.7-3.805-5-6.514-9.14-7.96l-4.69-10.517-8.3 9.908c-2 .42-4.02 1.05-6.02 1.94-11.61 5.17-17.83 16.51-13.9 25.34 3.93 8.83 16.52 11.8 28.13 6.63z"/></g><g stroke-linecap="square" opacity=".77"><path d="M408.906 1042.687c-2.258-.4-4.87-.094-7.387 1.027-1.13.5-2.14 1.128-3.03 1.837l-4.82-.56 1.81 4.07c-1.14 2.11-1.4 4.4-.51 6.42.43.98 1.11 1.8 1.95 2.45"/><path d="M417.568 1065.08c6.93-3.086 10.644-9.862 8.297-15.134-1.012-2.272-2.986-3.89-5.458-4.753l-2.796-6.28-4.95 5.916c-1.19.25-2.4.62-3.59 1.15-6.93 3.08-10.64 9.86-8.3 15.13 2.35 5.27 9.87 7.04 16.8 3.96z"/></g><g stroke-linecap="square" opacity=".87"><path d="M759.387 704.334c4.496-.125 9.372-1.756 13.73-4.92 1.943-1.414 3.613-3.026 5.02-4.748l9.466-.834-5.18-7.13c1.304-4.513.84-9.053-1.72-12.577-1.25-1.718-2.88-3.036-4.768-3.954"/><path d="M732.843 664.397c-12.064 8.765-16.317 23.476-9.5 32.86 2.938 4.042 7.454 6.426 12.605 7.14l8.12 11.176 7.02-13.52c2.202-.96 4.37-2.173 6.442-3.677 12.064-8.765 16.317-23.477 9.5-32.86s-22.123-9.884-34.187-1.12z"/></g><g stroke-linecap="square" opacity=".83"><path d="M760.397 610.38c.803-3.755.442-8.143-1.287-12.423-.77-1.91-1.763-3.634-2.897-5.164l1.22-8.025-6.915 2.794c-3.454-2.033-7.286-2.604-10.703-1.223-1.666.67-3.08 1.74-4.216 3.12"/><path d="M721.677 624.406c4.862 12.033 16.25 18.78 25.434 15.07 3.96-1.6 6.86-4.885 8.49-9.062l10.94-4.42-9.84-8.817c-.35-2.06-.92-4.145-1.76-6.21-4.86-12.034-16.25-18.78-25.43-15.07-9.18 3.71-12.69 16.475-7.83 28.51z"/></g><g stroke-linecap="square" opacity=".93"><path d="M552.334 836.556c-.9 4.496-3.374 9.157-7.29 13.074-1.748 1.747-3.65 3.19-5.613 4.355l-2.46 9.383-6.23-6.232c-4.73.657-9.19-.466-12.27-3.546-1.5-1.502-2.53-3.33-3.13-5.357"/><path d="M516.688 804.446c10.74-10.74 26.094-12.797 34.295-4.596 3.533 3.533 5.15 8.396 5.002 13.645l9.768 9.768-14.63 4.996c-1.325 2.05-2.893 4.04-4.737 5.88-10.74 10.74-26.093 12.8-34.294 4.59-8.2-8.2-6.144-23.56 4.596-34.3z"/></g><g stroke-linecap="square" opacity=".8"><path d="M527.816 750.214c-4.343 2.323-9.838 3.387-15.642 2.674-2.59-.318-5.023-.98-7.263-1.89l-9.44 4.334 1.2-9.757c-3.6-3.684-5.54-8.356-4.94-13.178.29-2.35 1.15-4.52 2.47-6.44"/><path d="M532.784 697.448c16.17 1.986 28.015 13.9 26.454 26.61-.672 5.476-3.732 10.2-8.28 13.652l-1.86 15.14-13.86-9.282c-2.615.256-5.33.25-8.106-.09-16.17-1.986-28.015-13.9-26.454-26.61 1.56-12.71 15.935-21.405 32.106-19.42z"/></g><g stroke-linecap="square" opacity=".99"><path d="M392.867 834.627c3.606 1.035 7.18 3.37 9.99 6.837 1.252 1.548 2.238 3.2 2.987 4.886l7.464 2.643-5.796 4.693c.037 3.924-1.363 7.5-4.227 9.82-1.397 1.132-3.012 1.86-4.745 2.21"/><path d="M362.604 861.064c-7.82-9.658-8.07-22.417-.56-28.5 3.237-2.62 7.386-3.564 11.687-3.03l8.95-7.243 2.74 12.4c1.57 1.25 3.06 2.69 4.4 4.35 7.82 9.66 8.07 22.42.56 28.5-7.51 6.09-19.94 3.19-27.76-6.47z"/></g><g stroke-linecap="square" opacity=".94"><path d="M452.66 538.485c3.01-3.828 5.045-9.023 5.452-14.856.182-2.61.01-5.12-.436-7.49l5.87-8.46-9.468-.66c-2.818-4.24-6.884-7.01-11.563-7.34-2.282-.16-4.5.28-6.563 1.21"/><path d="M401.635 532.912c-1.117 15.977 7.942 29.626 20.235 30.485 5.296.37 10.323-1.704 14.426-5.45l14.64 1.023-6.2-15.105c.726-2.476 1.223-5.098 1.415-7.84 1.12-15.978-7.94-29.627-20.23-30.486-12.29-.86-23.16 11.39-24.28 27.37z"/></g><g stroke-linecap="square" opacity=".99"><path d="M152.593 525.05c.912-4.55 3.424-9.21 7.41-13.056 1.777-1.717 3.71-3.12 5.71-4.232l2.502-9.474 6.357 6.583c4.825-.49 9.367.82 12.51 4.07 1.532 1.59 2.59 3.49 3.195 5.58"/><path d="M188.487 559.34c-11.124 10.743-26.945 12.406-35.337 3.716-3.616-3.745-5.25-8.802-5.065-14.203l-9.996-10.35 15.09-4.712c1.37-2.07 3-4.07 4.91-5.92 11.12-10.74 26.94-12.4 35.33-3.71 8.39 8.69 6.18 24.45-4.95 35.19z"/></g><g stroke-linecap="square" opacity=".79"><path d="M188.897 10.796c3.8-.54 8.153.127 12.302 2.15 1.85.903 3.5 2.013 4.94 3.25l8.09-.655-3.27 6.71c1.78 3.59 2.09 7.45.47 10.76-.79 1.62-1.96 2.95-3.41 3.99"/><path d="M172.204 48.444c-11.665-5.69-17.6-17.52-13.258-26.424 1.87-3.836 5.35-6.495 9.63-7.834L173.75 3.58l8.108 10.43c2.03.498 4.07 1.213 6.073 2.19 11.67 5.69 17.61 17.52 13.26 26.423-4.34 8.904-17.32 11.51-28.98 5.82z"/></g><g stroke-linecap="square" opacity=".84"><path d="M55.92 102.502c-.062-3.84-1.4-8.033-4.048-11.814-1.182-1.688-2.536-3.145-3.985-4.38l-.618-8.094-6.11 4.277c-3.83-1.2-7.69-.89-10.71 1.22-1.47 1.03-2.61 2.4-3.41 3.99"/><path d="M21.347 124.88c7.445 10.63 20.058 14.642 28.173 8.96 3.496-2.448 5.578-6.3 6.23-10.738l9.666-6.768-11.57-6.377c-.81-1.927-1.834-3.83-3.112-5.655C43.29 93.67 30.677 89.658 22.562 95.34c-8.115 5.682-8.66 18.907-1.215 29.54z"/></g><path d="M1125.22 584.963c15.222 1.07 38.73-13.473 38.73-13.473s-20.116-17.614-36.49-18.766c-17.654-1.242-23.123 14.572-23.123 14.572s3.1 16.416 20.882 17.667zm4.87-15.84L1092 566.46m143.544 417.364c8.76.616 22.284-7.752 22.284-7.752s-11.574-10.135-20.995-10.797c-10.157-.715-13.304 8.384-13.304 8.384s1.78 9.44 12.01 10.16zm2.803-9.115l-21.916-1.54" stroke-linecap="square" opacity=".97"/><path d="M1048.42 504.857l16.18 11.755m-16.554-23.15l21.843 15.87m-10.89-19.04l16.18 11.757m-39.37 15.9c-2-1.46-2.45-4.29-1-6.29 1.45-2 4.28-2.45 6.28-1l18.2 13.22m21.16-29.13l-18.21-13.23c-2-1.46-2.45-4.29-1-6.29 1.45-2 4.28-2.45 6.28-1m28.37 18.14c12.94 9.4 15.76 27.45 6.32 40.44-9.44 12.99-27.47 15.88-40.42 6.48l-8.99-6.53 34.09-46.93 8.99 6.53zm-18.09 40.01l4.7-6.47m7.64-10.52l4.7-6.48" stroke-linecap="square" opacity=".83"/><g opacity=".75" transform="translate(1 -9) rotate(95 420.338 725.038)"><path d="M17.62 34l-2.024 7.518C12.682 52.348 20.816 63 32 63c11.185 0 19.32-10.653 16.403-21.484l-2.01-7.47M35.09 0C34.405 1.69 34 3.57 34 5.508 34 13.512 40.47 20 48.45 20c4.06 0 7.925-1.858 10.55-4.563"/><circle cx="21.5" cy="19.5" r="6.5"/><path stroke-linecap="square" d="M0 25.412C0 16.93 14.103 0 31.5 0S63 16.93 63 25.412C63 29.912 48.897 36 31.5 36S0 29.647 0 25.412z"/></g><g opacity=".72" transform="translate(1 -9) scale(-1 1) rotate(26 -1622.612 -2319.724)"><path d="M0 36h9M9 9l7 7m42-7l-7 7M7 65l8-8m46 8l-8-8m6-21h9M25 5l-5-5m22 5l5-5m-1.636 11C53.432 16.016 59 26.162 59 37.904 59 54.548 47.864 68 34 68S9 54.548 9 37.904c0-11.742 5.568-21.888 13.636-26.79M34 16v52"/><circle cx="22.5" cy="27.5" r="4.5" stroke-linecap="square"/><circle cx="45.5" cy="27.5" r="4.5" stroke-linecap="square"/><circle cx="21.5" cy="44.5" r="5.5" stroke-linecap="square"/><circle cx="46.5" cy="44.5" r="5.5" stroke-linecap="square"/><path stroke-linecap="square" d="M34.5 2C28.58 2 23.797 6.28 23 11.72c0 0 5.807 4.28 11.5 4.28S46 11.835 46 11.72C45.203 6.28 40.42 2 34.5 2z"/></g><g stroke-linecap="square" opacity=".84" transform="translate(1 -9) scale(1 -1) rotate(31 1239.602 1843.862)"><path d="M31 36c-2.75 0-5 2.25-5 5s2.25 5 5 5m0-29c-2.75 0-5 2.25-5 5s2.25 5 5 5"/><circle cx="40" cy="31" r="31"/><path d="M45 17c7.7 0 14 6.525 14 14.5S52.7 46 45 46V17zm-5 45H0v-1.167C0 57.567 2.588 55 5.882 55c3.883 0 7.06 3.15 7.06 7"/></g><g opacity=".79"><path d="M1141.2 447.008l-17.757-34.848c-1.84-3.61-6.266-5.038-9.89-3.19l-34.992 17.828c-3.62 1.847-5.07 6.268-3.23 9.877l23.31 45.74c1.84 3.608 6.27 5.036 9.89 3.19l19.69-10.03"/><path d="M1134.298 451.084l-13.387-26.272c-.61-1.21-2.09-1.688-3.31-1.07l-28.57 14.56c-1.21.617-1.7 2.098-1.08 3.308l17.29 33.935c.62 1.21 2.1 1.688 3.32 1.07l16.49-8.4"/><path stroke-linecap="square" d="M1167.956 457.67l-7.8-15.31c-1.23-2.415-4.18-3.38-6.585-2.154l-30.49 15.536c-2.4 1.226-3.36 4.178-2.12 6.594l7.8 15.31c1.23 2.415 4.18 3.38 6.59 2.154l30.49-15.537c2.41-1.226 3.36-4.178 2.13-6.593zm-71.394-32.187l4.455-2.27m26.615 30.21l12.258 24.056m4.672-32.69l12.257 24.05m.31-17l.91 1.78"/></g><g stroke-linecap="square" opacity=".96" transform="translate(1 -9) scale(1 -1) rotate(-50 382.6 -1361.971)"><path d="M24 24c0-2.2-2.025-4-4.5-4S15 21.8 15 24m36 0c0-2.2-2.025-4-4.5-4S42 21.8 42 24"/><circle cx="33" cy="33" r="33"/><path d="M50 35c0 9.9-7.875 18-17.5 18S15 44.9 15 35h35z"/></g><g opacity=".75"><path d="M1118.117 673.734l18.27 8.134"/><path stroke-linecap="square" d="M1122.666 705.314l-4.715-31.654 26.68-17.678-11.21-4.99c-7.43-3.31-16.13.033-19.44 7.463l-9.98 22.423c-3.3 7.43.04 16.136 7.47 19.444l11.21 4.992zm20.32-21.055c4.38-9.84 16.11-14.18 26.203-9.68l13.7 6.1-10.82 5.85 2.88 11.96-10.82 5.85 2.88 11.96-13.71-6.11c-10.09-4.5-14.72-16.11-10.34-25.95z"/></g><path d="M1184.66 454.246c-5.11-13.295 1.457-38.246 1.457-38.246s21.21 13.148 26.706 27.448c5.926 15.418-6.696 24.615-6.696 24.615s-15.498 1.712-21.467-13.817zm12.607-9.2l12.67 33.008" stroke-linecap="square" opacity=".88"/><g stroke-linecap="square" opacity=".95" transform="translate(1 -9) scale(-1 1) rotate(-50 -621.578 1474.631)"><path d="M19 20c0-2.2-1.575-4-3.5-4S12 17.8 12 20m29 0c0-2.2-1.575-4-3.5-4S34 17.8 34 20"/><circle cx="26.5" cy="26.5" r="26.5"/><path d="M40 28c0 7.7-6.3 14-14 14s-14-6.3-14-14h28z"/></g><g opacity=".81"><path d="M1259.352 97.884l13.787 2.43"/><path stroke-linecap="square" d="M1267.696 119.664l-9.06-21.907 16.006-17.486-8.953-1.57c-5.94-1.04-11.6 2.92-12.64 8.85l-3.16 17.91c-1.05 5.94 2.91 11.59 8.85 12.64l8.95 1.58zm10.454-18.973c1.39-7.88 8.816-13.17 16.586-11.79l10.552 1.86-6.535 6.21 4.017 8.07-6.535 6.21 4.017 8.07-10.55-1.86c-7.772-1.37-12.943-8.87-11.552-16.76z"/></g><g opacity=".8"><path d="M1197.618 261.674l23.356-6.697c2.418-.693 3.823-3.192 3.138-5.58l-6.615-23.07c-.685-2.39-3.2-3.765-5.62-3.07l-30.653 8.79c-2.42.692-3.824 3.19-3.14 5.58l3.722 12.977"/><path d="M1196.757 256.72l17.138-4.914c.79-.227 1.24-1.07 1.005-1.884l-5.494-19.16c-.233-.815-1.062-1.292-1.85-1.065l-22.137 6.347c-.79.226-1.24 1.07-1.01 1.884l3.17 11.054"/><path stroke-linecap="square" d="M1187.413 277.084l10.4-2.982c1.64-.47 2.6-2.143 2.144-3.735l-5.79-20.187c-.455-1.592-2.156-2.502-3.797-2.032l-10.4 2.982c-1.64.47-2.6 2.143-2.143 3.736l5.788 20.186c.457 1.593 2.158 2.503 3.798 2.032zm28.172-39.287l.827 2.884m-21.417 12.39l-16.34 4.69m19.648 6.85l-16.34 4.69m10.99 2.05l-1.923.55"/></g><g opacity=".84" transform="translate(1 -9) scale(1 -1) rotate(32 1198.827 1942.319)"><path d="M19 18h10m-19 0l-7-5m42 0l-7 5"/><circle cx="15" cy="18" r="5" stroke-linecap="square"/><circle cx="34" cy="18" r="5" stroke-linecap="square"/><path stroke-linecap="square" d="M16 30c0 4.4 3.6 8 8 8s8-3.6 8-8H16z"/><circle cx="24" cy="24" r="24" stroke-linecap="square"/></g><g opacity=".76" transform="translate(1 -9) rotate(-47 1018.735 -1151.345)"><path d="M0 38h9M9 9l8 8m45-8l-8 8M7 69l9-9m48 9l-9-9m7-22h9M27 6l-6-6m23 6l6-6m-3.182 12C55.208 17.192 61 27.694 61 39.848 61 57.076 49.418 71 35 71S9 57.076 9 39.848c0-12.154 5.79-22.656 14.182-27.73M36 17v54"/><circle cx="23.5" cy="28.5" r="4.5" stroke-linecap="square"/><circle cx="47.5" cy="28.5" r="4.5" stroke-linecap="square"/><circle cx="23" cy="46" r="6" stroke-linecap="square"/><circle cx="49" cy="46" r="6" stroke-linecap="square"/><path stroke-linecap="square" d="M36 2c-6.178 0-11.168 4.28-12 9.72 0 0 6.06 4.28 12 4.28s12-4.165 12-4.28C47.168 6.28 42.178 2 36 2z"/></g><path d="M1146.406 628.722c7.016 15.063 33.277 29.772 33.277 29.772s6.156-28.455-1.39-44.658c-8.138-17.468-26.086-14.33-26.086-14.33s-13.997 11.62-5.8 29.216zm17.738-3.552L1146.81 588" stroke-linecap="square" opacity=".78"/><g stroke-linecap="square" opacity=".89" transform="translate(1 -9) rotate(3 -11184.91 23077.601)"><path d="M16 32.96h9.6S32 33.785 32 28"/><circle cx="14" cy="17" r="3"/><circle cx="33" cy="17" r="3"/><circle cx="23.5" cy="23.5" r="23.5"/></g><g stroke-linecap="square" opacity=".89" transform="translate(1 -9) rotate(3 -2242.281 26741.324)"><path d="M16 32.96h9.6S32 33.785 32 28"/><circle cx="14" cy="17" r="3"/><circle cx="33" cy="17" r="3"/><circle cx="23.5" cy="23.5" r="23.5"/></g><g opacity=".71" transform="translate(1 -9) scale(1 -1) rotate(-14 -1855.433 -5097.159)"><circle cx="23" cy="41" r="2" stroke-linecap="square"/><circle cx="35" cy="41" r="2" stroke-linecap="square"/><circle cx="18" cy="21" r="3" stroke-linecap="square"/><circle cx="41" cy="21" r="3" stroke-linecap="square"/><path stroke-linecap="square" d="M32.357 50h-7.714C19.317 50 15 45.747 15 40.5s4.317-9.5 9.643-9.5h7.714C37.683 31 42 35.253 42 40.5S37.683 50 32.357 50z"/><path d="M19 5.746C15.723 2.63 10.002 0 0 0c0 11.902.93 16.707 4.288 20M39 5.746C42.277 2.63 47.998 0 58 0c0 11.902-.93 16.707-4.288 20"/><circle cx="29" cy="31" r="27" stroke-linecap="square"/></g><path d="M1267.38 608.237l-17.966 20.667c-3.04 3.498-2.94 8.61.222 11.358l24.438 21.244 29.022-33.386-24.44-21.243c-3.16-2.75-8.236-2.137-11.277 1.36zm33.31 48.564l-6.038-5.24M1292.65 663l-6.038-5.248m19.823-10.61l-6.037-5.248m2.698-13.774l7.255-8.346-8.49-7.38c-1.55-1.354-4.13-.96-5.73.878l-4.35 5.007" stroke-linecap="square" opacity=".83"/><path d="M1402.552 200.367c-8.498-10.136-31.717-16.034-31.717-16.034s1.13 23.144 10.27 34.046c9.853 11.75 23.004 5.64 23.004 5.64s8.36-11.82-1.56-23.66zM1389.016 206l21.817 26" stroke-linecap="square" opacity=".8"/><g stroke-linecap="square" opacity=".79" transform="translate(1 -9) scale(1 -1) rotate(52 1176.036 1001.845)"><path d="M22 26c-1.65 0-3 1.575-3 3.5s1.35 3.5 3 3.5m0-21c-1.65 0-3 1.575-3 3.5s1.35 3.5 3 3.5"/><circle cx="29.5" cy="22.5" r="22.5"/><path d="M33 12c5.5 0 10 4.725 10 10.5S38.5 33 33 33V12zm-4 33H0v-.833C0 41.833 1.876 40 4.265 40c2.814 0 5.117 2.25 5.117 5"/></g><g opacity=".82"><path d="M1248.482 445.46c-.838.25-1.573.384-2.418.414-5.81.203-10.736-4.578-10.947-10.625-.21-6.05 4.37-11.16 10.18-11.37.844-.03 1.693.05 2.44.24"/><path stroke-linecap="square" d="M1276.93 457.804c.173 4.947 4.17 8.86 8.88 8.695l6.425-.23m-24.3-8.16c.173 4.94-3.54 9.13-8.252 9.29l-6.424.22m22.03-56.81c-.18-4.95 3.54-9.13 8.25-9.3l6.42-.23m-23.67 9.83c-.18-4.95-4.17-8.86-8.88-8.7l-6.43.23"/><path stroke-linecap="square" d="M1300.078 432.98c.464 13.302-9.74 24.356-22.908 24.816l-6.476.226c-13.168.46-24.12-9.855-24.583-23.156-.46-13.3 9.74-24.355 22.91-24.815l6.48-.22c13.17-.46 24.12 9.86 24.59 23.16z"/></g><g opacity=".71"><path d="M1358.76 365.786c.287-2.602.185-5.29-.36-7.963-1.408-6.89-5.464-12.512-10.886-16.033-5.42-3.52-12.208-4.94-19.074-3.423-2.664.59-5.16 1.59-7.42 2.91m-12.778 21.512l-1.81 30.26.03.02c-.193 2.44.876 4.9 3.053 6.31 2.177 1.41 4.854 1.39 7.008.22l.03.01 26.913-13.97"/><path d="M1307.934 366.166c-4.153.232-8.19 2.364-10.606 6.085-1.663 2.56-2.318 5.49-2.092 8.33 3.24-2.78 8.077-3.45 12.1-1.7m34.01 8.99c1.476 3.89 1.17 8.45-1.246 12.17-1.663 2.56-4.066 4.35-6.754 5.3 1.22-4.09-.132-8.78-3.366-11.74m-7.106-22.1c-3.302.6-6.77 0-9.763-1.94-6.37-4.13-8.08-12.81-3.81-19.37.35-.53.69-1 1.09-1.47m20.03 27.71c.8 3.25 2.77 6.17 5.76 8.11 6.37 4.14 14.99 2.17 19.25-4.39.35-.53.64-1.04.9-1.6"/><path stroke-linecap="square" d="M1332.684 365.545l-17.612-11.437c-6.485-4.21-8.328-12.882-4.117-19.366l17.612 11.437c6.485 4.21 8.328 12.88 4.117 19.36zm0 0l17.612 11.438c6.484 4.21 15.155 2.368 19.366-4.117l-17.612-11.437c-6.485-4.22-15.155-2.37-19.366 4.11m-8.387-5.45c-1.504 2.31-4.413 3.09-6.497 1.74-2.085-1.35-2.555-4.33-1.05-6.65m31.03 20.15c-1.504 2.31-4.413 3.09-6.498 1.74-2.084-1.36-2.554-4.33-1.05-6.65m-16.643-.08c1.35-2.09 6.59-6.45 8.67-5.1 2.08 1.35.22 7.91-1.13 10-1.36 2.08-6.59 6.45-8.68 5.09-2.09-1.36-.23-7.92 1.13-10z"/></g></g></svg>
!!!!Source: AFNCCF

For a plethora of useful resources, training slides and evaluation information to successfully refine or develop a peer mentoring programme to support the mental health and emotional wellbeing of children and young people in schools, colleges or community organisations please see the [[Peer support resources|https://www.annafreud.org/what-we-do/schools-in-mind/our-work-with-schools/peer-support-for-children-and-young-peoples-mental-health-and-emotional-wellbeing-programme/]] page on the Anna Freud National Centre for Children and Families website.

Peer Support for Children and Young People's Mental Health and Emotional Wellbeing Programme
This national Department for Education (~DfE) funded programme was piloted in 89 schools, colleges and community organisations in six different regions in England.  

The participating settings received evidence informed training and resources to help them to develop or refine a peer mentoring programme to support the mental health and wellbeing of the children and young people in their setting.

Just to check that the following tiddlers should be tagged "CWP Library":

<<list-links "[!is[system]!is[image]sort[]]">>

Children are experiencing increased levels of emotional symptoms in the context of the COVID-19 pandemic and are also struggling to access support and services because of the lockdown.
 
In response to these concerns, ''the National & Specialist CAMHS Clinic for Trauma, Anxiety, and Depression'' have prepared a set of ''short animations'' with practical tips that parents can use to help children with emotional symptoms. The tips are based on evidence-based Cognitive Behavioural Therapy (CBT) principles for the treatment of anxiety and depression in young people. 

----

''Watch all the videos on the [[KCL YouTube Channel|https://www.youtube.com/playlist?list=PLun2jODy9M2fz4KuSfEh4DLqEO0M-Klyd ]]
 OR on the on [[Families under pressure website|https://familiesunderpressure.maudsleycharity.org/]]''

----

The tips really came to life thanks to our collaboration with the production company TOAD and the narration by well-known parents. They are part of the "‘[[Families under Pressure|https://familiesunderpressure.maudsleycharity.org/]]" series that also includes some excellent animations on helping children with behavioural symptoms, which were prepared by Professor Edmund Sonuga-Barke and colleagues. We are thankful to ~SLaM and the Maudsley Charity for funding this project. You can find more details [[here|https://www.kcl.ac.uk/news/animated-parenting-tips-for-struggling-households-tips-9-12]] and 
Just like guided self help, the CWPs should be given opportunities and suggestions of things to practice or read up. References or self help materials might be useful here. 

This is a key aspect of mirroring guided self help. The key principle here (overstated) is that the CWPs won’t learn things because we teach them but they will learn things by practicing some things that we suggest to them.

For more theoretical or evidence related teaching this may be less straight forward and may just be about suggesting a very specific reference (or a web site) for them to read and discuss with a colleague. 

What is important is that students are encouraged to adopt an active sense of agency around their own learning, the link with guided self help is then made explicit and not implicitly assumed. 
* Explain to the child before using calm time what behaviours it is for. Calm time should be introduced in a brief and positive way as a space that will help the child to calm down.
* Identify an appropriate place for calm time to take place. This should be a relatively non stimulating area, that encourages a child to calm down e.g. a chair, the sofa
* Parent needs to be in the same room, or close to the child. This is to ensure the child is safe if they have become emotionally dysregulated and so they can see when the child has calmed down
!!Managing the Transition from Primary to  Secondary school

A parent/child workbook generously shared by the Islington Child Wellbeing (CWP) Service.

 <<link-pdf "Transition School Booklet" "https://drive.google.com/open?id=16z5iIyAHeLJwPAi5ppvZ6vaXubggMWFM">>


Please also see the useful resource '[[Transition suitcase|https://drive.google.com/file/d/1krbN3BKMIEAS_6Z4P7fS3gbc1C_s6XbS/view?usp=sharing]]', when working with young people regarding transitions. 
!!!!!Source: Cathy Creswell
!!''Key points''
Problem solving is a key technique in many areas of child mental health work. 
Problem solving is used in Cathy Creswell’s manual, in working with worry and in many other booklets to do with treating anxiety and generally follows these steps: 
#define the problem that requires solving
#think about all and every possible solution (no matter how strange it may seem at this stage)
#consider the pros and cons of each possible solution (short term & longer term)
#decide on a plan using one of the solutions 
#try it 
#evaluate it – how did it go?

!!!Problem solve anticipated problems
#''Young person doesn't attend.'' Phone or text young person to enquire how they are. arrange to ring again at a specific time in a few days time. Remind of next appointment which is a telephone meeting. Send materials to young person if they agree. 
#''Young person attends but is very disengaged, passive and monosyllabic.'' Reduce demands in the session. Validate young person's state of mind.Avoid too much praise for coming. Problem solve about ways of making the contacts more adaptive to young person's preferences. 
#''Young person says problem has gone away''. Young person describes rapid improvement in mood and doesn't see need to come for more sessions. Practitioner positively validates improvement, emphasises the cyclical nature of low mood, encourages persistent with plan, focuses on relapse prevention in psycho-educational material.  
#''Young person says parent would like to phone practitioner.'' Discuss how young person feels about this. Problem solve best way of responding to parent's request. Consider how to avoid secrets and option of doing call in front of young person. Agree explicit plan with young person about what practitioner will do. 
#''Young person is relatively active and low mood has not impacted on behaviour significantly.'' Two things need to be reviewed. What does the young person believe would be helpful in improving his/her mood? Secondly, it may be helpful to review the basic formulation and also to consider a developmental formulation as a way of making sense of the current difficulties. It may also be important to recognise the resilience and coping that the young person is demonstrating.  
!!!Problem solving anticipated problems.  
#''Young person doesn't attend.'' Phone or text young person to enquire how they are. arrange to ring again at a specific time in a few days time. Remind of next appointment which is a telephone meeting. Send materials to young person if they agree. 
#''Young person attends but is very disengaged, passive and monosyllabic.'' Reduce demands in the session. Validate young person's state of mind.Avoid too much praise for coming. Problem solve about ways of making the contacts more adaptive to young person's preferences. 
#''Young person says problem has gone away''. Young person describes rapid improvement in mood and doesn't see need to come for more sessions. Practitioner positively validates improvement, emphasises the cyclical nature of low mood, encourages persistent with plan, focuses on relapse prevention in psycho-educational material.  
#''Young person says parent would like to phone practitioner.'' Discuss how young person feels about this. Problem solve best way of responding to parent's request. Consider how to avoid secrets and option of doing call in front of young person. Agree explicit plan with young person about what practitioner will do.  

Progressive Muscle Relaxation  is a technique 

{{Relaxing lion.jpg}}
[img[close_up_pen_writing.jpg]]
Please click on the relevant pages below for a list of useful materials and information aiming to help children, young people, families, teachers, schools and practitioners develop a better understanding of mental health and what it feels like to have mental health problems. 

*Core Knowledge: [[Psychoeducation Core Knowledge]]
*Workshops: [[Psychoeducation Workshops]]
*Resources: [[Psychoeducation Resources]] 
*Videos: [[Psychoeducation: Videos]]
*Self Help Materials/ Resources: [[Self Help Materials]]
<<list-links "[tag[Psychoeducation Core Knowledge]]">>
Two excellent websites with extensive material for use in schools can be found at: 

*[[Mentally Healthy Schools|https://www.mentallyhealthyschools.org.uk/]] - this website is aimed at primary schools to understand and promote children’s mental health and wellbeing. Our aim is to increase staff awareness, knowledge and confidence to help support pupils.
*Anna Freud Centre: [[Resources for Schools|https://www.annafreud.org/what-we-do/schools-in-mind/resources-for-schools/]]- this website aims to provide resources and information to help all teaching staff support the mental health and wellbeing of their pupils.
<<list-links "[tag[Psychoeducation Resources]]">>
<<list-links "[tag[Psychoeducation Workshops]]">>
Within this heading is a list of pages that contain various videos from Young people discussing mental health. These videos could be shared with CYP or families (to be discussed with supervisors beforehand). These video may also be used by practitioners to develop a better understanding of the issues discussed. 

<<list-links "[tag[Psychoeducation: Videos]]">>

!!!''The Revised Child Anxiety and Depression Scale (RCADS)''

This is a 47 item scale with items are rated on a 4 point Likert-scale from 0 (Never) to 3 (Always).

The RCADS does not provide  a diagnosis but it is extremely useful in gaining a wider picture of the young person's difficulties.

It has six subscales: 

* separation anxiety
*social phobia
*generalised anxiety disorde
* panic disorder,
*obsessive compulsive disorder
*depressive disorder. 

!!!''Scoring the RCADS''

!!!!''Raw Scores''

A Total Internalising score is created from the sum of all 6 subscales, 

A total anxiety score from the sum of the 5 anxiety subscales.

 
A total depression score is taken from the depression subscale. 

Raw scores can range from 0-141. An aid to a quick interpretation of an RCADS scores can be found by looking at the link below. 

Scores are standardised by age and gender. In the attached table, age is shown in terms of school year. The age of the child can be computed by adding 6 to the school year. So a child aged 10 years would be compared with children in school year 4. 

<<link-pdf "Interpretation Aid" "https://drive.google.com/open?id=0B-tACu2wi4-4dEdqbk93SlNvTE0">>


!!!!''T Scores''

For fuller interpretation of the RCADS, raw scores are converted to a T-score. This calculates how far the score is from the average for age and gender. If the score is more than 1.5 standard deviation, it is considered to be above threshold. 

A 'T' score of 65 and above would indicate that the child/young person is within the highest 7% for their age and gender. This is what is commonly termed above the cut-off or threshold when estimating reliable recovery. 

A 'T' score of 70 and above would indicate that the child/young person is within the highest 2% for their age and gender. 

A very neat way of seeing T scores in practice can be found at the following website which has all the RCADS resources freely available.

 https://www.childfirst.ucla.edu/resources/



!!!''RCADS in practice'' 

For the London and South East CWP programme, it was advised that the youth self-report questionnaire to be used
with adolescents being seen for low mood or anxiety. Following a full RCADS at Session 1,
CWPs should complete the relevant subscale at each session. The full RCADS is then completed again in the final session.

!!!!''Using POD''

The RCADS is best collected using POD as this will provide immediate feedback to the young person and also can compare repeat measures with previous ratings. 

Personal identifiable information is not collected on POD. However in order for the RCADS to be scored information on Gender and Year group is required.

!!!''Guidance on completing the RCADS'' 
 
Guidance on how to complete the RCADS with a young person can be found at  [[Completing the RCADS]] 

Don't be too worried if the parent or young person does not reach their goals. Goals help them to get __motivated__ as it is very satisfying when they achieve them. Some find it useful to have a few large targets rather than many small targets if you feel overwhelmed. 
!!''Developing a new Reading Well Books on Prescription list to support children and family mental health''


Reading Well supports people to understand and manage their health and wellbeing using helpful reading. The books are all endorsed by health experts, as well as people living with the conditions covered and their relatives and carers.

The scheme is available free to access in 98% of English public library authorities.

If you are not already familiar with their work, you can find out more on their website. 

https://readingagency.org.uk/adults/quick-guides/reading-well/

!!Mood-boosting Books
Reading Well Mood-boosting Books is a national promotion of uplifting titles, including novels, poetry and non-fiction. The books are all recommended by readers and reading groups.
For a list of mood boosting book please use the link below:

https://reading-well.org.uk/books/mood-boosting-books

!!Evidence and evaluation

There is a huge evidence base around the value of reading to support health and wellbeing, as well as the value of libraries as a non-stigmatised space that is both welcoming and empowering for people with mental health problems.

The Reading Well programme is evaluated each year to ensure that it continues to deliver positive outcomes. Health professionals, library staff and users are surveyed on their experiences of the programme, as well as information on reach being calculated through book loans and book sales data. To date, The Reading Well programme has reached over 778,000 users.

There are several levels of diversity that should be borne in mind: 

#Sessions should include prompts to consider content in respect to cultural, ethnic and sexual diversity of population of families that practitioners are working with. 
#Diversity of practitioners and opportunity for reflexivity around how their own culture and background impacts on material that is being considered. 
#Diversity of service settings. Practitioner services are going to have different service contexts.
This video tells the story of Red Riding Hood from the point of view of the flight or fight response. 

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/GCL7tXawv50" frameborder="0" allowfullscreen></iframe></html>
!!! Relaxation techniques can be beneficial to our mental health, especially when we practice them regularly.

{{relaxing frog.jpg}}

!!! Why are relaxation techniques helpful?
When we experience [[Anxiety]] or [[Stress]], our bodies are responding to danger in a way that used to be very helpful. This is often called the [[Fight or Flight]] response, which results in common symptoms of anxiety such as a fast heart rate, quickened breathing, trembling etc. When we are feeling this way, stopping or reducing the response in our bodies can be really helpful in making us feel calmer and more in control. 

There are lots of different relaxation techniques that can help with this, and some work better for some than for others, so it can be good to try them out and decide which one(s) work best for you.

''Below you will find some resources for relaxation techniques:''

* [[Breathing techniques]]
* 
* [[Visualisation]]
* 
* [[Mindfulness]]
* 
* [[Progressive Muscle Relaxation]]



The CWP programme has arisen from  a range of government initiatives aimed to improve services for children and young people with mental health needs. The following links provide access to the core documents. 




[[Future in Mind]]

[[The CYP IAPT Programme]]

[[National Guidance on the CWP Curriculum: key sections from the Headline Plan (December 2016)]]
<<link-pdf "Site Specific Resources" "https://drive.google.com/open?id=15FimHi1RWNtQ9IEix3BAs25VSsEbJJiK">>

<<link-pdf "Site Specific Resources" "https://drive.google.com/open?id=15FimHi1RWNtQ9IEix3BAs25VSsEbJJiK">>



<<list-links "[tag[Review]]">>
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/A97q7Xv7Tfg" frameborder="0" allowfullscreen></iframe></iframe></html>
!!!''Key points''
*In some ways this is an on-going process as much as a fixed session/part of the intervention. The practitioner should be on the look out for things that the young person has previously enjoyed or relationships that are valued and trusted. These need to be remembered as the young person may easily discount such things if asked directly. 
*For example, if asked about friendships, the young person may claim that they have no friends, often meaning that they have come to believe that their friends are distrustful or fickle or other things. This tendency to discount value in others (or in the situation that the young person is in) can be seen as part of the impact of low mood on the young person's judgement about his/her life circumstances. 
*It is also important to include interests and activities that may not be generally approved. Young people may have interests in trivial or dark areas of life. These need to be accepted (providing there are no child protection issues).  A stance of acceptance (without collusion) is important is this process. 
*Young people have an acute radar for adult disapproval and this will tend to diminish engagement if this is perceived to be the case.   
!!!!@@Color:red; THIS PAGE IS CURRENTLY BEING WRITTEN AND IS AWAITING REVIEW@@ 

Source: Joe Hickey

''The purpose of this page'' is to provide information and practice points on conducting risk assessments 

!!What is risk?
The chances of something harmful happening to the CYP or another person

!!Potential risks for a  CYP

Main risks to self:

* Suicide
* Deliberate self-harm/Non-suicidal self-injury
* suicide contemplation/ intention, imagery, ideation
* Emotions: Hopelessness, defeat, despair
* Self-neglect
* Alcohol and substance use 
* Impulsivity

__Main risks from others:__

* Abuse
* Neglect
* Exploitation
* Bullying 
* Accidental harm
* Unsupervised at home
* Parental/ sibling mental health problems
*Criticism and/or avoidance of young person’s self-harm or suicidality

!!Protective factors for CYP:

* Existing coping mechanisms 
* familial support 
* peer support 
* emotional resilience 
* understanding potential risks 


!!How to conduct a risk assessment:

* Collaboratively identify the current protective and risk factors
* Ask direct questions and do not avoid the issue
* Explore connections between risk and protective factors
* Always evaluate level of risk with support from supervision and team
* Always discuss with your supervisor when unsure
* Make a safety plan if required
* Record your risk assessment and safety plan in the young person’s clinical notes
* Discuss information sharing with the CYP
* Communicate risk assessment and safety plan to other adults as needed

!!Links with other pages:

Please to go [[Safeguarding]] for a list of pages links to keeping young people safe.

Please go to [[Assessment]] for a list of pages relating to assessments 
!!!@@color:red;THIS PAGE IS CURRENTLY BEING WRITTEN@@ 

* Ensure CWPs are aware of local/service risk protocols and who they can contact if they have concerns about a child/YP/parent they are working with 
*Jack - irritability, worried friends will stop to like him if he is angry with them, wanted to come to therapy as parents don't understand what he's going through 
!!!Group tasks 
*Rachel case example: reinforces as she isn't going to college and she won't catch up and she becomes isolated in the long term as it reduces the opportunity for positive reinforcement; modelling from her dads reaction to depression of staying in bed; no problem solving from the family and how to facilitate her part time job; started when she became isolated from her friends after breaking up with her boyfriend and developing an illness. 
*Explaining BA example: cutting down on other things to do things that matter as they might be missing things in their lives. Young people might not know what would matter to them and this is part of BA. Social media- what are they doing with their time? Is it productive? 
*Completing activity log: important = does it matter to you? If it matters to someone else then it isn't important. Doesn't matter about the numbers its about how to get towards the higher number activities, and address the lower activities on the schedule. Need to understand where the balance is between A, C and E. CWPs noticed feelings of guilt when filling in the schedule, basic principle is that it needs to be reinforcing for the young person and balance the guilt (might be easier to start with the fun stuff). The ratings have got to work for the person who is completing it (could be Yes, a tick or a smiley face). Can rate school day lesson by lesson to understand the differences i.e. who they are sitting next to. Cant change maths but they can do something else at break time so its more important to get positive reinforcement.
!!!How to talk about BA 
*Everything feels hard when you feel depressed and everything is an effort. So its understandable you stop doing things when you feel low for example you see friends less or not go to school. Now this helps in the short term because you don't have to face all these things. The problem with this is that you don't get the feel good factor from life e.g. playing guitar or computer games. So it maintains the low mood, and it keeps it all going around and around. We work on this circle which often happens when people feel low and we have a practical way to address this. We work on the B bit which is the BA, start making small changes, there not easy otherwise you would have done them already. We do this by breaking them down into small steps so we can put them into practice. You won't be  doing this on your own, we will all form part of a team. Together we will figure out what is important to you. Then you will be able to do more of what matters to you, get more out of life, and when you do this it boosts your mood.
!!!Reviewing the activity log 
*Massive thank you for filling it in, whatever you can manage in between sessions is great. Focus on the higher ratings e.g. spending time with other people. 

!!!!Source Peter Fuggle 

!!The SDQ
The Strengths and Difficulties questionnaire (SDQ) is a brief behavioural screening questionnaire. 

It includes 25 items of psychological attributes: 

* emotional symptoms
* conduct problems
* hyperactivity/inattention
* peer problems
* prosocial behaviour. 

The first four subscales are added together to generate a ''Total Difficulties'' score.


For this programme, it was advised that the ''SDQ-Parent'' was used for parents of children
with anxiety or behavioral difficulties. 

The ''SDQ Impact'' was used in each session which measures if the respondent thinks the young person has a problem and prompts around: 

*chronicity, distress
*social impairment 
* burden to others. 

The ''SDQ Follow-Up'' can be used at the last session (Session 8) where two additional questions are included which ask whether discover if they intervention has reduced the problem
and if the intervention helped in other ways. 
 

*Different informant- carer, teachers or self-report  
*Scored into categories- Close to average, slightly raised, high, very high

<<link-pdf "Download Paper Versions of SDQ" "http://www.sdqinfo.com/py/sdqinfo/b3.py?language=Englishqz(UK)">>

!!Practice points

Please see [[Using Feedback and Outcome Tools]]

!!Links with other pages 

More general introduction to outcomes can be found at [[Outcomes]]

When setting goals, it is important that they are clear and achievable. 

They need to be : Specific – Measurable – Agreed (collaboratively) – Realistic – Time limited

<<link-pdf  "SMART Goal handout" "https://drive.google.com/open?id=1n-KiufWlI_3xIniCOtqv5iqNFe_ec-fDGYh_OumuvhE">>
This is a tag tiddler
<<list-links "[tag[Safeguarding]]">>


 Source: The London Safeguarding Children Board 

''Purpose of the page'' This page provides links to authoritative guidance on safeguarding practice in London. 

!!@@color:purple;Safeguarding guidance@@  

The documents found through the links below give an overview of  safeguarding principles and practice and methods of promoting the welfare of children. It also contains useful information on how children and young people are 'tiered' into levels of need and why.  

The guidance is divided into two parts. 

1. Responding to concerns 
http://www.londoncp.co.uk/chapters/responding_concerns.html#conc

2. General practice and procedures 
http://www.londoncp.co.uk/chapters/B_contents.html

The London Child Protection Procedures are updated on a six monthly basis with the relevant changes to legislation, statutory guidance and local guidance.

Please go to the below webpage for access to the online legislation:

http://www.londoncp.co.uk/

!!@@color:purple;Practice points@@
As practitioners it is important to understand about safeguarding procedures and how assessments are carried out resulting in a judgement of a 'level of need'.  

!!The Assessment Triangle
This is used to assess the child’s needs and form a judgement regarding the level of need.

 [img[Child protection assessment framework.PNG]]

!!The Four Levels of Need 

__Tier 1: No additional needs__

These are children have all their health and developmental needs met by universal services.

__Tier 2: Early help__

These children may be vulnerable and showing early signs of abuse and/or neglect; their needs are not clear, not known or not being met. These children may be subject to adult focused care giving. This is the threshold for a multi-agency early help assessment to begin. 

__Tier 3: Children with complex multiple needs__

These children require specialist services in order to achieve or maintain a satisfactory level of health or development or to prevent significant impairment of their health and development and/or who are disabled. They may require longer term intervention from specialist services. This is the threshold for an assessment led by children’s social care under Section 17, Children Act 1989 although the assessments and services required may come from a
range of provision outside of children’s social care.

 __Tier 4: Children in acute need__

These children are suffering or are likely to suffer significant harm. This is the
threshold for child protection. These children are likely to have already experienced adverse effects and to be suffering from poor outcomes. Their needs may not be considered by their parents.This is likely to mean that they may be referred to
children’s social care under section 20, 47 or 31 of the Children Act 1989. This would also include those children remanded into custody and statutory
youth offending services.

!!The Indicators of Possible Need 
The indicators within this document are outlined within a matrix/ table and are designed to provide practitioners
with an overarching view on what tier of support and intervention a family might need depending on the age group of the child. 


!!Please use the link below to view the full document:

http://www.londoncp.co.uk/files/revised_guidance_thresholds.pdf

!!@@color:purple;Links to other pages @@  

A list of other pages about safeguarding can be found at [[Safeguarding]]. 

@@color:red;This page is being developed in light of recent changes to working due to the outbreak of COVID-19@@
!!Overarching practice point

''If you have a concern about the safety of a child or young person, you should always discuss such concerns with either a member of their team, or the school staff or their supervisor. This should take place on the same day that the issue arises, or as soon after as is possible.''

---
This page is general guidance on safeguarding and should not replace any specific safeguarding procedures in a school or locality.

---
!!What is safeguarding?


Safeguarding involves: 

 
*Protecting children from maltreatment; 
*Preventing impairment of children’s health or development 
*Ensuring children grow up in circumstances consistent with the provision of safe and effective care 
*Taking action to enable all children to have the best outcomes 

!!!Child Protection
This is a specific part of safeguarding and promoting welfare. It is the activity undertaken to protect specific children who are suffering, or likely to suffer, significant harm. 
The aim is to proactively safeguard so the need for action to protect children from harm is reduced. 

There are different levels of needs that have been carefully demarcated by guidance documents from social care.  Please see the page on [[Safeguarding guidance: London Child Protection Procedures]] for more information.

!!!Effective safeguarding
This is underpinned by two key principles: 

*Safeguarding is ''everyone’s responsibility'': for services to be effective each professional and each organisation should play their full part 
*A ''child-centred'' approach: for services to be effective they should be based on a clear understanding of the needs and views of children

!!!Key Points 
*Would you have shared 'the worst thing you have ever done' in front of the lecture? Recall how that made you feel. This may be how young people feel attending sessions. Important to develop relationships and empathy. 
*Safeguarding priorities can vary by local area, be sure to be aware what these issues are in your area.
* Be curious of safeguarding issues during assessment i.e. abuse (domestic, substance) and parental mental health in addition to vulnerability factors 
*Often work in grey areas, important to share information. It is a practitioners responsibility to share information to keep children safe. 
!!! Discussion on case study 
* If case is open, try to obtain more information 
*Be curious about potential triggers e.g. anniversaries 
*Think about the relationship you have with the young person (after a disclosure) 
*Don't be afraid to ask questions!  No question is ever silly or trivial 
*Safety plan- what is it? who will be involved? How can you make sure the young person is safe after they stop seeing you. 
*Safeguarding disclosure at end of session? Discuss with supervisor, may not be safe to end there. 
!!!Safeguarding 'hot topics'
*Child Sexual Exploitation
**The grooming process can be associated to gang culture 
**How to spot the signs? listening out for signs, can be straightforward e.g. who is bringing them to the session, is the phone activity out of the ordinary 
*Looked After Children 
**Experience health risks at a great degree 
**Language in referrals or reports- child is the victim! Be mindful of how we describe the interactions, keeping the child in the centre of things. 
*Cyber-bullying
** Can take many forms (aware of current issues such as 'Blue Whale', sexting) 
!!!Taking action  
* Be mindful of information sharing with other agencies. Poor communication increases the risk of serious case reviews. 
* We have a duty to safeguard children 
* Concerned about another professional? There is a Local Authority Designated Officer (LADO) who has a role in investigating staff abuse of children. 
*In such situations, speak to the local safeguarding lead 

Remember to safeguard yourself as well as the young people you see. 

!!Defining abuse
Children are at risk of many different forms of abuse (physical abuse, sexual abuse, neglect, emotional abuse, domestic violence (DV), forced marriage, female genital mutilation, child trafficking, online exploitation and radicalisation).

*''Acts of commission:'' Words or overt actions that cause harm, potential harm, or threat of harm
*''Acts of omission:'' Failure to provide needs or to protect from harm or potential harm

!!!Signs of abuse
Children are unlikely to report abuse themselves, due to fear of consequences and/or because may not know how to tell someone about what they are experiencing. As part of our duty of care, we therefore need to ''be aware of the signs'' both physical and behavioural.

!!Roles and responsibilities of health care staff

Useful guidance has recently been produced by the RCN on the roles and responsibilities of health care staff around safeguarding which can be applied to a school setting.

This can be found here:
<<link-pdf "Safeguarding guidance for health care staff""https://drive.google.com/drive/u/1/folders/1KrTJOiI1WuHsUlGl9i6jBBzJIiL-WiUJ">>

---
!!Practice points
*Always go back to how you define abuse-make sure that you are being consistent  with agreed definitions etc. 
*If in doubt: always defer to schools safeguarding procedures and talk to your supervisor
*''It is your duty to act - it is not a choice!''


!!!Working with families:
*It is important to build positive relationships with parents even when dealing with difficult issues. 
*It is essential to try to understand the context of families: i.e. the family's own experience of abuse, cultural norms, risk factors 

!!!Working within the school:
*It is essential to know the safeguarding procedure for the school you visit- ''if you are not told, ask!''
*You should know who the ''Designated safeguarding lead'' (DSL) 
*Don’t rely on a verbal conversation as this can be rushed in school setting- You have a right to follow it up via email (but don’t include any sensitive info). 
*Write down concerns in some form ASAP.
*''Be aware of the time!''- if you have serious concerns talk to DSL straight away- don't wait to 3:30 when child is going home.
 *Powerful feelings you will need to attend to- be compassionate and understanding about emotions provoked in others  

!!!Working with CYP:

*Treat every case individually 
*Have to always hold in mind it is a possibility and ''remain curious but don't assume!''

---
!!Links with other pages

Pages relating to Safeguarding are listed in the page [[Safeguarding]]


!!!Selective ignoring is good for behaviours such as:
Moaning, complaining, swearing, whining, minor squabbles, messy eating, silly noises, fiddling, back-chatting, pulling faces, answering back (being rude, arguing)

!!!Guidelines:
* Explain what you’re doing beforehand (not while ignoring)
* Be subtle and neutral
* No eye contact or expressions of disapproval
* No verbal or physical contact	
* Stay close so you can return attention as soon as (10-15 seconds) the behaviour stops 
* Do something distracting to help you stay calm
* Look for something to praise afterward
* Be consistent in what you ignore i.e. every time
* Model being calm
!!!These are not the core materials used in the interventions found in the [[Helping]] section but may be helpful as additional materials. (To be discussed with supervisor).
For practitioner self help materials, handouts, outcome measures and paper documents that may be useful to print out, please see below.

<<link-pdf "Handouts for YP and parents" "https://drive.google.com/open?id=0B-tACu2wi4-4T21kOXlMYVQ5b0k">>

<<link-pdf "Self help materials and Practitioner Resources" "https://drive.google.com/open?id=0B2_m9ZgGWI-jVWZYcXh3c0x1OFU">>

Please see below for a list of useful self-help materials that may aid practitioners work. The use of these materials should be discussed with supervisor.
<<list-links "[tag[Self Help Materials]]">>
!!!!!Source: Moodjuice; Camden and Islington Mental Health Trust 
!!''Websites''
''Moodjuice self-help guide'':
Moodjuice have produced excellent self help materials for young people.
Available from their [[website|https://www.moodjuice.scot.nhs.uk/]].  

''Self Care'': there is an informative page from the MIX on [[self care|http://www.themix.org.uk/mental-health/a-guide-to-self-care-15574.html]].


!!''Guides''
''Camden and Islington Self Help Guides'' for the following:

*Stress and Worry
*Panic and Phobias
*Depression and Low Mood

<<link-pdf "Camden and Islington self-help guides" "https://drive.google.com/open?id=0B-tACu2wi4-4a0NocmRXaElfOHM">>

''Northumberland Tyne and Wear NHS Foundation Trust'':
an alternative guided anxiety Self-Help Booklet in which page 17 provides a brief description of facing anxiety in small steps:

<<link-pdf "Anxiety Self-Help Booklet" "https://drive.google.com/open?id=0B-tACu2wi4-4OVM4WUU0UlM5OWs">>

''Moodjuice self help guides'' for the following:

* [[Anxiety|http://www.moodjuice.scot.nhs.uk/anxiety.asp]]
*[[Depression|https://www.moodjuice.scot.nhs.uk/depression.asp]]



''Braintrain booklet'': which highlights the helpfulness of exercise in mental well-being.

<<link-pdf "Braintrain" "https://drive.google.com/open?id=0B-tACu2wi4-4SkE0TXBsbjlmS0U">>

!!''Videos''
Hertfordshire CWPs have found two Youtube videos helpful in workshops with young people exploring the difference between anger and anxiety. These can be found at

https://www.youtube.com/watch?v=yZBHbIGnGs4

https://www.youtube.com/watch?v=HBamFtLKO9M

!!''Apps''
Apps for relaxation: Mindshift, Headspace

'Grow' which is aimed at YP to help them manage personal goals

Please go to [[Self Help Materials: Apps]] for more information

!!''Podcasts''
The main approach is around behavioural activation and very helpful resources and ways of presenting behavioural activation approaches to low mood can be found on the [[Moodjuice website|https://www.moodjuice.scot.nhs.uk/]]
Please also find the  Moodjuice self help guide for [[depression|https://www.moodjuice.scot.nhs.uk/depression.asp]]

These may be different in some details from the main approach taught on the course.

The intention is to enable awareness of other sources of information about this approach. 

Please see the get self help [[website|https://www.getselfhelp.co.uk/privacy.htm]] for a list of free downloadable resources. These are listed in alphabetical order. 

Also see behaviour activation manual which has valuable materials for the BA approach. This manual is from the university of Michigan [[website|https://medicine.umich.edu/]]. 


<<link-pdf "Behaviour activation manual" "https://drive.google.com/open?id=1FEyuvgTeJDfZfZm9YfhGu-SgKqgogurN">>

Camden and Islington NHS Trust: Depression and low mood guide

<<link-pdf "Adapted Low Mood Booklets" "https://drive.google.com/open?id=0B2_m9ZgGWI-jMDhZdEl2MkRpV1E">>
!!Breathe With Me

''What is it?''

An animated app designed to teach children and young people diaphragmatic breathing. This breathing technique is known to reduce anxiety and help users control anxious feelings.

''How does it work?''

This simple app works by asking users to select an animal: either a cat, dog or panda. Once selected, users are then shown instructions to prepare for the deep breathing technique. Users are told to sync their breath with the movement of the animation, which shows their chosen animal breathing in and out.

The animation includes pop-up instructions reminding users to breathe from the belly. It also keeps time and tells users when they’ve been breathing for two minutes and for five minutes.
Users also have the option to play or mute music during the animation, and can view the full instructions at anytime if they need reminding of the technique.

''How to access the app?''

Breathe with Me is available via the Breathe with Me [[website|https://breathewithme.co.uk.]]

Although it is possible to use the app through a web browser, we recommend downloading to the home screen of your device (tablet, smartphone, etc.) and using as a normal app. Installation instructions are available here.
Please note: Breathe with Me is not currently accessible via the Windows smartphone.

!!Grow
''What is it?''

Grow is an app for managing your personal goals, aimed primarily at users aged 12-18 in the CAMHs system.

Users can set themselves goals, either on their own at home or in a session with a clinician, and then rate them (along with a reason for the rating), edit the goals, or delete the goals. Goals can be tracked graphically.

''How does it work?''

Users can currently register to use Grow via Facebook, as it needs a way to store the goals for a specific user. However, Grow stores no identifiable data on users, nor does it draw any data from Facebook. Users can input goals and track them over time by accessing the web-based tool.

''How to access the app?''

You can try out Grow [[here|https://polar-dawn-55555.herokuapp.com/login]]

 
!!Getting to Know You

''What is it?''

A fun and accessible questionnaire for children when first visiting CAMHS (Child and Adolescent Mental Health Services). Designed for tablets.
This questionnaire aims to reduce the anxieties of children (5 – 12 years old) coming to CAMHS for the first time. It offers an alternative questionnaire to the paper based one which is currently used and is not appropriately designed for children.
This questionnaire helps therapists get to know a young person better so that they can more quickly build a healthy and meaningful relationship.

''How does it work?''
The child chooses an avatar (lion, monkey or bear) then goes on to answer a series of interactive questions about themselves.

''How to access the app? ''
The app can be found [[here|https://welcome-in.herokuapp.com/]]

!!GO

''What is it?''

Aimed at 16-24 year olds, NHS Go was first developed in 2016, after young Londoners told us they wanted better and easier access to health and wellbeing information. They can now use it to search local health services and find information on health and wellbeing, including mental health, sex and relationships, healthy eating and puberty.

''How to access it?''

Download from the app store or from their [[website|https://www.healthylondon.org/our-work/children-young-people/nhs-go/ ]]
!!!''Recommended books by the Royal College of Psychiatrists''
For children under the age of 12, please go to their [[website|http://www.rcpsych.ac.uk/workinpsychiatry/faculties/childandadolescent/generalinformation/booksforyoungerchildren.aspx#anger]] for a list of books addressing mental health matters, written for children and parents. 


!!!''Further reading for children's books''
Parent guidance books about anger and difficult behaviour 

*It takes two to talk: a parent's guide to helping children communicate. A series of books on helping parents and children to communicate. 
*Toddler taming: a parent's guide to the first four years
*Understanding children's behaviour (Jennie Lindon)
*Taming the dragon in your child: solutions for breaking the cycle of family anger (Meg Eastman)
*When anger hurts your kids - quieting the storm within

!!!''Adult self help materials on anxiety and depression'' 
Self help materials from Camden and Islington Trust [[website|http://icope.nhs.uk/therapy-information/guided-self-help/]]


Please also see [[Reading Well: Books on Prescription List]]
<<list-links "[tag[Psychoeducation: Videos]]">>
!!! Recommended Websites:
''[[The Mix|http://www.themix.org.uk/]]'' provides general information and advice for young people under 25 including sections on mental health and other areas of stress and difficulties. 
 

''[[Moodjuice|http://www.moodjuice.scot.nhs.uk/]]'' have produced excellent self help materials for young people experiencing anxiety problems. 

''[[Get self help|https://www.get.gg/index.html]]'' provides a very extensive range of self help using the CBT approach. The material is primarily for adults but much of this may be useful for working with young people. 

''[[On My Mind|https://www.annafreud.org/on-my-mind/]]'' from the Anna Freud Centre has information on a range of topics including supporting young people's active involvement in their own help and shared decision making. 

''[[Self-care|https://www.annafreud.org/on-my-mind/self-care/]]'' from the Anna Freud Centre has a plethora of ideas and advice about how YP could help themselves when they are struggling.

''[[Good Thinking|https://www.healthylondon.org/our-work/mental-health-transformation/good-thinking-digital-wellbeing/]]'': mental health and wellbeing service from Healthy London. This 24-hour online service finds people who may be struggling with a range of issues impacting on their mental health and directs them to resources that meet their personalised needs.
This page provides some sites where services could explore whether they would like to recommend or encourage use of these sites for on-line help. We are unable to assess the quality of the service provided on these sites but have tried to select sites that appear to have some recommendation form NHS providers for example, 

[[Kooth|https://kooth.com/]]: Free, safe and anonymous online support for young people

[[Mind Time Therapies|http://www.mindtimetherapies.co.uk/about.htm]]: team of clinicians trained in the use of psychological therapies to support people in their own home or wherever they choose to access the internet from. Delivered via interactive webinars enabling people access to professional support by PCs, tablets or smart phones.

[[Big White Wall|https://www.bigwhitewall.com/v2/Home.aspx?ReturnUrl=%2f]]: online mental health community

[[Be Mindful Online|https://www.bemindfulonline.com/]]: An onlone mindfulness course (please note this course does cost money)

[[WYSA|https://www.wysa.io/]] Co-designed by therapists, coaches, users and AI folk. provides the opportunity for an anonymous conversation. Think of it as an interactive journal meets life coach. 


!!!Linked pages
[[Barriers to Digital Forms of Help]]

Key messages: 

*Check data sources before you start 
*Try and embed digital resources to early doors interventions to reinforce learning and share widely 
*Services use too many jargon terms 
!!!These are not the core materials used in the interventions by may be helpful as additional materials. (To be discussed with supervisor).
For practitioner self help materials, handouts, outcome measures and paper documents that may be useful to print out, please see below.

<<link-pdf "Handouts for YP and parents" "https://drive.google.com/open?id=0B-tACu2wi4-4T21kOXlMYVQ5b0k">>

<<link-pdf "Self help materials and Practitioner Resources" "https://drive.google.com/open?id=0B2_m9ZgGWI-jVWZYcXh3c0x1OFU">>

For more additional self help materials please see a list of relevant pages below.
 
<<list-links "[tag[Self help materials]]">>
Here is a brief clip of a toddler who experiences anxiety when his attachment figure leaves the room. 

https://www.youtube.com/watch?v=Y6QtuU1L_A8
Source: Duncan Law

!!!! Service Development 

In order for CWPs to practice effectively they need to be supported by the wider system, including, but not solely, supervisors.  Existing services and structures need to be able to developed and adapted to meet the needs of the new CWP workforce to ensure they are able to work effectively and efficiently.  The new workforce needs to protected to do the work it is trained to do and not be lost in a bigger system.  Without good leadership and apprapairte workforce development there is a real danger that the CWP workforce could become lost and end up working in ways that are beyond their trainman and competency and/or being asked to fill gaps in existing services  - rather than expanding the offer of services to see the needs of the CYP for whom the programme is aimed: those with low to moderate mental health issues who can benefit from CBT informed guided self-help.

''!!!Tips for setting up a new CWP service:''
Source: these tips have beed developed by experienced CWP service development leads 
''* Make it a new service (Not more of the same…) '' -  ensure  CWPs are facilitated to practice in the ways they have been trained to deliver the best possible service. This might mean the need for 'Cultural' separation from existing services to enable the new workforce to develop the best way of working and avoiding being subsumed by a system that may well being feeling overwhelmed. This might need to include 'Physical' separation from tier 3 CAMHS.  There is a fine and delicate balance between helping CWP feel and be part of an existing service and system and being enabled to practice and being difference to the service
''* Reaching new CYP & families (who would not otherwise be seen)'' - there is a need to be active in setting up a service that is more closely linked to the communities it serves. This will entail speaking to school, community leaders, youth leaders, youth and sports clubs to create new links.  This will necessitate setting up new referral pathways that are more community based and 
* Protecting the fidelity to the  Guided self-help model  - supervisors obviously play a vital role in ensuring CWPs work within their competencies and keep fidelity to the models they are trained in but, service leads need to support supervisors and CWPs to do this.  

All these tasks require good ''collaborative working'' across the system and ''good leadership ''

''!!!Responsibility of service leads ''
Source: Adapted from the CWP Memorandum of Understanding 

The Service Lead will be the first point of contact for the CWP programme within each service. They will have oversight of the implementation of the programme and support the CWP supervisors in service development and management of the programme. 
•	Service Leads will be responsible for recruiting appropriate CWPs using a template JD and PS provided by the collaborative (see appendix 1)
•	Service Leads will be responsible for the recruiting a Supervisor(s)/Service Development Lead to support the CWPS using a template JD and PS provided by the collaborative (see appendix 2)
•	Service Leads should be responsible for informing the collaborative of progress with recruitment and alert us as soon as possible if they are not able to fill their places.
•	Service Leads will be required to attend monthly steering groups to feedback on progress and share learning with the wider CWP network
•	The Service Lead should be responsible for setting up a site visit with the collaborative team and ensure that other relevant members of the local CWP team are present
•	The Service Leads should ensure regular availability by phone or email to provide updates to the collaborative.
•	The Service Leads should ensure that audit data is collected and flowed to the collaborative to evaluate the effectiveness of the programme.
•	The Service Leads have overall responsibility to ensure adequate clinical governance arrangements are in place to ensure a safe and effective service is provided to service users.
•	The Service Lead is responsible to for CWP staff in terms of health and safety, appropriate working environment and that they have adequate study time to fulfil the requirements of the course. 
•	Service Leads will be asked to work with their local CWP team (including commissioners, Supervisors/Service Development Leads and CWPs) to provide feedback at a shared learning event to be held around March 2019
•	The Service Manager will be responsible for ensuring that the line manager released the CWP for trainee and supports their training,

<<list-links "[tag[Service Development Resources]]">>
This page is being developed with [[cohort 2]] SSDLs. Suggested content will include: 

*Referal pathways 
*Capa Stats - how many cases should a CWP be seeing in year (160 per year in national meeting after training) 
*Protecting CWPs from CAMHS service pressure 
*How you make contact with the outside world i.e. build relationships with schools 

The collaborative have developed a template Job Description and Person Specification for the role: 

<<link-pdf "Job Plan" "https://drive.google.com/open?id=1wsnPi0i3YDxKrYSDIfsiGf-DLXMGl4Yr">>

<<link-pdf "JD/PS" "https://drive.google.com/open?id=1CAlEhL4JZ6VK3qQXdoN6-T2Yw6A9XwHL">>
!!!!Source: Helen Barker 

!!!@@color:red;THIS PAGE IS CURRENTLY BEING WRITTEN AND IS AWAITING REVIEW@@ 

!!!This is a general assessment session which does not need to be conducted if a CYP has received a full assessment from CAMHS or a similar service

Please see [[What is a Session 0]] for what to do if a CYP has already received a assessment from another service/clinician.

---

If a previous assessment has not been completed use this session 0 to complete a general assessment of the main problem/s the YP is seeking support for, see [[Guided Self Help practice]] for pages to support this process. Local services may also have assessment proformas or guidelines to follow. The guidelines below cover the main areas/aims that need to be considered. Session 0 can be completed either with the YP alone or with YP and parent/s or carer/s.

Outcome measures completed at this session will be captured in POD. In POD it will be the first completion of the measure. This is potentially a little confusing for practitioners and this note is just recognising this. 

The purpose of this session is assessment: to gather enough information about the child/young person’s (CYP) difficulties to enable the practitioner, in collaboration with the CYP/parent, to decide which of the four possible GSH interventions is the most appropriate to undertake. For more general information session 0 and when a practitioner would conduct one please see [[here|What is a Session 0]]. Please also see the section [[Guided Self Help practice]] which may provide useful information to support this session. 

---

''Please note:'' The general session 0 as outlined on this page can be used if you are yet to decide which intervention would be most suitable for the YP. For the rare occasion that it has been decided which intervention is most appropriate before you meet with the YP please use the specific session 0 material in the relevant intervention manual either the Low Mood Manual or Adolescent Anxiety Manual (both linked below).

----

!!!Key Tasks 

*To engage the YP, validate/ listen to their experience/concerns 
*Develop a 'problem list'/ agree on a main problem YP wants support with.
*Discuss a recent situation where YP has experienced distress/ anxiety- consider thoughts, feelings (physical sensations) and behaviours.
*Psychoeducation on GSH and CBT
*Assessment of development of the problem and on what is keeping it going.
*Discuss impact on YP’s life.
*[[Risk assessment|Risk and Safety Assessment]] and safety plan (if necessary).
*Discuss YP's strengths/ current coping strategies.
*Complete full ROMs
*In collaboration with the YP agree on a future intervention plan


!!!Resources
The main resources for the assessment can be found in the [[Assessment]] section o f the Wiki. Your site may also have additional assessment/risk assessment/safety plan proformas to use. Consider creative materials to help explain role of thoughts/behaviours on our feelings- please see [[Psychoeducation]].

!!!Outcome measures
At assessment you should ask the young person to complete the full version of the appropriate ROM for their age/presenting problem. For adolescents this is most likely to be the RCADS. If possible ask parent/carers to also complete. 
Utilise SRS or similar to get feedback on the session. See [[Outcomes]]

----
Please not the pages referred to in the below document refer to the Adolescent Anxiety Manual however useful information for conducting a session 0 with a YP can also be found in the Low Mood manual. The session plan for conducting a general assessment or 'session 0' with adolescents:

<<link-doc "Session 0 plan: adolescents" "https://drive.google.com/file/d/1bGxWmGgEzuSwGD13lzAZIMyrDw0XBR4E/view?usp=sharing">>

---

For the rare occasion that it has been decided which intervention is most appropriate before you meet with the YP please use the specific session 0 material in the relevant intervention manual either the Adolescent Anxiety Manual:

<<link-doc "Getting to grips with anxiety" "https://drive.google.com/file/d/1MhSkweHKlMx3gAHe8SyVqss4nSjzJhFd/view?usp=sharing">>

OR the Low Mood manual:

<<link-doc "Guided Self-Help for Low Mood: Full Manual" "https://drive.google.com/file/d/1Ua1L-0BUmNMBTJi2AkYQhdlmnWpKwl0g/view?usp=sharing">>

----

!!!Linked pages:

For more information on conducting assessment session or 'session 0 please see [[What is a Session 0]]
!!!!Source: Vicki Curry
''This is a general assessment session which does not need to be conducted if a CYP has received a full assessment from CAMHS or a similar service''

Please see [[What is a Session 0]] for what to do if a CYP has already received a assessment from another service/clinician.

---

If a previous assessment has not been completed use this session 0 to complete a general assessment of the main problem/s the YP is seeking support for, please go to [[Guided Self Help practice]] for pages to support this process. Local services may also have assessment proformas or guidelines to follow. The guidelines below cover the main areas/aims that need to be considered. 

Session 0 can be completed either with the parent/carer alone or with the parent/carer and child.  In the two interventions for younger children (overcoming anxiety and behaviour management), the intervention sessions are mostly carried out with the parent. However, in most cases, if the child is not present in this initial assessment session 0, it will be helpful for the child to be invited to session 1, so the practitioner at least meets the child at some point.  

Outcome measures completed at this session will be captured in POD. In POD it will be the first completion of the measure. This is potentially a little confusing for practitioners and this note is just recognising this. 

The purpose of this session is assessment: to gather enough information about the child/young person’s (CYP) difficulties to enable the practitioner, in collaboration with the CYP/parent, to decide which of the four possible GSH interventions is the most appropriate to undertake. For more general information session 0 and when a practitioner would conduct one please see [[here|What is a Session 0]]. Please also see the section [[Guided Self Help practice]] which may provide useful information to support this session. 

---

''Please note:'' The general session 0 as outlined on this page can be used if you are yet to decide which intervention would be most suitable for the YP. For the rare occasion that it has been decided which intervention is most appropriate before you meet with the YP please use the specific session 0 material in the Behaviour Problems Manual (linked below).


!!!Key Tasks of session 0:
*To engage the parent and validate and listen to their experience/concerns 
*To understand the nature of the main problem(s) in the child that is causing the parent concern and they want help with 
*To explore a recent example of the problematic behaviour(s) – including thoughts/emotions/physical feelings/behaviour in the child if possible; as well as how others responded to this behaviour and what the outcome was. 
*To explore the history and development of these difficulties; as well as ideas about what might be keeping the problem going – the beginnings of an initial formulation
*To find other important background information about the history and current context –  child and family demographic information; child health and developmental/educational history; general functioning of the child (eg. social and school); family relationships and psychosocial details)
*Include assessment of risk and safeguarding issues. 
*To hear about strengths in the child/parent/system and identify current coping strategies.
*Completion of full ROMs – e.g. SDQ, RCADS
*To provide some psychoeducation on CBT and GSH and the CWP/EMHP service– including confidentiality – and to instil confidence in parents about this kind of approach 
*To hear about the difficulties are impacting on the child/parents’ lives; and to clarify the main problem the parent/child wants support with.  This may include setting specific goals for treatment.
*To use the above information to agree, in collaboration with the parent/child, whether the current approach would be helpful; and if so, which intervention is most appropriate to address the main identified difficulties. 
*Once an intervention has been agreed, the practitioner may provide the parent with some relevant reading to orient them in more detail to the approach and prepare them for session 1,

!!!Resources
The main resources for the assessment can be found in the [[Assessment]] section o f the Wiki. Your site may also have additional assessment/[[risk assessment|Risk and Safety Assessment]]/safety plan proformas to use. Consider creative materials to help explain role of thoughts/behaviours on our feelings- please see [[Psychoeducation]].

!!!Outcome measures
At assessment you should ask the parent to complete the full version of the appropriate ROM for their child's age/presenting problem. 
Utilise SRS or similar to get feedback on the session. See [[Outcomes]]

---

The session plan for conducting a general assessment or 'session 0' for younger children:

<<link-doc "Session 0 plan: younger children" "https://drive.google.com/file/d/1ocdR7bizZMVIZJyGRmr6RI3LI6GcWVBq/view?usp=sharing">>

---

For the rare occasion that it has been decided which intervention is most appropriate before you meet with the YP please use the specific session 0 material in the Behaviour Problems Manual.Please find the session 0 to be used specifically for behaviour problems as part of the full manual here:

<<link-doc "Guided self-help for behaviour problems" "https://drive.google.com/file/d/1vBNYY-hZtqIKHZucyZmbxZmfjTvYYoRZ/view?usp=sharing">>


---

!!!''Reading prior to session 1 (Child Anxiety)''

If you have agreed with the parent that a Child anxiety Intervention is appropriate, suggest and encourage parents to have a go at reading the first chapter of the [[Child Anxiety: Book]] before session 1 (Parents should be given at least one week to do so). As the Practitioner will be referring to Part 1 of the Overcoming book in session 1. When services are unable to give families a copy of the book in advance, other options, such as a loaning service or asking families to access a copy through their local library, could be considered. This should be discussed and agreed with the supervisor.

!!!Linked pages:

For more information on conducting assessment session or 'session 0 please see [[What is a Session 0]]
!!''Overview:''
This session is face to face (up to 1 hour).  The full session plan can be seen in the [[paper manual|http://centaur.reading.ac.uk/65537/]]

For a breif summary of Session 1, see below:

<<link-doc "Simplified session plan" "https://docs.google.com/document/d/1kE5bXCZJixE9LQVQNEjoFHP_58z3dp5Q4TwX612zagw/edit?usp=sharing">>
!!!''Outcome measures:''
These will be completed on [[POD|https://pod-database.org/db3/login/]]
*At beginning of session:
**Primary Outcome Measure = Full Parent SDQ 
**Goal rating scale 
*At end of session:
**Session Feedback Questionnaire (SFQ) 
----
!!''Session plan:''
Reading covered in session: Part 1 (Chapters 1- 4)
!!!''Key tasks: ''
*To engage parent and child in the work 
*To develop a joint understanding  of the development and maintenance of the child’s anxiety 
*Complete parent SDQ.
*Provide information on treatment aims and set goals
!!!''Check In''
*How are you?
*Agree the agenda: outline content of session, provide opportunity for parent to add to agenda
*Discuss practicalities: Session dates/time
*Review homework: any questions/comments about Part 1 of book?
*If reading not completed, encourage problem solving for next week
!!!''Main content of the session''
*''Overview of therapy plan:'' Guided self-help based on CBT principles
*''Explain outcome measures:'' Used to track progress and inform sessions
*''Understand current difficulties:'' Establish main concerns
*''Psycho-education of anxiety'': Development and maintenance of anxiety 
*''Setting goals:'' Help family develop realistic and achievable goals
!!!''Parent 'homework' tasks:''
*Parent to record their child's anxious thoughts, feelings and behaviour on handout (My Child's Anxious Thoughts, Bodily sensations and Anxious Behaviour)
*Discuss goals with child and confirm next session.
''Reading:''
*Read Part 2, Steps 1 & 2 of the Overcoming book. 
*For younger children (aged 5- 8 years), ask the parent to read Chapter 14, Using This Book With Younger Children 
*For older children (aged 12 years+), ask the parent to read Chapter 15, Using This Book With Teenagers 
!!!''Review of the session''
*Complete Session Feedback Questionnaire (SFQ) on ''POD''
*Discuss ‘take home’ messages from session: e.g. no single cause of anxiety; what can be helpful is to change what is keeping the anxiety going; parents are best placed to do this.
----
!!'' Handouts ''
!!!''Core self help materials:''
*Book: Overcoming Your Child's Fears and Worries (either purchased by parent/purchased by partnership for parent/lent out to parent by partnership)
<<link-doc "Child’s anxious thoughts, feelings, behaviours record sheet" "https://drive.google.com/open?id=0B1hDLHd8syMsT1RJRkxyVVZSZWs">>
<<link-doc "Development and Maintenance of Anxiety Map" "https://drive.google.com/open?id=0B1hDLHd8syMsaXBldnFtYVJyT0k">>
<<link-doc  "SMART Goal handout" "https://drive.google.com/open?id=1n-KiufWlI_3xIniCOtqv5iqNFe_ec-fDGYh_OumuvhE">>
<<link-doc "Paper version of GBO" "https://drive.google.com/drive/u/1/folders/1jaGGIN0Q_nI9eIFkJhx1TYBHxpOm0ojI">>
!!!''Additional handouts:''
<<link-doc "School information sheet" "https://drive.google.com/open?id=0B1hDLHd8syMscGw5MEJFUEUyYVU">> (if appropriate)


!!!!Source: Caroline Bengo, Matt Woolgar, Sara Dawson and Jelena Crnokrak 

This page provides a brief session plan to be used as a reminder for practitioners. 

---

!!''Overview:''

''Goals and Attending'': This session is face to face (approx. 50-60 mins). The full session plan can be found here:

<<link-doc "Session 1: Goals and Attending" "https://drive.google.com/file/d/1MlHSjPeukPev-tRHtEc60rQtzN6SGURW/view?usp=sharing">>

The full manual can be found here:

<<link-doc "Guided self-help for behaviour problems" "https://drive.google.com/file/d/1vBNYY-hZtqIKHZucyZmbxZmfjTvYYoRZ/view?usp=sharing">>

!!!''Outcome measures''
These will be completed on [[POD|https://pod-database.org/db3/login/]]

* At beginning of session:
**[[SDQ]] (Full -dependant on assessment session)
**[[GBO|Goal-Based Outcomes (GBO)]] (+HIT)
*End of session:
**SFQ/SRS

----
!!''Session plan''

!!!''Key tasks''

* Introduce/clarify aims of program (if not covered in assessment).
*Determine main areas of concern (if not covered in assessment)
*Develop/ clarify goals (if set during assessment)
*Discuss the importance of play
*Introduce attending and positive attention as a strategy for appropriate behaviour
*Support parents in how to attend and plan how to use this at home

!!!''Check In''

*How are you? 
*Agenda setting and explain structure (each session focusing on different strategy)/ length of sessions and expectations (parents to try strategies at home) (If not done in assessment session)
 *Give parents a folder to collect weekly handouts as an aid memoire. 
* Agree 'ground rules'

!!!Review
*No homework to review but check if any questions/ concerns from initial assessment. 

!!!''Main content of the session''

PLEASE NOTE: During this session Use your ABC charts to unpick/understand processes and use modelling/ role play (really important). Listen and validate the difficulties that they face.



*''Role of parental attention:'' as an important reinforcer (parents so important to child) and problematic patterns -refer to attention table, examples and reasons why it is easier to attend to problematic behaviour (examples of parent traps)- important to normalise.
*''Aims of program:'' to support parents to provide positive attention for positive behaviour (praise, rewards, encouragement), decrease negative attention given for misbehaviour (criticisms, directions, questions), ensure expectations for behaviour are clear and responses are consistent. Desired results: Misbehaviour reduce and positive/prosocial behaviour increase.
*''Focus on play and positive attention first'' explain/ reassure why this is focused on first- link to research.
*''Set or review SMART Goals'' (Set Goals in assessment or this session) –3 main behaviours of concern (be specific and clear about behaviours), rate how often they occur. May also want to include a goal for themselves – use handout: concerns about my child
*''The Importance of Play'' Discuss impact on their relationship to parent and physical, cognitive, emotional and social learning. Attending as an investment (like putting money into a savings account). Current experiences of playing with child? Normalise concerns and role play different ways of playing.
*''Attending/Special Time'' demonstrate how play CAN NOT be a positive experience for children- short role play as parent - playing intrusively, overact and explain/ apologise for this afterwards. Re-demonstrate using attending strategies (Discuss this two experiences). Discuss AVOID and DO points (See full session plan).  Advise keep time short at first about 10 mins.
*''Ending special time''- can be very engrossing for child- parent to warn child of ending 2 mins before (discuss if additional warning needed). Parents to reassure child they enjoyed it. If child protests: focus on play for remaining time, if protests when time is up: be clear you need to stop but they can carry on explain you will check back with them, do not extend time. 
*''Practice'' Demonstrate attending and special time- with you as parent then switch with you as child. Normalise difficulties and stress it looks more natural than it feels
*''Develop home practice plan'' and troubleshoot any difficulties/identify and address potential concerns/ barriers (Other siblings, type of toys to use, time of day).

!!''Home-practice''

*Attend to their child for 10 minutes each day
*Parents to note down when they achieved this/how it went, to discuss next session


---

!!''Handouts''

*Concerns about my child
*Goals
*Attending/Special Time


<<link-doc "Session 1 Handouts" "https://drive.google.com/file/d/1zz7tslg-lr8BpbZX10yZU0AhmMnKWht3/view?usp=sharing">>
!!''Overview:''

!!!This page provides a brief session plan to be used as a reminder for practitioners, the full session plan can be found here:

<<link-doc "Session 1 Plan: Adolescent Anxiety" "https://drive.google.com/file/d/1CLJXa90m3nQGnoUdfUUHStEjlzBzyW7C/view?usp=sharing">>

This session is face to face (approx. 45 mins).  In this session you’ll support the YP to:

 *Find out more about anxiety. 
*Develop an understanding (formulation) of the development and maintenance. 
*You’ll also support them to develop goals and backup team. 

!!!''Outcome measures''
These will be completed on [[POD|https://pod-database.org/db3/login/]]

*At beginning of session:
**[[RCADS]] (Full)
----
!!''Session plan''


''Note: ''If you haven’t completed a session 0 for this YP as they have had an assessment elsewhere you will need to make some additions to this session, including checking with the YP they feel this is the appropriate intervention, a brief risk assessment and discussing the impact of the YPs anxiety on their life. See session 0 for support with this.

!!!''Key tasks''

*Discuss a recent situation where the YP felt anxious- thoughts, feelings and behaviours.
*Provide psychoeducation about anxiety.
*Discuss the YP’s ideas of development of problematic anxiety- what might be keeping it going. 
*Support the YP to identify helpful coping behaviours v’s unhelpful habits. 
*Discuss/agree goals for sessions and back-up team. 
*Complete ROMS and SRS

!!!''Check In''

*How are you?
*Complete RCADS
*Agree the agenda: content of session and give opportunity for YP to add to agenda
*Review any questions they had about psychoeducation materials they read between sessions.


!!!''Main content of the session''

*''Discuss specific situation'' the YP has experienced anxiety - thoughts, feelings, body sensations and actions (p18). 
*''Maintaince factors'' - avoidance, safety behaviours and unhelpful thinking. 
*''Psychoeducation'' on anxiety. Utilise p19/20 of manual- the fight/flight/freeze response and how the YP experiences this response. Use other resources – be creative! (YouTube etc.)
*''Cause and maintenance'' of problematic anxiety. Normalise/ validate the YP’s experience. Acknowledge any feelings of self-blame/ criticism - reassure it is not their fault. __Important:__ Once YP knows what is keeping it going they can do something to overcome it.  
*''Coping behaviours vs unhelpful habits:'' Utilise examples/analogies - Coping strategies previously used- which are helpful coping techniques /unhelpful habits. 
*''Suggest possible coping techniques'' (p.25/26 of manual).
*''Formulation'' (worksheet p.27) - pull together learning /understanding of cause or trigger and what is keeping it going. This will help when deciding which techniques to focus on and developing goals.  
* ''Develop up to 3 goals'' with the YP for sessions. Refine into SMART goals (p28/29). Aim for one to be a learning goal (e.g. to develop ways of coping with my anxiety). 
* ''Back-up team:'' Discuss who is going to support them between sessions. 

!!!''Things for YP to practice''
*Try out/practice coping strategies on p. 25/26. 
*Could read about the role of avoidance in maintain anxiety.

!!!''End of session review''

*Any questions? 
*Plan if anything needs to be shared with anyone on the back up team (e.g. parents/teachers who may need to support YP with home tasks or have been identified as doing things that are inadvertently maintaining the YP’s anxiety which needs to be discussed).
*Utilise SRS or similar to get feedback on the session.

----
!!''Handouts''
!!!''Core self help materials:''
The main resources are session 1 of the Getting to Grips with Anxiety manual:

<<link-doc "Getting to grips with anxiety" "https://drive.google.com/file/d/1MhSkweHKlMx3gAHe8SyVqss4nSjzJhFd/view?usp=sharing">>

!!!''Additional handouts:''
<<link-doc "SMART goals" "https://drive.google.com/file/d/1u3mrTagRhW23ZB5K6TEZwwJtZtEL2Cc7">>
!!!''Other resources:''
*You may want to utilise other self help materials in your work with YP. For self-help materials such as videos, websites, apps and booklets (in particular:'Panic and Phobias' or 'Stress and Worry' depending on difficulty) please go to: [[Self Help Materials for Adolescent Anxiety]]
*Apps: There is an app called 'Grow' which is aimed at YP to help them manage personal goals (see: [[Self Help Materials: Apps]])

Additionally please go to the [['get self help'|https://www.getselfhelp.co.uk/]] website for useful handouts and session materials.
!!Overview:
This session is face to face (up to 1 hour).  The full session plan can be seen in the paper manual which can be found here:
 <<link-pdf "Guided Self-Help for Low Mood: Full Manual" "https://drive.google.com/file/d/12bn3n53aWhm5_21Za460fp_qOtPsWY_N/view?usp=sharing">>  

!!!Outcome measures:
These will be completed on [[POD|https://pod-database.org/db3/login/]]

*At beginning of session:
**Primary Outcome Measure = Full RCADS
**Goal rating scale 
*At end of session:
**Session Feedback Questionnaire (SFQ) 
----
!!Session plan:

!!!Key tasks:

*RCADS symptom tracker
*Set goals
*Psychoeducation
*Formulation

!!!Check in
How are you?
Agree the agenda: outline content of session, provide opportunity for them to add to agenda (This can be discussed in space at the end of the session, or integrated during a relevant part of the session)
Discuss practicalities: Session dates/time

!!!Main content of the session 

*''Complete RCADS'' symptom tracker on POD. Feedback RCADs results from previous week - discuss results.  

*''Goal Setting:'' Identify goals (SMART goals handout).  
*''Record the goal''- use the GBO 
*''Rate goals'' out of 10 for where they are currently with this goal and where they would like to aim to get to (10/10 might not be realistic!)
*''Psychoeducation: '' work through handout and discuss (“Depression and Low Mood: Psychoeducation” handout)

*''Normalise their difficulties'' by encouraging YP to tick which signs and symptoms they might be struggling with.
*''Vicious cycle'' of depression/low mood (also included in handout) Explain and wider formulation around development of low mood (“Development Map of Low Mood”)
*''Highlight importance of BA'' as part of their intervention.
*''Develop an individual formulation/cycle'' with the young person using the same handout, using a recent time  they felt low.    
*''Discuss the information'' on 'how I can overcome my low mood'. Emphasising that things can improve! 

!!!Home practice
*Read over the psychoeducation material on low mood that has been provided.

!!!End of session review
*Review of session, comments and questions. 
*Key learning points?

-----

!!Handouts 
!!!Core self help materials: 

<<link-pdf "Depression and Low Mood: Psychoeducation" " https://docs.google.com/document/d/1ruYpSKy13nxb13CFyreZAGn0w0BPba8BWlQn7PGIFlY/edit?usp=sharing">>
 
<<link-pdf "Development Map of Low Mood" "https://docs.google.com/document/d/167VUIWaLoqrWbb1wOrcklO-N2CZNfjgcpsTDfiDdRyk/edit?usp=sharing">>

<<link-pdf  "SMART Goal handout" "https://drive.google.com/open?id=1n-KiufWlI_3xIniCOtqv5iqNFe_ec-fDGYh_OumuvhE">>

<<link-pdf "Paper version of GBO" "https://drive.google.com/drive/u/1/folders/1jaGGIN0Q_nI9eIFkJhx1TYBHxpOm0ojI">>

!!!Additional resources:

[[The ‘Dog Poo’ analogy|Dog Poo Analogy]] is a useful way to describe the relationship between thoughts, feelings and behaviour.  This is included in session four where the role of thoughts is discussed. However, in some instances this may fit well following the vicious cycle where the thoughts, feelings and behaviour link is first illustrated. 

Black Dog Video clip (WHO) https://www.youtube.com/watch?v=XiCrniLQGYc

 ----
Session 1: Goal setting; Psychoeducation; Formulation.

''Key Tasks: ''
•	RCADS symptom tracker

•	Goals

•	Psychoeducation

•	Formulation

1.	''Agree/Set agenda.'' Let them know that there are a number of areas that you will be covering today. Is there anything they would like to add to this? This can be discussed in space at the end of the session, or integrated during a relevant part of the session (e.g. during formulation if there was a particular difficulty during the past week).

2.	''RCADS: ''Complete RCADS symptom tracker on POD. Feedback RCADs results from previous week (using graph where possible). Discuss meaning of results.  

3.	''Goal Setting:'' Identify up to 3 goals using the SMART goals handout as a guide for yourself.  Use the GBO form to record the goal.   

a.	Rate the goal out of 10 for where they are up to right now with this goal. For example, 10/10 is that the goal is met; 0/10 is that goal is not met.    
 
b.	Rate where they would like to aim to get to (e.g. 8/10 might be a healthy aim, as 10/10 might not be realistic with life’s ups and downs!)

c.	Add goals to POD

''4.	Psychoeducation: ''

Go through the psychoeducation handout (“Depression and Low Mood”). Areas included within this are:   

a.	What is depression (thoughts, physical sensations, behaviours)?

b.	Signs and symptoms

c.	What causes depression and low mood?

d.	Vicious Cycle of depression and low mood

e.	Understanding your depression and low mood

f.	What keeps our low mood going?

g.	How can I overcome my low mood?

Go through each of these areas and discuss with the young person. Encourage the young person to tick which signs and symptoms they might be struggling with. Use this to normalise some of their difficulties.

Explain the vicious cycle of depression/low mood (also included in handout) and information about activity levels and low mood. Begin to highlight the importance of BA as part of their intervention.

Develop an individual formulation/cycle with the young person using the same handout.  Let them know that whilst it can be helpful to understand what caused their low mood, it is more important to identify what is keeping it going presently. Ask young person to tell you about a recent time when they felt low and fill this into the formulation template.    

Discuss the information on how I can overcome my low mood. Present this in a hopeful manner, emphasising that things can and will improve! 

OPTIONAL: You may wish to complete a wider formulation around the development of low mood, alongside the vicious cycle (including genes, adverse life experiences and so on). See handout “Development Map of Low Mood”

OPTIONAL: The ‘Dog Poo’ analogy is a useful way to describe the relationship between thoughts, feelings and behaviour.  This is included in session four where the role of thoughts is discussed (see session four content). However, in some instances this may fit well following the vicious cycle where the thoughts, feelings and behaviour link is first illustrated. 

 
OPTIONAL:  Black Dog Video clip (WHO) https://www.youtube.com/watch?v=XiCrniLQGYc

''Home practice''
•	Read over the psychoeducation material on low mood that has been provided.

''End of session''

•	SFQ 

•	Review of session, comments and questions. Key learning points?
 
!!''Overview: ''
This session is face to face (up to 1 hour).  The full session plan can be seen in the [[paper manual|http://centaur.reading.ac.uk/65537/]]
!!!''Outcome measures:''
These will be completed on [[POD|https://pod-database.org/db3/login/]]
*At beginning of session:
**Primary Outcome Measure: Parent SDQ IMPACT Sub-scale (short version)
**Goal rating scale
*At end of session:
**SFQ
----
!!''Session plan:''
Reading covered in this session: Part 2 (steps 1 and 2)
!!!''Key tasks: ''
*Helping parents support their children explore anxious thoughts
*Helping to test out fears
*Complete impact subscale of parent SDQ.
!!!''Check In''
*How are you?
*Agree the agenda: content of this session and give opportunity for parent to add to agenda
*Complete measures and review goals: Reflect on any changes
*Does parent have questions/comments about reading Part 2 (steps 1 and 2) of book? If not completed, encourage problem solving for next week.
!!!''Main content of the session''
''Review of maintenance cycles''
*To help parents recognise the maintaining role of thoughts in anxiety.
''Alternative ways of thinking''
*Introduce concept: Alternative ways a child might think about a situation and the ways parents can help a child with this
*To give parents strategies to help children think through negative thoughts independently (with support). 
''Methods of encouraging alternative ways of thinking''
*Give parents alternatives to reassurance or responses that may inadvertently promote avoidance. 
*Instead of reassurance, encourage parents to show empathy by validating child’s feelings (e.g. I can see that you are worried about x) and then ask questions to help child to think for themselves.
*Introduce Judge and Jury techniques: Identify evidence for the thought and alternative to the thought.
''Encourage testing out fears''
*Introduce behavioural experiments and encouraging children to think of ways to test their fears
*Emphasise importance of asking child what they think will happen before experiment and what actually happened after experiment so that they can think about what results mean 
''Give an opportunity to practice''
*Role play with parent (with you as parent and parent playing child first, then swap) 
*Discuss what felt like it worked/didn't work etc
!!!''Parent 'homework' tasks:''
*Parent to record their child’s anxious thoughts and their attempts at challenging these
*Parent to read remainder of Part 2 
*Parent to decide what fear should be the focus of the programme and step-by-step plan for their child, in preparation for session 3.
!!!''Review of the session''
*Complete SFQ
*Discuss ‘take home’ messages from session - reducing reassurance, asking questions and testing predictions. 

----
!!''Handouts''
!!!''Core self help materials:''
<<link-doc "My Child's Thoughts" "https://drive.google.com/open?id=0B-tACu2wi4-4LUFGSjc4ek05SWc">>
<<link-doc "Helping my child with unhelpful thoughts" " https://drive.google.com/open?id=0B-tACu2wi4-4TnZXaml6X2RsUkk">>
!!!''Additional handouts:''
<<link-doc "Judge thought challenging" "https://drive.google.com/open?id=0B-tACu2wi4-4MXFfN0Q1U3FwOVk">>
!!!!Source: Caroline Bengo, Matt Woolgar, Sara Dawson and Jelena Crnokrak 

This page provides a brief session plan to be used as a reminder for practitioners. 

---

!!''Overview:''

''Praise and Rewards'': This session is face to face (approx. 50-60 mins). The full session plan can be found here:

<<link-doc "Session 2: Praise and Rewards" "https://drive.google.com/file/d/1xVNpAfXMRTOLS5FdjJ6tpuVQAJKbneH0/view?usp=sharing">>

The full manual can be found here:

<<link-doc "Guided self-help for behaviour problems" "https://drive.google.com/file/d/1vBNYY-hZtqIKHZucyZmbxZmfjTvYYoRZ/view?usp=sharing">>

!!!''Outcome measures''
These will be completed on [[POD|https://pod-database.org/db3/login/]]

*At beginning of session:
**[[SDQ]] (IMPACT only)
**[[GBO|Goal-Based Outcomes (GBO)]] (+HIT)
*End of session:
**SFQ/SRS

----
!!''Session plan''

!!!''Key tasks''
*Review and troubleshoot attending
*Introduce specific praise and positive reinforcement strategies

!!!''Check In''

*How are you?
* Agenda setting 
* Explain how long you will meet for (50-60 minutes)
*''Review of home-practice'': aim is to increase parents’ awareness of the impact that they have on their child’s behaviour and the relationship between the attention that they give and their child’s behaviour. 

!!!Review
*how did attending go? What toys/activities were used? How did it feel while attending? How did the child respond? Troubleshoot any issues/ practice again if needed.
*Goals

!!!''Main content of the session''

*''The Importance of Praise''- highlight importance and explore current use of/feelings about giving praise. Explain it as another way of investing positive time, and tells children which behaviours we value (Focus praise on positive behaviours- in line with goals). Also builds child’s self-esteem, reminds them they are loved.
*''Giving Effective Praise'' Discuss difference of generic praise and specific labelled praise tied to a behaviour (reasoning for using the latter). Use/ share [[Making praise effective]] 
*''Rewarding behaviour'' introduce/ discuss use of social rewards, and tangible rewards (to be used in a sparing way) to reinforce positive behaviour. Discuss if reward charts are appropriate- good for establishing new routines. Encourage parents to use specific praise, even when using other forms of reward.
**''Social Rewards discuss types of social reward'': Verbal Praise, Physical Affection, Time with Child
**''Tangible Rewards'' (Used sparing) check clarity between bribe and reward. Discuss types: Inexpensive Items (stickers etc.), Special Choices and Privileges (Screen time etc.), Special Activities, Special Time with Child.
*''Practice'' think/note down with parents how they can increase praise for specific desired behaviours (refer to goals) for the following week. If no positive behaviours- encourage noticing child’s steps in the right direction or compliance with minor instructions.
*''Parents to praise themselves'' for something they have done well each day. Important to recognise steps in the right direction as can help to counter own inner critics.


!!''Home-practice ''
*Parents to select behaviours and praise these across the week
*Assist with a reward chart (if appropriate) 
*Notice one thing they did well (or in the right direction) every day

---

!!''Handouts''

*Praise
*Reward Charts
*Goals


<<link-doc "Session 2 Handouts" "https://drive.google.com/file/d/1XmmTnHbmynS-E9ujRk-jkNL4s8PLmfsn/view?usp=sharing">>


!!''Overview: ''
This session is face to face (approx. 45 mins).  
!!!This page provides a brief session plan to be used as a reminder for practitioners, the full session plan can be found here:
 <<link-doc "Session 2 Plan: Adolescent Anxiety" "https://drive.google.com/file/d/1H3psPPCGetG_4PJ_lqGvKvBfoCsU2uU6/view?usp=sharing">>

In this session you’ll support the YP to: 
*Address problematic anxiety through exposure in a step-by-step plan. 
*Discuss avoidance in maintaining anxiety 
!!!Outcome measures:
These will generally be completed on [[POD|https://pod-database.org/staff/select-project.php]]
*At beginning of session:
**Sub-scale on the [[RCADS]]
**Goal rating scale 
----
!!''Session plan''
!!!''Key tasks''
*Discuss role of avoidance in maintenance and how exposure can be used to address this.
*Identify situations /activities being avoided due to anxiety. 
*Agree activity they would like to address using exposure 
*Support them to create a step-by-step plan.
!!!''Check In''
*How are you?
*Complete outcome measure
*Agree the agenda: content of session and give opportunity for YP to add to agenda
*Review any questions they had about the last session or home task materials
*Review home tasks and what YP has learnt from completion. Set further practice if appropriate. 
*Problem-solve any barriers to completing home tasks
!!!''Main content of the session''
*''The role of avoidance'' in maintaining anxiety and the rational for exposure -Utilise metaphors /analogies to support this and p. 33 of the manual (examples from their own experience) __Key messages:__ 
**avoidance is a natural response and reduces anxiety short-term 
**Maintains it in the long-term 
* ''Identifying situations or activities'' -Support  YP to identify what they are avoiding/ escaping from due to their anxiety (p.34).
*''The fear thermometer'' (p.35) to gauge /rate fear levels for particular situations. Help the YP to decide anchor points for a few fear ratings.
*''Choose a situation/activity goal'' - one the YP is avoiding that they would like to do if they overcome anxiety. (Place the ultimate goal at the top of the step-by-step plan)
*''Break goal down into smaller steps'' Use the fear thermometer to help rate levels of anxiety to help guide where to place them on the 'fear ladder'. 
*''Discuss rewards'' for when they have completed each identified step successfully.  
*''Decide a plan for completing first step'' (p. 37). - should provoke some anxiety but feel achievable and likely to result in completion /success to boost confidence (work within the YP’s “window of tolerance”). Discuss safety behaviours - may need to be dropped and helpful coping skills used.
*''Talk through any problems'' that may get in the way of completing the exposure and plan for these.
*''Tip sheet'' to talk through with the YP on p.39.
''To note:'' If appropriate the first step can be completed at home or in the next GSH session. If YP plans to complete exposure at home ask them to complete the exposure rating sheet (p.44/45) as a record of changes in their anxiety during the exposure task. Be clear on what a successful step means - to remain in situation until anxiety reduces by half of original rating.
!!!''Things for YP to practice''
*May want to complete the first step on their exposure hierarchy at home if this feels manageable. If not - could discuss and plan rewards for their step by step plan with parents/carers and/or practice coping skills discussed in session one. 
!!!''End of session review''
*Review the main content of the session and check YP’s understanding or any questions. 
*Ensure YP is clear about any home tasks/practice that need to be completed before the next session.
*Plan if anything needs to be shared with anyone on the back up team (e.g. parents/teachers who may need to support YP with home tasks or have been identified as doing things that are inadvertently maintaining the YP’s anxiety which needs to be discussed).
*Utilise SRS or similar to get feedback on the session
----
!!''Handouts''
!!!''Core self help materials:''
All core handouts can be found in session 2 of the the treatment manual: 
 <<link-doc "Getting to grips with anxiety" "https://drive.google.com/file/d/1MhSkweHKlMx3gAHe8SyVqss4nSjzJhFd/view?usp=sharing">>
!!!''Additional Handouts:''
<<link-doc "Fear Thermometer" "https://docs.google.com/document/d/1mdOx9P-4TAJJ5Zx2D8dpyKtAviiih3cj8zUx02rjN2Y/edit?usp=sharing">>
<<link-doc "Thinking traps" "https://docs.google.com/document/d/1uKIB6vs687FCuoYUwK52yQIdqQHm1pky0wTkLl1tFpw/edit?usp=sharing">>
<<link-doc "Coping thoughts" "https://drive.google.com/open?id=0B-tACu2wi4-4dVNuelpUUVh6UWc">>
<<link-doc "Overcoming Avoidance" "https://drive.google.com/file/d/0B-tACu2wi4-4X3dSNzV3YzlXTTA/view?usp=sharing">>
!!!''Other resources:''
You may want to utilise other self help materials in your work with YP. For self-help materials such as videos, websites, apps and booklets please go to: [[Self Help Materials for Adolescent Anxiety]]. Additionally please go to the [['get self help'|https://www.getselfhelp.co.uk/]] website for useful handouts and session materials.
!!Overview:
This session is face to face (up to 1 hour).  The full session plan can be seen in the paper manual which can be found here:
 <<link-pdf "Guided Self-Help for Low Mood" "https://drive.google.com/file/d/12bn3n53aWhm5_21Za460fp_qOtPsWY_N/view?usp=sharing">>  

!!!Outcome measures:
These will be completed on [[POD|https://pod-database.org/db3/login/]]

*At beginning of session:
**Primary Outcome Measure = RCADS (Subscale)
**Goal rating scale 
*At end of session:
**Session Feedback Questionnaire (SFQ) 
----
!!Session plan:

!!!Key tasks: 

•	RCADs symptom tracker & rate goals

•	Back up team 

•	Introducing Behavioural Activation and the Activity Diary

!!!Check in
* How are you?
* Agree the agenda: outline content of session, provide opportunity for them to add to agenda (This can be discussed in space at the end of the session, or integrated during a relevant part of the session)
* Discuss practicalities: Session dates/time

!!!Main content of the session 

*''Explain the back up team'' and different types of support different people might offer and begin creating their own back up team (‘The Back-Up Team’ handout). 
*''Sharing this discussion'' with people on the back up team (may require support in how to do this).

*''Introduce Behavioural Activation:'' (Behavioural Activation 1 handout). Cover key areas:
**Activity levels and low mood – leading into the ‘Vicious Cycle of Depression/low mood’.
**What happens in their own lives when they feel low? Have they stopped/ reduced activities?
*''Action before motivation'' (Handout). - Check understanding, thoughts? Have they ever done an activity that they didn’t want to do, but then felt better for it?  

*''Introduce the Activity Diary'' (Handout) Discuss idea of rating activities on scales; Achievement, Closeness to others, Enjoyment

*''This weeks activities'' What have they done- Practice scoring verbally on each of these areas for the activity.

*''PLEASE NOTE: values and the importance of values and activities are included in the following session.''

*Go through the sample diary (Mohammed). Any reflections?

*''Blank Activity Diary'' for the week ahead. - Complete a whole day together to practice. (try to use detail). BUT if the young person is particularly overwhelmed, basics of how they are spending their time is better than nothing at all.

!!!Home practice

*Fill in Activity Diary 
*If possible, share the session work with parents
!!!End of session review: 
*Comments and questions, key learning points?

-----

!! Handouts 
!!!Core self help materials:

 <<link-pdf "The Back-up Team (CYP)" "https://docs.google.com/document/d/1WfmTz29skWDxADSQ3rN67MUPS88Jy8zu_6M1u59TmAY/edit?usp=sharing">> 

<<link-pdf "Behavioural Activation 1 (CYP)" "https://docs.google.com/document/d/1HLilN-S1H-6WnnbPAncz8Mn99QIbaQvzhRYiOuVDKfo/edit?usp=sharing">>  
!!''Overview: ''
This session is face to face (up to 1 hour).  The full session plan can be seen in the [[paper manual|http://centaur.reading.ac.uk/65537/]]
!!!''Outcome measures:''
These will be completed on [[POD|https://pod-database.org/db3/login/]]
*At beginning of session:
**Primary Outcome Measure: Parent SDQ IMPACT Sub-scale (short version)
**Goal rating scale
*At end of session:
**SFQ
----
!!''Session plan:''
Reading covered in this session: Part 2 (Steps 3 & 4)
!!!''Key tasks: ''
*Building up brave behaviour
*Devising a step plan to face fear
!!!''Check In''
*How are you?
*Agree the agenda: content of this session and give opportunity for parent to add to agenda
*Complete measures and review goals: Reflect on any changes
*Review homework: Does parent have questions/comments about homework? If not completed, encourage problem solving for next week.
!!!''Main content of the session''
''Building up brave behaviour''
*Discuss promoting independence in children 
*Discuss opportunities in everyday life where they can promote facing or testing out fears.
*Discuss attending to attempts made by child and praising/ rewarding this.
*Role models for child
''Devising a step plan to face fear''
*Discuss stepped-approach: building up behavioural experiments gradually to build confidence in facing fears.
*Consider graded exposure with parent (least anxiety provoking to most anxiety provoking). 
*Think of a reward for each step.
*Helpful thoughts: Encouraging child to come up with helpful thoughts that will help them to take the next step
!!!''Parent 'homework' tasks''
*Check the step-by-step plan with their child and alter if necessary
*Encourage the child to have a go at the first step on the step-by-step plan. 
*Parent to monitor own responses and complete handout (how anxious does my child feel?)
*Continue to encourage their child to challenge their anxious thoughts 
!!!''Review of the session''
*Complete SFQ
----
!!'' Handouts ''
!!!''Core self help materials:''
<<link-doc "Responding to My Child’s Anxious Behaviour" "https://drive.google.com/open?id=0B-tACu2wi4-4WkpPZ3pMNmxvRW8">>
<<link-doc "Praise and Rewards"" https://drive.google.com/open?id=0B-tACu2wi4-4UjFlTWhkY1hrVU0">>
<<link-doc "How Anxious Does My Child Feel Doing Each Step?" "https://drive.google.com/open?id=0B-tACu2wi4-4eV9JMjNMci1ONzA">>
<<link-doc "Step-by-step plan" "https://drive.google.com/open?id=0B-tACu2wi4-4OEFaMWFSTHFvUms">>
!!!!Source: Caroline Bengo, Matt Woolgar, Sara Dawson and Jelena Crnokrak 

This page provides a brief session plan to be used as a reminder for practitioners. 

---

!!''Overview:''

''Selective Ignoring'': This session is face to face (approx. 50-60 mins) ''OR ''telephone if ''NOT'' doing time out (approx. 20-40 mins).  The full session plan can be found here:

<<link-doc "Session 3: Selective Ignoring" "https://drive.google.com/file/d/1JpuKNrjwMYq1XpkIMct-rF-FkTEligKx/view?usp=sharing">>

The full manual can be found here:

<<link-doc "Guided self-help for behaviour problems" "https://drive.google.com/file/d/1vBNYY-hZtqIKHZucyZmbxZmfjTvYYoRZ/view?usp=sharing">>

!!!''Outcome measures''
These will be completed on [[POD|https://pod-database.org/db3/login/]]

* At beginning of session:
**[[SDQ]] (IMPACT only)
**[[GBO|Goal-Based Outcomes (GBO)]] (+HIT)
*End of session:
**SFQ/SRS

----
!!''Session plan''

!!!''Key tasks''
* Introduce selective ignoring as a strategy to reduce negative behaviours
*Support parents to use differential attention
*Support parents to use selective ignoring appropriately/calmly



!!!''Check In''

*How are you?
* Agenda setting 
* Explain how long you will meet for 

!!!Review

*Home Practice: how did specific labelled praise go? Did you remember to praise yourself? Still using special time? Troubleshoot any issues/ practice again if needed. 
*Goals

!!!''Main content of the session''

''Notes for practitioners:'' Selective ignoring not to be used for dangerous behavior/ behaviours that really push parents’ buttons. Works best for behaviour intended to elicit a parental response (and minor irritating behaviours). If possible: everyone in home is to ignore the behaviour. Must be used consistently (every time chosen behaviour occurs) and alongside positive attention/ praise/ rewards for positive behaviour. 

*''Selective Ignoring parental attention rewarding''. So major way to decrease unwanted behaviour is to completely remove attention from that behaviour but NOT the child. Benefits: extremely effective, maintains positive relationship, role modelling self-control/emotional regulation, and allows child to practice independently calming down. See [[Selective Ignoring Guidelines]] 
*''Choosing the right behaviour'' choose tolerable behavior to begin with - if they crack (eg. Shout etc.) provides powerful reinforcement of negative behavior 
*''Reinforcement strengthens behaviour'' so more likely to occur again. Two types - Continuous: rewarding behaviour every time it occurs (establishing new behaviours). Intermittent: rewarding every now and then (maintaining behaviour). Use [[The Slot Machine Analogy]]
*''May get worse before it gets better'' as the usual reward is withdrawn (your attention). If you stick with it, it will eventually reduce. Use behaviour extinction diagram (in full manual) to illustrate re-emergence and extinction (stress importance of consistency).
*''Practice:'' note down/discuss behaviours (handout: Selective Ignoring) parent is to selectively ignore. Practice (if helpful) with parent acting as child first then switch roles. Discuss/ problem solve getting the family ‘on board’, coping statements (Handout: Coping Thoughts) and (appropriate) distractions.


!!''Home-practice:''

*Practice selective ignoring for a mild irritating behaviour during the week.
*Continue using specific praise for the positive alternative to the behaviour being ignored.
*Continue special time

---

!!Handouts

*Selective Ignoring
*Coping Thoughts


<<link-doc "Session 3 Handouts" "https://drive.google.com/file/d/105KDpArw9_r1jLLVHNAlJe1hbOUo4UbS/view?usp=sharing
">>



!!''Overview:''
This session is face to face (approx. 45 mins).  In this session you’ll support the YP to: complete an exposure task on their step by step plan. 
For the full session 3 plan see below:

 <<link-doc "Session 3 Plan: Adolescent Anxiety" "https://drive.google.com/file/d/1saxbcbaa8R6vxTbNUWcE-w1rCeQQx6g6/view?usp=sharing">>
!!!''Outcome measures:''
These will generally be completed on [[POD|https://pod-database.org/staff/select-project.php]]
*At beginning of session:
**Sub-scale on the [[RCADS]]
**Goal rating scale 
----
!!''Session plan''
!!!''Key tasks''
*Plan and complete and exposure task in session with the YP. 
*Discuss any potential barriers to completing exposure and ways to overcome.
*Ensure YP drops any unhelpful habits (safety behaviours) during task.
*Validate/normalise any concerns but provide encouragement and confidence that they can do it. 
!!!''Check In''
*How are you?
*Complete outcome measure
*Agree the agenda: content of session and give opportunity for YP to add to agenda
*Review any questions they had about the last session or home task materials
*Review home tasks and what YP has learnt from completion. Set further practice if appropriate. 
*Problem-solve any barriers to completing home tasks
!!!''Main content of the session''
''Note:'' If YP completed an exposure task at home then this should be reviewed and learning from the task discussed. You will need to plan a further exposure task to then complete in the session or repeat the task. Utilise the step by step plan and YP current fear ratings to guide choice of task.
*''Complete an exposure task in session'' - track fear ratings during the task (page 42) use the fear thermometer to help with this. 
* ''During exposure''
**Be encouraging /supportive to increase YP confidence but validate concerns/anxiety.
**	Drop safety behaviours during task. 
**	Don’t talk too much but check in with YP about level of fear every couple of minutes.
**YP to remain in situation until their fear ratings drop by at least half of peak rating. Ensure there is enough time to complete task. 
**Work within the YP’s “window of tolerance” (should provoke anxiety but within a limit that feels manageable)
*''Review exposure task'' (how it went/ what they have learnt p.43). If you noted any anxious thoughts during the exposure look back at these and discuss.
*''YP to reward themselves'' for completing the step. 
*Plan another exposure task for their home task (p.46).  When setting up the exposure task discuss unhelpful habits (safety behaviours) that may need to be dropped and more helpful coping skills that can be used such as calm breathing and coping self-talk. Talk through any problems that may get in the way of completing the exposure and plan for these.
*''Review the tip sheet'' on p.39.
!!!''Things for YP to practice''
*The YP should complete the next exposure task on their step by step plan or repeat the current step until it becomes less anxiety provoking.
!!!''End of session review''
*Review the main content of the session and check YP’s understanding or any questions. 
*Ensure YP is clear about any home tasks/practice that need to be completed before the next session.
*Plan if anything needs to be shared with anyone on the back up team (e.g. parents/teachers who may need to support YP with home tasks or have been identified as doing things that are inadvertently maintaining the YP’s anxiety which needs to be discussed).
*Utilise SRS or similar to get feedback on the session
-----

!!''Handouts''
!!!''Core self help materials:''
The main resources are session 3 of the Getting to Grips with Anxiety manual: 
<<link-doc "Getting to grips with anxiety" "https://drive.google.com/file/d/1MhSkweHKlMx3gAHe8SyVqss4nSjzJhFd/view?usp=sharing">>
!!!''Additional handouts:''
<<link-doc "Graded exposure"  "https://drive.google.com/open?id=0B-tACu2wi4-4VEdGSWpxcHlOOHM">>
<<link-doc "Habituation" "https://drive.google.com/open?id=0B-tACu2wi4-4alB5aHBfOVJoaVE">>
!!!''Other resources:''
You may want to utilise other self help materials in your work with YP. For self-help materials such as videos, websites, apps and booklets please go to: [[Self Help Materials for Adolescent Anxiety]]. Additionally please go to the [['get self help'|https://www.getselfhelp.co.uk/]] website for useful handouts and session materials.
!!Overview:
This session is face to face (up to 1 hour).  The full session plan can be seen in the paper manual which can be found here:
 <<link-pdf "Guided Self-Help for Low Mood: Full Manual" "https://drive.google.com/file/d/12bn3n53aWhm5_21Za460fp_qOtPsWY_N/view?usp=sharing">>  

!!!Outcome measures:
These will be completed on [[POD|https://pod-database.org/db3/login/]]

*At beginning of session:
**Primary Outcome Measure = RCADS (Subscale)
**Goal rating scale 
*At end of session:
**Session Feedback Questionnaire (SFQ) 
----
!!Session plan:

!!!Key tasks:

*RCADs symptom tracker & rate goals
*Review ROMs (RCADS DEP, GBO) 
*BA Continued

!!!Check in
* How are you?
* Agree the agenda: outline content of session, provide opportunity for them to add to agenda (This can be discussed in space at the end of the session, or integrated during a relevant part of the session)
* Discuss practicalities: Session dates/time

!!!Main content of the session 
*''Brief recap of behavioural activation'' introduced in the last session. Remind YP BA doesn’t happen overnight, but when it begins to work it can make a huge difference. 
*''Review the Activity Diary:'' Ask the YP to talk you through their Activity Diary. Why did they like something/see it as important? Reflections?
* ''Trouble shoot/problem solve'' if they didn’t complete activity diary. Consider following [[Tips for Completing Activity Log]]
*''Further BA'' (Behavioural Activation 2 handout) discuss:
**Importance of Values and linking activities to values- selecting activities/values that are important to you may increase success.
**Explore common areas of life people value (as per sheet).
**List of sample values: discuss which are important to them. Add to sheet.
**Support the young person in entering values into the blank areas of life sheet.

*''Translating Values into Activities'' (handout) Write in as many as possible, BUT will not be working on all of these in one go! Working gradually making step by step changes.
*''Plan one or two activities'' – depending on what feels best for the young person. Use the top tips (as per handout) to identify activities
''NOTE: ''

*May be necessary to break activities into small steps (it’s better to aim for smaller/achievable ones than overwhelming ones). 
*Early steps may involve things that the YP is already doing – but may want to do more of (to increase the likelihood of success).
*May be past activities they no longer do due to feeling low. These might be easier to get going with!

!!! Home practice
•	Continue completing Activity Diary

•	Complete the agreed one or two valued activities

•	If possible, share the session work with parents

!!!End of session review

*Review of session, comments and questions. 
*Key learning points?

-----

!!Handouts 
!!!Core self help materials:

<<link-pdf "Behavioural Activation 2 (CYP)" "https://docs.google.com/document/d/1uQ6Ik8hd3PADOcBQWSvmOfhyh_Zs3Gw97O_TxJqZk1A/edit?usp=sharing">>   
!!''Overview: ''
Session 4, 5 and 6 are telephone sessions (approx. 20 minutes).
The full session plans can be seen in the [[paper manual|http://centaur.reading.ac.uk/65537/]]
!!!''Outcome measures:''
These will be completed on [[POD|https://pod-database.org/db3/login/]]
*At beginning of session:
**Parent SDQ IMPACT Sub-scale (short version)
**Goal rating scale
*At end of session:
**SFQ
----
!!''Session plan:''
!!!''Key tasks:''
*Review all homework tasks, be encouraging and highlight small successes. 
!!!''Check In''
*How are you
*Agree the agenda: Purpose of this session is to review how things are going. Remind parent that it will be 20 minutes.
*Check with the parent that they are in a position to discuss the material uninterrupted and are happy to proceed with the telephone call.
*Complete measures and review goals: Reflect on any changes
!!!''Main content of the session''
''Review goals''
*Challenging anxious thoughts: Is your child using thought challenging/ any difficulties?
''Experiments''
*Any further experiments to challenge anxious thoughts? 
*Was your child able to understand what the result of the experiment meant?
''Parent response to child’s anxious behaviour''
*Did they recognise anything they need to change e.g. needing to give less attention to anxious behaviours?
''Step by step plan and praise/reward'' 
*Check parent discussed plan with child
*Explore how plan is going and any difficulties
* Is child ready for next step?
!!!''Parent 'homework' tasks''
*Continue to record their child’s anxious thoughts and their attempts at challenging these on the ‘helping my child with unhelpful thoughts’ handout.
*Be on the lookout for opportunities for the child to conduct ‘experiments’ and encourage the child to test out fears and reflect on what happens. 
*Continue to record their responses to their child on handout. 
*Encourage the child to take the next step and to work through the step-by-step-plan. 
!!!''Review of the session''
*If any difficulties identified in session, use problem solving and set homework to try again
----
!!'' Handouts ''
!!!''Core self help materials:'' 
<<link-doc "Helping my child with unhelpful thoughts" " https://drive.google.com/open?id=0B-tACu2wi4-4TnZXaml6X2RsUkk">>
<<link-doc "Responding to My Child’s Anxious Behaviour" "https://drive.google.com/open?id=0B-tACu2wi4-4WkpPZ3pMNmxvRW8">>
!!''Overview:''
These sessions are briefer (20-30m) can be completed over the phone. The focus of these sessions is to support the YP to continue to work through their step-by-step plan of exposure tasks and review progress each session. 

It is good practice (if you have consent and you haven’t already done so) to check in with parents/carers/teachers about the YP progress at around session 4. This is an opportunity to discuss any concerns and ensure they understand the rationale for exposure and how best to support the YP.

For the full session 4-6 plan see below:

 <<link-doc "Session 4-6 Plan: Adolescent Anxiety" "https://drive.google.com/file/d/1PCzD8qC7hXlpr5FhcUU72UIy1OG8MS3z/view?usp=sharing">>
!!!''Outcome measures:''
These will generally be completed on [[POD|https://pod-database.org/staff/select-project.php]]
*At beginning of session:
**Sub-scale on the [[RCADS]]
**Goal rating scale 
----
!!''Session plan''
!!!''Key tasks''
*In each session you will need to review exposure tasks that have been completed at home and problem solve any difficulties.  
*Plan the next exposure task.
*Discuss any potential barriers to completing exposure and ways to overcome.
*Ensure YP drops any safety behaviours during the exposure task.
*Validate/ normalise any concerns but provide encouragement and confidence that they can do it. 
!!!''Check In''
*Briefly check how YP has been and agree agenda/plan for session
*Review any questions they had about the last session or home task materials
*Review home tasks and what YP has learnt from completion. 
*Problem-solve any barriers to completing home tasks
*Complete outcome measure
!!!''Main content of the session''
*''Review the exposure task/s'' YP completed at home utilising Facing your Fears review sheet (p.55). Discuss learning and/or problem solve. Refer back to any anxious thoughts/predictions YP and link new learning to these.
*''Ensure YP is rewarding themselves'' for completing the steps.
*''Ensure YP is repeating exposures'' until anxiety levels are reduced during anxiety provoking situation. 
*''Plan another exposure task'' for their home task utilising the facing your fear plan sheets - discuss safety behaviours that may need to be dropped. Talk through any problems/ barriers to completing the exposure and plan for these.
*''Review the tip sheet'' with the YP on p.39.
*''Ensure YP utilises exposure rating sheet'' (p.57) to keep track of the exposure tasks they complete and fear ratings during the tasks. 
!!!''Things for YP to practice''
*The YP should complete the next exposure task on their step by step plan or repeat the current step until it becomes less anxiety provoking.
!!!''End of session review''
*Review the main content of the session and check YP’s understanding or any questions. 
*Ensure YP is clear about any home tasks/practice that need to be completed before the next session.
*Plan if anything needs to be shared with anyone on the back up team (e.g. parents/teachers who may need to support YP with home tasks or have been identified as doing things that are inadvertently maintaining the YP’s anxiety which needs to be discussed).
*Utilise SRS or similar to get feedback on the session
-----

!!''Handouts''
!!!''Core self help materials:''
The main resources are sessions 4-6 of the Getting to Grips with Anxiety manual:

<<link-doc "Getting to grips with anxiety" "https://drive.google.com/file/d/1MhSkweHKlMx3gAHe8SyVqss4nSjzJhFd/view?usp=sharing">>
!!!''Additional Handouts:''
<<link-doc "Thinking traps" "https://docs.google.com/document/d/1uKIB6vs687FCuoYUwK52yQIdqQHm1pky0wTkLl1tFpw/edit?usp=sharing">>
<<link-doc "Coping thoughts" "https://drive.google.com/open?id=0B-tACu2wi4-4dVNuelpUUVh6UWc">>
<<link-doc "Overcoming Avoidance" "https://drive.google.com/file/d/0B-tACu2wi4-4X3dSNzV3YzlXTTA/view?usp=sharing">>
!!!''Other resources:''
You may want to utilise other self help materials in your work with YP. For self-help materials such as videos, websites, apps and booklets please go to: [[Self Help Materials for Adolescent Anxiety]]. Additionally please go to the [['get self help'|https://www.getselfhelp.co.uk/]] website for useful handouts and session materials.

!!!!Source: Caroline Bengo, Matt Woolgar, Sara Dawson and Jelena Crnokrak 

This page provides a brief session plan to be used as a reminder for practitioners. 

---

!!''Overview:''

''Effective Instructions'': This session is face to face (approx. 50-60 mins) ''OR ''telephone if ''NOT'' doing time out (approx. 20-40 mins).  The full session plan can be found here:

<<link-doc "Session 4: Effective Instructions" "https://drive.google.com/file/d/14fAQNeU5NS_NesEy072mpvRDLe_9EY2P/view?usp=sharing">>

The full manual can be found here:

<<link-doc "Guided self-help for behaviour problems" "https://drive.google.com/file/d/1vBNYY-hZtqIKHZucyZmbxZmfjTvYYoRZ/view?usp=sharing">>


!!!''Outcome measures''
These will be completed on [[POD|https://pod-database.org/db3/login/]]

* At beginning of session:
**[[SDQ]] (IMPACT only)
**[[GBO|Goal-Based Outcomes (GBO)]] (+HIT)
*End of session:
**SFQ/SRS

----
!!''Session plan''

!!!''Key tasks''

*Highlight instructions as a potential trigger for misbehaviour
*Support parents to learn how to give instructions effectively

!!!''Check In''

*How are you?
* Agenda setting 
* Explain how long you will meet for

!!!Review 
*Home Practice: How did Selective Ignoring go? What behaviour(s) used on? How did child respond? Able to return attention when misbehaviour ended?
*Still using attending/special time every day and continuing to praise prosocial behaviours frequently?
*Troubleshoot difficulties with any of the strategies introduced so far
*Goals

!!!''Main content of the session''

*''Instructions as Triggers'' Introduce concept using example of ABC chart. (Instruction often the ‘A’). Consider examples the parent has discussed with you to illustrate this.
*''Ineffective Instructions ''Discuss common mistakes made when giving children instructions as below, giving examples, normalising but highlighting problematic nature. 
**''Chain instructions:'' combining list of instructions- confusing (particularly for young children/ those with ADHD)- only retain first/last and overwhelming= no response.
**''Question Instructions:'' Instructions phrased as questions- confusing as suggests choice (it’s not).
**''Vague instructions'' (‘stop it’): May not understand what is being asked of them
**''“Let’s…” instructions'' (‘let’s go to bed’): confusing as not completing task together (child may wait for you before complying).
**''Instructions plus rationale'' (‘I need you to do…because…’): instruction gets lost in rationale, and child can get distracted/focussed on reasoning, instead of acting.
**''Repeated instructions:'' repetition unlikely to increase compliance and parent may get annoyed/angrier the more they repeat. (Also communicates parent’s instructions do not matter).
**''Unnecessary instructions'' (interrupting a favourite show for non-urgent tasks): Try not to give these, particularly if potentially triggering.
**''Poor body language'' (instructing while looking away/without ensuring attention): Issue of clarity- child unaware parent is speaking to them/too absorbed in activity. Also makes it seem instruction is not important.
*''Effective Instructions'' Discuss/demonstrate (Use example in full manual)
**''Decide ahead of time:'' is it necessary, realistic, fair? (don’t set the child up to fail) and be prepared to see it through (consequences for non-compliance covered next session).
**''Prevention better than cure:'' can we re-structure the day so compliance is more achievable (e.g. homework before screen time not after)
**''Ensure child’s attention:'' Parent stop their task, go to child, get down to their level, invite eye contact/ place a hand on their arm (as appropriate). 
**''Be simple, clear, and brief:'' keeping it straightforward (helps processing). Rehearse in head first to ensure its clear?
**''Be polite:'' modelling prosocial behaviour, add ‘please’/ use calm, pleasant tone of voice.
**''Ask child to do rather than not do something:'' more helpful (‘play quietly’ vs ‘stop shouting’).
**''Give child space to comply:'' allow processing time- wait 5 seconds after giving instruction (no discussion/argument/repeating during this time) – if still not started to comply, repeat once more. If begins to comply during either of these 5 seconds, praise immediately. If not followed, have consequence ready (introduced the next session). 
**''Break down longer tasks:'' into smaller tasks (where possible) and praise/encourage after each task is complete (e.g. lunch box in bag (praise), shoes on (praise) etc. rather a general ‘get ready’ instruction). Start praising as soon as they begin to comply (helps keep them focussed on task).
*Practice by using examples of triggering instructions (to their child), consider how to make instructions more effective (demonstrate with parent acting as child then switch). 
''Note for practitioners:'' Reassure ‘consequences’ will be covered next week, but ok to start practicing giving effective instructions now. If child does not respond to second instruction, leave it there, or use existing consequences (if safe and appropriate).


!!!Home-practice

*Parents to try giving effective instructions as practiced in session and note results
*Continue attending/special time and specific praise.

----

!!Handouts 
*Effective Instructions (Clear, Calm Commands)

<<link-doc "Session 4 Handouts" "https://drive.google.com/file/d/1EXZKPR3DDzWrDvYDV3pfd8vaMjJcCzU_/view?usp=sharing">>
!!Overview:
This session is face to face (up to 1 hour).  The full session plan can be seen in the paper manual: 

 <<link-pdf "Guided Self-Help for Low Mood: Full Manual" "https://drive.google.com/file/d/12bn3n53aWhm5_21Za460fp_qOtPsWY_N/view?usp=sharing">>  

!!!Outcome measures:
These will be completed on [[POD|https://pod-database.org/db3/login/]]

*At beginning of session:
**Primary Outcome Measure = RCADS (Subscale)
**Goal rating scale 
*At end of session:
**Session Feedback Questionnaire (SFQ) 
----
!!Session plan:
!!!Key tasks:
*RCADs symptom tracker & rate goals
*Review BA work: continuous/ active part work alongside other intervention components.
*The Role of Thoughts 
*Unhelpful Thinking Styles/Thinking Traps
*Thought diary

!!!Check in
* How are you?
* Agree the agenda: outline content of session, provide opportunity for them to add to agenda (This can be discussed in space at the end of the session, or integrated during a relevant part of the session)
* Discuss practicalities: Session dates/time

!!!Main content of the session 

*''Review Activity Diary'' with the young person. Did they complete the scheduled activity/activities identified in last weeks’ session- how did they find it/did it impact on mood?
*''Reflect on balance of activities'' in terms of achievement, closeness & enjoyment
*''Back-up team:'' were they able to share this with them?
*''Problem solve'' any difficulties in completing activities:

**Explore obstacles
**Were activities chosen realistic?
**Do we need to break down into smaller activities?
**Is there any guilt getting in the way? For example, if values conflict with parents values/preferences. - may need to be supported to talk to their parents.

*''Identify Activity for next week'' that fit with the young person’s values. Select some easy and some which may be more challenging.  
NOTE: YP continue to complete activity diary (to be reviewed at each future session).

*''Revisit the role of thoughts'' highlighted in their individual formulation in session one. How negative thoughts can feed into low mood.  
*''Use [[Dog Poo Analogy]] ''to further emphasise the link between thoughts, feelings and behaviour.
*''Negative Automatic Thoughts:'' Sometimes we are able to create some shifts in our mood by identifying particular negative thoughts making us feel low, and using techniques to think a bit differently! 
*''Negative Automatic Thought Fact Sheet'' handout; key points:   
**Thoughts are not a fact
**Thoughts may not be true and they might be unreasonable and unhelpful
**Negative thoughts drive distress
*''Unhelpful Thinking Styles:'' When people become depressed their thinking often changes -develop unhelpful thinking styles. (Thinking Traps handout).
*''Identify common thinking styles'' in handout 
*''Discuss breaking patterns of unhelpful thinking'' by explaining 'thought challenging'.

*''Challenging Negative Thinking''(handout)- introduce and go through sample questions
* ''Thought Diary'' (handout)- think together about a time recently when the YP felt low and support to put in diary. 
*''Challenge the thought'' may be helpful to rate strength of thought before and after thought challenging.(Try to generate a more balanced thought together)
NOTE: Some questions may work better for certain young people. Ensure you are challenging a thought and not a feeling		
*''Thought challenging is hard '' recognise this- It’s like having to create a new path out of dense jungle (Use [[Jungle Analogy]])

''Extra Technique: //Positive Self Talk//'' (used to enhance thought challenging) identify phrases helpful for them to say to themselves during difficult moments.

----

__NOTE BECAUSE:__  Thought challenging can be very difficult when working with low mood. For some young people thought challenging can be effective, although requires practice. It may be that further techniques below will be of use in strengthening thought challenging skills. In some cases it requires additional techniques such as mindfulness or thought acceptance work. These could be used as optional extras with appropriate supervisory support. 

---
!!!Home practice

*Practice challenging thoughts for homework, and record on the form given (give a few forms).
*Continue completing Activity Diary
*Complete the agreed one or two valued activities
*If possible, share the session work with parents
*Complete thought diary. Begin to practice challenging thoughts using the ‘Thinking Traps’ and the ‘Challenging Negative Thinking’ sheet.
*Handouts: Negative Automatic Thoughts Fact Sheet, Thinking Traps, Challenging Negative Thinking and Positive Self Talk sheet (optional).

!!!End of session review

*Review of session, comments and questions. Key learning points?

-----

!!Handouts 
!!!Core self help materials:

<<link-pdf "Negative Automatic Thoughts factsheet" "https://docs.google.com/document/d/1eYo3wxU0HAfd0lXt75Ba79logY4yhgz-G-jCIwtOxqA/edit?usp=sharing">>  

<<link-pdf "Thinking Traps" "https://docs.google.com/document/d/1uKIB6vs687FCuoYUwK52yQIdqQHm1pky0wTkLl1tFpw/edit?usp=sharing">>

<<link-pdf "Challenge Negative Thinking " "https://docs.google.com/document/d/1svoln2f7jaKhLfYbexOHr7pBZzT6QPr4p8ELbW91JBw/edit?usp=sharing">>

<<link-pdf "Thought Diary" "https://docs.google.com/document/d/1R2QZM747m9-WIoWYR5x1ld5etxd-R2LlVSJdNBHtliE/edit?usp=sharing">>

<<link-pdf "Think Positive" "https://docs.google.com/document/d/1Z2CjcHutfYM6snQQksRzVdDj6WyCmPqywdJj1ZW_5d0/edit?usp=sharing">>
 
!!!!Source: Caroline Bengo, Matt Woolgar, Sara Dawson and Jelena Crnokrak 

This page provides a brief session plan to be used as a reminder for practitioners. 

---

!!''Overview:''

''Consequences'': This session is face to face (approx. 50-60 mins) ''OR ''telephone if ''NOT'' doing time out (approx. 20-40 mins).  The full session plan can be found here:

<<link-doc "Session 5: Consequences" "https://drive.google.com/file/d/1DrhHnuvxOcznoHjV0v1lnTSx3D251Tk-/view?usp=sharing">>

The full manual can be found here:

<<link-doc "Guided self-help for behaviour problems" "https://drive.google.com/file/d/1vBNYY-hZtqIKHZucyZmbxZmfjTvYYoRZ/view?usp=sharing">>

!!!''Outcome measures''
These will be completed on [[POD|https://pod-database.org/db3/login/]]

* At beginning of session:
**[[SDQ]] (IMPACT only)
**[[GBO|Goal-Based Outcomes (GBO)]] (+HIT)
*End of session:
**SFQ/SRS

----
!!''Session plan''

!!!''Key tasks''

* Help parents understand the importance of boundaries
*Support parents to use consequences in a framework of positive discipline
*Support parents to use natural and logical consequences for unacceptable behaviour

!!!''Check In''

*How are you?
* Agenda setting 
* Explain how long you will meet for

!!!Review 
*Home Practice: Ask how using clear, calm instructions went. How did their child respond? Able to remember to praise? Able to use ‘do’ instructions? Problem solve any difficulties
*Are they still using special time?
*Goals

!!!''Main content of the session''

*''Routines and boundaries:'' creates sense of safety/security and helps children to know to expect/is expected of them. Often children calmer, more relaxed and easier to manage. 
*''Children are not innately obedient''- often test out rules /limits (healthy), but need to learn how to accept limits and boundaries. (session 6 will cover family rules/boundaries).
*''Current consequences'' that parents do? Check if appropriate (non-harmful, non-punitive). Do not promote smacking as models violence is acceptable/ possibly scares them and reinforces parent trap.
*''Natural and Logical Consequences'' often intervene to protect children from consequences of actions, but also need to support independence. Explain difference between natural and logical consequences.- use [[Logical Consequences Guidelines]]
*''Setting limits'' important parents model clear calm disciplinary strategies-Thinking about natural and logical consequences beforehand can help with- as reduces likeliness of acting out of anger which can lead to arguments, no actual limit setting, setting unrealistic consequences).
''Note:'' Habits can develop of only using consequences (not as effective as positive reinforcement) -practitioners to assist parents with introducing rewards for positive behaviours. If relevant use attention table. If relevant discuss using reward charts to establish new routines for example morning and bedtime.

*''Practice:'' discuss particular behaviours (following the guidelines) to use consequences for and practice with you as child and them as parent. Remind: consequences to be non-punitive delivered in a straightforward/ calm manner. These strategies only work alongside use of positive attention (special time) and specific praise. 

''Note:'' If a telephone session problem solve potential difficulties.

!!!Home Practice:
•	Parents to practice using identified consequences for behaviour
•	Keep a record of how this goes
•	Continue special time and specific praise 

---

!!Handouts

•	Logical consequences guidelines 

<<link-doc "Session 5 Handouts" "https://drive.google.com/file/d/1IyIjH52gFjcEbgWilUKT1mvYeozAo6YE/view?usp=sharing">>

!!!!Source: Caroline Bengo, Matt Woolgar, Sara Dawson and Jelena Crnokrak 

This page provides a brief session plan to be used as a reminder for practitioners. 

---

!!''Overview:''

''Time Out and Family Rules'': This session is face to face (approx. 50-60 mins) ''OR ''telephone if ''NOT'' doing time out (approx. 20-40 mins).  The full session plan can be found here:

<<link-doc "Session 6: Time Out and Family Rules" "https://drive.google.com/file/d/16WZvoTA5du1KH8QOlWit8jdDy1gZSR1R/view?usp=sharing">>

The full manual can be found here:

<<link-doc "Guided self-help for behaviour problems" "https://drive.google.com/file/d/1vBNYY-hZtqIKHZucyZmbxZmfjTvYYoRZ/view?usp=sharing">>

!!!''Outcome measures''
These will be completed on [[POD|https://pod-database.org/db3/login/]]

* At beginning of session:
**[[SDQ]] (Full- if not doing a session 7)
**[[GBO|Goal-Based Outcomes (GBO)]] (+HIT)
*End of session:
**SFQ/SRS

----
!!''Session plan''

!!!''Key tasks''
*Help parents understand the importance of boundaries
*Introduce parents to using family rules as a way of creating clear expectations and limit
*Support parents to use time out (if appropriate) 

!!!''Check In''

*How are you?
* Agenda setting 
* Explain how long you will meet for 

!!!Review
*Review of Home Practice: Ask how they found using consequences?
*Problem solve any difficulties
*Check that they are still using positive strategies to promote pro-social behaviour
*Review Goals


!!!''Main content of the session''
*''Family Rules:''families rules may be implicit but helpful to have four or five explicitly stated family rules- family meeting can be helpful so that rules can be worked out together. Rules need to be
**Simple
**Fair (apply to everyone in the family)
**Easy to follow
**Positively Stated
**Enforceable

*''What is Time Out?''– extreme form of removal of attention. Can be used as a consequence for and to help reduce dangerous/destructive behaviours. Some may be familiar with/ have tried; if so discuss how/ if it works for them. If confident this is used in an appropriate way acknowledge – make suggestions if appropriate (e.g. changing phrase ‘naughty step’). If do no use/ didn’t work for them introduce the concept in more detail.
*''Effective time out'' when used infrequently but consistently. When specified period has finished return to providing positive attention. Strategy often means parents feel in control and calm (reducing likelihood of harsh discipline). Time out can also help emotion regulation.
*''introducing time out strategy'' (for families not already using it) 
*''Before Time Out:'' parents to discuss and/or role play with child (or toy e.g. ‘show me teddy being calm’) when things are calm before using so parent and child are clear- ask the child to repeat back (check understanding). Time out to be in a neutral/boring/safe place - parent extremely nearby so see when child calms down/ ensure safety.
*''During Time Out:'' 
**Parent gives child clear warning (opportunity to make a choice) [extreme violence= go straight to time-out]
**If continues, give clear instruction to go to time-out space
**Parent remains close, but does not give attention to child 
**Parent does not end time-out until child is calm [time depends on child -keep it brief, 30 secs to 2 mins]
**Return child to time-out space if they leave 
**Needs to be delivered calmly
*Trouble Shooting: 
**Refusing to go to calm time
***Small kids: pick them up
***Older children (or situation feels unsafe), give option of bigger consequence – then withdraw attention until misbehaviour ceases
**Leaving calm time early
***Calmly return them (if safe)
***Give option of bigger consequence
*Time Out for persistent non-compliance: show/discuss diagram in manual
*After Time Out: Do not revisit reason/no forced apology (risk of re-triggering/ not learning to be sorry and express genuinely) and Involve child in positive activity -praise behaviour ASAP. But- If time-out was for non-compliance, child still needs to comply [or time-out can be used to avoid tasks]
**Repair the relationship –behaviour was not ok, but they are still loved
**Prevent further misbehaviour – avoid re-triggering
**Give them a clean slate –the day is not ruined 
**Model good emotional regulation (and forgiveness)
Note: parents may use- minute per year of age for children in time out. If already using and works this is ok. If time out is new this is too long (will not work)-30 seconds to 1 minute advised. Child can leave time out as soon as they are calm, (long time may re-escalate).

Note: saying ‘sorry’ no forced apology (risk of re-triggering/ not learning to be sorry and express genuinely


!!!Home-practice

*Ask parents to use time out if appropriate
*Ask them to keep a record of how this goes
*Ask parents to set up some family rules with their household
*Problem solve any potential difficulties


----
!!Handouts: 
*Time out

<<link-doc "Session 6 Handouts" "https://drive.google.com/file/d/1koHUDzpr04-6tda4LP5d7PfTXBJ085we/view?usp=sharing">>


!!''Overview: ''
This session is face to face (up to 1 hour).  The full session plan can be seen in the [[paper manual|http://centaur.reading.ac.uk/65537/]]
!!!''Outcome measures:''
These will be completed on [[POD|https://pod-database.org/db3/login/]]
*At beginning of session:
**Parent SDQ IMPACT Sub-scale
**Goal Rating Scale
* At end of session:
**SFQ
----
!!''Session plan:''
Reading covered in this session: Step 5 (Problem Solving) & Chapter 13 (Keeping it Going)   
!!!''Key tasks:''
*Problem Solving
*Keeping things going
!!!''Check In''
*How are you
*Agree the agenda: content of this session and give opportunity for parent to add to agenda
*Complete measures and review goals: Reflect on any changes
Review homework: Does parent have questions/comments about homework? 
!!!''Main content of the session''
''Problem Solving''
*If you have already used problem-solving to overcome any difficulties during the programme, refer back to this as an example
*Encouraging child to problem solve independently: Ask child to think of as many solutions as they can and then give one a go
*Discuss problems parent has faced 
*Practice problem solving with a problem experienced by the parent e.g. ‘I find it hard to keep pushing my child’
''Keeping things going''
*Help parent to reflect on what they have done to help reduce child’s anxiety and importance of practicing learnt skills
*Encourage parents to continue implementing strategies that have been helpful
*Increase parents’ confidence by recognizing their achievements
!!!''Parent 'homework' tasks''
*Continue with all other homework
*Use problem solving approach with child and record on handout
!!''Review of the session''
*Discuss ‘take home’ messages from sessions and make sure parent knows next week is final session.
----
!!''Handouts''
!!!''Core self help materials:''
<<link-doc "Problem Solving" "https://drive.google.com/open?id=0B-tACu2wi4-4Qmw5dWNmZm9pWXM">>
 <<link-doc "Things I Have Done That Have Been Helpful for my child" "https://drive.google.com/open?id=0B-tACu2wi4-4OFI1cWtvRi1zbHc">>
 <<link-doc "Things for Me and My Child to Continue to Work on" "https://drive.google.com/open?id=0B-tACu2wi4-4ZVN5LVBpUFMwQUE">>
!!!!Source: Caroline Bengo, Matt Woolgar, Sara Dawson and Jelena Crnokrak 

This page provides a brief session plan to be used as a reminder for practitioners. 

---

!!''Overview:''

''Ending and Trouble Shooting'': This session is over the telephone if doing time out (approx. 20-40 mins). This is a follow up session if time out has been introduced to ensure that it is being implemented correctly and to problem solve any difficulties.  The full session plan can be found here:

<<link-doc "Session 7: Ending and Trouble Shooting" "https://drive.google.com/file/d/13wp-BMIIoor9yAHxVJm5CWhWsrlkvq-U/view?usp=sharing">>

The full manual can be found here:

<<link-doc "Guided self-help for behaviour problems" "https://drive.google.com/file/d/1vBNYY-hZtqIKHZucyZmbxZmfjTvYYoRZ/view?usp=sharing">>

!!!''Outcome measures''
These will be completed on [[POD|https://pod-database.org/db3/login/]]

* At beginning of session:
**[[SDQ]] (Full)
**[[GBO|Goal-Based Outcomes (GBO)]] (+HIT)
*End of session:
**SFQ/SRS

----
!!''Session plan''

!!!''Key tasks''

*To think about how to end the intervention
*Strategies for common difficulties
 

!!!''Check In''

*How are you?
* Agenda setting 
* Explain how long you will meet for

!!!Review
*Review of Home Practice: Timeout?
*Problem solve any difficulties 
*Consider Other Common Difficulties
*Check that they are still using positive strategies to promote pro-social behaviour
*Review Goals

!!!''Main content of the session''

*''Maintaining progress of goals:'' congratulate parents on the progress, generate plan, who will support them, consider future difficulties and framework of how to deal with these
*''Bedtime and Morning Routine:'' think about current steps and timings, develop plan- using clear expectations and frequent positive reinforcement
*''Pre-Planning for Tricky Times:'' consider what to do before during and after the situation (see full manual)
*''Supporting emotion regulation skills:'' in children (regulate appropriately not suppress emotions). Children learn this through observation – encourage parents to discuss feelings/ scaffold emotional expression and provide stability, consistency, positive reinforcement and boundaries. Remind parents that feelings are always valid although behaviour may not be
*''Naming feelings:'' helps children understand what is happening for them. Parents can model the sharing of both positive and difficult feelings
*''Emotion regulation techniques:'' discuss current ways to calm and suggest other ways-
**Breathing strategies
**Grounding/five senses (5, 4, 3, 2, 1)
**Calming self-talk
**Calm spaces
**Glitter bottle/other calming toy
**The turtle…
*''Parental self-care:'' the parent is the agent of change and they need to be healthy and well to support child. vital and not selfish to spend time looking self- discuss how they can do this.
*''Divided Parents:'' Common for parents to have different expectations of behaviour and how to respond – but consistency is important, think ‘united front’, Support one another, Avoid having one ‘soft’ one ‘tough’ parent and communicate feedback be constructive/non-blaming
*''Sibling Rivalry:'' Think positive reinforcement first (Reward: cooperative play/sharing, non-fighting, Spend time with children individually and as a pair). Dealing with conflict (do not listen to tell-telling, apply blame/consequences equally, removing object of argument, separate by specifying activities and locations)

!!!''Home-practice''

Where necessary sign post parents to appropriate services in the area such as community groups or if necessary to their local CAMHS.

---

!!''Handouts''

<<link-doc "Session 7 Handouts" "https://drive.google.com/file/d/1x42jn5R796yh6HVrd6sC6zKNDXbMg0Kj/view?usp=sharing">>
!!''Overview:''
This session is face to face (approx. 45 mins) or can also be completed as a briefer session over the phone (20-30mins). The focus of this session is to review progress with the YP, looking back over any changes in ROMS and their goals for sessions. It’s also an opportunity to check in with parents/carers about progress (if you have consent).
For the full session 7 plan see below:

 <<link-doc "Session 7 Plan: Adolescent Anxiety" "https://drive.google.com/file/d/1ZX6ehMkMMUXfpaZ9J9QciP2fDNNciqx6/view?usp=sharing">>
!!!''Outcome measures:''
These will generally be completed on [[POD|https://pod-database.org/staff/select-project.php]]
*At beginning of session:
**Sub-scale on the [[RCADS]] 
**Goal rating scale 
----
!!''Session plan''
!!!''Key tasks''
*Review progress with YP. Relate this to ROM and Goal ratings, as well as discussion around the impact of problematic anxiety on their life and any changes in this. 
*Agree what further steps need to be taken to support YP to overcome anxiety.
*Explore if any other areas of difficulty YP would like to discuss.
*Introduce problem solving strategy and work through a problem YP would like support in overcoming. 
!!!''Check In''
*Briefly check how YP has been and agree agenda/plan for session
*Review any questions they had about the last session or home task materials
*Review home tasks and what YP has learnt from completion. 
*Problem-solve any barriers to completing home tasks
*Complete outcome measure
!!!''Main content of the session''
*''Review progress'' -Has there been any change in ROM/Goal ratings? If not discuss why and possible solutions. 
*''Discuss ways to build on progress''- Plan any future exposure tasks or consider if there is another feared situation/activity YP would like to break down in step-by-step plan. 
*''Discuss any other areas of concern or difficulty'' YP may also want support with. Any other issues that have not been addressed by sessions so far. If beyond the remit of the GSH consider sign posting to additional resources or whether further/ alternative intervention is required. If there is a particular issue/concern where problem solving could be utilised then you can consider using this when discussing the problem solving strategy.
*''Work through the problem solving strategy''. (Utilise an example from the YP’s life if possible). Work through the following steps:
**''Step 1.'' Agree on a problem to resolve with the YP be as clear and specific as possible.
**''Step 2.'' Discuss all possible solutions no matter how far-fetched or unrealistic and write down pros/cons for each idea. Once discussed look through the list and agree on a solution to put into practice 
**''Step 3.'' Break the chosen solution down into steps (if necessary) to ensure it is clear and achievable. 
**''Step 4.''Plan with the YP to put the solution into practice. 
''Note:'' you can review the outcome when completed, either at home or with you in the next session. Adjustments to the plan to be made accordingly. 
!!!''Things for YP to practice''
*The YP should continue with exposure exercises if appropriate. They may also want to put solutions to any problems discussed into action. 
!!!''End of session review''
*Review the main content of the session and check YP’s understanding or any questions. 
* Summarise the conclusions of the progress review and any plans for further support/interventions/sign posting on page 70. 
*Ensure YP is clear about any home tasks/practice that need to be completed before the next session.
*Plan if anything needs to be shared with anyone on the back up team (e.g. parents/teachers who may need to support YP with home tasks or have been identified as doing things that are inadvertently maintaining the YP’s anxiety which needs to be discussed).
*Utilise SRS or similar to get feedback on the session
-----

!!''Handouts''
!!!''Core self help materials:''
The main resources are session 7 of the Getting to Grips with Anxiety manual:
<<link-doc "Getting to grips with anxiety" "https://drive.google.com/file/d/1MhSkweHKlMx3gAHe8SyVqss4nSjzJhFd/view?usp=sharing">>
!!!''Additional handouts:''
<<link-doc "Judge thought challenging" "https://drive.google.com/open?id=0B-tACu2wi4-4MXFfN0Q1U3FwOVk">>
<<link-doc "Problem Solving" "https://drive.google.com/open?id=0B-tACu2wi4-4LTNhcVlvSkdFek0">>
!!!''Other resources:''
You may want to utilise other self help materials in your work with YP. For self-help materials such as videos, websites, apps and booklets please go to: [[Self Help Materials for Adolescent Anxiety]]. Additionally please go to the [['get self help'|https://www.getselfhelp.co.uk/]] website for useful handouts and session materials.

!!''Overview: ''
Session 8 is a telephone session (approx. 20 minutes).
The full session plan can be seen in the [[paper manual|http://centaur.reading.ac.uk/65537/]]
!!!''Outcome measures:''
These will be completed on [[POD|https://pod-database.org/db3/login/]]
*At beginning of session:
**Parent SDQ Full 
**Goal rating scale
*At end of session:
**ESQ
----
!!''Session plan:''
!!!''Key tasks: ''
*Review progress 
*Discuss plan moving forward
*Congratulate parent 
!!!''Check In''
*How are you?
*Agree the agenda: Purpose of this session is to review for 20 minutes and discharge.
*Complete measures and review goals
*Reflect on any changes/ progress
!!!''Main content of the session''
*Discuss any questions or concerns
*Congratulate parent / discharge 
!!!'' Parent 'Homework' tasks''
*Discuss progress made towards goals
*Discuss how to keep momentum going forward

----
!!''Handouts ''
!!!''Core self help materials:''
<<link-doc "Problem Solving" "https://drive.google.com/open?id=0B-tACu2wi4-4Qmw5dWNmZm9pWXM">>
!!!''Additional materials''
*You might want to think about sign posting parent and child to clubs, groups, other services etc 
!!Overview:
This session is face to face (up to 1 hour).  The full session plan can be seen in the paper manual:

 <<link-pdf "Guided Self-Help for Low Mood: Full Manual" "https://drive.google.com/file/d/12bn3n53aWhm5_21Za460fp_qOtPsWY_N/view?usp=sharing">>  

!!!Outcome measures:
These will be completed on [[POD|https://pod-database.org/db3/login/]]

*At beginning of session:
**Primary Outcome Measure = Full RCADS 
**Goal rating scale 
*At end of session:
**CHI-ESQ (experience of service questionnaire)
----
!!Session plan:

!!!Key tasks:

*Full RCADS & Goals
*Review of work completed and achievements
*Keeping things going
*Feedback to parents (if agreed with YP)

!!!Check in

*How are you?
*Agree the agenda: outline content of session, provide opportunity for them to add to agenda (This can be discussed in space at the end of the session, or integrated during a relevant part of the session)
*Discuss practicalities: Session dates/time

!!!Main content of the session 

*''Complete full RCADS and goal rating scale''- Discuss with young person. If RCADS/goals scores have improved or gone down, explore this. How do they account for any changes?  What have they been doing that has worked well/less well?

*''Review of Intervention:'' What was helpful? Not helpful? Key learning points. Focus on aspects of the intervention, e.g. BA component alongside Thought Work, Problem Solving etc. 
*''Relapse Prevention: ''(handout) Go through with the young person- how this might fit into their life? who is their support? which strategies are important to take forward? 
*''Relapse Prevention key points:''

**Practice, practice, practice!
**Knowing Your Red Flags! 
**Make a plan of action 
**Being Kind to Yourself.   
**Rewarding Yourself.  

*''Discuss/complete the ‘Staying Well Plan’'' section. Think together, about future and feeling low- who can support them (back up team) /what might they do/ strategies?  

*What might get in the way of continuing?  Problem solve any potential future areas of difficulty.  
!!!End of session review
*Review of all sessions, comments and questions. 
*Key learning points?
*Book in one month review (either face to face or on phone) (Advised)

-----

!! Handouts
!!!Core self help materials: 

<<link-pdf "Relapse Prevention" "https://docs.google.com/document/d/1YyWU6cCJRu1iJi5NyuFepkfEFZj-PfkuulVx6OGKjt0/edit?usp=sharing">>

<<link-pdf "Staying Well Plan" "https://docs.google.com/document/d/1skOzUa9z8f5W24-SeJ1SdN6qoobnKCgPMQm4Lm3fw2k/edit?usp=sharing">>

!!''Overview: ''
This session is face to face (approx. 45 mins). The focus of this session is to review sessions and create a staying well plan with the YP. Consideration should be given to any further input/resources the YP may need. It’s also important to consider with the YP how any outcomes from the sessions are fed back to parents/carers/network.
For the full session 8 plan see below:

 <<link-doc "Session 8 Plan: Adolescent Anxiety" "https://drive.google.com/file/d/1wtO3skPSBqNkvsyf-O7zVvbjhFIOIWJA/view?usp=sharing">>
!!!''Outcome measures:''
These will generally be completed on [[POD|https://pod-database.org/staff/select-project.php]]
*At beginning of session:
**Full [[RCADS]]
**Goal rating scale 
----
!!''Session plan''
!!!''Key tasks''
*Review the sessions with the YP utilising the staying well plan to facilitate discussion.
*Support the YP to set ongoing goals. 
*Discuss ending of sessions, consider mixed emotions YP may be experiencing and validate any concerns. 
*Complete full ROM (e.g. full RCADS if utilised as main measure).
*Agree a future plan
!!!''Check In''
*How are you?
*Complete outcome measure
*Agree the agenda: content of session and give opportunity for YP to add to agenda
*Review any questions they had about the last session or home task materials
*Review home tasks and what YP has learnt from completion.
*Problem-solve any barriers to completing home tasks
!!!''Main content of the session''
*''Review learning and progress'' in sessions utilising the staying well plan (p.73/74). Discuss:
**''Hopes for the sessions''. What had they set out to achieve? What did they wish to overcome?
**''Understanding developed'' about what was keeping their problematic anxiety going
**''Have things changed''. How do they know? Changes in: goal ratings/ROMS/thinking/behaviour. What is the impact on YP’s life.
**''What they think helped'' overcome difficulties. Key learning? What strategies do they want to keep going?
**''How to recognise if anxiety starts to become problematic again''. Normal fluctuations in stress/anxiety levels vs problematic anxiety.
**''What to do if anxiety becomes problematic again''. What could they try? Backup team? When to seek professional support?
**''Goals'' the YP would like to continue to work on- short-term and long-term goals. 
*''Discuss sharing the staying well plan with parents/carers'' (If appropriate /possible) or discuss how YP could do this.
''Note:'' If there are plans for a follow up session/phone call make plans for this and ensure YP is clear. 
----
!!''Handouts''
!!!''Core self help materials:''
The main resources are session 8 of the Getting to Grips with Anxiety manual:
<<link-doc "Getting to grips with anxiety" "https://drive.google.com/file/d/1MhSkweHKlMx3gAHe8SyVqss4nSjzJhFd/view?usp=sharing">>
!!!''Additional handouts:''
<<link-doc "Maintaining progress" "https://drive.google.com/open?id=0B-tACu2wi4-4QmY0ajdVdjE4bGM">>
<<link-doc "Ending therapy" "https://drive.google.com/open?id=0B-tACu2wi4-4QXduVEM5Uk9Yck0">>
!!!''Other resources:''
You may want to utilise other self help materials in your work with YP. For self-help materials such as videos, websites, apps and booklets please go to: [[Self Help Materials for Adolescent Anxiety]]. Additionally please go to the [['get self help'|https://www.getselfhelp.co.uk/]] website for useful handouts and session materials.
The Session Feedback Questionnaire (SFQ) is a simple, four-item scale designed to elements
of a therapeutic relationship: 

* feeling listened to
* discussion
* understanding
* future plans. 

It is
a measure of engagement and provides feedback to the CWP about how the sessions have
been experienced by the young person or the parent. Items are rated on a 5-point scale from
1 (Not at all) to 5 (Totally).

The SFQ is administered, scored and discussed at the end of each session to get real time
alliance feedback so they any problems can be addressed and identified. 

Completed at the'' end of each session''.  It is a measure of engagement and provides feedback to the CWP about how the session has been experienced by the young person or parent. 

 <<link-pdf "SFQ" " https://drive.google.com/open?id=0B1hDLHd8syMsSGVsRWpoVi0wVmc">>


*Provides opportunity to feedback 
*Shows you are devoted to this and listening to what the young person thinks 
*Items- listened to, talk about what you wanted, understand, listened to (latter might be rated low in assessment).

Alternatively used the 
[[Session Rating Scale]] for 13 years to adult. 
The Session Feedback Questionnaire is the most widely used session feedback measure in the programme and should be used as the default measure for obtaining systematic feedback from the child, young person or parent at the end of a session with them. 

Details about the SFQ can be found on the [[CORC website|https://www.corc.uk.net/outcome-experience-measures/]]

The measure is loaded on [[POD]] and is easiest completed using this system. 

A copy of the questionnaire can be downloaded from googledocs here

<<link-pdf "Link to paper version of SFQ" "https://drive.google.com/drive/u/1/folders/1Hub2gtgS4x2rPeMomKGl8nKxEq-SYGSC">>


---

The full manual can be accessed through the link below:  


<<link-doc "Guided self-help for behaviour problems" "https://drive.google.com/file/d/1vBNYY-hZtqIKHZucyZmbxZmfjTvYYoRZ/view?usp=sharing">>


ALL behaviour problems handouts: 

<<link-doc "Behaviour Manual ALL handouts" "https://drive.google.com/file/d/1DdoY9H4Hpvp6nlKIPRSBckbTYpMx5Ld7/view?usp=sharing">>

For the session plans please go to: [[Session Plans for Behaviour Problems]]

---

!!''Overview''

The brief guided self-help parenting intervention is divided into two broad areas that are covered over seven (or more) sessions. These have been divided into parenting approaches that:

#To promote positive relationships, attachment and pro-social behaviour through sensitive responding
#To provide appropriate routines, boundaries and limit setting


!!!''Session One:'' Goals and Attending 
Enhancing the relationship with children through play

!!!''Session Two:'' Praise and Rewards
Promoting positive behaviours and routines with praise and rewards

!!!''Session Three:'' Selective Ignoring
Reducing undesirable behaviour through selective ignoring

!!!''Session Four:'' Effective Instructions
Increasing compliance with clear calm commands

!!!''Session Five:'' Consequences
Promoting boundaries with consequences

!!!''Session Six:'' Time Out and Family Rules
Creating clear expectations with family rules and time out for extreme misbehaviour

!!!Session seven: Ending and Trouble Shooting 
Ending and Trouble Shooting 
To access the previous version of the [[Treatment manual|http://centaur.reading.ac.uk ]] for parent led approach to child anxiety by Cathy Creswell for the full interventions manual. 

---
!!''Overview''

*8 sessions with parent (s)
**4 face to face (60 mins)
**4 telephone review (15-20mins)
!!!''Assessment session''
An initial assessment session referred to in this guide as ''Session 0'' will take place before the intervention starts. In this session parents may be encouraged to read the [[Child Anxiety: Book]]. This pre-intervention session (like a choice appointment) it is not counted as one of the intervention sessions. For more information please go to [[Session 0 for Younger Children: General Assessment]]

!!!''Session 1'': Getting started 
(Face to Face: approx. 1 hour) 

*Introduce routine outcome measures 
*Understanding of current difficulty
*Provide information about the causes and maintaining factors of anxiety 
*Introduce the guided self help approach 
*Practitioner encouraged to develop a formulation at the end of first session using a handout 

!!!''Session 2'': Cognitive strategies
(Face to Face: approx. 1 hour) 

*Helping children explore their anxious thoughts 
*Encouraging testing out fears
*Train the parents in thought challenging as a form of behavioural experiment
*Bring problems back to practitioners: problem solve together 
*Role play with the parent in the session "lets give this a try as if we were out there is the real world" 

!!!''Session 3'': Exposure Hierarchy 
(Face to Face: approx. 1 hour) 

*Building up 'brave behaviour' 
*Devising a step plan to face a fear 
*Encourage parents to read 'Step by step approach to facing your fears' 
*Avoid terminology such as exposure, use 'brave' instead
*The homework task is taking the exposure hierarchy and picking up the next step with the child: to be brought back to practitioner in next session to see if it is correct  

!!!''Session 4-6:'' Trouble shoot 
(Telephone session: approx. 20 minutes) 

*Advised to be telephone review (session 4) but can be face to face (service dependent)
*Can be thinking of an appropriate reward for the exposure tasks 
*Work through the exposure hierarchy using record keeping handouts 

!!!''Session 7: '' Problem solving
(Face to Face: approx. 1 hour) 

* What has helped your child? 
* Problems parents may face
* Keeping it going

!!!''Session 8:'' Review 
(Telephone session: approx. 20 minutes) 

* Review homework tasks 
* Review goals 
* Discuss plan moving forward
* Congratulate parent
<a class="tc-float-right">[img width= 100 [brain.jpg]]</a>

----
For a list of session plans based on  'Getting to Grips with Anxiety' by Helen Barker and colleagues go  to:
[[Session Plans|Session Plans for Overcoming Adolescent Anxiety]]

Please use the link below for the full manual: 

<<link-doc "Getting to grips with anxiety" "https://drive.google.com/file/d/1MhSkweHKlMx3gAHe8SyVqss4nSjzJhFd/view?usp=sharing">>

---

!!''Overview''

**8 sessions with adolescents, with parent involvement where appropriate and with consent. Recommended at assessment (session 0) and final session at least. 
**4 face to face sessions (30-45 mins)
**4 telephone contacts (15-30 mins)
*There is still the option of doing a follow-up after this at around a month’s time, which we think will be important. 

!!!''Assessment session''
*An initial assessment session referred to in this guide as [[Session 0|Session 0 for Adolescents: General Assessment]] will take place before the intervention starts. 
*After the assessment, the YP is given the relevant material to read / look at in advance of session 1.  

!!!''Session 1:'' Understanding Anxiety and how it affects me

!!!''Session 2:'' Trying out new things

!!!''Session 3:'' Facing your Fears

!!!''Session 4-6:'' Facing Fears Review. (Briefer sessions (20-30m) can be completed over the phone)

!!!''Session 7:'' Progress review (this can also be completed as a briefer session over the phone)

!!!''Session 8:'' Staying well 


[[Session 0 for Younger Children: General Assessment]]

[[Session 1: Guided Self Help for Behaviour Problems]]

[[Session 2: Guided Self Help for Behaviour Problems]]

[[Session 3: Guided Self Help for Behaviour Problems]]

[[Session 4: Guided Self Help for Behaviour Problems]]

[[Session 5: Guided Self Help for Behaviour Problems]]

[[Session 6: Guided Self Help for Behaviour Problems]]

[[Session 7: Guided Self Help for Behaviour Problems]]

[[Session 0 for Adolescents: General Assessment]]

[[Session 1: Overcoming Adolescent Anxiety]]

[[Session 2: Overcoming Adolescent Anxiety]]

[[Session 3: Overcoming Adolescent Anxiety]]

[[Session 4-6: Overcoming Adolescent Anxiety]]

[[Session 7: Overcoming Adolescent Anxiety]]

[[Session 8: Overcoming Adolescent Anxiety]]
[[Session 0 for Adolescents: General Assessment]]

[[Session 1: Overcoming Low Mood]]

[[Session 2: Overcoming Low Mood]]

[[Session 3: Overcoming Low Mood]]

[[Session 4: Overcoming Low Mood]]

[[Sessions 5-7: Overcoming Low Mood]]

[[Session 8:  Overcoming Low Mood]]
The Session Rating Scale (SRS) is a simple, four-item visual analogue scale designed to assess key dimensions of effective therapeutic relationships. The SRS is administered, scored and discussed at the end of each session to get real time alliance feedback from young people and carers so that alliance problems can be identified and addressed (Miller, Duncan, & Johnson, 2002).

The SRS translates what is known about the alliance into four visual analogue scales each 10cm long to assess the clients’ perceptions of:

* Respect and understanding
* Relevance of the goals and topics
* Client-practitioner fit
* Overall alliance
The following session plans have been developed by the team in Tower Hamlets and are generously shared by them for use by others under a Creative Commons licence. This means that the materials cannot be used for commercial gain, the source of the material should always be acknowledged and the materials should not be changed fundamentally when used with clients. Failure to comply with these standards would result in the material being used without permission. 

[[Tower Hamlets Low Mood: Session 0]]

[[Tower Hamlets Low Mood: Session 1]]

[[Tower Hamlets Low Mood: Session 2]]

[[Tower Hamlets Low Mood: Session 3]]

[[Tower Hamlets Low Mood: Session 4]]

[[Tower Hamlets Low Mood: Session 5-7]]

[[Tower Hamlets Low Mood: Session 8]]
''Sessions 5 to 7 will follow the session plan below, with BA progress being reviewed in each session. Alongside this, a number of further strategies can be added depending on the nature of the client presentation. See the options below.''

!!Overview:
This session is face to face (up to 1 hour).  The full session plan can be seen in the paper manual:

 <<link-pdf "Guided Self-Help for Low Mood: Full Manual" "https://drive.google.com/file/d/12bn3n53aWhm5_21Za460fp_qOtPsWY_N/view?usp=sharing">>  

!!!Outcome measures:
These will be completed on [[POD|https://pod-database.org/db3/login/]]

*At beginning of session:
**Primary Outcome Measure = RCADS (Subscale)
**Goal rating scale 
*At end of session:
**Session Feedback Questionnaire (SFQ) 
----
!!Session plan

!!!Key tasks for each session:

*RCADs symptom tracker & rate goals

*Review BA work – continuous/ active part of the work alongside other intervention components.
*Reviewing reading, homework, skills practiced during week.
*Introduce new skills/strategies as appropriate.
*Session review (comments and questions, key learning points).

!!!Check in
* How are you?
* Agree the agenda: outline content of session, provide opportunity for them to add to agenda (This can be discussed in space at the end of the session, or integrated during a relevant part of the session)
* Discuss practicalities: Session dates/time

!!!Main content of the session

*''Review Behavioural Activation Progress and Activity Diary:'' Similar to last session, reflect with the young person on their activity diary. 
*''Review Thought Diary: ''How did this homework go? 
*''Thought challenging'': How did it go? Which questions were helpful/ not? Other questions or things they used to challenge their negative thoughts? How much has this impacted on their thinking? 
(Could link to the earlier psychoeducation on the cycle of low mood).

!!!End of session review

*Review of session, comments and questions. Key learning points?

---
''Further work for sessions 5 to 7, select from options below as and when appropriate (to be discussed in supervision).''

''Further Intervention Options:''

*Thought Based Work – continuation: 
**Testing out unhelpful thoughts through Behavioural Experiments
**Thinking like a judge technique
**Prejudice Analogy
**Internal Bully
**Thought Acceptance Work
**Recognising your qualities and achievements
*Coping Cards:
**Tackling avoidance, safety behaviours and developing a step by step plan 
*Problem solving
*Sleep Management 
*Worry management (Worry Time)
*Distraction Techniques
''Other Strategies not detailed here (draw from other manuals)''

*Relaxation Strategies

-----

!!Handouts 
!!!Core self help materials:
<<link-pdf "Negative thought experiment" "https://docs.google.com/document/d/1vPOTb7xeh4k2FTTwjplK71Q9GGnHuZv0VAbT_KAGaec/edit?usp=sharing">>

<<link-pdf "Putting Thoughts on Trial" "https://docs.google.com/document/d/1p-AOMr7B3IHg3UlBIFNHakdMXQKU4pvVSfyo0AHIBDY/edit?usp=sharing">>

<<link-pdf "Internal Bully" "https://docs.google.com/document/d/1clKxDvH1eA1jWD0PsJcEsMhHlkEUsn_AftF5yHtm-LU/edit?usp=sharing">>

<<link-pdf "Thought Acceptance" "https://docs.google.com/document/d/1AMTUadcRo5Hkt1Dk31DPAL3llWwdcZnyVhWP4N_w_Ys/edit?usp=sharing">>

<<link-pdf "Recognising your Qualities and Achievements" "https://docs.google.com/document/d/19-de69p_-IEDp9z-jh97sCnqpeSe-QcCZyEIGzknMRo/edit?usp=sharing">>

<<link-pdf "Problem Solving (CYP)" "https://docs.google.com/document/d/1nskm3W7zSTv0G02SG6sSvUKGiU5a1Q9aZz9zFeNgEh4/edit?usp=sharing">>

<<link-pdf "Sleep Hygiene" "https://docs.google.com/document/d/1uIpcRdEdXF_s7V3t7-4MVP6a0r0OcmuTpIQhcyNnMpI/edit?usp=sharing">>

<<link-pdf "Worry Time" "https://docs.google.com/document/d/1lUqQz069CCbvpqnpnWrwKQH3_wn3XzD3WZZAg84DjgI/edit?usp=sharing">>

<<link-pdf "Is Worry Helping Me?" "https://docs.google.com/document/d/1DHnwmlVvM6ISrUxtDzvvkRYM4qB2erzOZGrV4GiX82s/edit?usp=sharing">>


<<link-pdf "Distraction" "https://docs.google.com/document/d/1Lq3vimhaIvmQdRcXzYe3ks3kb4Nf0wsskw4esQIzYIw/edit?usp=sharing">>
!!!!Source: Duncan Law 
!!''Setting goals''


*Goals are simply a clear, brief, expression of what a child, young person or family wants to be different in their life as a result of engaging in therapy or other psychological or behavioural intervention
*[[SMART Goals]]: – Specific – Measurable – Agreed (collaboratively) – Realistic – Time limited. 
*Goals can help have a shared focus or aim, instill hope and improve the working alliance between CWP and YP/ family and also to track progress towards something
 *Deciding the destination before any interventions will help you and the YP/parent what GSH material is best suited to them / most useful to move towards their goals 

!!!''Two golden rules for setting goals'': 
*It isn't the numbers that are important but the discussion around them 
*The numbers generated are an invitation to a conversation
!!''The Goal Based Outcome Tool (GBO)''
This is one way to track progress using goals 

*This is what it looks like: 
**0 1 2 3 4 5 6 7 8 9 10 
**0 = not made any progress towards the goal 
**10 = goal is fully reached 
**5 = exactly half way

The aim is to not always to reach 10 by the end of the intervention but to begin to progress towards an improvement against a goal.

!!''Monitoring Goals''
GBO monitoring helps in the following ways:

*Visual aid to discussion 
*Helps focus discussion 
*Shared agreement on progress and ways forward 
*Helps monitor progress 
*Can aid supervision – additional information 
*People feel more part of the change process 
*Demonstrate effectiveness (or lack of it)
*Reliable change for goals is an change in score of 2.45 points
!!Practice points
*Consider language used; they don’t have to be called goals e.g. hopes, expectations wishes etc. 
*See [[Converting parental concerns into goals]] for some specific examples.





See [[Reaching their Goals]] for more material on this. 
!!Setting up a practice with parents

''Step 1:'' Be clear on what you are practicing e.g. support parent to practice the skills of describing and attending to children during special time

''Step 2:'' Be clear on roles (parent in the role of parent, CYWP playing the child) and the situation. Ensure it is tailored to the parent e.g. get parent to think of an activity/ special time they would have with their child 

''Step 3:'' Generate the words that the parent can use e.g. ask parent “what can you describe? What can you say to your child when they’re playing with the cars? if playing with toy people and cars “you’ve put the person in the car, he looks happy to be going out for the day”

''Step 4:'' Ensure parent knows they can pause at any time

''Step 5:'' Get into role and get the parent to practice the skill 

''Step 6: ''Discussion about the practice – how did if feel? 
''The learning of setting up a new CWP service''

* Fidelity to the model, how much flexibility do you have in GSH 
* Meaningful goals introducing learning component
* Normalising use of video and how to use video effectively (how to 'sell' it to families) 
*Managing expectation with signed contracts from schools  


''Setting up a new pathway ''

* Protecting CWPs from external pressures from tier 3 or schools 
*Possibility of accepting self-referrals 
*Streamlining referrals pathways to get tier 1.5 


''Supervision issues ''

*No protocols for cohort 1 but useful in cohort 2 i.e. bringing measures, responsibilities 
*Supervising un-trained people 



''Protecting CWPs from the CAMHS waiting list ''

* Co-production 
* Important to have a clear criteria and being robust in screening 
*Being physically separate from CAMHS 
*Making the CWPs unique in the service 
@@color:red;This page is being developed in light of recent changes to working due to the outbreak of COVID-19@@
@@color:red;This page is being developed in light of recent changes to working due to the outbreak of COVID-19@@
!!!!!Source:Kate Martin

!!!''What memories do you have from your own adolescence of decision-making processes?''
*At times we want to feel autonomous and there are also times that we want others to take the responsibility for us
*We seek out the things that we do have control over but are aware that there are also a number of things that we are not in control of
*When we aren't given power over decisions, it can lead to seeking control in unhelpful ways (eating, self harm etc) or disengage from adults
!!!''What are the choices/decisions that young people and parents  might make and what might make them more complicated?''
*CYP would be involved in who they wanted to be a part of their 'back-up' team but that could be potentially difficulty if CWP had concerns about someone they wanted to include
*How much choice can be given to child in low-intensity service given the nature of it (low-intensity support). We therefore have to be aware of the boundaries to our practice
*Give input into how information is given - Being aware of how a young person learns (visually/actively etc) and what works best for them
*Especially in guided self help it's important to show examples of research etc but make sure you are making it clear that these strategies don't work for everyone and you need to work to find what works best for them specifically
*Pressure from network (parents, school etc) and how this impacts upon goals of treatment can be difficult to resist / negotiate
*With these examples, it can be important to do the opposite of 'rolling with resistance' - If the child does not want to work on the goals that other parties want to work towards it needs to be addressed (speak to managers etc)
*Choice of practitioner (gender, ethnicity). Some services may have options (e.g. you can give choice to give male therapist but there will be a longer wait) but some may not (need to be upfront).
*Sometimes people might make assumptions which are important to explore. e.g. requesting an older practitioner. It is therefore important to explore the parent/CYP choice and whether there is underlying anxiety/ whether the reasons make sense etc 
*You can highlight the choices that CYP are making throughout sessions e.g. choosing to come (is it their choice to come or are they just coming to get parents off their back etc), choosing to do the homework (think together about how to make the most of the 4 sessions)
*Sometimes choice can feel overwhelming. In these cases we need to make a conscious choice ourselves to limit the choices we are offering but still start to offer smaller choices to them, so they can start to learn about choice and decision making (e.g. what colour pen do you want to use)
*When working with parents you can model with them how to give choices so that they can go away and do the same with their child
*You can reflect with parents the difference that choice makes (i.e. less resistance etc) 
!!!''Why is it important''
*Often our view of what is in a child's best interest overrides their choice. We need to challenge this view in ourselves and try to encourage joint decision making with children, as you would with adults. 
*If a CYP feels involved in decision making they are more likely to engage better and help them to feel empowered
*Building children's trust that we do care about their choice and decisions can take time
!!!''Open Talk'' 
*Talk with me about the decision and how much say I have
**Make it clear that a decision is being made and let them know how much input they have
**Be explicit about how much influence they have: Is it their choice (and for you to support) / Is a joint decision/ Is it mostly your decision (be clear about how you can make it collaborative)
*Ensure I understand the options that are available to me
**Offer an appropriate amount of choice (and think about level of choice that is appropriate without feeling overwhelming to CYP)
**Do not dismiss options which don't work straight away - help CYP to understand why its not feasible
*Talk with me about the pros and cons of the options available
**You can think about evidence to help them think about this
**Be upfront about your opinion (and that it is just your opinion). You can then help CYP/parent to think about pros and cons and what their opinion is 
**Make the pros and cons more visual so it's easier to understand
*Discuss my views, values and preferences
**What would others in their life think about their choice preference
**Help them think about what they want and weigh up risks and benefits of this 
*Explain your views
**Explain from what you know of CYP, the things you cannot support (unsafe behaviours) and what your opinions would be 
*Discuss if I feel able to do this
**How do you feel about possibility of doing this decision? Is there another option? Or is it that they don't know how to do it (break it down into smaller steps)
*Discuss what we are going to do and how we are going to do it
**Summary of what the plan is and when to check in about how it went
!!!''Interesting points''
*CYP may have had many experiences where they have not felt heard etc so we need to keep this in mind when working with them (how we show them that we are interested in their input)
*Safeguarding concerns can lead to a lowered collaboration with CYP but the practitioner always has a choice in how it is explained and achieved ('What' can be taken out of CYP hands but they can have input into 'How' it happens)
!!!''Decision making when working with parents and CYP'' 
*Need to bear in mind that parent will have different viewpoint to child. They can share this e.g. parent can say the downside of making this decision would be that you don't do well in exams etc. 
*Need to help both CYP and parent understand the realistic impacts and acknowledge feelings e.g. think through the catastrophic worries that parents might have
**It is about normalising  the worries that parents have about their child and then helping them to notice what reactions this might lead to e.g. reassurance, which can backfire (Cathy Creswell model)


Note: A shared decision making cpd training module can be found at the Royal Collage of Psychiatry website.

http://www.psychiatrycpd.co.uk/default.aspx?page=15699

 
!!Linked pages
See [[Engagement and Shared Decision Making]] for more information on this subject.

Pages tagged with [[Engagement]] are linked to this page. 

[[The 'Adolescent Brain']] has useful information on adolescent development which relate to this page 
An online short course about supporting YP with low mood and depression during the pandemic. 

It is free and accessible to anyone with an internet connection. It is aimed at YP, parents, carers, teachers and anyone supporting YP. It is very practical and brief. 

Please share this with other professionals and any YP and families who you think may benefit. 

Please find the link to the summary and enrolment page below:

https://www.futurelearn.com/courses/low-mood-during-covid-19/1
Source: Natasha Byrne and Duncan Law

Yes, the Universities have guidelines around protected study time to ensure that CWPs are able to work on assignments, review guided self help materials and resources and review their videos. 

On the weeks that the students attend a teaching day, CWPs should be given half a day of additional protected study time by their sites.
 
All other weeks, CWPs should be allocated one day of protected study time

Protected study time allows time for a variety of tasks:  

* Assignments 
* Preparing for the Shared Learning Event (there may also be a need for additional planning and prep time with supervisors outside of allocated study time for this task, so some flexibility from supervisors may be needed e.g. - an hour a fortnight to support with this)
* Preparing for CWP case work
* Attending bespoke training delivered by supervisor or organisation
* Additional supervision if appropriate
 
It is for services to decide whether they wish CWPs to undertake this study time onsite or not.
All sites will need to provide the following for their trainees in order for them to fulfil their role and course requirements:

*a place to work including access to rooms for clinical sessions and supervision
*a phone
*video recording equipment (capable of filming at least 1 hour)
*encrypted USBs for assignment submission
*tablet or laptop
*Wi-Fi and access to POD (browser-based outcomes collection system), the Wiki and university emails

Recommendations for equipment can be found in the below document.

<<link-doc "Recording and storing clinical video for use on CYP IAPT programmes" "https://drive.google.com/file/d/1K-v0pbpyrJK_OEPYxSjStaf9N3fEyl1w/view?usp=sharing">>

For any programme enquiries please contact cwp@annafreud.org

For queries related to the course, please contact:

!!!UCL (University College London)	
Telephone: 020 7443 2272 

Email: cwp.admin@annafreud.org

Programme Office: 
1st floor, PGS Staff Workspace, 
Anna Freud Centre, 
4-8 Rodney Street, N1 9JH.
Office hours: 9.30am - 4.30pm

!!!KCL (Kings College London)	
Telephone: 020 7848 5096 

Email: cyp-iapt@kcl.ac.uk 

Programme Office:
P3.07 Henry Wellcome Building 
Institute of Psychiatry, Psychology & Neuroscience 
De Crespigny Park 
Denmark Hill Campus, SE5 8AF 
Office hours: 9.30am - 4.30pm


!!!POD queries
 please contact pod@annafreud.org

!!!Wiki queries
please contact PGSonlineguides@annafreud.org 
!!!Trainee outcomes data

All sites are required to submit their trainees’ outcomes data for the training year. To facilitate this, a site will have free access to POD, a browser-based data collection system. We will provide training for this system to trainees and to supervisors on the course. If your site does not want to use POD, please get in touch so we can provide a template for data submission.

!!!Accessing your sites data and site reports

All supervisors will be given supervisor level permissions on POD. This will allow them to access all of the data that the trainees from that site have submitted. You can export this data at any time via the ‘Project’ tab. For POD guidance, please see the POD information page https://pod-database.org/info/. 
The POD team sends each site an outcomes report at the end of the training year. If you would like to replicate the format of the site report, the POD team have produced a guide: [[CWP Site Reports How To Guide March 2019|Using POD to produce site reports]]
!!!On-site Protected Learning Time

On the weeks that the students attend a teaching day, CWPs should be given half a day of additional Onsite Protected Learning Time by their sites. All other weeks, CWPs should be allocated one day of Onsite Protected Learning Time, which would allow time for a variety of tasks. It is for services to decide whether they wish CWPs to undertake this study time onsite or not.

!!!Assignment footage and data storage

All trainees will need to submit session footage for their assignments. 
From a GDPR perspective, CYP and families are the “data subjects”; sites are the “data controllers”; and the HEIs are “data processors”.  As “data controllers”, sites have responsibility for ensuring that their service users agree to the additional use of their data for student training purposes, and that they are given adequate information about the proposed use of their “data” to enable them to gain this consent.  Template consent forms can be provided by the university and adapted to your sites requirements.

!!!University assignment footage processing procedure
''UCL: '' On receiving the encrypted USBs from students, we transfer the clips to our own encrypted USBs, so that we can share these with first/second markers and the programme external examiner as necessary. The videos are not downloaded by the marker/externa but rather viewed directly from the encrypted USB. Once viewed and marked, the encrypted USBs are returned to the relevant Programme Officer and the data is wiped. 
 Videos form part of a student/trainee’s assessment and so these have to be retained for one year following on from the date of their final Board of Examiner’s meeting, as per UCL’s retention policy for this. For this purpose only, the videos are stored on an encrypted drive held at the AFC during this retention period, after which the relevant data is wiped. 
 This format for sharing video files is currently the most secure mechanism by which we can support assessment delivery for trainees whilst retaining client confidentiality for sites. Sharing files via email or other unencrypted online storage mechanisms such as Dropbox are not recommended. Sharing files via organisational cloud systems is also not viable for a number of quality assurance purposes.

!!!Information sharing with the university
Open communication between the HEI and Partnerships is essential for trainee support and safe practice because learning takes place in both settings. Reasons for communication between the HEI and Partnerships would include:   

*If CWP trainee progress is being hampered by the arrangement in the partnership, the course may contact the Supervisor or Lead in the partnership to ask such difficulties to be addressed.
*If there are concerns about CWP performance on the course, course staff will talk to the CWP and to the supervisor/manager where appropriate.  This will be done in order to both support the CWP and ensure safe and ethical practice for the CYP with whom they are working.  The courses will involve the CWP in this process where possible.        
*Similarly, sites may contact the HEIs to share information if they have concerns about CWP performance in the work setting.
Effective supervision is crucial for the safe and effective practice of trainees, nurturing their skills development during training and post qualification.
Placement Support funding (£12000 per CWP) is intended to fund approx. 1 day per week per CWP for supervision, support and service development with the expectation that this should include at least 1 hour per week individual supervision as well as group supervision (please see operational guidance for more information). Below is guidance from HEE about the use of Placement Support funding:
This is to support services in providing essential and intensive supervision requirements fundamental to the success of this new role. This will include: 

*clinical case management
*professional support 
*the release of staff for specific supervision training and any other relevant training required 
*linking regularly with the HEI 
*ensuring clinical and service leaders are fully engaged throughout the training year 
*providing in service pastoral support 
*stakeholder engagement in partnership with the HEI 
*supporting the training in partnership with the HEI 
*ensuring access to appropriate clinical cases 
*supporting evaluation and assessment of the role 
*providing service assurance of placement suitability 
 
The workforce team will be responsible for closely monitoring the above and reporting back to the HEE CYP team when requested.
New CWP supervisors are expected to attend the CYP IAPT supervision PGCert course. 
Sites can speak to the CWP team at any time if you need any support or guidance. 

KCL sites should contact cyp-iapt@kcl.ac.uk (main contact: Hugh Baulderstone) and UCL sites should contact cwp@annafreud.org (main contact: Natasha Byrne and Neha Loison)

The CWP team (made up of course and project staff from KCL/UCL/AFNCCF) visits all sites involved in the programme at least once during the training year. Site visits are an opportunity to discuss the development of the CWP service so far, troubleshoot any difficulties and celebrate and share good practice. We have found that it works well to have all trainees, their supervisor and the service manager present at the visit. 
<?xml version="1.0" encoding="UTF-8"?>
<svg width="460px" height="93px" viewBox="0 0 460 93" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 48.2 (47327) - http://www.bohemiancoding.com/sketch -->
    <title>cwp-iapt-london-dark</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <rect id="Rectangle-Copy" fill="#6B717D" x="0" y="0" width="460" height="93" rx="8"></rect>
        <path d="M59.134,30.742 C61.0966765,31.6313378 62.714327,32.842659 63.987,34.376 C65.259673,35.909341 66.064665,37.6266572 66.402,39.528 C66.4633336,39.7426677 66.494,39.9879986 66.494,40.264 C66.494,40.4480009 66.4480005,40.5706664 66.356,40.632 C66.2639995,40.6933336 66.1260009,40.7393332 65.942,40.77 L59.732,41.184 C59.4559986,41.184 59.2796671,41.1380005 59.203,41.046 C59.126333,40.9539995 59.0573336,40.7700014 58.996,40.494 C58.658665,38.8073249 57.9840051,37.4733382 56.972,36.492 C55.9599949,35.5106618 54.6106751,35.02 52.924,35.02 C48.0173088,35.02 45.564,38.9452941 45.564,46.796 C45.564,50.8746871 46.1773272,53.849324 47.404,55.72 C48.6306728,57.590676 50.5013208,58.526 53.016,58.526 C54.8560092,58.526 56.412327,58.0660046 57.685,57.146 C58.957673,56.2259954 59.9926627,54.7233438 60.79,52.638 C60.8820005,52.4233323 61.0813318,52.316 61.388,52.316 C61.5720009,52.316 61.7099995,52.3313332 61.802,52.362 L66.31,53.328 C66.7393355,53.4813341 66.9080005,53.8646636 66.816,54.478 C66.5093318,55.7966733 65.7963389,57.222659 64.677,58.756 C63.5576611,60.289341 61.9860101,61.6233277 59.962,62.758 C57.9379899,63.8926723 55.5153474,64.46 52.694,64.46 C49.5353175,64.46 46.7830117,63.7163408 44.437,62.229 C42.0909883,60.7416592 40.2893396,58.6563468 39.032,55.973 C37.7746604,53.2896533 37.146,50.1846843 37.146,46.658 C37.146,43.1619825 37.7746604,40.1106797 39.032,37.504 C40.2893396,34.8973203 42.0909883,32.8963403 44.437,31.501 C46.7830117,30.1056597 49.5353175,29.408 52.694,29.408 C55.0246783,29.408 57.1713235,29.8526622 59.134,30.742 Z M116.772,30.834 C116.772,31.0486677 116.756667,31.2019995 116.726,31.294 L107.342,63.034 C107.219333,63.371335 107.050668,63.6166659 106.836,63.77 C106.621332,63.9233341 106.330002,64 105.962,64 L100.994,64 C100.22733,64 99.7520009,63.6780032 99.568,63.034 L93.772,42.932 C93.7106664,42.6253318 93.6340005,42.472 93.542,42.472 C93.4806664,42.472 93.3733341,42.6559982 93.22,43.024 L87.378,63.034 C87.2859995,63.371335 87.1326677,63.6166659 86.918,63.77 C86.7033323,63.9233341 86.3966687,64 85.998,64 L80.892,64 C80.4933313,64 80.1866677,63.9233341 79.972,63.77 C79.7573323,63.6166659 79.5886673,63.371335 79.466,63.034 L70.082,31.294 C70.0513332,31.2019995 70.036,31.0486677 70.036,30.834 C70.036,30.1899968 70.4193295,29.868 71.186,29.868 L76.936,29.868 C77.3040018,29.868 77.5799991,29.9293327 77.764,30.052 C77.9480009,30.1746673 78.0706664,30.3739986 78.132,30.65 L84.066,51.58 C84.1580005,51.9480018 84.2499995,52.132 84.342,52.132 C84.4340005,52.132 84.5259995,51.9940014 84.618,51.718 L90.552,30.65 C90.6440005,30.1286641 91.0426631,29.868 91.748,29.868 L96.67,29.868 C97.0686687,29.868 97.3523325,29.9293327 97.521,30.052 C97.6896675,30.1746673 97.8199995,30.3739986 97.912,30.65 L103.938,51.902 C103.999334,52.1166677 104.091333,52.2316666 104.214,52.247 C104.336667,52.2623334 104.413333,52.1626677 104.444,51.948 L110.286,30.65 C110.439334,30.1286641 110.85333,29.868 111.528,29.868 L115.668,29.868 C116.404004,29.868 116.772,30.1899968 116.772,30.834 Z M146.051,48.199 C143.766322,50.0236758 140.753352,50.936 137.012,50.936 L130.112,50.936 C129.774665,50.936 129.606,51.104665 129.606,51.442 L129.606,62.942 C129.606,63.6473369 129.207337,64 128.41,64 L122.522,64 C122.153998,64 121.901001,63.9233341 121.763,63.77 C121.624999,63.6166659 121.556,63.3866682 121.556,63.08 L121.556,30.742 C121.556,30.1593304 121.801331,29.868 122.292,29.868 L136.092,29.868 C138.637346,29.868 140.914323,30.2589961 142.923,31.041 C144.931677,31.8230039 146.526327,33.0113254 147.707,34.606 C148.887673,36.2006746 149.478,38.1633217 149.478,40.494 C149.478,43.8060166 148.335678,46.3743242 146.051,48.199 Z M139.68,36.814 C138.667995,36.0166627 137.303342,35.618 135.586,35.618 L130.48,35.618 C130.173332,35.618 129.951001,35.6793327 129.813,35.802 C129.674999,35.9246673 129.606,36.1393318 129.606,36.446 L129.606,44.312 C129.606,44.6186682 129.652,44.8409993 129.744,44.979 C129.836,45.1170007 130.004665,45.186 130.25,45.186 L135.908,45.186 C137.533341,45.186 138.821329,44.756671 139.772,43.898 C140.722671,43.039329 141.198,41.8586742 141.198,40.356 C141.198,38.7919922 140.692005,37.6113373 139.68,36.814 Z M166.452,53.42 C166.452,54.09467 166.053337,54.432 165.256,54.432 L154.446,54.432 C154.077998,54.432 153.825001,54.3630007 153.687,54.225 C153.548999,54.0869993 153.48,53.849335 153.48,53.512 L153.48,50.154 C153.48,49.6019972 153.709998,49.326 154.17,49.326 L165.762,49.326 C165.976668,49.326 166.145333,49.3873327 166.268,49.51 C166.390667,49.6326673 166.452,49.8013323 166.452,50.016 L166.452,53.42 Z M179.24,29.868 C179.730669,29.868 179.976,30.1439972 179.976,30.696 L179.976,62.896 C179.976,63.2946687 179.884001,63.5783325 179.7,63.747 C179.515999,63.9156675 179.194002,64 178.734,64 L172.938,64 C172.569998,64 172.309334,63.9233341 172.156,63.77 C172.002666,63.6166659 171.926,63.371335 171.926,63.034 L171.926,30.742 C171.926,30.1593304 172.171331,29.868 172.662,29.868 L179.24,29.868 Z M184.714,63.218 C184.714,62.9726654 184.744666,62.7886673 184.806,62.666 L196.26,30.788 C196.382667,30.450665 196.528332,30.2130007 196.697,30.075 C196.865668,29.9369993 197.118665,29.868 197.456,29.868 L204.356,29.868 C204.693335,29.868 204.984665,29.9599991 205.23,30.144 C205.475335,30.3280009 205.644,30.5733318 205.736,30.88 L217.098,62.758 C217.159334,62.9420009 217.19,63.0799995 217.19,63.172 C217.19,63.4173346 217.136334,63.6166659 217.029,63.77 C216.921666,63.9233341 216.760668,64 216.546,64 L209.784,64 C209.323998,64 209.032667,63.7853355 208.91,63.356 L206.518,56.64 C206.456666,56.4559991 206.387667,56.325667 206.311,56.249 C206.234333,56.1723329 206.104001,56.134 205.92,56.134 L194.696,56.134 C194.389332,56.134 194.19,56.2873318 194.098,56.594 L191.66,63.402 C191.475999,63.8006687 191.154002,64 190.694,64 L185.404,64 C184.943998,64 184.714,63.7393359 184.714,63.218 Z M204.034,50.016 C204.340668,50.016 204.494,49.8933346 204.494,49.648 C204.494,49.4639991 204.478667,49.3260005 204.448,49.234 L200.584,38.47 C200.492,38.2859991 200.384667,38.194 200.262,38.194 C200.17,38.194 200.078,38.3013323 199.986,38.516 L196.076,49.234 C196.014666,49.4180009 195.984,49.5559995 195.984,49.648 C195.984,49.8933346 196.152665,50.016 196.49,50.016 L204.034,50.016 Z M246.377,48.199 C244.092322,50.0236758 241.079352,50.936 237.338,50.936 L230.438,50.936 C230.100665,50.936 229.932,51.104665 229.932,51.442 L229.932,62.942 C229.932,63.6473369 229.533337,64 228.736,64 L222.848,64 C222.479998,64 222.227001,63.9233341 222.089,63.77 C221.950999,63.6166659 221.882,63.3866682 221.882,63.08 L221.882,30.742 C221.882,30.1593304 222.127331,29.868 222.618,29.868 L236.418,29.868 C238.963346,29.868 241.240323,30.2589961 243.249,31.041 C245.257677,31.8230039 246.852327,33.0113254 248.033,34.606 C249.213673,36.2006746 249.804,38.1633217 249.804,40.494 C249.804,43.8060166 248.661678,46.3743242 246.377,48.199 Z M240.006,36.814 C238.993995,36.0166627 237.629342,35.618 235.912,35.618 L230.806,35.618 C230.499332,35.618 230.277001,35.6793327 230.139,35.802 C230.000999,35.9246673 229.932,36.1393318 229.932,36.446 L229.932,44.312 C229.932,44.6186682 229.978,44.8409993 230.07,44.979 C230.162,45.1170007 230.330665,45.186 230.576,45.186 L236.234,45.186 C237.859341,45.186 239.147329,44.756671 240.098,43.898 C241.048671,43.039329 241.524,41.8586742 241.524,40.356 C241.524,38.7919922 241.018005,37.6113373 240.006,36.814 Z M253.07,30.696 C253.07,30.4506654 253.154332,30.2513341 253.323,30.098 C253.491668,29.9446659 253.713999,29.868 253.99,29.868 L280.394,29.868 C281.007336,29.868 281.314,30.1439972 281.314,30.696 L281.314,34.974 C281.314,35.4340023 281.038003,35.664 280.486,35.664 L271.884,35.664 C271.546665,35.664 271.378,35.8173318 271.378,36.124 L271.378,63.126 C271.378,63.7086696 271.117336,64 270.596,64 L264.018,64 C263.557998,64 263.328,63.7393359 263.328,63.218 L263.328,36.262 C263.328,36.0473323 263.289667,35.8940005 263.213,35.802 C263.136333,35.7099995 263.006001,35.664 262.822,35.664 L253.944,35.664 C253.36133,35.664 253.07,35.4340023 253.07,34.974 L253.07,30.696 Z" id="CWP-IAPT-Copy-2" fill="#FFFFFF"></path>
        <path d="M291.26,29.986 C291.26,29.7579989 291.355999,29.644 291.548,29.644 L294.122,29.644 C294.314001,29.644 294.41,29.7519989 294.41,29.968 L294.41,40.462 C294.41,40.5460004 294.425,40.6059998 294.455,40.642 C294.485,40.6780002 294.536,40.696 294.608,40.696 L300.35,40.696 C300.566001,40.696 300.674,40.7859991 300.674,40.966 L300.674,42.676 C300.674,42.7720005 300.644,42.8499997 300.584,42.91 C300.524,42.9700003 300.440001,43 300.332,43 L291.656,43 C291.511999,43 291.41,42.9700003 291.35,42.91 C291.29,42.8499997 291.26,42.7540007 291.26,42.622 L291.26,29.986 Z M306.668,43.18 C305.719995,43.18 304.883004,42.9730021 304.157,42.559 C303.430996,42.1449979 302.864002,41.5660037 302.456,40.822 C302.047998,40.0779963 301.844,39.2320047 301.844,38.284 C301.844,37.2999951 302.050998,36.4300038 302.465,35.674 C302.879002,34.9179962 303.454996,34.3300021 304.193,33.91 C304.931004,33.4899979 305.761995,33.28 306.686,33.28 C307.634005,33.28 308.473996,33.4929979 309.206,33.919 C309.938004,34.3450021 310.504998,34.9359962 310.907,35.692 C311.309002,36.4480038 311.51,37.3059952 311.51,38.266 C311.51,39.2140047 311.306002,40.0599963 310.898,40.804 C310.489998,41.5480037 309.920004,42.1299979 309.188,42.55 C308.455996,42.9700021 307.616005,43.18 306.668,43.18 Z M306.686,41.344 C307.346003,41.344 307.846998,41.0830026 308.189,40.561 C308.531002,40.0389974 308.702,39.2620052 308.702,38.23 C308.702,37.1859948 308.531002,36.3970027 308.189,35.863 C307.846998,35.3289973 307.346003,35.062 306.686,35.062 C306.025997,35.062 305.522002,35.3289973 305.174,35.863 C304.825998,36.3970027 304.652,37.1859948 304.652,38.23 C304.652,39.2500051 304.825998,40.0239974 305.174,40.552 C305.522002,41.0800026 306.025997,41.344 306.686,41.344 Z M313.436,43 C313.303999,43 313.208,42.9730003 313.148,42.919 C313.088,42.8649997 313.058,42.7720007 313.058,42.64 L313.058,33.802 C313.058,33.5739989 313.153999,33.46 313.346,33.46 L315.524,33.46 C315.704001,33.46 315.794,33.561999 315.794,33.766 L315.794,34.648 C315.794,34.7440005 315.824,34.792 315.884,34.792 C315.92,34.792 315.962,34.7680002 316.01,34.72 C316.502002,34.2519977 316.993998,33.8950012 317.486,33.649 C317.978002,33.4029988 318.499997,33.28 319.052,33.28 C319.928004,33.28 320.620997,33.5379974 321.131,34.054 C321.641003,34.5700026 321.896,35.2599957 321.896,36.124 L321.896,42.568 C321.896,42.8560014 321.752001,43 321.464,43 L319.466,43 C319.333999,43 319.244,42.9730003 319.196,42.919 C319.148,42.8649997 319.124,42.7720007 319.124,42.64 L319.124,36.556 C319.124,36.147998 319.013001,35.8330011 318.791,35.611 C318.568999,35.3889989 318.242002,35.278 317.81,35.278 C317.449998,35.278 317.117002,35.3679991 316.811,35.548 C316.504998,35.7280009 316.178002,36.0099981 315.83,36.394 L315.83,42.586 C315.83,42.7300007 315.794,42.8349997 315.722,42.901 C315.65,42.9670003 315.530001,43 315.362,43 L313.436,43 Z M330.41,43 C330.157999,43 330.032,42.8800012 330.032,42.64 L330.032,42.136 C330.032,42.0399995 330.002,41.992 329.942,41.992 C329.906,41.992 329.852,42.0159998 329.78,42.064 C329.431998,42.4000017 329.051002,42.669999 328.637,42.874 C328.222998,43.078001 327.728003,43.18 327.152,43.18 C326.023994,43.18 325.115003,42.7600042 324.425,41.92 C323.734997,41.0799958 323.39,39.8740079 323.39,38.302 C323.39,37.3179951 323.566998,36.4450038 323.921,35.683 C324.275002,34.9209962 324.751997,34.3300021 325.352,33.91 C325.952003,33.4899979 326.611996,33.28 327.332,33.28 C327.800002,33.28 328.222998,33.3579992 328.601,33.514 C328.979002,33.6700008 329.341998,33.9099984 329.69,34.234 C329.774,34.2940003 329.834,34.324 329.87,34.324 C329.954,34.324 329.996,34.2460008 329.996,34.09 L329.996,29.968 C329.996,29.7519989 330.091999,29.644 330.284,29.644 L332.48,29.644 C332.564,29.644 332.633,29.6739997 332.687,29.734 C332.741,29.7940003 332.768,29.8779995 332.768,29.986 L332.768,42.622 C332.768,42.7540007 332.738,42.8499997 332.678,42.91 C332.618,42.9700003 332.510001,43 332.354,43 L330.41,43 Z M329.996,35.944 C329.719999,35.6439985 329.447001,35.4220007 329.177,35.278 C328.906999,35.1339993 328.604002,35.062 328.268,35.062 C327.631997,35.062 327.128002,35.3229974 326.756,35.845 C326.383998,36.3670026 326.198,37.1739945 326.198,38.266 C326.198,39.3700055 326.377998,40.1769974 326.738,40.687 C327.098002,41.1970025 327.595997,41.452 328.232,41.452 C328.712002,41.452 329.125998,41.2930016 329.474,40.975 C329.822002,40.6569984 329.996,40.2880021 329.996,39.868 L329.996,35.944 Z M339.14,43.18 C338.191995,43.18 337.355004,42.9730021 336.629,42.559 C335.902996,42.1449979 335.336002,41.5660037 334.928,40.822 C334.519998,40.0779963 334.316,39.2320047 334.316,38.284 C334.316,37.2999951 334.522998,36.4300038 334.937,35.674 C335.351002,34.9179962 335.926996,34.3300021 336.665,33.91 C337.403004,33.4899979 338.233995,33.28 339.158,33.28 C340.106005,33.28 340.945996,33.4929979 341.678,33.919 C342.410004,34.3450021 342.976998,34.9359962 343.379,35.692 C343.781002,36.4480038 343.982,37.3059952 343.982,38.266 C343.982,39.2140047 343.778002,40.0599963 343.37,40.804 C342.961998,41.5480037 342.392004,42.1299979 341.66,42.55 C340.927996,42.9700021 340.088005,43.18 339.14,43.18 Z M339.158,41.344 C339.818003,41.344 340.318998,41.0830026 340.661,40.561 C341.003002,40.0389974 341.174,39.2620052 341.174,38.23 C341.174,37.1859948 341.003002,36.3970027 340.661,35.863 C340.318998,35.3289973 339.818003,35.062 339.158,35.062 C338.497997,35.062 337.994002,35.3289973 337.646,35.863 C337.297998,36.3970027 337.124,37.1859948 337.124,38.23 C337.124,39.2500051 337.297998,40.0239974 337.646,40.552 C337.994002,41.0800026 338.497997,41.344 339.158,41.344 Z M345.908,43 C345.775999,43 345.68,42.9730003 345.62,42.919 C345.56,42.8649997 345.53,42.7720007 345.53,42.64 L345.53,33.802 C345.53,33.5739989 345.625999,33.46 345.818,33.46 L347.996,33.46 C348.176001,33.46 348.266,33.561999 348.266,33.766 L348.266,34.648 C348.266,34.7440005 348.296,34.792 348.356,34.792 C348.392,34.792 348.434,34.7680002 348.482,34.72 C348.974002,34.2519977 349.465998,33.8950012 349.958,33.649 C350.450002,33.4029988 350.971997,33.28 351.524,33.28 C352.400004,33.28 353.092997,33.5379974 353.603,34.054 C354.113003,34.5700026 354.368,35.2599957 354.368,36.124 L354.368,42.568 C354.368,42.8560014 354.224001,43 353.936,43 L351.938,43 C351.805999,43 351.716,42.9730003 351.668,42.919 C351.62,42.8649997 351.596,42.7720007 351.596,42.64 L351.596,36.556 C351.596,36.147998 351.485001,35.8330011 351.263,35.611 C351.040999,35.3889989 350.714002,35.278 350.282,35.278 C349.921998,35.278 349.589002,35.3679991 349.283,35.548 C348.976998,35.7280009 348.650002,36.0099981 348.302,36.394 L348.302,42.586 C348.302,42.7300007 348.266,42.8349997 348.194,42.901 C348.122,42.9670003 348.002001,43 347.834,43 L345.908,43 Z M296.75,50.446 C297.530004,50.446 298.225997,50.5659988 298.838,50.806 C299.450003,51.0460012 299.929998,51.3819978 300.278,51.814 C300.626002,52.2460022 300.8,52.7439972 300.8,53.308 C300.8,53.908003 300.551002,54.5199969 300.053,55.144 C299.554998,55.7680031 298.892004,56.277998 298.064,56.674 C297.968,56.7220002 297.92,56.7699998 297.92,56.818 C297.92,56.8660002 297.95,56.9199997 298.01,56.98 L299.918,59.068 C299.99,59.1400004 300.05,59.176 300.098,59.176 C300.134,59.176 300.2,59.1280005 300.296,59.032 C300.596002,58.6959983 300.880999,58.3180021 301.151,57.898 C301.421001,57.4779979 301.621999,57.0940017 301.754,56.746 C301.826,56.6259994 301.921999,56.566 302.042,56.566 C302.102,56.566 302.15,56.5719999 302.186,56.584 L303.572,57.034 C303.668,57.0580001 303.74,57.1179995 303.788,57.214 C303.836,57.3100005 303.842,57.4059995 303.806,57.502 C303.445998,58.3660043 302.786005,59.3799942 301.826,60.544 C301.754,60.6280004 301.718,60.6939998 301.718,60.742 C301.718,60.7900002 301.766,60.8439997 301.862,60.904 C302.138001,61.108001 302.476998,61.2789993 302.879,61.417 C303.281002,61.5550007 303.697998,61.6299999 304.13,61.642 C304.262001,61.6540001 304.355,61.6839998 304.409,61.732 C304.463,61.7800002 304.49,61.8639994 304.49,61.984 L304.49,63.55 C304.49,63.8500015 304.358001,64 304.094,64 C303.265996,64 302.486004,63.8890011 301.754,63.667 C301.021996,63.4449989 300.374003,63.130002 299.81,62.722 C299.714,62.6619997 299.636,62.632 299.576,62.632 C299.516,62.632 299.432001,62.6679996 299.324,62.74 C298.723997,63.1960023 298.082003,63.5349989 297.398,63.757 C296.713997,63.9790011 295.952004,64.09 295.112,64.09 C293.719993,64.09 292.637004,63.7780031 291.863,63.154 C291.088996,62.5299969 290.702,61.6540056 290.702,60.526 C290.702,59.8059964 290.938998,59.149003 291.413,58.555 C291.887002,57.960997 292.651995,57.3700029 293.708,56.782 C293.828001,56.7099996 293.888,56.6440003 293.888,56.584 C293.888,56.5239997 293.84,56.4400005 293.744,56.332 C293.383998,55.935998 293.105001,55.5160022 292.907,55.072 C292.708999,54.6279978 292.61,54.1900022 292.61,53.758 C292.61,53.1339969 292.789998,52.5700025 293.15,52.066 C293.510002,51.5619975 294.004997,51.1660014 294.635,50.878 C295.265003,50.5899986 295.969996,50.446 296.75,50.446 Z M296.876,52.12 C296.419998,52.12 296.054001,52.2579986 295.778,52.534 C295.501999,52.8100014 295.364,53.1339981 295.364,53.506 C295.364,53.8660018 295.531998,54.2319981 295.868,54.604 L296.462,55.306 C296.51,55.3420002 296.564,55.36 296.624,55.36 C296.684,55.36 296.75,55.3480001 296.822,55.324 C297.854005,54.8199975 298.37,54.1900038 298.37,53.434 C298.37,53.025998 298.232001,52.7050012 297.956,52.471 C297.679999,52.2369988 297.320002,52.12 296.876,52.12 Z M295.526,58.33 C295.442,58.2339995 295.352,58.186 295.256,58.186 C295.196,58.186 295.124,58.2099998 295.04,58.258 C294.619998,58.4860011 294.290001,58.7739983 294.05,59.122 C293.809999,59.4700017 293.69,59.8359981 293.69,60.22 C293.69,60.7240025 293.884998,61.1529982 294.275,61.507 C294.665002,61.8610018 295.141997,62.038 295.706,62.038 C296.042002,62.038 296.398998,61.9690007 296.777,61.831 C297.155002,61.6929993 297.469999,61.5160011 297.722,61.3 C297.818,61.2039995 297.866,61.1200004 297.866,61.048 C297.866,60.9759996 297.836,60.9100003 297.776,60.85 L295.526,58.33 Z M317.72,53.794 C317.407998,53.4459983 317.051002,53.173001 316.649,52.975 C316.246998,52.776999 315.722003,52.678 315.074,52.678 C314.341996,52.678 313.784002,52.8099987 313.4,53.074 C313.015998,53.3380013 312.824,53.6859978 312.824,54.118 C312.824,54.7420031 313.309995,55.1979986 314.282,55.486 L317.126,56.296 C318.194005,56.5960015 318.988997,57.0699968 319.511,57.718 C320.033003,58.3660032 320.294,59.1459954 320.294,60.058 C320.294,60.8980042 320.078002,61.6269969 319.646,62.245 C319.213998,62.8630031 318.593004,63.3399983 317.783,63.676 C316.972996,64.0120017 316.022005,64.18 314.93,64.18 C313.705994,64.18 312.602005,63.9730021 311.618,63.559 C310.633995,63.1449979 309.914002,62.5780036 309.458,61.858 C309.41,61.7739996 309.386,61.6960004 309.386,61.624 C309.386,61.5279995 309.445999,61.4260005 309.566,61.318 L310.952,60.364 C311.072001,60.2919996 311.18,60.256 311.276,60.256 C311.384001,60.256 311.474,60.3039995 311.546,60.4 C311.990002,60.9760029 312.439998,61.3839988 312.896,61.624 C313.352002,61.8640012 313.957996,61.984 314.714,61.984 C315.518004,61.984 316.147998,61.8580013 316.604,61.606 C317.060002,61.3539987 317.288,60.9760025 317.288,60.472 C317.288,60.1479984 317.174001,59.8720011 316.946,59.644 C316.717999,59.4159989 316.334003,59.2180008 315.794,59.05 L313.076,58.276 C312.043995,57.9879986 311.246003,57.5050034 310.682,56.827 C310.117997,56.1489966 309.836,55.3780043 309.836,54.514 C309.836,53.7459962 310.048998,53.0560031 310.475,52.444 C310.901002,51.8319969 311.503996,51.3490018 312.284,50.995 C313.064004,50.6409982 313.963995,50.464 314.984,50.464 C315.992005,50.464 316.915996,50.6349983 317.756,50.977 C318.596004,51.3190017 319.237998,51.7779971 319.682,52.354 C319.754,52.4500005 319.79,52.5339996 319.79,52.606 C319.79,52.6780004 319.754,52.7439997 319.682,52.804 L318.17,53.92 C318.098,53.9680002 318.044,53.992 318.008,53.992 C317.948,53.992 317.852001,53.9260007 317.72,53.794 Z M326.36,64.18 C325.411995,64.18 324.575004,63.9730021 323.849,63.559 C323.122996,63.1449979 322.556002,62.5660037 322.148,61.822 C321.739998,61.0779963 321.536,60.2320047 321.536,59.284 C321.536,58.2999951 321.742998,57.4300038 322.157,56.674 C322.571002,55.9179962 323.146996,55.3300021 323.885,54.91 C324.623004,54.4899979 325.453995,54.28 326.378,54.28 C327.326005,54.28 328.165996,54.4929979 328.898,54.919 C329.630004,55.3450021 330.196998,55.9359962 330.599,56.692 C331.001002,57.4480038 331.202,58.3059952 331.202,59.266 C331.202,60.2140047 330.998002,61.0599963 330.59,61.804 C330.181998,62.5480037 329.612004,63.1299979 328.88,63.55 C328.147996,63.9700021 327.308005,64.18 326.36,64.18 Z M326.378,62.344 C327.038003,62.344 327.538998,62.0830026 327.881,61.561 C328.223002,61.0389974 328.394,60.2620052 328.394,59.23 C328.394,58.1859948 328.223002,57.3970027 327.881,56.863 C327.538998,56.3289973 327.038003,56.062 326.378,56.062 C325.717997,56.062 325.214002,56.3289973 324.866,56.863 C324.517998,57.3970027 324.344,58.1859948 324.344,59.23 C324.344,60.2500051 324.517998,61.0239974 324.866,61.552 C325.214002,62.0800026 325.717997,62.344 326.378,62.344 Z M336.692,62.182 C337.352003,62.182 338.005997,61.8280035 338.654,61.12 L338.654,54.874 C338.654,54.5979986 338.809998,54.46 339.122,54.46 L341.066,54.46 C341.210001,54.46 341.309,54.4899997 341.363,54.55 C341.417,54.6100003 341.444,54.7059993 341.444,54.838 L341.408,63.676 C341.408,63.7720005 341.381,63.8499997 341.327,63.91 C341.273,63.9700003 341.204,64 341.12,64 L338.978,64 C338.797999,64 338.708,63.898001 338.708,63.694 L338.708,62.812 C338.708,62.7399996 338.69,62.6980001 338.654,62.686 C338.618,62.6739999 338.57,62.6919998 338.51,62.74 C338.005997,63.2560026 337.508002,63.6249989 337.016,63.847 C336.523998,64.0690011 335.990003,64.18 335.414,64.18 C334.609996,64.18 333.950003,63.9190026 333.434,63.397 C332.917997,62.8749974 332.66,62.1700044 332.66,61.282 L332.66,54.892 C332.66,54.6039986 332.803999,54.46 333.092,54.46 L335.09,54.46 C335.318001,54.46 335.432,54.5859987 335.432,54.838 L335.432,60.886 C335.432,61.282002 335.545999,61.5969988 335.774,61.831 C336.002001,62.0650012 336.307998,62.182 336.692,62.182 Z M347.42,56.368 C347.287999,56.368 347.222,56.4399993 347.222,56.584 L347.222,60.922 C347.222,61.330002 347.317999,61.6209991 347.51,61.795 C347.702001,61.9690009 348.007998,62.056 348.428,62.056 L349.4,62.056 C349.484,62.056 349.55,62.0829997 349.598,62.137 C349.646,62.1910003 349.67,62.2659995 349.67,62.362 L349.652,63.46 C349.652,63.7000012 349.520001,63.8439998 349.256,63.892 C348.751997,63.9640004 348.038005,64 347.114,64 C346.273996,64 345.620002,63.802002 345.152,63.406 C344.683998,63.009998 344.45,62.4340038 344.45,61.678 L344.45,56.638 C344.45,56.4579991 344.372001,56.368 344.216,56.368 L343.118,56.368 C342.889999,56.368 342.776,56.266001 342.776,56.062 L342.776,54.73 C342.776,54.5499991 342.883999,54.46 343.1,54.46 L344.342,54.46 C344.438,54.46 344.498,54.3940007 344.522,54.262 L344.774,51.526 C344.798,51.321999 344.887999,51.22 345.044,51.22 L347.006,51.22 C347.09,51.22 347.159,51.2499997 347.213,51.31 C347.267,51.3700003 347.294,51.4539995 347.294,51.562 L347.294,54.262 C347.294,54.3820006 347.353999,54.442 347.474,54.442 L349.364,54.442 C349.580001,54.442 349.688,54.537999 349.688,54.73 L349.688,56.062 C349.688,56.266001 349.568001,56.368 349.328,56.368 L347.42,56.368 Z M351.578,64 C351.445999,64 351.35,63.9730003 351.29,63.919 C351.23,63.8649997 351.2,63.7720007 351.2,63.64 L351.2,50.986 C351.2,50.7579989 351.295999,50.644 351.488,50.644 L353.648,50.644 C353.828001,50.644 353.918,50.745999 353.918,50.95 L353.918,55.558 C353.918,55.6540005 353.948,55.702 354.008,55.702 C354.044,55.702 354.086,55.6780002 354.134,55.63 C354.686003,55.1379975 355.198998,54.790001 355.673,54.586 C356.147002,54.381999 356.647997,54.28 357.176,54.28 C358.088005,54.28 358.789998,54.5319975 359.282,55.036 C359.774002,55.5400025 360.02,56.2479954 360.02,57.16 L360.02,63.568 C360.02,63.8560014 359.876001,64 359.588,64 L357.59,64 C357.457999,64 357.368,63.9730003 357.32,63.919 C357.272,63.8649997 357.248,63.7720007 357.248,63.64 L357.248,57.556 C357.248,57.147998 357.137001,56.8330011 356.915,56.611 C356.692999,56.3889989 356.372002,56.278 355.952,56.278 C355.579998,56.278 355.244001,56.3679991 354.944,56.548 C354.643998,56.7280009 354.320002,57.0099981 353.972,57.394 L353.972,63.586 C353.972,63.7300007 353.936,63.8349997 353.864,63.901 C353.792,63.9670003 353.672001,64 353.504,64 L351.578,64 Z M365.906,50.986 C365.906,50.7579989 366.001999,50.644 366.194,50.644 L375.266,50.644 C375.446001,50.644 375.536,50.745999 375.536,50.95 L375.518,52.57 C375.518,52.8220013 375.392001,52.948 375.14,52.948 L369.398,52.948 C369.169999,52.948 369.056,53.043999 369.056,53.236 L369.056,55.846 C369.056,56.050001 369.145999,56.152 369.326,56.152 L373.142,56.152 C373.346001,56.152 373.448,56.247999 373.448,56.44 L373.448,58.168 C373.448,58.3360008 373.352001,58.42 373.16,58.42 L369.308,58.42 C369.139999,58.42 369.056,58.4919993 369.056,58.636 L369.056,61.462 C369.056,61.5460004 369.071,61.6059998 369.101,61.642 C369.131,61.6780002 369.182,61.696 369.254,61.696 L375.41,61.696 C375.626001,61.696 375.734,61.7859991 375.734,61.966 L375.734,63.676 C375.734,63.8920011 375.614001,64 375.374,64 L366.302,64 C366.157999,64 366.056,63.9700003 365.996,63.91 C365.936,63.8499997 365.906,63.7540007 365.906,63.622 L365.906,50.986 Z M382.664,63.082 C381.871996,63.8140037 380.930005,64.18 379.838,64.18 C378.937995,64.18 378.224003,63.9370024 377.696,63.451 C377.167997,62.9649976 376.904,62.3320039 376.904,61.552 C376.904,60.543995 377.365995,59.7340031 378.29,59.122 C379.214005,58.5099969 380.485992,58.1860002 382.106,58.15 L382.754,58.096 C382.826,58.096 382.889,58.0750002 382.943,58.033 C382.997,57.9909998 383.024,57.9280004 383.024,57.844 L383.024,57.466 C383.024,56.9979977 382.892001,56.6380013 382.628,56.386 C382.363999,56.1339987 381.986002,56.008 381.494,56.008 C380.653996,56.008 380.030002,56.3679964 379.622,57.088 C379.574,57.2080006 379.496001,57.268 379.388,57.268 C379.328,57.268 379.274,57.2620001 379.226,57.25 L377.426,56.836 C377.317999,56.8119999 377.264,56.7460005 377.264,56.638 C377.264,56.5659996 377.288,56.4760005 377.336,56.368 C377.624001,55.6719965 378.136996,55.1500017 378.875,54.802 C379.613004,54.4539983 380.527995,54.28 381.62,54.28 C383.048007,54.28 384.079997,54.5409974 384.716,55.063 C385.352003,55.5850026 385.67,56.3259952 385.67,57.286 L385.67,63.604 C385.67,63.7480007 385.646,63.8499997 385.598,63.91 C385.55,63.9700003 385.460001,64 385.328,64 L383.474,64 C383.353999,64 383.267,63.9580004 383.213,63.874 C383.159,63.7899996 383.12,63.6640008 383.096,63.496 L383.078,63.1 C383.066,62.9919995 383.018,62.938 382.934,62.938 C382.886,62.938 382.796001,62.9859995 382.664,63.082 Z M383.024,59.752 C383.024,59.6439995 383.006,59.5660002 382.97,59.518 C382.934,59.4699998 382.862001,59.446 382.754,59.446 L382.25,59.482 C381.553997,59.5180002 380.939003,59.6829985 380.405,59.977 C379.870997,60.2710015 379.604,60.6759974 379.604,61.192 C379.604,61.5520018 379.729999,61.836999 379.982,62.047 C380.234001,62.257001 380.581998,62.362 381.026,62.362 C381.578003,62.362 382.045998,62.2000016 382.43,61.876 C382.826002,61.5639984 383.024,61.2460016 383.024,60.922 L383.024,59.752 Z M393.428,56.944 C392.935998,56.2959968 392.234005,55.972 391.322,55.972 C390.865998,55.972 390.488001,56.0589991 390.188,56.233 C389.887998,56.4070009 389.738,56.6439985 389.738,56.944 C389.738,57.1120008 389.806999,57.2649993 389.945,57.403 C390.083001,57.5410007 390.349998,57.6579995 390.746,57.754 L392.816,58.258 C393.764005,58.4860011 394.459998,58.8489975 394.904,59.347 C395.348002,59.8450025 395.57,60.4299966 395.57,61.102 C395.57,62.0500047 395.174004,62.7999972 394.382,63.352 C393.589996,63.9040028 392.552006,64.18 391.268,64.18 C390.235995,64.18 389.342004,63.9970018 388.586,63.631 C387.829996,63.2649982 387.296002,62.7880029 386.984,62.2 C386.924,62.1159996 386.894,62.0380004 386.894,61.966 C386.894,61.8819996 386.936,61.8220002 387.02,61.786 L388.244,61.156 C388.34,61.1079998 388.424,61.084 388.496,61.084 C388.568,61.084 388.634,61.1139997 388.694,61.174 C388.958001,61.5460019 389.278998,61.8429989 389.657,62.065 C390.035002,62.2870011 390.535997,62.398 391.16,62.398 C391.724003,62.398 392.182998,62.3140008 392.537,62.146 C392.891002,61.9779992 393.068,61.7320016 393.068,61.408 C393.068,61.1919989 392.978001,61.0120007 392.798,60.868 C392.617999,60.7239993 392.312002,60.5980005 391.88,60.49 L390.026,60.094 C388.201991,59.697998 387.29,58.7920071 387.29,57.376 C387.29,56.775997 387.454998,56.2420023 387.785,55.774 C388.115002,55.3059977 388.585997,54.9400013 389.198,54.676 C389.810003,54.4119987 390.529996,54.28 391.358,54.28 C392.234004,54.28 393.010997,54.4419984 393.689,54.766 C394.367003,55.0900016 394.855998,55.4979975 395.156,55.99 C395.228,56.0860005 395.264,56.1699996 395.264,56.242 C395.264,56.3140004 395.222,56.3739998 395.138,56.422 L393.842,57.052 C393.806,57.0760001 393.758,57.088 393.698,57.088 C393.589999,57.088 393.5,57.0400005 393.428,56.944 Z M401.096,56.368 C400.963999,56.368 400.898,56.4399993 400.898,56.584 L400.898,60.922 C400.898,61.330002 400.993999,61.6209991 401.186,61.795 C401.378001,61.9690009 401.683998,62.056 402.104,62.056 L403.076,62.056 C403.16,62.056 403.226,62.0829997 403.274,62.137 C403.322,62.1910003 403.346,62.2659995 403.346,62.362 L403.328,63.46 C403.328,63.7000012 403.196001,63.8439998 402.932,63.892 C402.427997,63.9640004 401.714005,64 400.79,64 C399.949996,64 399.296002,63.802002 398.828,63.406 C398.359998,63.009998 398.126,62.4340038 398.126,61.678 L398.126,56.638 C398.126,56.4579991 398.048001,56.368 397.892,56.368 L396.794,56.368 C396.565999,56.368 396.452,56.266001 396.452,56.062 L396.452,54.73 C396.452,54.5499991 396.559999,54.46 396.776,54.46 L398.018,54.46 C398.114,54.46 398.174,54.3940007 398.198,54.262 L398.45,51.526 C398.474,51.321999 398.563999,51.22 398.72,51.22 L400.682,51.22 C400.766,51.22 400.835,51.2499997 400.889,51.31 C400.943,51.3700003 400.97,51.4539995 400.97,51.562 L400.97,54.262 C400.97,54.3820006 401.029999,54.442 401.15,54.442 L403.04,54.442 C403.256001,54.442 403.364,54.537999 403.364,54.73 L403.364,56.062 C403.364,56.266001 403.244001,56.368 403.004,56.368 L401.096,56.368 Z" id="London-&amp;-South-East" fill="#FFFFFF"></path>
    </g>
</svg>
<<list-links "[tag[Skills Workshop Days]]">>
!!!!!Source: Helen Barker 
!!!! Disruptions to our sleep are commonly associated to difficulties with mental well-being
{{sleep.gif}}

''What do we mean by 'sleep disturbance''?

Sleep disturbance is a common symptom of mental health difficulties such as anxiety and depression. It can have a significant impact on our emotional well-being and ability to go about our day-to-day activities. Lack of sleep can impact on our concentration, mood, health and weight. Some young people experience problems falling asleep as they are preoccupied by worries or negative thoughts about the day, others wake during the night or in the early hours of the morning and are unable to fall back to sleep. Some children and young people also experience sleep disturbance because of poor sleep routines, such as busy schedules that don’t allow enough time for sufficient sleep or spending long periods on the phone/internet during the night.  

''Why am I finding it hard to sleep?''

''Why am I feeling tired all day?''

''What can I do to improve my sleep?''

There is a lot that can be done to reduce sleep disturbance and help improve sleeping patterns. Healthy sleep routines and sufficient sleep can have a positive impact on mood, energy levels and concentration and improve over-all emotional well-being. There are many resources on this site that can support children and young-people in tackling sleep disturbance.


Source: Joe Hickey and Peter Fuggle

!!What is the socratic technique?
Socratic Technique is a method of learning through dialogue, with the teacher using questions to help the student solve problems, has been very influential in CBT and modern therapy. 

!!!Basic components
(Fuggle et al., 2013)

# ''Empathic listening'' in relation to the child’s initial perspective, so they feel heard and understood.
# ''Explore whether (or not)'' there might be another way of looking at things/ other conclusions might be drawn from the same experiences and contexts.
# ''Summarise and reflect: ''Does the above exploration result in the need to re-evaluate thoughts and beliefs – or is their thinking realistic?  If not – how can they problem-solve/cope?

!!How to use it?

# Explore why the child has come to think like this
#normalise where possible so they don’t feel stupid
# Don’t try to change their minds!
# Evidence for and against, what would a friend say etc
# Draw their attention to information that might not have been noticed/been noticed but discounted

__''DO''__

* Show genuine curiosity
* Highlight new information the CYP hasn’t thought about before.
* Are there other ways of thinking about things? Is there a new way of understanding something?
* Take the ‘one-down’ position: //I’m a bit confused/can you help me understand what you’re saying//
* Make sure the child can understand the questions 
* Monitor the reactions of the child to your questioning
* Use prompts/choices and make suggestions where appropriate
* Normalise where appropriate and reassure them there’s not a ‘right/wrong’ answer

__''DON'T''__

* Assume the child is wrong and guide towards the view/answer of the therapist
* Become polarised 
* Make them feel stupid
* Conduct the Spanish Inquisition!

!!Links to other pages
Socratic technique is linked to processes of change and is connected with a range of techniques around [[Guided Self Help]]

Please see [[Engagement]] for a list of relevant pages
!!!!Source: Peter Fuggle

!!Alternative to RCADS for younger children

The RCADS can’t be used for under 8s. The norms don’t apply to young children.
However, the Spence Preschool Scale can be used for children aged 3 – 6 (for kids aged 7 you can use the child SCAS – on the same website).
The Spence Scale is very similar to the RCADS. The reason for this is historical. The Spence or SCAS (Spence Child Anxiety Scale) was developed first. 

*Corpita used the Spence to develop the RCADS, which essentially is the Spence Scale with a depression subtest. The SCAS is a widely used measure (e.g., Creswell uses the SCAS in her guided self-help studies).
The SCAS is free and can be found [[here.|https://www.scaswebsite.com/index.php?p=1_41]]

Nevertheless, from the perspective of POD/ practitioner the Parent SDQ (& parent GBO) is the main outcome measure for young children. However, if you want an anxiety measure for formulation purposes then I highly recommend the SCAS.
'Spoon theory' was originally developed to help describe what it feels like to have limited energy in relation to chronic pain. This original theory was then developed to apply to mental health being renamed 'fork theory'. This is a really practical and visual way to describe energy levels and stressing the importance of depleting and replenishing activities. This theory could also be simplified for young children.

For a really clear and simple explanation of both spoon and fork theory please see below:

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/DyU-5P5ip4o" frameborder="0" allowfullscreen></iframe></html>

 
!!! What do we know about staff burnout?
The Oldenburg Burnout Inventory (Demerouti et al, 2003) suggests that there are two factors to Burnout:

1. Exhaustion e.g. 'During my work I often feel emotionally drained'

2. Disengagement e.g. 'Over time, one can become disconnected from this type of work'


CWP steering group are held approx. every 6 weeks. Representatives from all sites are expected to join the steering groups which are a forum for feedback, updates, sharing learning and developing the CWP programme in London and the South East. If you have not received invites to the upcoming steering groups, please contact cwp@annafreud.org
Steps model for managing stress in children has been adopted by Hounslow.  

To be drafted. 




What do we mean by the term 'Stressed'?
Below are some good examples of study skills.

Exam essentials: Studying for success

https://www.bbc.co.uk/bitesize/articles/zb7j382

Go The Distance: Study Skills

https://www.bbc.co.uk/learningenglish/gothedistance/studyskills

Nine nifty ways to study remotely

https://www.bbc.co.uk/bitesize/articles/z77svk7


These have all been taken from the 'support' section of [[BBC Bitesize|https://www.bbc.co.uk/bitesize/support]]
Summarising is a simple but important technique which is a closely linked to [[Active Listening]] which involves feeding back to the client what the practitioner has understood from what he/she has heard. It invites the client to say whether what has been summarised is accurate etc. It builds the story in a collaborative way. A few common phrases may be used to introduce summarising. 

//Can I just stop you for a minute and make sure that I have got things right so far.//

//You have told me a lot of important things. I want to make sure I haven't missed anything.What you told me was.......//

//I am not sure I have got this right. Can I check with you whether this is what you meant.//

//I am getting a bit muddled. Can we have a pause and let me check with you what  I understand so far.//

Having created a break in the conversation, the summary needs to be simple and clear. It is not necessary to repeat everything but using the same phrases as the young person may be very useful. It should be finished by some check back statement such as 'Is that roughly right?'
Summarising can be very powerful for a client. For them to hear their own story retold to them may lead to them hearing it in a somewhat different way than when they told it. It may support a process of mentalizing. 
[img width=100% img [laptop .jpg]]
Source: Duncan Law and supervisors group

!!Supervisors: 
This area of the guide is for supervisors and contains information and resources about all aspects of supervising and supporting service development leads on the CWP programme. 

!!! Core Information for Supervisors
[[Supervisors Core Information]]


!!!Supervisor Resources

[[Supervisors Resources]] contains information on supervision, training of supervisors and useful resources to facilitate the work of supervisors. 

[[Service Development Resources]] contains information for service development including referral pathways, example job descriptions and service expansion using CAPA

!!!Supervisors Q&A
[[Supervisors Q&A]]


!!!Supervisor Training

[[Supervisors Training]]

!!!General  CWP Information 

*[[Outcomes]]

!!!Key Training Documents 
You can find key documents such as:

* The Memorandum of Understanding
* Operational guidance
* Template job descriptions and job plans

As well as slides and information about the current supervisors course by clicking the green button below:


<<link-pdf "SSDL Documents on Google Drive" "https://drive.google.com/open?id=1F6pJ_dh5QRuEEJphJoCjInWnPLFgcdsl">>
!!! How is supervising a CWP different to other supervison (draw more on supervisor knowledge)

*CWPs often have no/little clinical experience so supervisors hold clinical responsibility  
*More teaching and case/time management is needed
*Risk does come up even in low level, which means additional work for supervisor in choosing cases with low enough risk 
*No experience in community settings i.e. basic things like what hours to work, checking in (can be resolved with contracting which is CWP specific), lone working etc.
*Knowing how to use supervision i.e. knowing what to discuss in cases, bringing pens and paper to supervision. Examples of CWPs coming to supervision with no cases to discuss. 
*Balance between being on a course but also working so adjustment to the environment/area/community
*Might be more issues this year with recruiting people outside psychology i.e. teaching assistants. TAs likely to have even less clinical experience. 

!!!Experience and need for supervision of CWP supervisors
*Missing link in that nowhere to discuss experience of being a CWP supervisor sessions
*Able to use supervisor sessions for that, but was about service set up in the beginning and less about supervision itself
*No professional registration even though they are trained there is no code of conduct which leads to questions about whose responsibility this is (have been told it would be the supervisor responsibility which is added pressure)
*One service management supervision monthly, clinical supervisor fortnightly
*Resources are service dependent and effected by time constraints 
*Need to develop model to scale-ability 
*Many current supervisors are being asked to supervise new CWPs for cohort 2 but also continue with supervision of trained CWPs. Concern that there is a lack of understanding higher up about the amount of supervision trained CWPs will need. To be discussed in steering groups to ensure services are aware of this and supervisors have support from service managers and a chance for supervision of supervision if possible. 

!!!How to protect CWPs from wider CAMHS service pressures 
* Services have developed a system whereby they don't say no but: 
*show empathy "that sounds really difficult"
*limit setting "my role doesn't cover that however"
*signposting "maybe you should talk to this person"

Based on [[First Year Learning]]


*In situations where the CWP is concerned about risk, it is okay to move away from the planned agenda and focus on risk assessments and safety plan.
*cases with a lot of risk management may need additional sessions or may need to be referred to more intensive help.  
*Flexible around managing risk 
*Risk needs to be top of the priority list and discussed in every session 
*Bring energy to the room because of emotional contagion 
*Be aware of local risk protocols [[Risk assessment and management]]
!!!Risk management plan 
*Session 1 discuss confidentiality 
*Safety plan or checklist at every session - how to keep yourself safe when your finding things hard e.g. go for a walk, talk to mum, put music on
*Inform parents of risk - found from parent feedback this is very useful 
Supervisors/Service Development Leads will be asked to attend skills workshops with their ~CWPs approximately once every 4-5 weeks.

The general lay out of the Friday skills days: 
*meet as a larger group in the morning to go through overview of main points of teaching 
*split into 2 or 3 smaller groups to practice role plays / observe staff modelling things / have vignettes about common pit falls etc. 
!!!Supervisor role: 
#Supervisors could be involved in demonstrating and modelling things e.g. how to help discuss using outcome measures with a YP. 
#Supervisors could be allocated to a smaller group of ~CWPs to help observe their skills practice and give feedback
## it could be their own group of ~CWPs, or they could be paired with another group.
##Benefits to not being with their ~CWPs. ~CWPs might feel 'safer' to try things out without fear of evaluation; supervisors would get to hear about what ~CWPs are doing in different settings / contexts etc.
#Supervisors and their own ~CWPs could bring along dilemmas / problems encountered thus far (e.g. 'couldn't get anyone to agree to be recorded' or 'YP turned up and hadn't done their activity log') and then we could given these dilemmas to different groups to help problem-solve.  
[img[cave.jpg]]

<<list-links "[tag[Supervisor Core Information]]">>
[img[question mark.jpg]]
<<list-links "[tag[Supervisor Q&A]]">>
[img[books.jpg]]

Source: Natasha Byrne and Duncan Law

!!''Cohort 3 Supervisor and Service Lead group''

New (cohort 3) SSDLs are expected to attend at all days set out in the timetable (below)

In addition to these dates for the SSDL course teaching, all new supervisors are strongly encouraged to attend additional CWP training days for Anxiety/ Depression/ Challenging Behaviour days (unless training already undertaken in these models) 

Previous cohorts of SSDLs (Cohorts 1 and 2) are invited to attend the three ‘All Cohorts Group Session’ (afternoons) these are compulsory for SSDLs in services who have current CWPs being trained and optional for all other previous SSDLs

<<link-pdf "Timetable Cohort 3" "https://drive.google.com/file/d/1V2G1a6T41is2gZkhCZDtpvf-uFwaKIRH/view?usp=sharing">>

 
!!''Supervisor resources''  

<<list-links "[tag[Supervisor Resources]]">>

[img[man writing.jpg]]

<<list-links "[tag[Supervisor Training]]">>
Advice for parents, carers and people that work with children and young people developed by

<<link-doc "Supporting children and young people with worries about COVID-19" "https://drive.google.com/file/d/1dsIMjfJorMptCcDTpDy7D2LMQpHbfdS_/view?usp=sharing">>
Source NHS Digital 

''Purpose of this page'' To make information about this extremely important study of the mental health needs of children and young people easily available to EMHPs

!! Mental Health Survey 2017
Major surveys of the mental health of children and young people in England were carried out in 1999, 2004, and 2017. 

This survey series provides England’s best source of data on trends in child mental health. While many surveys use brief tools to screen for nonspecific psychiatric distress or dissatisfaction, this series applied rigorous, detailed and consistent methods to assess for a range of different types of disorder according to International Classification of Disease (ICD-10) diagnostic criteria. All cases were reviewed by clinically-trained raters.

Comparable data is available for 5 to 15 year olds living in England in 1999, 2004, and 2017. The 2017 survey for the first time provides findings on the prevalence of mental disorder in 2 to 4 year olds, and spans the transition into adulthood by covering 17 to 19 year olds.
The latest survey was funded by the Department of Health and Social Care, commissioned by NHS Digital, and carried out by the National Centre for Social Research, the Office for National Statistics and Youthinmind.

For more information please read about this survey on the NHS [[website|https://digital.nhs.uk/data-and-information/publications/statistical/mental-health-of-children-and-young-people-in-england/2017/2017]]

!!Links to other pages
Key findings from this survey are included in the page on [[Common mental health problems]] and [[Diversity: Shaping Practice]]
!!Findings from the National Evaluation of Targeted Mental Health in Schools study (TAMHS)

!!!''What was the study?''
Two studies were undertaken: a longitudinal study (2008-11) and a Randomised Controlled Trial (RCT; 2009-11).

 
*The longitudinal study sample was 2,687 primary school pupils across 137 primary schools and 2,311 secondary pupils across 37 secondary schools provided self-reports on their mental health in all three years (2008, 2009 and 2010). 
*Randomised Control Trial sample was 7,330 primary school pupils across 270 primary schools and 5,907 secondary pupils across 82 secondary schools provided online self-reports of their mental health in 2009 and 2010.

!!!''What was the programme?''

The programme consisted of three levels of input to schools, namely whole school approaches, small group interventions and individual therapeutic help. Please see [[full report|https://www.gov.uk/government/publications/findings-from-the-national-evaluation-of-targeted-mental-health-in-schools-2008-to-2011]] for details. 


!!!''What were its key findings?''

!!!!''Improvement in behaviour problems in primary school'' 
*The programme resulted in a statistically significant decrease in problems in primary – but not secondary – school pupils who had behavioural problems at the outset
*It had no effect on primary or secondary school pupils who had emotional difficulties at outset. 
*These conclusions are based on comparison of children in schools in Local Authorities that, on a randomized basis, did and did not implement the programme. 
!!!!''Using of self help booklets increased the improvement compared with no booklets.''

*The random allocation of evidence based mental health self-help booklets to pupils in ~TaMHS schools enhanced the general effect of exposure to ~TaMHS on primary school pupils with behaviour problems. That is, it resulted in a statistically significant additional decline in their behaviour problems over time. 
*This conclusion is based on comparison of primary school pupils with behaviour problems at the outset randomly assigned to ~TaMHS who, on a random basis, did or did not receive evidence based mental health self-help booklets. 


!!!''What were the key implications for future work in schools?'' 

There were different implications for primary and secondary schools.

!!!!''Primary schools''
*It may make sense to prioritise mental health work with primary school pupils in relation to behavioural problems to have maximum impact before problems become too entrenched.
*It may be worth considering further use of evidence based self-help materials for primary school pupils at risk of or with behavioural difficulties.
*Caution should be taken when giving information to pupils in primary school with emotional problems to ensure the material does not impact negatively.
!!!!''Secondary schools''
*It may make sense to prioritise improved inter-agency working (such as by use of systems such as the Common Assessment Framework (CAF) as ways to help address behavioural problems in pupils in secondary school.
*It may be beneficial to prioritise improved relationships and referral routes between schools and specialist CAMHS as ways to help address behavioural problems in pupils in secondary school. 


''A link to the full study report is provided here. ''



<<link-pdf "TAMHS Study report" "https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/184060/DFE-RR177.pdf">>


''TAMHS in the West Midlands''

Here is a 20 minute report on youtube which describes the TAMHS programme

https://www.youtube.com/watch?v=GIxM4jRp3vQ





 
!!!!Source: Peter Fuggle

---
Please use the link below for a new accessible summary of the Framework:

<<link-pdf "THRIVE Framework" "https://www.annafreud.org/media/9254/thrive-framework-for-system-change-2019.pdf">>

----
!Introduction
The THRIVE Framework provides a set of principles for creating coherent and resource-efficient communities of mental health support for children, young people and families.

It aims to talk about mental health and mental health support in a common language that everyone understands.

The Framework is needs-led. This means that mental health needs are defined by children, young people and families alongside professionals through shared decision making. Needs are not based on severity, diagnosis, or health care pathways.

The Framework is part of the NHS Long Term Plan.

!The THRIVE Framework
The THRIVE Framework conceptualises the mental health and
wellbeing needs of children, young people and families into
five needs-based groupings: 
[img[THRIVE framework.PNG]]

!!!!!//(Image taken from 'THRIVE: The AFC-Tavistock Model for CAMHS (2014)')//





!Implementation
Since its creation, the THRIVE Framework has been extensively implemented across England. It has been the basis for service transformation plans in many child and
adolescent mental health services. 

Already, half of all children and families live in an area that is using this Framework. Services in these areas have seen major improvement in waiting times and using their resources efficiently.

!!The i-THRIVE Programme
i-THRIVE is the implementation of the THRIVE conceptual framework, using an evidence based approach to implementation in order to translate the principles of THRIVE into models of care that fit with local context.

// i-THRIVE Approach to Implementation to implement the key principles of the THRIVE framework.//

!Versions of THRIVE

There are three existing iterations of the Framework. Each includes further detail than the last while the fundamental ideas of the Framework are unchanged. 

#[[THRIVE: The AFC-Tavistock Model for CAMHS (2014)|http://www.implementingthrive.org/wp-content/uploads/2016/03/Thrive.pdf]]

#[[THRIVE Elaborated (2015).|http://www.implementingthrive.org/wp-content/uploads/2016/03/thrive-elaborated-2nd-edition-2018.pdf]] Included more details of the work on case mix adjustment to underpin a new payment system for child mental health services that influenced the development of the Framework.

# [[THRIVE Elaborated: Second Edition (2016)|https://www.annafreud.org/media/9243/thrive-elaborated-second-edition-2016.pdf]]. Included a new foreword emphasising the multi-agency and multi-sector scope of the Framework.


!!References: 

Wolpert, M., Harris, R., Hodges, S.,
Fuggle, P., James, R., Wiener, A.,
...Munk, S. (2019). THRIVE Framework for system change. London: CAMHS Press.

See [[CWP site map]] for further information as to how the information is organised in this guide. 


 
<<list-links "[tag[Teaching]]">>
Just as with a young person, the idea is to make contact with the group and clarify the purpose of the session. Apologies if this is very basic but it is easy for this to be missed. This should only take a few minutes. 

1. @@color:red;''How are you?''@@ What do you want from this session? What have we planned? These simple enquiries enable the group to have a sense of coming to a shared understanding about what the session is about. 

2. @@color:red;''Setting out some key learning objectives''@@ which preferably link to CWP competencies. 

3. Where possible, @@color:red;''making reference to previous teaching sessions''@@ and how this fits with the session you are about to do. 

There is a risk that, with different teaching staff, the content of the sessions becomes disconnected and, as with families, it is the job of the person leading the session to help the CWPs make these connections. 

1 session = half a day and the job plan adds up to 10 sessions to reflect a full time job (5 days a week).

__July – August:__
Ad hoc depending on leave and service requirements

*HEI guidance suggests that CWPs should reserve 1 day a week over the summer months for study time

__September to December: __

* 1 session of clinical supervision (individual and group)

* 1 session ongoing group skills training (either with supervisor or within peer group)
* 4 sessions training at Kings (Thursdays and Fridays)
* 1 session for bigger admin (inputting cases onto the system, writing notes, writing reports etc)
* 1 session for course assignments
* 2 sessions for clinical work (= picking up 6 new cases each over the quarter, plus any ongoing cases picked up in July / August)

This is a very generous training job plan and can of course be tweaked to suit different services.  It might be that a whole session for big admin is too much unless CWPs are also doing triaging and having to write up assessments.  Services may also wish to cut down the ongoing skills training to half a session to give half a session for triaging if this needs to be part of the CWP job plan.  I’m going to play it by ear and adjust as necessary as my trainees won’t be doing any triaging.  Instead, I might ask them to create more clinical materials during that session if a whole session feels too much for ongoing skills training, on top of the supervision allowance.

__January – March:__

* 1 session of clinical supervision (individual and group)
* 1 session ongoing group skills training (either with supervisor or within peer group)
* 1 session for bigger admin (inputting cases onto the system, writing notes, writing reports etc)
* Half session for working on service evaluation reports and other ongoing service development issues
* 6 sessions for clinical work (= picking up 18 new cases each over the quarter, plus finishing the ongoing cases from the previous quarter)
* Half a session for slippage / anything I have forgotten to include!
__
April – May 25th (when the first year ends):__
This is not a full quarter and job plans will be dependent on whether the service has agreed ongoing funding or not.  If funding is agreed and the project is ongoing then I have in mind a rough job pan of:

* 1 session of supervision (individual and group)
* 1 session of bigger admin
* Half a session for CPD and keeping skills up to date
* Half a session for ongoing mandatory training / other Trust requirements / other meetings
* 7 sessions of clinical work (21 new cases a quarter)

This has been developed based on the assumption that once they are properly up and running, CWPs will be able to see 4-5 cases per clinical day (2- 2.5 cases per clinical session).  The maths does add up so that they should be able to see an ongoing caseload of 21 new cases per quarter without getting a backlog.  This will of course be more squeezed during the quarters when they take leave but will even out again during the quarters when they don’t take so much leave.
!!!!!Source: Laura Bowyer 
!!''The role''

*Provide early intervention for children with mild to moderate low mood, anxiety and behaviour problems
*Community focused - less about families having to travel (requiring people to come to appointments and more reliance on technology e.g. phone / skype)
*Signposting and helping parents and CYP to actually access resources in the community 
*Can also make use of bibliotherapy schemes 
*Provide guided self help as one of their main interventions – this might be 1:1 or in a group, or in workshop formats
*To support wellbeing and strengthen or ''restore existing helping systems'' (e.g. often parents)  by considering what evidenced-based material might be useful to that family or young people.
*Can be seen therefore as ''more of a coach and not a therapist''. 
*Although it is likely that the role will vary from one service to another (might be asked to take on additional service specific tasks), it is important that the work within the service reflects the principles of guided self-help as taught at University.

!!''The stance''
*The basic premise of the guided self help approach is to aim to support the young person or parent to take an active position in relation to the varying difficulties. 
*The stance is to encourage and be confident that the young person can do things for herself even though she may not believe this to be the case. 
*It is a stance of gentle and sympathetic optimism  in which you are continuously looking out for examples of the young person helping themselves (e.g. texting a friend for help) or challenging  in a warm way the beliefs that the problem is bigger than the person.
*The skill in adopting this stance is to find a balance between a sense of optimism and a capacity to attune to the current feelings of the parent or young person. Just being attuned to the young person may not help them to change but being too positive and optimistic can lead the young person to feel misunderstood. Each practitioner will develop their own way of finding a middle to that dilemma. 

!!!Source: Charlotte Hepburn
It is important to understand the ways in which the brain develops during adolescence and the effect this may have on a YP motivation and ability to engage with LI interventions. 

Dan Siegel has developed a useful animation on the development of [[the adolescent brain|https://www.youtube.com/watch?v=0O1u5OEc5eY]] this is useful for EMHPs to gain a better understanding of how best to engage YP but also may be of interest to YP, families and teachers.

Related pages:

<<list-links "[tag[Adolescent Development]]">>
!!!''What do we mean by CAMHS?''

CAMHS is an acronym for Child and Adolescent Mental Health Services. 

Within CAMHS there is often a part of this service which is called //Specialist CAMHS//. This usually refers to the traditional assessment and treatment service provided by the NHS in each area. Over the last twenty years, there has been an increasing variety of additional mental health services for children and young people which may be provided by the voluntary sector or by schools and social care. 

For many years this range of services was described in terms of Tiers and there were four tiers of services. This framework is used much less nowadays but you will still hear people talk about services as being Tier 2 or Tier 3 so it is useful to know what these mean. 

!!!''The Tier System'' 
Tier 1. This recognises the role played by universal services such as schools in supporting children and young people with mental health matters. School teachers and parents play a huge role and this should not be forgotten in thinking about how to help. People in this level of service would not consider themselves as formally part of a CAMHS service. 

Tier 2. This is provided by practitioners with some mental health training working in community settings such as schools. Such services are often provided by a single practitioner such as a school counsellor and focus on problems of moderate severity. Often such services may be the first line of treatment or help to a child, young person or parent. 

Tier 3. As said above, this is often referred to as Specialist CAMHS and is a multi-disciplinary team including child psychiatry, psychotherapy, family therapy and other professional groups.  Problems addressed at this level are generally more severe than those seen at Tier 2 settings. 

Tier 4 This usually refers to highly specialist teams or to In-patient units. So all Child and Adolescent In-Patient Units would fall into this category. Referral to such units is usually through a Tier 3 service.  

!!!''Moving away from a tiered system - Thrive Model''

The Thrive Model is a conceptualisation that outlines groups of children and young people and the sort of support they may need, by drawing clearing distinctions between treatment on the one hand and support on the other. The model conceptualises four clusters for young people and their families with mental health issues and ways in which they can seek support depending on their personal needs. A number of CWP partnerships describe themselves as sitting within the 'coping' and 'getting help' quadrants of the Thrive Model. 

{{Thrive Model.png}}

!!!''How would you describe CAMHS to a parent?''

Each local area will have information about CAMHS both in leaflets and on a website. It would be helpful to direct them to this. This will explain the local ways of working etc. 

Parents and children are often nervous about mental health services so the initial introduction to such services needs to be done with care. As a CWP, it may be useful to find out what a parent or young person might be worried about about such a referral and then to consult a colleague as to the best way to come back to them as to how best to address their concerns. The important thing is for the parent to experience the process as being something that they have some control over and can make up their own minds as to whether this would be useful for them. 

The CWP programme is a new addition to helping children, young people and parents with things that they become worried about that are linked to a child's wellbeing. The way that the CWP programme links to the local CAMHS will vary from area to area. 

This online guide is designed to make information as widely accessible as possible. Using a wiki-based manual to ensure the most effective ways of helping people can be tested, shared, and effectively replicated in services. 

Wiki's (from the Hawaiian word for Quick) allow text, videos, and downloadable coontent to be easily adapted as learning continues to advance. 

Rather than offering a single, rigid structure, the online guide is non-linear and uses: 

*Hyperlinks (web-links that allow you to access expanded detail about a particular word or phrase) 
*Tagging (which allows thematically linked content to be grouped in different ways – like flexible versions of chapters) 
*Powerful search engines allow content to be approached and navigated according to the readers needs. 
CYP-IAPT stands for ''Children and Young People's Increased Access to Psychological Therapy''. 

The CWP Programme is part of the CYP-IAPT Programme which has been going since 2011. 

https://www.england.nhs.uk/mental-health/cyp/
provides basic information about the National CYP-IAPT programme. 

The five key principles of CYP-IAPT are:

1. Evidence based practice

2. Outcomes monitoring

3. Client participation

4. Improving access to help

5. Awareness of mental-well being and to reduce stigma
!!!!By Sarah Thompson and Shayo Bryan-Fenelon, CWPs at SLaM

[img[The CWP BAME INCLUSION GROUP LOGO x 4.png]]

!! https://www.linkedin.com/groups/8873855/

[img[group-diverse-kids-standing-together_53876-22754.jpg]]



!!! 






!

!

“We are not fighting for integration, nor are we fighting for separation. We are fighting for recognition as human beings...In fact, we are actually fighting for rights that are even greater than civil rights and that is human rights.” -Malcolm X (Black Revolution) 


“Not everything that is faced can be changed; but nothing can be changed until it is faced.” -James Baldwin (As Much Truth As One Can Bear, New York Times) 


“Oppressive language does more than represent violence; it is violence; does more than represent the limits of knowledge; it limits knowledge.” -Toni Morrison (Nobel lecture, 1993)



“Ignorance, allied with power, is the most ferocious enemy justice can have.” -James Baldwin (No Name in the Street)



!! ^^^^Who are we?

[img[fonds-ecran-groupe-enfants-qui-s-amuse-10-1024x685.jpg]]

!!! Mission Statement:

The Children’s Wellbeing Practitioner BAME Inclusion Group is a space for professionals to discuss, reflect and share ideas regarding how psychological services may become, have been, or can continue to be inclusive of all. The group is a national and international think tank existing to explore avenues that may enhance, promote and uphold BAME engagement with early intervention services through encouraging conversation. It aims to unearth ideas considering best practice, adaptation of resources, service development, and share existing and emerging theory.
We hope to inspire practitioners, particularly CWPs, to develop early intervention practices that engage CYP’s representative to the local and general population, inclusive of ethnic diversity. Together we can reduce the incidence of crisis being the first point contact for ethnic minority clients’ entry into psychological services.

[img[Join the Largest MDT Ad.png]]








!!Why did we use the 'BAME' acronym in the group's name?

The acronym BAME and the initialism BME are useful to a degree but we acknowledge their limitations. ‘BAME’ stands for ‘Black, Asian and minority ethnic’ and ‘BME’ stands for Black and Minority Ethnic’. We have used 'BAME' as it is widely used by government departments, public bodies, the media and others when referring to ethnic minority groups. It was also seen to be the most appropriate reference for person's represented by these communities at the time of developing the group name.

The UK government creates new acronyms and initialisms on a regular basis which can be catchy and convenient. However, acronyms and initialisms are not always well thought through. Should we find the use of 'BAME' falls out of favour with the communities for whom we are using the 'BAME' term to represent; or we discover this terminology to denote negative connotations that are hurtful to people; or a more appropriate reference term becomes available, we will redact and/or replace 'BAME' with a more suitable and fitting reference term.

!!!!The Children's Wellbeing Practitioner BAME Inclusion Group

https://www.linkedin.com/groups/8873855/


<<link-doc "CWP BAME inclusion group flyer" "https://drive.google.com/file/d/1OKiWCRxNMBDSgf8zHW3zV9WasUefGqnD/view?usp=sharing">>

!!!!Source: Joe Hickey

!!The cycle of change

The cycle of change comes from a area of work known as the transtheoretical model (TTM)of behaviour change.

It is called transtheoretical because it can be applied to a range of different types of intervention. The ideas originated in work around habit change (smoking cessation). 

The approach helps to assess the stage of change that a person is at which in turn helps support the [[Therapeutic Alliance]].

It provides a framework to assess the stage of readiness to change that a client may be  at. It can also inform reasonable [[goal|Setting Goals]] setting.


Please see the diagram below outlining the different stages of behavior change:


[img[Transtheoretical model of behaviour change.PNG]]

__Precontemplation:__ The child does not intend to change soon.

__Contemplation:__ The child is considering whether to change. 

__Preparation:__ The child is getting ready to change.

__Action:__ The child is engaging in change now.  

__Maintenance:__ The child has made a change and is working to keep it going.

__Relapse:__ The child has reverted to the previous behaviour

!!Practice points
*The child, parent/carer, teacher, siblings etc. may all be at different stages of readiness to change.
*How important is it to the young person (and others) to make the change?
*How confident are they that they could achieve the change, if they tried?

!!Links with other pages 
The material in this page links with a range of pages about [[Engagement]]. 
The Dinosaur Programme is the Incredible Years Programme for primary school aged children. It is prevention programme teaching children social skills. 
Children are taught to problem solve, to identify feelings and then to develop ways of managing feelings.  

The link below gives an introduction to the Dinosaur Programme. 

https://www.youtube.com/watch?v=73zYE-FDnIs
[[Hot Cross Bun.png]]

From: http://psychologytools.com/cross-sectional-formulation.html

It is extremely important to feedback to children, young people and parents what you have learnt form the questionnaires that they have filled in. ''No client should be asked to complete a questionnaire that is not fed back to them.'' Feeding back results from questionnaires will need to be practiced as part of the skills sessions. 
A number of principles need to be borne in mind. 
#recognise the effort that has gone in to doing the questionnaire (//e.g. 'Thanks for doing this. People often find doing these forms a bit of a faff.'//)
#scores form questionnaires are not 'facts' but are a helpful way of making sense of complicated matters. 
#clients should be encouraged to give their views about what you have understood from the questionnaire ('//e.g. it seems that you get most anxious meeting people and less anxious about things like travel or homework. Does this seem right to you?//)
#balance feedback between strengths and difficulties. (//e.g. some people get really bothered about going to bed but this seems to be no problem for you. However, I can see that getting ready for school is a real struggle for you.//)
#be clear(and empathic!) when there is understandable room for concern.(//e.g.'I can see that when you get low, this is not just being a bit miserable but is much more than that. This seems ot be something that i really impacting on your life.'//) 
#always check at the end of your feedback if they have questions about what you have discussed with them. 
The Incredible Years Programme was developed by Carolyn Webster Stratton. This programme of work has been hugely influential in developing evidence based approaches to aggressive behaviour.

Here is a link to a youtube presentation by Carolyn Webster Stratton in 2006 where she outlines her approach to aggression in young children.  

https://www.youtube.com/watch?v=FCmikgiL5zQ


A video testimony of a parent who has done the incredible years programme can be seen here. 

https://www.youtube.com/watch?v=73zYE-FDnIs
!!!!By Paula Nyklewicz, CWP at SLaM

!THIS PAGE IS UNDER CONSTRUCTION 

https://drive.google.com/file/d/1mVMqLfFVXdYUdIU4wKTdfdKzOmhIUl2Y/view?usp=sharing

https://drive.google.com/file/d/1newLyo2-WCmehQoF0hydM4laCiVDVT1_/view?usp=sharing

https://drive.google.com/file/d/1rgs0JjqtX-uis8B5KXFj2y-vV7sXNv9C/view?usp=sharing

https://drive.google.com/file/d/1j8-ADi4dUo2ItRRqvdM33WfZncGf7GpV/view?usp=sharing

https://drive.google.com/file/d/1WE9uKye07HVsOmeC-dtaasioCcxMG30h/view?usp=sharing

https://drive.google.com/file/d/1PWaAnuo5tWFR6hViapQmGcZmcoty1ps5/view?usp=sharing

https://drive.google.com/file/d/1CEho5pXHrypEJhQWNUbUIc3aJW-GxUjO/view?usp=sharing


!!!The Children's Wellbeing Practitioner BAME Inclusion Group

https://www.linkedin.com/groups/8873855/

!!!!Source: Laura Bowyer

!!''The principles of guided self help (GSH)''
Guided self help aims to increase coping and self management capacity within clearly agreed time frames and resources.

This means the practitioner is often in the role of a coach, supporting the young person to practice things and try new ideas to help cope better. 

The core principle of GSH interventions is that the expertise is seen to exist in the self help materials that are being shared with the client AND in the practitioner's expertise in making this knowledge available to the young person or parent, their knowledge about common pitfalls and their creativity in overcoming these. This is ''guided'' self help in which the practitioner plays a very active role. Self help is not about letting the young person do it on their own. 

The young person/parent and practitioner learn/work together. The expertise of the practitioner is in helping the client to access and utilise the materials which they are being offered and in the practitioners familiarity in how best to make use of these ideas. In this way, the practitioner is not expected to hold a position of unique expertise about the problems being presented but a position of knowledge of materials that might help this problem or condition. 

Practitioners should remain curious as to what ‘helping’ means for the young person/parent. The role of the practitioner is not to provide all the answers or to ‘tell’ or ‘advise’ a young person or parent what to do, but rather to listen, and consider the following kinds of questions: 

*Why do you want to change? And why not?
*Have you had ideas about how you might do this?
*How important is it to you and why?

The ''helping process is like a learning course'' with clear objectives at the end of the course that the client will have learnt both knowledge and skills in relation to their problem. They then decide whether, or not, to go on to use such knowledge and skills.

GSH itself should have a ‘curriculum’ with a clear beginning, middle and end that is planned and transparent from the beginning. The assumption is that the client will be aware of the ‘course’ that they are doing from the beginning, will know what is involved and will be able to anticipate the completion of the course from the beginning. 

Just like any course e.g. ballet or a language course, there is no surprise when the course finishes after e.g. 7/8 contacts or sessions. Having clear course materials which describe the course that can be shared with the client at the beginning is important for the process of GSH. 


!!Key aspects
#''What will be offered?'' - guided self help interventions 
#''Who for?''- for children, young people and parents. 
#''What problems?'' - low mood, anxiety and common behaviour problems 
#''How severe?'' -mild to moderate level of difficulty.


!Key responsibilities in CWP
*Provide early intervention for children with mild to moderate low mood, anxiety and behaviour problems
**Self harm is no longer going to be a separate intervention. It will be in relation to helping CYP with low mood
*Community focused less about families having to travel (requiring people to come to appointments and more reliance on technology)
*Signposting - in practice we need to be thinking about how to help families to actually arrive (helping parents and CYP to actually access these)
*Guided Self help 
*Thinking about what will be helpful for this population - e.g.children use to internet/apps etc not paper 
*Although it is likely that the role of the CWPs will vary slightly from one service to another and CWPs might be asked to take on additional service specific tasks, it is important that the work within the service reflects the principles of guided self-help as taught at University. 
*It should be emphasised that this is a training post supported by in-service work and supervisors should support trainees to ensure that the work they do in the service is reflective of the skills they have learnt whilst training.
Source: Charlotte Aubrey 

!!What is SEND?
SEND stands for ''Special Educational Needs and Disability.'' Children or young people with SEND are described as having a learning difficulty or
disability which calls for special educational provision to be made for them. ''Special educational provision'' is provision that is additional to or different from that which would normally be provided for children or young people of the same age in a mainstream education setting.



!!!What is a learning difficulty?
Children have a learning difficulty if they:

# Have a significantly greater difficulty in learning than the majority of children of the same age
# Have a disability which prevents or hinders them from making use of educational facilities
# Are under compulsory school age and fall within the definition at (1) or (2) above.
# Children must not be regarded as having a learning difficulty solely because of language barriers

!!The Children and Families Act 2014
The Children and Families Act (2014) reformed legislation relating to children and young people with special educational needs and disabilities (SEND).

The Act identifies social emotional mental health difficulties (SEMH) shift to closer link between mental health needs and learning difficulties 

!!!Part 3: Children and young people with special educational needs and disabilities.

This part of the act sets out the definition of SEND as well as the general principles that local authorities must have regard to when supporting disabled children and young people. It also has information regarding assessment plans and provisions for SEND students.

!!Core principles of the legislation:

Local authorities must pay particular attention to:

* the views, wishes and feelings of children and their parents, and young people
* CYP and their families participating as fully as possible in decision-making and providing the information and support to enable them to do so
*supporting children and young people’s development and to achieve the best possible educational outcomes. 


For a helpful overview please see below:

<<link-pdf "Overview Part 3: The Children and Families Act" "https://drive.google.com/file/d/1yps7kB8H5fvWHSIAV9LSrRQRE64bt72i/view?usp=sharing">> 

!!!SEND code of practice (2014)
The SEND Code of Practice provides statutory guidance for organisations that work with and support children and young people with SEND.
It highlights the duties, responsibilities and procedures relating to Part 3 of the Children and Families Act (2014).
There is a statutory duty on the Local Authority to develop and publish a local offer: sets out the support they expect to be available for CYP with SEND.

For the full SEND code of practice please use the link below:

<<link-pdf "SEND code of practice" "https://drive.google.com/file/d/1QQ3UekwRpLIcm2P8nyn1ww8_V_Oxo_yh/view?usp=sharing">> 


!!What this means for schools:

*Every school is required to meet the SEN of the children or young people that they support.     
*Teachers are responsible for progress of pupils.
*High quality teaching, differentiated for individual pupils, is the first step in responding to pupils who have or may have SEN.
*The SENCo and teacher should gather information on whether special educational provision is required (including wishes of pupil and parents).
*schools should take action to remove barriers to learning and put provision in place.
!!!Challenges for schools:
*Funding, pressure on teachers of exam success
*The role of the teacher- may not have in depth knowledge of SEND, or the time to manage students in the classroom!

!!The graduated approach:
SEN support should arise from a four part cycle, known as the graduated approach, through which earlier
decisions and actions are revisited, refined and revised, leading to a growing understanding of the pupil’s needs
and of what supports the pupil in
making good progress. The four stages of
the cycle are:

*Assess
*Plan
*Do
*Review

Outside agencies are often involved: educational psychologists, speech and language therapists, CAMHS professionals, paediatricians etc

Please see below for the full document by Nasen on the graduated approach:
[img[The graduated approach.PNG]]

<<link-pdf "Nasen: the
Graduated Approach" "https://drive.google.com/file/d/146pGBK_EK3cmjVWTSQGG_IrMiZX98n9a/view?usp=sharing">> 


!!Education, Health and Care needs assessments and plans (EHC)

*If, despite identification, intervention and assessment, the child/young person has not made expected progress, parents, schools and health professionals should consider applying for an EHC assessment.
* The EHC plan replaced Statements of Special Educational Need in 2014.
*Legal document outlines the child/young person’s needs and how they should be met most effectively. 
* it should include advice from all professionals involved, as well as the child or young person and their parents.
*it should be reviewed yearly and can be in place for a young person until they reach the age of 25. 
*updated/amended at key transition times, for example change from primary to secondary school

!!Practice points for EMHP
!!!General practice points
*EMHPs need to be mindful the children they see may have additional needs
*need to be mindful of the pressure on schools/ teachers over supporting children with SEN. 
*What additional needs are and what schools may mean by this 
*Understanding of code of practice and how the application in different schools may vary 
*What the process and procedures look like in a school. .
*How the process of graduated provision works in a school 
*Where work by an EMHP fits into a wider range of help for SEN. 

*''Don’t need to know the code of practice inside out '' but need to be aware of the context you are working in
*Parent may want child to focus on learning so the mental health needs may not be primary concern - you can: educate parent on mental health barriers to learning.
*Not all schools have a identified lead professional for SEMH and schools may call them different names
*You may be working with those that are involved in the ‘plan’ / ‘review’ stage of SEND support.

!!!When working with a child or young person:

*use a child's school file to gain an understanding of what SEND may look like and the plans/provisions surrounding a child.
*Need to think holistically about a child- socially and educationally 
*Consistency of support is important. Explain how your role fits in to this.
*emotional implications of additional support.

!!! When working as a part of the school:

*Good idea to check the local authority SEND provision of school
*Be aware some schools may not be recognizing the MH need as the child has complex SEND.
*Behaviour may reflect underlying MH difficulties, schools may not see this: you can provide this information
 *You can ask for examples from the school/ ask about Provision map, SEND plan, interventions provided for SEND students, how many students have EHC
*Can point schools to [[NICE guidance |NICE guidance for social and emotional wellbeing]]


!!Videos
Kate Browning, Acting Education Officer  provides a one hour talk on the SEND framework and particularly the graduated approach and the value of whole school practice. This can be found at 
https://www.youtube.com/watch?v=6CBGR1IGOS8

There is a useful six minute explanation of the SEND Framework with a particular emphasis on what happens post 16 can be found below:
  
https://www.youtube.com/watch?v=8WgEaB7AWl0

!!Links with other pages
Pages linked to special educational needs can be found by going to [[Working in Schools]] which lists pages relevant to this page. 
!!!Example: The Slot Machine Analogy 
Sometimes to illustrate the above it can be helpful to explain to parents that many people play slot machines not because they win every single time but because they win every now and then. This occasional reinforcement is enough to keep them returning to the slot machines in the hope that they will win. Parental attention (whether positive or negative) can work in the same way for children. So you can explain to parents that if they begin to selectively ignore a behaviour and then suddenly after 5 minutes provide attention this makes it more likely the behaviour will happen again. Their child has simply learnt that if they escalate their behaviour their parent will give in. You can if you wish relate this to the parent trap (coercion hypothesis) we spoke about at the beginning of the programme.
!!!! Explored and Explained by Isaac Cook, EWP at SLaM


[img[Social Graces Model V1.png]]


This is the Social Graces model. It is a framework for understanding aspects of identity, and how it influences our practices. This model is not set in stone, however, as practitioners are constantly adding new graces to the model, and sometimes taking away graces that may have become outdated.

The original model was developed by John Burnham in 1993, for the purpose of aiding practitioners to talk through the different elements that make up a person’s identity, and how they might impact our relations to others. The Social Graces model is often used in practice to identify implicit biases, so that they can be neutralised, creating a more open minded, fair and considerate practitioner.


!!! Strengths and limitations of the model:

[img[Strengths and Limitations of Social Graces Model V6.png]]




	

!!!! Some useful references:

Burnham, J. (1993) Systemic supervision: The evolution of refl exivity in the context of the supervisory relationship. Human Systems, 4, 349- 381.

Burnham, J. (2005) Relational reflexivity: A tool for socially constructing therapeutic relationships. In: C. Flaskas, B. Mason & A. Perlesz (eds.), The space between: Experience, context and process in the therapeutic relationship. London: Karnac.

Burnham, J. (2012) Developments in social GRRRAAACCEEESSS: Visible-invisible and voicedunvoiced. In I-B. Krause (Ed.) Culture and Reflexivity in Systemic Psychotherapy. Mutual Perspectives. London: Karnac.

Burnham, J. & Roper-Hall, A. (2017) Commentaries on this issue. Context, 151, 47-50.

Butler, C. (2017). Intersectionality and systemic therapy, Context, 151, pp. 16-18.

Totsuka, Y. (2014). ‘Which aspects of social GGRRAAACCEEESSS grab you most?’The social GGRRAAACCEEESSS exercise for a supervision group to promote therapists’ self‐reflexivity. Journal of family Therapy, 36, 86-106. DOI: https://doi.org/10.1111/1467-6427.12026


!!!! The Children's Wellbeing Practitioner BAME Inclusion Group

https://www.linkedin.com/groups/8873855/

!!!The anxiety equation
You may want to use this tool when discussing the young persons problem and how much it is impacting them. As such it is a good tool to use either in a session 0 or a session 1 (Depending on what you are covering in each)

*How likely an event is/how horrible it will be/coping (self and others)
*This can be worked on in treatment - helping YP to see that things aren't as likely as they think and that they can cope even if things do go wrong 

<<link-pdf "More on the Anxiety equation" "https://www.perera-delcourt.co.uk/single-post/2016/05/05/The-Anxiety-Equation-in-Cognitive-Behavioural-Therapy-A-simple-tool-for-breaking-down-your-fears"">>
All interventions with children, young people and /or parents consist of a similar pattern of contacts for either anxiety, low mood or parenting. 
This consists of 8 sessions/contacts, either face to face or by phone and each sessions follows a similar structure using the guided self help approach. 

All the specific sessions of each intervention (either anxiety, low mood or behaviour) are described in [[Session Plans]]. This page will provide the overall structure of the help that is offered.

It is recognised that this plan will vary for different young people but it provides the basic framework of the intervention. This intervention will follow an initial [[Choice appointment]] to consider options for help. 

An example for a person seeking help for anxiety would be: 
#Session 1. Face to face meeting. Parent and young person. Review psycho-educational material, making sense of things, setting goals, agree plan. 
#Session 2. Telephone contact. Encouraging of diary keeping, psycho-education. 
#Session 3. Face to face meeting. Addressing avoidant behaviour  
#Session 4. Telephone contact. Supporting exposure work
#Session 5. Face to face. Exposure work (review session involving supervisor either face to face or not) 
#Session 7. Telephone contact  
#Session 8. Face to face with parent and young person  Consolidating the back up team 
#Follow-up Session Follow-up session (one month after session 8)

[[Moderating factors to this basic intervention plan]]

[[Introduction to self help materials]]
 

 
!!!The basic stance - a definition  
The basic stance of the of the practitioner using a guided self help approach will have a number of the following components. Guided self help for the child, young person or parent will generally:
*''emphasise and support the client to adopt a sense of agency in relation to their problems/difficulties''. 
!!!What does loss of agency look like?
Mental health problems such as anxiety, low mood, self harm and/or oppositional behaviour are intrinsically distressing and can cause enormous human suffering through the mental states that are associated with these conditions. However, in addition to this phenomenological experience, these conditions also have the secondary impact of reducing the capacity of someone experiencing these states of mind to adopt a an active stance in relation to addressing them. Loss of agency is a key important secondary effect of many mental health conditions. 
Here are some features 
#belief that one's own efforts are unlikely to change the problem
#belief that change can only occur through the input of others including professionals. 
#adoption of highly passive styles of behaving combined with strong sense of hopelessness. 
!!!Some aspects of the core stance
The core stance for the worker in delivering guided self help is to instill and communicate a sense that the client does have capacity to make changes in their life, however severe their difficulties or powerless they may be in the face of important contextual factors. The stance is neither critical of the client or minimising of these conditions but does not treat such states of mind as 'facts' but as understandable reactions to human distress. An example of the approach is, in ways that are respectful and as attuned as possible, to consider that there are small steps to make this week a little different from the previous week. In short the stance is one that some degree of agency can be stimulated even in the most difficult circumstances. Part of the common struggle of this type of work is that the client will often seek to convey that agency in relation to the problems presented is not possible and that the problem needs to be addressed by others. 
!!!Methods which support a sense of agency
This will include several of the following components as a way of enhancing a sense of agency. 
#have explicit learning objectives rather than objectives of recovery or 'remission'. 
#will make suggestions about ways of thinking about the problems and things to try out. 
#will continuously seek feedback about the suggestions made and processes of trying things out. 
#will explicitly adopt a position of hopefulness and optimism characteristic of the role of 'coach'.
#will explicitly share knowledge/research with the client where this fits with their problems/difficulties.  








 
!!''Introduction''
As a first step to engaging in low intensity help, the parent or young person will need to have a contact with the service (either telephone or face to face) in which the client decides the sort of help that they would like. Sometimes referred to as a choice appointment or session 0.

This ideas around this part of the help process  is hugely indebted to the CAPA model (Choice and Partnership Approach) developed by Ann York and Steve Kingsbury and also to the work of Miranda Wolpert and her team around [[Shared Decision Making]]. 

The purpose of the Choice process is that by the end  of the meeting, the young person or parent will have come to a collaborative decision about the sort of help that they would like to engage in. This is probably best done face to face but could be done by telephone if this is preferred by the parent or young person. 
!!!''Before the Choice contact.''
There may have been telephone contact with the parent and the parent and/or young person to discuss the referral and set up a first contact. The parent will be asked to complete appropriate questionnaires which will include the Parent SDQ for all cases and selected questionnaires depending on the nature of the referral. 

These questionnaires need to be returned prior to the appointment and to be scored before the appointment. These help to orientate the worker prior to the meeting. 
!!!''The Choice process''
This needs to cover the following:
#basic introduction and [[Engagement]].
#hearing about the problem.  [[Making sense of things]].
#[[Enquiring about strengths]] 
#exploring their ideas about what would be helpful and what has been helpful in the past [[What is helpful for the client?]]
#sharing ideas about how the service could help (by [[Signposting]] to self help materials, by offering low intensity guided self help,by referral on, by watchful waiting or by jointly deciding to take no further action.) 
#[[Agreeing a future plan]] including a small task to do before the next contact. For many case, this may be a modest diary keeping task. 
#provide client with guided self help materials e.g. Overcoming anxiety  
#agreeing with time and date of next contact (if this is part of plan)   
Respecting the expertise of the parents is a really important factor- keep in mind every family work in a really different way 
Validate their feelings about what is happening without validating their behaviours e.g. 'I understand that must be really frustrating for you...'
Show them the kindness you want them to show their children i.e. picking out the things that went well 
!!!!!Source: Deb ~McNally and Manchester Collaborative 

The National Institute of Clinical Excellence (NICE) recommends the following interventions for treatment of conduct problems and ADHD

*''Group parent training programme'' recommended for the parents of children and young people aged between 3 and 11 years who have been identified as being at high risk of developing oppositional defiant disorder or conduct disorder or have oppositional defiant disorder or conduct disorder or are in contact with the criminal justice system because of antisocial behaviour.

*Group parent training programmes should involve both parents if this is possible and in the best interests of the child, and should be based on a social learning model, using modelling, rehearsal and feedback to improve parenting skills. They typically consist of 10 to 16 meetings of 90 to 120 minutes' duration and should adhere to a developer's manual and employ all of the necessary materials to ensure consistent implementation of the programme.

*The evidence base for group parent training is clear, and therefore brief guided self-help parenting intervention on an individual basis should not be used as a substitute for group work. Low-level guided self-help intervention could be used as a precursor to groups or where there are no groups available in the area at that time. 
For many forms of help around matters of wellbeing or mental health, the process involves a relationship with a helper. There is a relationship between the 'helper' and the 'helped'. Some forms of help rely relatively little on this such as bibliotherapy (encouraging people to read about how to help with their problem).   But in the main, ''help is a relational process''. 

Many writers have written extensively about this helping process. An extremely clear and well developed model has been developed by Crispin Day at Kings College London who has developed the Family Partnership Model (FPM). This identifies the key components of effective help and is applicable to  many forms of help. It is a goal based model of help and aims to enable clients to move into position of actively addressing their problems and achieving shared and agreed goals form the beginning of the process of help. 

Practitioners influenced by more psychotherapeutic and mentalization based models of help have often given more prominence to the value of clients gaining an understanding of their difficulties and that a sense of feeling understood by another person is seen as intrinsically beneficial to the wellbeing of the client.  This is present in the FPM approach but does not occupy such a central position in the work. 

 

This topic can be linked to session on assessing children with both educational and mental health problems.  The impact of reading difficulties on wellbeing for pupils in school needs to be recognised as having the potential to have a major impact on a child's experience of school as a whole. 
Guided self help has a primary purpose:
#''to increase the capacity of a parent or young person (or family) to more  effectively manage their current problems/difficulties''
This will usually involve a number of  secondary aims or components:
#to enable the child, young person and/or parent to make explicit decisions about how they would like to try to make things better 
#to strengthen helping relationships for the child, young person or parent that support more effective self management
#to recognise and utilise the strengths and individual preferences of the child, young person and/or parent 
#to support the child, young person or parent to reduce the impact of negative cognitions and/or negative relationships which tend to maintain the problem/difficulty. 
!!!!!Source: Peter Fuggle

Tags in the wiki are like chapter headings in a book. You have main chapter headings and then sub headings etc. 

!!''Primary Tags''

The primary chapter headings are the buttons at the top of the screen. 

!!''Secondary tags''

Secondary tags are listed below for each of these primary chapters. 

!!!''Helping''

*[[Helping: Low Mood]] 

*[[Helping: Adolescent Anxiety]]

*[[Helping: Child Anxiety]]

*[[Helping: Behaviour problems]] 

!!!''Learning''

*[[Child/Adolescent Mental Health Problems]]

*[[Outcomes]] 

*[[Guided Self Help]]  

*[[Psychoeducation]]

*[[Low Mood]]

*[[Child Anxiety]]

*[[Adolescent Anxiety]]

*[[Behaviour Problems]]

!!''Tertiary tags''

At this level, the tagging becomes a little less structured. There are some general rules. 

For example, for pages that particularly related to aspects of practice rather than theory or research may be labelled as 

*[[Anxiety practice]]
*[[Low Mood practice]]
*[[Guided Self Help practice]]

Pages more related to knowledge and research may be tagged as 

*[[Guided Self Help knowledge]]


!!!!Principles of Behavioural Change
Two TED talks below which explain aspects of theory of behavioural change.  
https://youtu.be/6T9TYz5Uxl0
https://youtu.be/AdKUJxjn-R8
!!!!Source: Joe Hickey

!!What is a therapeutic alliance?
It is the nature and strength of the interpersonal relationship between a client and practitioner. ''There is always a therapeutic relationship'' between practitioners and clients, if someone describes there as being 'No relationship' might suggest a withdrawn relationship.

Tripartite model (Bordin, 1979)

*Shared goals between client and therapist
*Agreement on the tasks taking place
*The bond between the client and therapist

[img[Tripartite model (Therapeutic alliance).PNG]]

This is a reciprocal relationship in which the child or young person is an active participant

!!Systems around the CYP

*Practitioner-CYP alliance takes place in context of the systems around the child
* How the child ends up being sat in front of you affects building relationship - A child often doesn’t bring themselves to sessions (adults do) 

[[Bronfenbrenner’s ecosystemic theory diagram|https://www.google.com/search?q=Bronfenbrenner%E2%80%99s+ecosystemic+theory+diagram&rlz=1C1GCEB_enGB848GB848&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjIrKu2wqLiAhUJUhoKHWnDBpMQ_AUIDigB&biw=1920&bih=969]] shows how wider systems but also different levels within the school may effect the context of the therapeutic alliance.

Complex systems theory suggests that there will be unintended consequences of interventions.

!!Child development
It is important in your work as EMHP's to work within the parameters of a CYP developmental level. Furthermore all the work you do in schools will be framed by developmental milestones as this is how school practitioners frame their work.

__Some key things to note:__

* There are multiple ‘critical periods’ for brain development during childhood (Rationale for CYP and families to make change during before adulthood).
*Keep a typical developmental track in mind when you meet a child and family. 
*Your work always needs to reflect the child's stage of development, not just their age.
*Theories of child development focus differently on the mechanism or the organism. 
*Epigenetics is a helpful way to combine these perspectives. 
*Social learning theory and sociocultural theory are influential in schools.
*Social learning theory and information processing theory are foundations of the low intensity interventions you will be doing.  
*All therapeutic work needs a theory of development and learning.

!!Practice points:

*Use [[Building a Therapeutic Alliance]] page to guide your practice
*Child development will strongly effect therapeutic alliance and school practitioners will frame all of their work around this
*Reflect back on how the client feels when they talk to other people, in regards to the young person talking to you. 
* Need to prepare your child for the short nature- setting expectations.
*Not all of your work will be successful in creating change
*Other people within a school setting will impact the therapeutic alliance and the therapeutic outcomes
*Constantly reflect on whether the relationship alliance is good
*Reactions need to be well attuned to what is being said in the session these need to change as the topics change 
*Be mindful not to get too draw into the content i.e. what happened next rather than how that made them feel 

!!Links to other pages

There are a number of pages around [[Engagement]] which are highly related to this topic.

!!!Tips on competing activity log for young people 
*You will remember more activities if you get into the habit of writing them down 
*If it’s easier, keep your logs super brief, e.g. ‘lunch with Sam’, ‘did homework’
*If giving a 0-10 rating is too hard, just put a tick if the activity gave you a sense of achievement, closeness, and/or enjoyment, and if you felt it was important to you
*It’s ok if it’s not all complete, just do as much as you can
*Put the activity log somewhere you’ll see it regularly- on your bedroom wall, by the computer, on the fridge?
*Try setting a reminder on your phone for a time you’re likely to be free (e.g. after dinner)
*If you’re somewhere where it’s not easy to fill in the log, send a text or email to yourself
*Put a post-it somewhere you can’t miss- on your mirror? Next to the light switch? 
*Ask your parents to remind you
*It is helpful to know the diagnostic criteria so that you can know what to look for when meeting with young people.  
*Irritability is a core symptom in adolescents - start with this kind of question as it might be easier for young people, especially males to express. 
*Sleep is the most common symptom in adolescent depression 
*Concentrating is affected which means they might find it difficult to engage in therapy 
*Parents have been found to under report symptoms so important to hear from both sides if possible. 
*Anxiety commonly occurs at the same time, particularly social anxiety   
*Low mood is related to negative trajectories in outcomes later in life 
Thank-you for agreeing to teach on the CYP IAPT Post Graduate Certificate in CWP. 

This is an introductory page to a series of pages that hopefully may be helpful in delivering your teaching session. 

The core idea is to encourage teaching sessions to mirror some of the basic basic ideas about guided self help. 

In this way a teaching session could be structured in a similar way to a session with a young person so that the session had: 

*[[Teaching check-in]]
*[[Learning about the problem]]
*[[Trying out new things]] 
*[[Invitation for feedback]]

There are also some additional pages that may be helpful to you in teaching on the CWP programme. 

* [[Checking in about the previous session]]
* [[Recognising diversity]]
* [[Core Competencies for CWP Practitioners]] 

The intention is that this will lead to greater coherence between the teaching sessions for the students themselves.  



These session guides are taken from the "Adolescent low mood manual" written by the Tower Hamlets Child Wellbeing Practitioner Service, with their kind permission


!!Session 0: CWP Low Mood Assessment

!!!''Key Materials''
*Complete CWP Standard Adolescent Assessment Form, with exploration of risk including self-harm, confidentiality and introduction to CWP model as detailed on form.
*Engagement: listening and validation. Building a picture of what’s important to them.
*Orientation of the GSH framework 
*RCADS & Session Rating Scale/Session Feedback Form
*Timeline 
*Discussion around linking in with parents.
!!!''Key tasks''
#Warmly welcome and introduce yourself to the young person explaining your role and the plan for the assessment session today.
#Complete assessment as per your local CWP assessment form/process. Details of assessment questions are not included here. It is assumed CWP services will have developed processes locally. Sample areas to cover will include;
##Confidentiality
##Permission to share information
##Filming
##Full local CWP assessment form including local risk assessment
##Orientation to CWP model and discuss willingness to engage in this approach
#ROMS: Complete RCADS on pod and discuss with young person.
!!!''Linking in with parents''.
#Depending on information given during assessment and the young person’s relationship with parents, discuss CWP level of involvement with parents. This may involve parents at the beginning, middle and end of the intervention by having some joint session time with them (at the end of sessions) or simply via telephone contact.

#Where young people do not wish for parents be involved, do they consent to us calling parents to get their view of difficulties (it is helpful for us to get a sense of parental perspective)?
#Difficulties around low mood can sometimes be linked to difficulties in relationships and feelings of isolation. Parents can be a helpful part in addressing this and become a core part of the back-up team.  

!!!''Timeline of Low Mood''  

#This can be completed either as part of your assessment, or at the beginning of session One.

#Create a timeline in relation to feelings of low mood, with age across the bottom axis and mood (score from 0-10) on the vertical axis. Have they always felt like this? Is there a time when they have felt differently? Can they remember a time when feeling down wasn’t a problem? Does their mood ever change? See sample below: 


!!!''End of Session''
*Complete SFQ on POD and discuss
*Reflections on today's session, comments and questions?
*Agree appointment time for next session




_

!!!''Session 1: Goal setting; Psychoeducation; Formulation''. 

!!!Key Tasks: 
* RCADS symptom tracker 
*	Goals 
*	Psychoeducation 
*	Formulation 

1. Agree/Set agenda. Let them know that there are a number of areas that you will be covering today. Is there anything they would like to add to this? This can be discussed in space at the end of the session, or integrated during a relevant part of the session (e.g. during formulation if there was a particular difficulty during the past week).

2.	RCADS: Complete RCADS symptom tracker on POD. Feedback RCADs results from previous week (using graph where possible). Discuss meaning of results.

3.	Goal Setting: Identify up to 3 goals using the SMART goals handout as a guide for yourself. Use the GBO form to record the goal.

#	Rate the goal out of 10 for where they are up to right now with this goal. For example, 10/10 is that the goal is met; 0/10 is that goal is not met. 
#Rate where they would like to aim to get to (e.g. 8/10 might be a healthy aim, as 10/10 might not be realistic with life’s ups and downs!) 
#Add goals to POD

4.	Psychoeducation: Go through the psychoeducation handout (“Depression and Low Mood”). 

Areas included within this are:

# What is depression (thoughts, physical sensations, behaviours)?
# Signs and symptoms 
#What causes depression and low mood? 
# Vicious Cycle of depression and low mood 
# Understanding your depression and low mood 
# What keeps our low mood going? 
# How can I overcome my low mood? 

Go through each of these areas and discuss with the young person. 

Encourage the young person to tick which signs and symptoms they might be struggling with. 

Use this to normalise some of their difficulties. 

Explain the vicious cycle of depression/low mood (also included in handout) and information about activity levels and low mood. 

Begin to highlight the importance of BA as part of their intervention. 

Develop an individual formulation/cycle with the young person using the same handout. Let them know that whilst it can be helpful to understand what caused their low mood, it is more important to identify what is keeping it going presently. Ask young person to tell you about a recent time when they felt low and fill this into the formulation template. 

Discuss the information on how I can overcome my low mood. Present this in a hopeful manner, emphasising that things can and will improve! 

OPTIONAL: You may wish to complete a wider formulation around the development of low mood, alongside the vicious cycle (including genes, adverse life experiences and so on). See handout “Development Map of Low Mood” 

OPTIONAL: The ‘Dog Poo’ analogy is a useful way to describe the relationship between thoughts, feelings and behaviour. This is included in session four where the role of thoughts is discussed (see session four content). However, in some instances this may fit well following the vicious cycle where the thoughts, feelings and behaviour link is first illustrated. 

OPTIONAL: Black Dog Video clip (WHO) https://www.youtube.com/watch?v=XiCrniLQGYc 

Home practice

*Read over the psychoeducation material on low mood that has been provided. 

End of session

*SFQ 
*Review of session, comments and questions. 
*Key learning points?
__Session 2: Back up team and Behavioural Activation__
Key Tasks:
•	RCADs symptom tracker & rate goals
•	Back up team 
•	Introducing Behavioural Activation and the Activity Diary
1.	Agree/Set Agenda.  

2.	Back up team: As detailed in the assessment, it is vital to have supportive people in your life to help you to feel better. Explain the idea of the back-up team and the different types of support using ‘The Back-Up Team’ handout. Explore different areas of the young person’s life and work towards creating their own back up team using the closeness circle handout. Identify what kinds of support different people might offer. 

Discuss the importance of sharing this discussion with people on the back up team. Letting them know you are getting help and that they are on your back up team. Some young people may require support in how to talk to people in their lives about this.

3.	Introducing Behavioural Activation. The information you will need for this task is included in the handout “Behavioural Activation 1”. Go through the handout, ensuring you cover key areas:
o	Activity levels and low mood – leading into the ‘Vicious Cycle of Depression/low mood’. Check in with their thoughts about this.  
	Is this vicious cycle something they can relate to?  
	What happens in their own lives when they feel low?  
	Are there any activities that they are doing less of or have stopped completely as a result of them feeling low in their mood?
o	Beginning to act BEFORE feelings of motivation come. Go over section “Action before motivation”. Check in with their understanding around this point. What are their thoughts about this idea? Have they ever ended up doing an activity that they didn’t want to do, but then felt better for it?  

4.	Introduce the Activity Diary. Continuing with the same handout, introduce the activity diary (section entitled “First Step” and onwards). Discuss idea of rating activities on these scales:
o	Achievement
o	Closeness to others
o	Enjoyment
Think through a couple of activities they have done this week. Get them to practice coming up with a score verbally on each of these areas for the activity.
Please note: values and a discussion around the importance of values and activities are included in the following session.
Go through the sample diary (Mohammed). Any reflections on how Mohammed is spending his time?
5.	Give blank Activity Diary to young person. Ask the young person to begin completing an activity diary for the week ahead.    
o	Complete a whole day with the young person in session to practice this.
o	Encourage them to include everything/ a lot of detail in order to get a really good understanding of who you are! “The more you write down, the more I can get to know you”.
o	BUT – if the young person is particularly overwhelmed, it is more important to just get some basics of how they are spending their time than nothing at all.
Home practice
•	Fill in Activity Diary 
•	If possible, share the session work with parents

End of session
•	SFQ 
•	Review of session, comments and questions. Key learning points?
!!''Session 3: BA The Next Steps; Values and Activity Planning''

* RCADs symptom tracker & rate goals
* Review ROMs (RCADS DEP, GBO) 
* BA Continued

''1.	Agree/Set Agenda''

''2.	Behavioural Activation:''

Brief recap of the BA concepts introduced in the last session. What can they remember? Core areas to cover:

Rather than waiting to feel better before doing things, the opposite is true with this approach. We will be working on changing behaviour first, and this will begin to help you to start feeling better. This doesn’t happen overnight and can take a bit of time, but when it begins to work it can make a huge difference. 

''3.	Review the Activity Diary.''  

Ask the young person to talk you through their Activity Diary. Why did they like something/see it as important? Any reflections? If they didn’t complete it, trouble shoot/problem solve… what got in the way? How might they overcome this? 

Consider following tips for completing log:

* If the young person is finding it difficult to complete the diary, keep it very brief, e.g. ‘break time with Kamran’, ‘did revision’ 
* Set a reminder or alarm on your mobile to remind you to complete the diary. Its best if this is a time when you don’t have anything important to be doing (e.g. after dinner)  
* Send yourself a text or write it in the ‘notes’ app on your mobile, if you can’t fill out the diary straight away.   

''4.	Further BA: The next steps.''

 Go through Behavioural Activation 2 using the key points below:  

Values: Discuss importance of values and linking activities to values. Highlight the issue of ‘importance’, and stress that selecting activities and values that are important to you is likely to increase the success of using this approach.
* explore each of the common areas of life that people value (as per sheet). Explore these using the questions within each box.

Go through the list of sample values. Think with the young person about which are important to them? Are there any other values that are important? Add to empty boxes at the end. 

Support the young person in entering values into the blank areas of life sheet.

Use the above information to complete the ‘Translating Values into Activities’ sheet. Write in as many as possible, however emphasise that we will not be working on all of these in one go! We will be working gradually making step by step changes.

Plan one or two activities – depending on what feels best for the young person.  

 
* Use the top tips (as per handout) to carefully identify these. It may be that you need to break activities into small steps (it’s better to aim for smaller, achievable activities than ones which feel too overwhelming). Support the young person in doing this, if appropriate. As stated in the handout, steps might include; getting my trainers out, fixing my bike, getting off the bus a stop early/walking home from school.

* It may be that early steps involve things that the young person is already doing already – but they would like to do more of (to increase the likelihood of success).
* It can be helpful to think of activities they might have done in the past, but no longer do due to feeling low. These might be easier to get going with!

''Home Practice''

* Continue completing Activity Diary
* Complete the agreed one or two valued activities
* If possible, share the session work with parents

''End of session''

*SFQ 
*Review of session, comments and questions.
*Key learning points?
 
!!''Session 4: BA Continued, The Role of Thoughts and Unhelpful Thinking Styles''

''Key Tasks:''

*RCADs symptom tracker & rate goals
* Review BA work: This should continue as an active part of the work alongside other intervention components.
** The Role of Thoughts 
** Unhelpful Thinking Styles/Thinking Traps
**Thought diary


''1.	Agree/Set Agenda''

''2.	Review Activity Diary''

Reflect with the young person on their activity diary. Did they complete the scheduled activity/activities identified in last weeks’ session.   

* How did they find completing the activity?
* How did it impact on their mood?
* Reflect on the balance of activities in terms of achievement, closeness & enjoyment
* Were they able to share this with the back-up team?
* Problem solve any difficulties in completing activities:
**Explore obstacles
**Were activities chosen realistic?
**Do we need to break down into smaller activities?
**Is there any guilt getting in the way? For example, if values conflict with parents values and preferences for how the young person spends their time.   If this is the case, the young person may need to be supported in talking to their parents about the importance of pursuing activities that fit with their values in order to improve their mood.

''3.	Identify Activity for next week.'' 

* Attempt to identify activities that fit with a variety of the young person’s values. Select some which are easy to pursue and some which may be more challenging, depending on how they are progressing.  Young person to continue to complete activity diary (to be reviewed at each future session).

* Begin to support the young person in building up a life that feels meaningful to them.

''4.	The Role of Thoughts. ''

* Revisit/remind the young person of the role of thoughts highlighted in their individual formulation in session one and how negative thoughts can feed into low mood.  The example below can be helpful as a neutral analogy to further emphasise the link between thoughts, feelings and behaviour.
* Dog Poo Analogy (adapted from Stott et al., 2010; Kendall, 2012): Several people hurrying out of their block of flats fail to notice some dog poop on the path outside and step right into it! 
**The first person thinks, “Well, that’s just my luck. This just like my whole life. I can’t do anything right. There’s no use in even trying today. I am just going to go home and go back to bed.” How would you think he is feeling? If you guessed sad, depressed or something similar, you’d probably be right! 
**But now, imagine a second person leaves for the day and steps into the same pile of poop. This time, the person looks down at her shoes and thinks, “Oh no! I'm already running late! If I go home and change my shoes, l’ll be late for my meeting and my boss will think I am disorganised! But if I go to work with this poop still on my shoes, my boss will surely smell it and think I have a hygiene problem! I could get fired! What am I going to do?” How would you think she is feeling? If you guessed anxious, worried, or something along these lines, you’d also probably be right! 
**Imagine a third person hurrying out steps into the same pile of poop! This time, however, the person looks down at his shoes and thinks, “What kind of world am I living in? This neighbourhood is going downhill fast because people just don’t have the decency or consideration to care about cleaning up after themselves! I am certain that I know the S.O.B. whose dog made this mess! I am going to sit on my porch and wait for him to come by and then let him have it!” How would you think this person is feeling? If you guessed angry, mad or something similar, you’d probably be right again!

*How is it that three different people, encountering the same situation (stepping in the poop), can have three very different emotional reactions to the situation? Is it really about the poop? Well, yes and no! 
**(1) it is not events in life that upset us, but rather our thoughts about these events, and 
**(2) specific emotions are connected to specific thoughts.

''5.	Negative Automatic Thoughts: ''

Following on from the above example, explain that at times we are able to create some shifts in our mood by identifying particular negative thoughts that make us feel low, and using techniques to think a bit differently!  Go through the ‘Negative Automatic Thought Fact Sheet’ handout.

Recognising negative thoughts; key points:   

* When you are feeling low the negative thoughts may be so familiar and happen so often to you that you just accept them as fact.  Negative thoughts are often about yourself for example: “I’m no good”, “People don’t like me”, “I’m stupid”, “I’m not attractive”. Do you have any negative thoughts about yourself? Jot them down.
* These thoughts are sometimes about other things such as the world around you or the future. For example “People are unkind”, “the world is a horrible place”, “nothing will work out”.
* Let’s look at these negative thoughts in more detail:
**Negative thoughts tend to be automatic. They are not actually arrived at on the basis of reason and logic; they just seem to happen/pop into your head.
**Often these thoughts are unreasonable, and unrealistic. They serve no purpose. All they do is make you feel bad and they get in the way of what you really want out of life. If you think about them carefully, you will probably find that you have jumped to a conclusion that is not necessarily correct. For example thinking someone doesn’t like you because they haven’t phoned recently.
**Even though these thoughts are unreasonable they probably seem reasonable and correct to you at the time.
**The more you believe and accept negative thoughts, the worse you are likely to feel. If you allow yourself to get into the grip of these thoughts, you are viewing everything in a negative way
	When people become depressed their thinking often changes. They may develop some unhelpful thinking styles when they are thinking negatively.


''6.	Unhelpful Thinking Styles:'' 

Explain the concept, using the “Thinking Traps” handout. Go through the sheet and support young person in identifying any common thinking styles.  

* Explain, together we can support young person in breaking the patterns of unhelpful thinking through thought challenging.

''7.	Challenging Negative Thinking and Thought Diary.'' 

Introduce the young person to the  “Challenging Negative Thinking Sheet”.  

* Go through the questions in the sheet. Show the young person the Thought Diary handout and think together about a time during the last week when the young person felt low. 

* Support the young person in putting the situation into the thought diary. Using the ‘Challenging Negative Thinking Sheet’ work through the sample questions to challenge the thought. It can be helpful to rate the strength of the thought before and after thought challenging.

Key Points:

* Thoughts are not a fact
* Thoughts may not be true and they might be unreasonable and unhelpful
* Negative thoughts drive distress
Key Steps:

* Elicit thoughts
* Examine whether they have fallen into any thinking traps
* Evaluate the thought: evidence for and against.   
* Be collaborative! 		

Ensure you are challenging a thought and not a feeling. Through this process, are they able to generate a more balanced thought?  Some questions may work better for certain young people. Ask them to re-rate the strength of their thought after this process. Are there particular questions/challenges that the young person finds most helpful?

''Extra Technique: Positive Self Talk.'' 

You may find it helpful to show the young person the ‘Think Positive Sheet’. This can be used to enhance thought challenging. Go through the handout and identify any phrases that might be helpful for them to say to themselves during difficult moments. Or can they think of their own statements?

Practice challenging thoughts for homework, and record on the form given (give a few forms).

''8.	Thought challenging is hard!''  

We recognise that thinking in a different way to the one that you are used to can be very difficult. It’s like having to create a new path out of dense jungle…

''Jungle analogy:'' 

You are lost in the middle of dense jungle. You can see only one path out which is well trodden – but this is the path you have just taken to get to where you are.  You don’t want to go this way!  It doesn’t lead you out.  You need to find a different way out. This means quite a lot of hard work – you have to clear a new path through the jungle and work really hard at clearing away branches and thick jungle.  This takes time and effort chopping away to create a new path. This is a bit like learning to think differently. Your old ways of thinking are very well known to you and easy to slip back into.  It takes a lot of hard work initially to develop a new way of thinking and battle with your old thoughts!  With some hard work, this path become more and more clear over time and easier to follow… but you need to keep trying (practice, practice, practice!).


Note to CWP:  Thought challenging can be very difficult when working with low mood. For some young people thought challenging can be effective, although requires practice. It may be that further techniques below will be of use in strengthening thought challenging skills. In some cases it requires additional techniques such as mindfulness or thought acceptance work. These could be used as optional extras with appropriate supervisory support. 

''Home Practice''

*Continue completing Activity Diary
* Complete the agreed one or two valued activities
* If possible, share the session work with parents
* Complete thought diary. Begin to practice challenging thoughts using the ‘Thinking Traps’ and the ‘Challenging Negative Thinking’ sheet.
* Handouts: Negative Automatic Thoughts Fact Sheet, Thinking Traps, Challenging Negative Thinking and Positive Self Talk sheet (optional).

''End of session''

* SFQ 
* Review of session, comments and questions. 
*Key learning points?
 
!!Session 5 to 7: BA Continued. (alongside additional interventions, to be selected as appropriate). 

Sessions 5 to 7 will follow the session plan below, with BA progress being reviewed in each session. Alongside this, a number of further strategies can be added depending on the nature of the client presentation. See the menu of options below

''Key Tasks for each session:''

*RCADs symptom tracker & rate goals
*Review BA work – this should continue as an active part of the work alongside other intervention components.
*Reviewing reading, homework, skills practiced during week.
*Introduce new skills/strategies as appropriate.
*Session review (comments and questions, key learning points).

''1.	Review Behavioural Activation Progress and Activity Diary.'' 

Similar to last session, reflect with the young person on their activity diary. Did they complete the scheduled activity/activities identified in last weeks’ session?  

* How did they find completing the activity?
* How did it impact on their mood?
* Reflect on the balance of activities in terms of achievement, closeness & enjoyment
* Were they able to share this with the back-up team?
* Problem solve any difficulties in completing activities as before.

''2.	Review Thought Diary.'' 

*How did this homework go? How did they find the thought challenging? Which questions were helpful? Which were not? Are there other questions or things they used to challenge their negative thoughts? How much has this impacted on their thinking?
 
*It may be helpful to link the above to the earlier psychoeducation on the cycle of low mood.

''3.	Further options.'' 

In relation to further work for sessions 5 to 7, select from menu of options below as and when appropriate (to be discussed in supervision).
Menu of Further Intervention Options:

*Thought Based Work – continuation, e.g. 
**Testing out unhelpful thoughts through Behavioural Experiments
**Thinking like a judge technique
**Prejudice Analogy
**Internal Bully
**Thought Acceptance Work
**Recognising your qualities and achievements
**Coping Cards
*Tackling avoidance, safety behaviours and developing a step by step plan 
* Problem solving
* Sleep Management 
* Worry management (Worry Time)
* Distraction Techniques
* Other Strategies not detailed here (draw from other CWP manuals)
* Relaxation Strategies
 
!!!''End of Session''
*Complete SFQ on POD and discuss
*Reflections on today's session, comments and questions?
*Agree appointment time for next session__
!!''Session 8: Relapse prevention'' 

''Key Tasks'':

* Full RCADs & goals
* Review of work completed and achievements
* Keeping things going
* Feedback to parents (if agreed with YP)

''1.	Set/Agree Agenda''

''2. Complete full RCADS and goal rating scale.''

* Discuss with young person. If RCADS/goals scores have improved or gone down, explore this. 
*How do they account for any changes?  What have they been doing that has worked well/less well?
 
''3.	Review of Intervention:''

 * What was helpful? Not helpful? Key learning points.

* Pay attention to different aspects of the intervention, e.g. BA component alongside Thought Work, Problem Solving etc.  

''4.	Relapse Prevention:'' 

* Go through ‘Relapse Prevention’ handout.  Go through each area with the young person, and think about how this might fit into their life, who they can ask for support, which strategies are important to take forward. Key points include:
**Practice, practice, practice! 
** Knowing Your Red Flags!  
** Make a plan of action. 
** Being Kind to Yourself.   
**Rewarding Yourself.  

*Discuss and complete the ‘Staying Well Plan’ section, enhancing learning from the whole intervention.  Think together, if started to feel low in the future, who can they draw on for support (back up team), what might they do, what strategies might they draw on?   

* What might get in the way of continuing with the implementation of skills learned?  Problem solve any potential areas of difficulty.  

''5. End of Session''

* SFQ and enter on POD
* CHI-ESQ (experience of service questionnaire)
* Book in one month review (either face to face or on phone)


[img width=100% [Workshop with flipchart, pens and paper - Pixabay.jpg]]

!!!!!Source: Peter Fuggle

This area of the guide is to provide information about training for CWPs. 

!!!''Introduction to CWP training''
<<list-links "[tag[Training introduction]]">>

!!!''Government policy and context''
<<list-links "[tag[Policy context]]">>

!!!''What are CWP competencies''
<<list-links "[tag[Competencies]]">>

!!!''The CWP National Curriculum''
<<list-links "[tag[National curriculum]]">>

!!!''Specific guidance for CWP training''
<<list-links "[tag[Training guidance]]">>

!!!''CWP National  Implementation Group''

*[[CWP National Implementation Group]]

!!!''EMHP Training''
All information about the Education Mental Health Practitioner (EMHP) Programme can be found on the EMHP on-line guide. 

https://manuals.annafreud.org/emhp/index.html

!!!''Guidance for teaching staff''

*[[Teaching]]

Carolyn Edwards and colleagues at Kings College London have developed some extremely useful activities that supervisors could do with their EMHP/CWP trainees. 

<<link-pdf "Training Ideas for CWPs/EMHPs" "https://drive.google.com/file/d/1agO7x_uZD6nNvd28y1CKk1yW1Y6aGFyy/view?usp=sharing">>
This page contains translated versions of original materials which have been provided by a variety of stakeholders involved in the CWP/EMHP projects and programmes. These have been completed in good faith in an attempt to provide an accurate translation. It is important that you are aware that the original material has not been translated by an accredited translator. We suggest that you discuss these with your supervisor, before using them, as to whether they will be beneficial and are appropriate for your site. 

Behaviour Problems Manual ALL Handouts: 

<<link-doc "Behaviour Problems Handouts- Somali Translation" "https://drive.google.com/drive/folders/1FSwUiDbHGneGJNxFpEbdvu3ds-Pp-QIS?usp=sharing
">> 

<<link-doc "Behaviour Problems Handouts- Bengali Translation" "https://drive.google.com/drive/folders/1SvUbKlxyric6e5Lao1B8kjmkgQ_R27Qe?usp=sharing
">> 












!!''Key points'' 
*This is at the heart of guided self help and can be encouraged in a number of ways such as [[Enquiring about strengths]] and [[Agreeing a future plan]]. 
The idea in guided self help is to encourage experimenting from the beginning.
*In guided self help the intention is that the parent or young person will be encouraged to be active in response to the problem from the beginning of ht helping process. 
*At the end of the first face to face contact, the practitioner will discuss with the parent or young person some suggestions about things that they could do to try out new things about the problem. 
*Often this may involve diary keeping as a way of encouraging balanced thinking about the nature of the problem or as a way of encouraging the development of some practical steps that could be taken. 
Here is a list of suggested first actions that might be considered at the end of the first session. 
#Keeping a diary in order to notice how the problem varies from day to day
#having a conversation with a key person about the problem 
#doing a relationship map and thinking of who could be helpful about this problem.
#reading some material about the problem
#practicing ways to relax
#doing something that you enjoy
This is often the heart of the change process, the part where the child, young person and parent try out new things to see if they can manage the problem more effectively than previously. 
For low mood, this process is called behavioural activation, for anxiety it is exposure, and for behaviour problems it is contingency management. There are many components to promoting change and trying out new things. For low intensity help, these are the ones that have been focused on for the CWP programme. 
@@color:red;This page is being developed in light of recent changes to working due to the outbreak of COVID-19@@
*Varying types of BA 
#Activity schedule
**plan activities then do them and see the impact on your mood, used a lot at start of CBT 
#Lejuez 
**activity in line with values in different life areas, you then start to plan in concrete activities that fit with values. Support available through planning in contracts to help young people along the way. 
**more likely to engage as its brief (Brief BA or BATD) and tried to keep it simple 
#Matrell
** function analysis which can be complicated for therapist and client. RCT conducted in the USA found equally as good as CBT and IPT.
!!!!!Source: CWP Audit Report for London and the South East 2018. Main author:  Deepa Mavji

The most frequent primary presenting problems recorded at referral were:

* Anxiety (50%)
* Challenging behaviour (16%)
* Low mood (15%)
* Behavioural and emotional regulatory difficulties (5%)
* Social phobia (4%)
* Other (4%)
* Separation anxiety (2%)
* Panic (2%)


The least frequent presenting problems recorded at referral were phobia (1%) and mixed presentations such as anxiety and low mood (1%).
!!!People on your back up team 
A back up team can be people that can step into the below positions:
*Emotional support
*Practical support: Someone to think about logistics etc 
*Instrumental support: Someone who can move things on (help with specific problem solving)
*Motivational support: Someone who will come on a walk with you (as a planned BA activity etc)
*Companionship: Someone you can relax with, spend time with etc
*Mentalizing: Who holds you in mind, especially when you are depressed/anxious? So that when you see yourself through their eyes, you find it easier to come out of the fog a bit 
!!!What happens if a YP struggles to come up with people?
*Just use the main 1 or 2 people that they do have
*It would be rare that someone is completely isolated
*Some people would be reliable and regular features but others would be less regular (and may change) e.g. asking for practical support from an admin person (directions etc)
! Welcome to the UCL CWP Homepage

[img[Poster UCLpic.jpg]]



A site with a lot of training material is ~MindEd. This can be found at:

https://www.minded.org.uk/
[img width=100% [countryside-2371480_960_720.jpg]]

!!!!!Source: Peter Fuggle

!!The purpose of this page is to help users find things in the guide!

This guide has hundreds of pages of information (including handouts, self help materials, videos) for CWP's. It is organised into ''six areas'' that can be found through the tabs at the top of the screen. 

For a useful video on the basics of how to navigate the Wiki guide please see below:

<iframe width="560" height="315" src="https://www.youtube.com/embed/potAcDTmPQk" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

For an easy read breakdown of how to find things in this guide please go to [[CWP site map]]. 

!!The seven areas of this guide are:

[[Home]]: Contains information about this guide and Navigating it as well as an overview of the core aspects of CWP's work.

[[Helping]]: the core manuals and session plans and related resources for the core interventions CWP's are trained in. 

[[Finding Out]]: Contains information and guidance pages relating to 10 key areas of CWP's work. These pages provide the knowledge and skills important to CWP's and also has additional resources/ self help materials that may be useful to use in CWP work.

[[Supervising]]: contains information on supporting and supervising CWP's.

[[Partnerships]]: which provides the links to the wiki pages of partnerships

[[More]]: which contains information on UCL course and its [[Teaching]], and background to the [[Training]] of CWP's. As well as information on [[Service Development]]

!!!Padlock: 
Contains role play videos of intervention sessions. Please note- you have to have a log in to access this section of the guide. Log ins are currently only given to Trainees and teaching staff.

!!Other Useful Pages
!!!''The CWP library''
This guide has hundreds of pages of   information (including handouts, self help materials, videos) about the CWP programme. All of these pages can be found in alphabetical order in the [[CWP library]].

!!!''The Search bar''
Another way of finding things is to put key words into the search bar. The search function is not as clever as google but it will often tell you if there is a page about what you are looking for. 

!!!''Chapter headings - The Tag list''
The pages in the guide are organised into areas which are like chapter headings in a book. These are pages linked together by tags. The main tags are shown in [[The tagging system]].  

For those that like to know more about this, all the tags can be found in the edit functions (on the right hand side of the screen under a button called 'More'.) You can go on tag manager by clicking on this button and this will give you further information about all the tags in the guide.  

!!!''The Site Map''
The Guide is organised into six areas that can be found through the buttons in the menu bar at the top of the screen. More information about the design of the guide can be found at [[CWP site map]]. Having an idea about the rationale for how things are organised will help finds things on the site. 
!!!!Source: Peter Fuggle, Duncan Law, AFNCCF

----
Much of the material in this page is drawn from the work of the [[''Child Outcomes Research Consortium''|https://www.corc.uk.net/]] (CORC). The Consortium has been an inspiration for working to make outcomes information available to front line practitioners.

----

!!Why use questionnaires?
''The aim'' of using questionnaires is that, if used properly, they help the child, young person or parent to understand their difficulties in a clearer way. 

Questionnaires should always be used as ''part of a conversation'' about a child's concerns or difficulties. One aspect of this is to discover whether a child's difficulties are common to many and fall in the average or whether they are more exceptional. 

Scores that fall above the average does not mean it has identified 'illness' but identifies concerns you are being trained to help them with.

Problems highlighted from questionnaire information can then be related to client goals and help figure out how to get to those goals.

It can help to make the intervention more focused and systematic (making it less overwhelming).

For some young people who find it hard to answer direct questions, it can provide a way of says things about themselves. 

Routine monitoring using questionnaires can help to identify when to change or stop the intervention that is being offered. 

Questionnaires can help to make sure nothing is being missed.

Measures can be the springboard for some really useful conversations.

Please see [[The Importance of Feedback]] for more information

!!!Tracking progress:
For both the young person and the practitioner it is important to track whether the problem is getting better or not. This is not always easy to know as changes can be small and may be easily missed in general conversation. 

Often a young person will be interested in viewing their progress visually- as this is not always clear based solely on how they feel.
Are they improving or not, why not? – it's not your 'fault'!

Tracking information ''invites a conversation'' as if the chart shows they aren’t improving but they feel better, this invites curiosity as does the alternative when the young person doesn't feel better but the scores suggest things are improving. 

Tracking invites conversation about how the service can change to generate improvement.

!!Which questionnaires to use?
Two primary outcomes you will use:

#  [[SDQ]] parents will fill this out for primary aged children
#  [[RCADS]] adolescents/ secondary school age children will fill this out themselves

These two measures will be completed on [[POD]]

For more information and an overview of the outcome measures used by practitioners please go to [[Core Outcome Measures]]

!!How to use questionnaires?

!!!''DO''

* Keep the conversation ordinary! 
* Sit side by side to the child, young person or parent - this externalises the problem away from child or parent as them being the problem.
* Let the CYP do the work/ working it out but in a supportive way.
* Reflect back on progress
* What strengths have they gained and how?
* How has the change occurred?- a little bit of inquiry may be good to highlight that this is something they have done. 
*encourage a child’s curiosity about how it has come about, why they have come to feel the way they do. 

!!!''DON'T''

* Don't get the CYP to fill it out if you are not going to use it and have a conversation about it
* Don’t force it as some CYP/Parents may react negatively and this should be respected.
* Don’t use questionnaires if you don’t understand what they are for! 
* May not get the improvement you are hoping for- don’t carry on doing the same thing if no improvement- change it up!
*Don’t conform everyone to this way of working if it isn't right for them-- it is not a rule that they have to fill this out to receive a service. 
*Don't get the child to fill out the WHOLE questionnaire each week only subscale they are concerned about!

 !!Issues completing questionnaires:

*Not usually refused by families, as often there is a concern they want solved (should be framed as a tool to help to this).
*Literacy/language barriers: effects a relatively small number of people but don't force it as a rule.
*Main reason for lack of completion is often a negative attitude towards the activity conveyed by the practitioner.

!!Practice points:

* Important to make sure your not being apologetic about measures, instead explain them in a sympathetic way.
* ''How you use it can be part of the therapy not an addition to''- opening up channels of communication.
* Only tracking sub scales- short and helps with goal setting 
* Don’t apologise for doing the questionnaire- may over do it- but need to build confidence about using them.
* Important to keep focus on measures being used primarily to ''inform joint understanding of problem and inform treatment'' (not to feed back to the government etc)
*You can speak to YP to find out if they would prefer to complete it on their own  or whether they want to fill it in together

!!!Working with CYP 

* It can be hugely helpful to externalise the problem away from CYP – seeing the problem instead of just living it.
* Sitting position: side by side, enacting collaboration: 
*'''is it ok if I sit next to you so we can look at this together?'''
* You can explain to the CYP what they will be used for: will help to inform our understanding of your difficulty (''the CYP is not the problem, the difficulty is!!'') 
* Ask CYP: would they prefer to complete it on their own or fill it in together?
* After full RCADS is completed: look at 'highlights' (answered 'Agree'). 
*You can explain that after the session you will look at all answers in more detail and feedback more to them in the next session

!!!Working with schools
* Schools aren’t always able to spot those with emotional difficulties- so this is where the questionnaires are helpful.
*schools often miss those that are struggling quietly without behaviour problems - questionnaires can help show this and the importance of your work with a CYP

!!!Working with parents/families:
* Good for making initial conversations with parents about whats not a problem/ is
*For example,  ''it would be tremendously helpful for me because you can tell me a lot about your child from this without me asking you lots and lots of questions'',
*demonstrate you are interested in all the items including those that aren’t a problem, have a conversation about what is going well.
*It is problem focused: there are lots of things about your child that aren’t in this questionnaire. We want to know what you are worried about that what this is going to try and capture.
*Sometimes questionnaires generate negative emotions from parents from filling this out: blaming/ judgemental, but for most parents it is a relief- someone is paying attention to concerns

!!Videos:
!!![[CORC|https://www.corc.uk.net/]]
The Child Outcomes Research Consortium (CORC) is the UK’s leading membership organisation that collects and uses evidence to improve children and young people’s mental health and wellbeing. On their website they have a plethora of [[videos|https://www.corc.uk.net/information-hub/training-videos-use-of-outcome-measures/]] exampling how to use outcome measures. These videos are to be used in training they are not intended to present perfect practice but rather to stimulate discussion. How might you do it differently or better? (The scenarios are based on real clinical examples although the young people are played by actors in the videos. Copyright is owned by CORC.)


CORC have also developed a useful [[short animation|https://vimeo.com/193374017]] giving an overview of what questionnaire are used for in CYP mental health services please see below. (This animation was created by Josh Day for CORC)





!!Links to other pages

Please go to [[Assessment]] for a list of relevant pages.

Please go to [[Outcomes]] for a list of pages relating to the specific outcome measures
@@color:red;This page is being developed in light of recent changes to working due to the outbreak of COVID-19@@
@@color:red;This page is being developed in light of recent changes to working due to the outbreak of COVID-19@@
Source: Natasha Byrne

The POD team have produced a guide to help services use data extracted from POD to replicate the format of the site reports that are sent for each service annually. 

This guide gives instructions on how to access services data from POD and some ideas about how to use the data.

You can access the guide here: [[ |]]

<<link-pdf "CWP Site Reports How to Guide" "https://drive.google.com/open?id=1RliDHNy2_1gabwioSR8ebRH4-NBUjcH0">>
@@color:red;This page is being developed in light of recent changes to working due to the outbreak of COVID-19@@

Please find attached a document outlining how to use 'Zoom' this could be helpful to support practitioners to use Zoom or to send to families to support them using Zoom.


<<link-doc "Step by Step Guide to using Zoom" "https://drive.google.com/file/d/11SKnJ5KuJvceL8FaaDKNCUMP51U91DH6/view?usp=sharing">>
!!Things that might make it difficult for ~CWPs to be open and honest in supervision
*Power imbalance, both perceived and real, in terms of:
**Authority (they manage you) 
**They are more senior than you 
**They have more knowledge than you 
*Worries that they might take it personally – and this might cause a rupture the relationship personally and professionally 
*Could it impact on your appraisal?
*Could impact on your pay and your job?
*It could highlight vulnerabilities and weaknesses 
*What if they don't listen to you and it doesn't make any difference- what's the point of taking a risk and being open?
*Timing of supervision- it can be hard to “open up a can of worms” and talk about difficulties with a supervisor when you’re about to go and see a client
*Lack of knowledge about confidentiality in terms of supervision:  Who do supervisors talk to about what is discussed?  Where does the information go? Could there be any “consequences” to issues discussed in supervision (e.g. appraisal, job, pay)
*If it is being filmed – this might make it hard to disclose certain things. Are they allowed to say “no” to supervision being filmed? Can they ask for the camera to be switched off if they are talking about something personal?
!!What supervisors can do to help ~CWPs be open and honest in supervision:  
*Showing that they have made mistakes too, e.g. through giving case examples and/or showing video of their sessions where it might have gone wrong
*Keeping the ~CWPs at the centre of the process - e.g. checking they're ok with the agenda, and checking in with the CWP at different points re how they're finding it
*Being clear and open about how the information in supervision is used e.g. Who do they discuss it with, limits of confidentiality, who gets to hear about it,  could it be used against them? Putting these kinds of things in their contracts
*Be a bit humble - e.g. talking about  they might learn from the supervisee, as well as the other way round
*Being honest if there are limitations to their role e.g. service issues - be a bit human about their feelings about this too if they have any
*The CWP is likely to focus on the negative- so make sure they also think about positives and strengths, e.g. praise small achievements that have been made
*Sometimes having an opportunity for group supervision might be good in addition to individual supervision- more ~CWPs in the room might address the power imbalance a bit 
*Trying to get a balance between asking the CWP what they think and for their ideas in supervision, but also sharing the supervisor’s ideas and giving advice 
*Regularly asking the CWP for feedback on what they found helpful and not helpful about the supervision session. Ensuring there is a regular 5 mins at the end of supervision to allow time for feedback of this kind; ensuring it isn’t rushed and doesn’t feel like lip-service
*If the supervisor senses there might be an issue, for them to verbalise this - be aware it can be hard sometimes for the CWP to do this
*If the CWP raises an issue, spend some time acknowledging and listening to this, NOT just jumping straight into problem solving 
!!What the ~CWPs can do
*Remember the supervisors aren't mind readers - In the end the ~CWPs have a responsibility to raise issues themselves too
*Negotiate ways of doing this with their supervisor
The search bar can be found at the right hand side of the homepage.

''The search bar is NOT as good as google- spell things correctly!'' 

When you type a word in you will first see pages which have ‘title matches’ i.e the word you are looking for is in the pages title. Below this you will then see listed ‘all matches’ which lists all pages that have the word you are looking for in the page itself.
{{head in head small.JPG}}


!!!!Source: Peter Fuggle

!!!What is Validating?
Validating is a key element of engagement and is closely overlapping with mentalizing and empathy. Overly academic definitions of how these terms are distinct may not be crucial for the practitioner.  The key aspect of the process of validating is to convey to the client that what they have told you about their state of mind or life circumstances makes sense and that it is very understandable that the client would think and feel the way that they do.  The assumption is that people do things for a reason, a reason that may not be rationale and may not be consciously available to the person but that there is a logic behind how someone is experiencing themselves and the world. Validation is the process of confirming this from the perspective of another person. 

!!!Examples of Validating

//It makes sense to me that if you always wanted your Dad to notice you more, that when he left it just confirmed how little he loved you.//

//I can see how horrible it must have been for you when the same thing happened again at your new school.//

//I am trying to imagine how hard it must be to try to bring up your children in a way that was different from how your Mum treated you.// 

//I can see how others might see it as quite unimportant but for you it was crucial that you got an A star for Maths.//

In this way validation is always stated in individual terms. What may be true for people in general may be quite different for the client. It is often this discrepancy that is so painful for the client and validation may be the first time that the client has felt that they are not just a 'bit mad' or 'wierd' to feel the way that they do. 

!!!Links to other pages

Related pages can be found in [[Engagement]]
Imagine you go to a vending machine at work. You put your pound in for a can of coke. It doesn’t come out straight away, so put give the vending machine a quick shake. Bingo, it worked!

The next day, you go back to the same vending machine and you’re your pound in for your coke. It doesn’t come out again, so you give it a shake. It still doesn’t come out, so you hit it… Bingo!

The next day, you do exactly the same thing. This time, the can of coke doesn’t come out after you’ve shaken it and hit it, so you shake it again and again…. You get fed up of trying and you walk away! 

This is analogous to what happens when a child asks and asks and you eventually give in. they will keep trying and accelerate until they get what they want… but if you follow through i.e. don’t give them what they want, then they will eventually give up!! 

This is a tag tiddler 

<<list-links "[tag[Video]]">>
<<link-pdf "Video Equipment Guidance" "https://drive.google.com/file/d/18Rty4K9EQr4yGxDvjPrMVBloSFqNb9Yq/view?usp=sharing ">>

*This is only a guidance, please check with local information governance leads 
This video describes the turtle technique which can be used with parents of children with behavioural difficulties to calm down, or for children with difficulties regulating their behaviour.
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/zRNh3Louyg0" frameborder="0" allowfullscreen></iframe></html>
This video could be shown in Session 1 of Behaviour problems before introducing the homework task. Please find the video below:

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/A3QYH9d3ZKg" frameborder="0" allowfullscreen></iframe></html>
This video could be shown in Session 1 of behaviour problems after the section on understanding the problem. 

Please find the video below:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/wBR5iUDeaWE" frameborder="0" allowfullscreen></iframe></html>
* With clear honest explanation, most people are open to allowing sessions to be videoed. 
* It needs tot be clear that this is standard practice in training and nothing to do with individual aspects of their case. 
* Needs to be very clear what the videos will be used for 
* Understand there might be unhappy about this so can be compromises such as having their face out the shot 
Please see below for a quick cartoon explaining ASD in a simple but effect way. This video could be used to help those that you are working with such as parents, teachers, other students in the school and the CYP you are working with get a better understanding of ASD.

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/RbwRrVw-CRo" frameborder="0" allowfullscreen></iframe></html>

!!!Diagnosis
These films have been made by young people on the autism spectrum who wanted to share their experiences of receiving a diagnosis with other young people who may be going through the diagnostic process. They know that receiving a diagnosis of autism can be difficult and confusing at any age and for this reason wanted to offer some help and support to young people and their families. Please find the videos [[here|https://www.autismeducationtrust.org.uk/receiving-and-understanding-a-diagnosis/]]

!!!Sensory processing
The clip below has been produced from the National Autistic Society and was part of their 'Too much information' (TMI) campaign. This is a really helpful perspective on what it may feel like for a young person who has ASD:

*[[Make it Stop|https://www.youtube.com/watch?v=xHHwZJX67-M&t=1s]]

*[[TMI: virtual reality|https://www.youtube.com/watch?v=Lr4_dOorquQ]]

!!!Gender differences
An interesting video, from a group of women talking about the misconceptions and issues relating to [[women who have ASD|https://www.youtube.com/watch?v=NwEH9Ui4HV8]]
'' Visualisation can be an effective way to reduce anxiety in the moment
''
{{mountain river wallpaper (11).jpg}}

''What is Visualisation?''
In short, this is when we imagine ourselves in a safe and calming environment to reduce our experience of distressing feelings, like [[Anxiety]] or [[Stress]]

''Exercises''

* The calm Clinic has a step by step guide to visualising and safe place: https://www.calmclinic.com/anxiety/treatment/visualization
!!!!!Source: Peter Fuggle; Peter Fonagy and colleagues - What Works for Whom (second edition) 
!!''Medical Classification of Disorders''
*The most detailed classification is the system of medical disorders which sets out criteria against which a person can be assessed. If a person meets this criteria, a 'diagnosis' is given. 
*The main child mental health disorders are:
**Anxiety Disorders
**Depression/Low mood
**Self Injurious Behaviour (Self Harm)
**Conduct (behaviour) Disorders
**Attention Deficit Hyperactivity Disorder (ADHD)
**Eating Disorders
**Specific Developmental Disorders (Autism) 
**Tourette Syndrome
**Psychosis
**Substance Misuse
The use of a medical model for child mental health problems presents a number of well recognised problems (are they really an illness?) and also some people find the language confusing and unhelpful. See [[Child mental health and medical diagnosis]] for consideration of this. 

!!''The Strength and Difficulties Questionnaire (SDQ)''  
This simpler approach adopted by the SDQ considers child difficulties in terms of: 

*Emotional Problems
*Behavioural Problems
*Attentional Problems
*Developmental/learning Problems 
*Habit Problems (e.g. sleep, feeding, toileting) 
This is not a formal classification system but is consistent with the information provided by the Strength and Difficulties Questionnaire (SDQ) which is the most widely used screening questionnaire used in the UK. 

!!''Child Behaviour Checklist (CBCL)''
A further simplification is adopted by the  CBCL which is a broad questionnaire covering a wide range of child mental health problems and divides mental health problems into two broad categories:

*Internalising Difficulties (anxiety, low mood etc)
*Externalising Difficulties (behaviour problems, aggression etc) 



 
@@text-align:center;
[img width=120 [east-london-nhs-foundation-trust.jpg]]
[img width=120 [docklands outreach.png]]
[img width=120 [towerhamlets-logo.jpg]]

! Children and Young People's Wellbeing Service

@@

!! Who we are

We are Children and Young People's Wellbeing Practitioners (CWPs) offering early intervention for mild to moderate difficulties with anxiety and low mood.

!! What we do

@@background:#C3F196;border:1px solid #1AAB53;border-radius:1em;padding:1em;

We work with young people and their families to provide guided self-help. Guided self-help aims to empower young people to gain the tools necessary to tackle difficulties by themselves. It involves young people taking an active part in sessions. We offer 8—10 sessions in person or via the telephone.

@@

!! Who we see

''Young people up to 18 years old who are'':

* Feeling low (e.g. sadness, unmotivated, low self esteem, frustration)
* Anxious (e.g. fears/phobias, feeling panicky and worries about family or friends)

@@text-align:center;
[img width=100 [people holding hands.png]]
@@

If you have more serious concerns about your anxiety, low mood or general mental health, please speak to a trusted member of teaching staff or your GP.

!! How will it help me?

* Using guided self help to provide you with tools and materials you can use on your own.
* We will support you in learning coping strategies to help encourage positive behaviour to help you feel better.
* We will help tackle distressing thoughts and increase resilience to future problems.
* Guided self-help approach involves reading through some materials before each session. From this you will practice applying the strategies and we will problem solve any difficulties you may have.

!! How to contact us

<div style="background:#C3F196;border:1px solid #1AAB53;border-radius:1em;padding:1em;text-align:center;">

If you are interested in our service please complete and return the attached form.

''__Spaces are limited and will be allocated on a first come, first serve basis.__''

</div>
*Prioritise more time to know the models 
*Written agreement between what is supervision and leadership 
*Difference between team leader and supervisor 
*Ensuring more time to transition into role from full time clinical role and to make sure this is planned with managers in the service 
*Set boundaries which work for SSDL especially if there is long travel times 
*Have access to their learning i.e. presentations 
*Learn as you go along and not to expect to know everything at once 

This page presents some initial guidance on ways of defining mild/moderate problems. We recognise that this is not simple and will be looking to local services to develop their own protocols as to how they will identify cases for the CWP/EMHP programme. Below are some ways of approaching this problem. 

!!Possible inclusion criteria: 
# A parent or young person who is actively wanting help (not just a referrer identifying the problem but the parents/YP themselves) 
# A parent who actively supports the process of help seeking for the young person. 
# Some likelihood that the problem started within the last six months. 
# Some indication that the problem is not part of multiple problems. 
# The severity of the problem may be defined using a standardised questionnaire. 
# A range of scores on the Parent SDQ could be agreed. So cases falling within the SDQ high range (the third highest of Goodman's four category model). Using this four band classification, we could take an Parent SDQ in the high range (emotional score 5-6: conduct score 4-5) as indicating a moderate level of severity.  
#Similarly we could take an agreed cut off score on the RCADS. 
# In practice, local services are likely to agree a combination of the above. 

!!Possible Exclusion criteria: 

# Evidence that problems have been around for over six months. 
# Evidence of high level of family dysfunction and family conflict. 
# Evidence of multiple problems. 
# Extreme risk 
# If engaged in other work, then may not be able to focus fully on the intervention 

Local exclusion criteria: There may be local differences dependent on commissioners and local need. But need to balance this with what the intervention is effective for and what practitioners are  trained to do 



!!!!!Source:Deb ~McNally and the Manchester Collaborative 

!!!''Principles not techniques''
This page emphasise //principles of parenting// rather than prescribe techniques

* Working ''collaboratively'' with parents. Evidence suggests that the most effective parenting interventions are those that are collaborative in nature. Clinicians can bring their knowledge of theory and effective strategies, but parents are ‘experts’ in their own children and so their views and ideas should be valued and respected
* New parenting skills must be ''modelled ''and ''rehearsed'' through ''experiential learning'' and ''practice.'' This includes active teaching methods such as demonstration and role play. Practices with parents may be used throughout to support parent’s implementation of strategies and to help parents through sticking points. It is important throughout to model the use of genuine praise and positive attention with parents to reinforce their development of skills and strategies
* ''Home-based practice.'' At the end of each session, parents should be set home-practice tasks which involve direct practice with their child at home. At the start of each session, the parent’s ''home-based practice should be reviewed'' as this is key to parents learning – important reflections and the parent efforts should be reinforced with praise. This is also an opportunity to help parents’ problem solve if any difficulties have arisen
* Emphasise ''relationship building'' and ''positive attention ''and ''reinforcement'' through play, enjoyable time together and praise
*'' Safe, non-violent discipline'' for unwanted behaviours

{{manc}}

Links to web page are used throughout the Wiki and look like this:


[img[web links.png]]
Traditionally, CAMHS in the United Kingdom have been divided into "tiers". Here Tier-3 often represents the highest level of specialist outpatient mental treatment. Tier-3 services are multidisciplinary in nature, containing nurses, clinical psychologists, psychiatrists, family therapists, and child psychotherapists. Tier three services often have close links with inpatient services (Tier 4  services). 
Some helpful introductory information on ADHD can be found at 

https://www.acamh.org/topic/adhd/
!!!!Source: Peter Fuggle; Laura Bowyer 
!!!''What is anxiety''
*Everyone experiences anxiety at some point. It is a normal and appropriate reaction to negative life experiences. 
*Anxiety is an unpleasant and aversive state of mind characterised by physical sensations of discomfort (butterflies in the tummy), emotions of anxiety and fear and avoidant behaviour (not going near the feared situation). In this way, it has cognitive, emotional and behavioural components.  
*Anxiety problems are common occurring in 1 in 6 young people at some point in their lives. This suggests that several young people in any classroom may be at risk of having significant anxiety problems. 
*Anxiety disorders have been divided up into a number of different types (see below). 
*EMHPs are not trained to diagnose different anxiety disorders but familiarity with these different types will be helpful in considering methods of guided self help. 

!!!''Types of Anxiety Disorders'':

* ''Generalised anxiety disorder'' (GAD)
* ''Social anxiety'' 
* ''Separation anxiety disorder''
*'' Phobia'' 
* ''Panic Disorder''. See [[What is panic?]]
* ''Health anxiety''
* ''Worry''. See  [[What is worry?]] 

''Anxiety-related disorders:'' 

*Obsessive compulsive disorder
*Post traumatic stress disorder

!!!Linked pages:
A general introduction to anxiety in children by Peter Fuggle, David Trickey and Dickon Bevington can be can be found at [[Anxiety in young people: a brief overview]]

!!!''Useful resources''
Anxiety UK provide the following information for young people about anxiety 
*https://www.anxietyuk.org.uk/get-help/anxiety-information/young-people-and-anxiety/

Information from Young Minds 
*https://youngminds.org.uk/find-help/conditions/anxiety/

Information from the NHS 
https://www.nhs.uk/conditions/anxiety-disorders-in-children/

Information form ACAMH
https://www.acamh.org/topic/anxiety-disorders/
!!!!By Sarah Thompson, CWP at SLaM


BAME is a British abbreviation that representative of the category term Black, Asian and Minority Ethnic. It is used to refer to members of non-white persons, populations and communities in the UK.

Its origin derives from "political blackness", an idea that various ethnic groups united behind to fight against discrimination in the 1970s.

[img[group-diverse-kids-standing-together_53876-22754.jpg]]

!!! BAME people, according to the Government, include: 

•Arabic people


•Asylum seekers and refugees


•Asian or Asian British people


•Black (African/African Caribbean) or Black British people 


•Chinese people


•Irish people (White other)


•People of mixed heritage


•Travellers and Gypsies


[img[fonds-ecran-groupe-enfants-qui-s-amuse-10-1024x685.jpg]]

!!! What is BME?

The term BME is another variation which is used, representing Black Minority Ethnic. 

The term BME has its roots in the idea of "political blackness", a term used by many in the anti-racist movement in the 1970s.

Professor Ted Cantle, who chaired a government review of community cohesion in 2001, says different ethnic groups banded together under a "universal term" - black - to fight back against discrimination.

But this was challenged by people unhappy being lumped all together. 

In the 1990s, sociologist professor Tariq Modood began arguing that including different people under one label - black - was confusing and wouldn't work. He argued it was particularly harmful for British Asians, as it gave undue prominence to Afro-Caribbean people.

At the time, his ideas were met with "great hostility by anti-racists".

[img[OIPM87BY4FN-culture.jpg]]

!!! What is Ethnicity or Ethnic Origin?


Ethnic origin is identified by a specific history, ancestry, language and culture shared by a group of people.


!!! What is [[Race|What is Racism?]]?

Race is defined as being “an umbrella term used to describe aspects of a person’s identity that is generally linked to their own of their ancestor’s homeland”, according to the Government.

‘Race’ is a term that we use in our everyday life to describe or give reference to various different groups of people. Race is frequently characterised by skin colour, hair texture, facial features and even eye colour. We look for characteristics that show how different we are as humans, and assume that there must be a biological or genetic difference associated to race, when in actual fact there is no real biological difference. 

However, race does portray the salience of a social construct, which has developed over the last half millennium. As the world has developed, so has the concept of race. Omi and Winant go on to suggest that the concept of race can be characterised by two main areas (1) contemporary political relationships and (2) the global context of race. Omi and Winant (1986). 


[img[Caution.jpg]]

!! The problem with using BAME and BME


“One thing I’ve noticed working in the Cabinet Office’s Race Disparity Unit is how many different ways there are to refer to people from ethnic minorities. 

It's true that, in government, we create new acronyms and initialisms on a regular basis, and rightly too – they can be very catchy and convenient! However, it is also true that acronyms and initialisms are not always well thought through. Where we find evidence that they are not widely understood, have negative connotations or are hurtful to people, it is right that we revisit them”.

!!!! Zamila Bunglawala, Deputy Head of Unit & Deputy Director Policy and Strategy, Race Disparity Unit, Cabinet Office



The acronym BAME and the initialism BME are useful to a degree but poses limitations. ‘BAME’ stands for ‘Black, Asian and minority ethnic’ and ‘BME’ stands for Black and Minority Ethnic’. The terms are widely used by government departments, public bodies, the media and others when referring to ethnic minority groups. Yet research carried out with nearly 300 people across the UK, found that only a couple recognised the acronyms and only one knew vaguely what they actually stood for!

There is also a problem in that the terms ‘BAME’ and ‘BME’ aren’t always associated with White ethnic minorities such as Gypsy, Roma and Traveller of Irish Heritage groups, which are among some of the most marginalised and disadvantaged communities in the UK. To leave these communities out of the very language we use is to marginalise them even further. 

Many individuals never refer to their ethnicity using BAME or BME, and do not like it when they are used to describe them. Many individuals of ethnic minority status would rather refer to their specific ethnic identity i.e. Indian, Caribbean, African etc. This may differ according to an individual’s personal preference. The acceptability of terms BAME and BME has been called into question by The BBC, The Times and The Guardian as well as by people who identify as ethnic minority who believe these terms diminish the distinct differences between the populations of people who are grouped together under these umbrella terms, for example, Black history should be respected in a context much different and separately nuanced to the history of Asia. Even this example fails to provide an equivalent, sameness or likeness between the populations they refer to.

The term ‘non-White’ was not well received by ethnic minorities during research, as it defines ethnic minorities solely by reference to the White majority. The term ‘non-Black’ is not used when describing the White population, so using the term ‘non-White’ invalidate the sense of equality towards ethnic minorities.

[img[QQQ.png]]

!!! The language we should all be using

On the UK Government’s Ethnicity facts and figures website, they use the term ‘ethnic minorities’. They always use capital letters when writing about individual ethnic groups. Ethnicity is not a colour palette. It is a technical term used in the Census, as well as an important part of an individual’s identity.  Most people rightly recognise that using a lower-case ‘i’ for Indian or ‘b’ for Bangladeshi is wrong, and this same use should apply in using ‘W’ for White and ‘B’ for Black ethnic groups etc. 

For those looking for more information, below is a short list of dos and don’ts provided by the UK Government. They have also developed a short guide on how we write about ethnicity that details their rationale.

[img[Talking about ethnicity... dos and donts.png]]


!!! It’s time to talk 

Some people may feel uncomfortable talking about ethnicity as they do not want to cause offence. That’s why now is the time to have an open conversation about this: to help share valuable research into how ethnic minorities wish to be identified; to help overcome that fear factor; be inclusive and invite others to share their own findings as well. 

We all have an ethnicity, so it is important that we all discuss ethnicity in a way that is appropriate, inclusive and sensitive to how ethnic groups identify themselves.

We may not be able to change everything overnight, but we can make a start. So please, let’s be more aware and inclusive. Inclusion starts with us all. Let’s all do our part in making a positive difference!


!!!!The Children's Wellbeing Practitioner BAME Inclusion Group

https://www.linkedin.com/groups/8873855/
!!!! By Shayo Bryan-Fenelon, CWP at SLaM

!! Cultural identity and development 
For this section, we are using the following definitions:

* [[Culture|What is Culture?]] is the characteristics and knowledge of a particular group of people, encompassing language, religion, cuisine, social habits, music and arts.
* [[Ethnicity|What is Racism?]] is used as a matter of cultural identity of a group, often based on shared ancestry, language, and cultural traditions

During childhood children become aware of ethnicity and cultural differences, however it is during adolescence, with the ability to reflect on the past and future that the adolescent becomes interested in their ethnic background. For many adolescents from ethnic minority groups, ethnic and cultural identity concerns become intrinsic to identity formation. Ethnic/cultural identity is more likely to be explored by those from minority ethnic groups and is seen as very important to the ethnic group (Phinney and Alipuria 1990). 

As a children identity and cultural identity is often unexamined, during this stage the individual have not explored their ethnicity nor culture, and doesn’t have any personal ideologies. Their culture, ethnicity, aims and goals are determined by their parents, religion and peers.

During adolescence, the individual is in the process of exploring their ethnicity; exploring their values and commitments. During this exploration experiences within the family and society play a role in the young person’s decisions about what aspects of their culture they want to keep and those they would like to negotiate. 

Phinney and Chavira (1991) found that experiences of discrimination can hinder adolescents from developing a strong sense of cultural pride and belonging. Additionally, Spencer and Dornbusch (1990) found that an adolescent’s awareness of negative appraisals of their ethnic group could negatively influence their life choices and plans for the future.

The aim is after exploration the young person has identified and committed to their cultural/ethnic identity. 

As practitioners, this can be aided by the exploration of values in the low mood model. Using the Cultural Iceberg, we can ask questions about culture that the young person hasn’t thought about. Just like with a physical iceberg, a cultural iceberg contains essential characteristics beneath the surface. Under the water line of the cultural iceberg are many important components of culture. This includes the ideas, preferences and priorities that comprise individual attitudes and values.

www.lynchlf.com/blog/the-cultural-iceberg-explained/

!

[img[The Cultural Iceberg.png]]



!!!! References:

Kroger, J. (1996) Identity in Adolescence. The balance between Self and other London: Routledge.

Kroger,J(2007) Identity Development; Adolescence through adulthood. London: Sage Publications 

Phinney, J.S (1989) Stages of ethnic identity development in minority group adolescents. Journal of Early Adolescence 9:34-49

Phinney, J.S Chavira, V( 1992) Ethnic Identity and self-esteem. A longitudinal study.
Journal of Adolescence 15: 271-281

Spencer, M. B Dornbusch, S. M (1990) challenges in studying minority Youth. In S.S Feldman and G.R Elliot (eds) At the threshold. The developing adolescent 123 – 146 Cambridge, MA Harvard University





!!!!By Sarah Thompson, CWP at SLaM


! [[Culture|What is Cultural Identity?]]: the characteristics and knowledge of a particular group of people, encompassing language, religion, cuisine, social habits, music and arts.


[img[Culture Poster]]




!!!!The Children's Wellbeing Practitioner BAME Inclusion Group

https://www.linkedin.com/groups/8873855/

!!!!!Source: Peter Fuggle; Laura Bowyer
!!''Low mood as adaptive to negative life events.''
*Low mood is a general term for a wide range of experiences which happen to everyone as a reaction to negative life events. 
*Low mood can include feelings of sadness, feeling anxious or panicky, worry, tiredness, low self-esteem, frustration or anger. 
*A low mood will tend to lift after a few days or weeks, or if the original problem resolves. 
!!''The problem called 'Low Mood'''
If problems do not resolve over time and have an impact on functioning further help may be needed.
*The problem called 'Low mood' means a persistent state of mind which has been going on for at least two weeks and often for much longer. 
*The functional impairment (e.g. not going to school, withdrawing form social interaction)  is the most important factor in distinguishing low mood from “ordinary” and appropriate sadness.
*Common aspects/symptoms of depression are:
**not getting enjoyment from life;
**boredom;
**social withdrawal; 
**feeling hopeless; 
**feeling constantly tired or lacking in energy; 
**not being able to concentrate; 
**comfort eating or loss of appetite; 
**somatic complaints;
**sleeping more than usual or problems in sleeping; 
**thoughts of suicide or self harm; 
**feeling guilt ridden; 
**irritable or intolerant of others 
**finding it difficult to make decisions 
**loss of motivation in activities.
**thoughts of being worthless along with high self-criticism. 
*Young people are more likely than adults to show comorbid behavior problems. (Knox, King,Hanna, Logan, & Ghaziuddin, 2000). 
!!''Low mood in this guide''
All pages in this guide relating to low mood in young people have been tagged with [[Low Mood]]. This guide does not cover low mood in children. So if you are trying to find things, just put this in the search bar or look for [[Low Mood]] on the tag list to try to find what you are looking for.  
!!''Useful resources''
*TED talk: this is a video of a young person describing their experience of depression
**What they don't tell you about mental illness - https://youtu.be/ieXB-BGxYwg
*I had a black dog, his name was depression
**https://www.youtube.com/watch?v=XiCrniLQGYc
*The truth about teen depression 
**https://www.youtube.com/watch?v=txJGm6zhiBA



!!!!By Shayo Bryan-Fenelon, CWP at SLaM

! Race

‘Race’ is a term that we use in our everyday life to describe or give reference to various different groups of people. Race is frequently characterised by skin colour, hair texture, facial features and even eye colour. We look for characteristics that show how different we are as humans, and assume that there must be a biological or genetic difference associated to race, when in actual fact there is no real biological difference. 

However, race does portray the salience of a social construct, which has developed over the last half millennium. As the world has developed, so has the concept of race. Omi and Winant go on to suggest that the concept of race can be characterised by two main areas (1) contemporary political relationships and (2) the global context of race. Omi and Winant (1986). 

! Racism
Lipsky (1995) states that racism is a form of oppression that is systematically initiated encouraged and enforced by the distress patterns of the majority culture. Racism and racial discrimination can manifest itself in many different ways not only in the attitudes of people but also in social structures that systematically disadvantage a particular race (McConnochie et al 1988). Many of our young people/families interact with many systems, housing, school, health, social care. How can you support them to navigate racist institutions? Validation is key, to helping them know you understand what they are going through.


[img[The impact of Racism on Mental Health.png]]


! Impact of Racism

The brutal murder of George Floyd highlighted that racism still exists and is more bold and prevalent. His untimely traumatic death has reignited a level of activism in communities across the globe and brought Black lives matter into the forefront. The impact of George Floyd’s death brought to the surface raw feelings linked to the impact of racism. Young people from BAME communities experience a range of emotions linked to racism in the community and personal experiences. These aspects will need to be taken into consideration with regards to Anxiety and low mood interventions. Validation of the racism and its impact is key, to helping them know you understand what they are going through.


Omi, M. Winant, H (1986) On Theoretical Concept of Race. In: Mc Carthy, C. Warren, C (ed) (1993) Race Identity and Representation in Education. London:Routeledge 


!!!!The Children's Wellbeing Practitioner BAME Inclusion Group

https://www.linkedin.com/groups/8873855/
“No, but where are you really from?” It is the question that is asked a lot to BAME young people. For “third culture kids” (TCKs),  they are left wondering whether the question refers to nationality, birth, residence, or where parents reside.


The term, “third culture kids” (TCKs), coined by the American sociologist, Ruth Hill Useem, refers to a child who has spent a significant part of their formative years outside their parents’ culture.


In summarizing that which we had observed in our cross-cultural encounters, we began to use the term "third culture" as a generic term to cover the styles of life created, shared, and learned by persons who are in the process of relating their societies, or sections thereof, to each other. The term "Third Culture Kids" or TCKs was coined to refer to the children who accompany their parents into another society. Ruth Hill Useem http://www.tckworld.com/useem/art1.html
TCKs move between cultures before they have had the opportunity to fully develop their personal and cultural identity. The first culture of such individuals refers to the culture of the country from which the parents originated, the second culture refers to the culture in which the family currently resides, and although not widely agreed upon by the TCK community, some sources refer to the third culture as the amalgamation of these two cultures.


Benefits:
•	Expanded worldview TCKs have an understanding that there is more than one way to look at situations that they are exposed to or experience. 
•	Third-dimensional view of the world: With an increased number of hands experience in multiple cultures, there is a difference in the way that the world is perceived. 
•	Interpersonal sensitivity: Increased exposure to a variety of perceptions and lifestyles allow TCKs to monitor their emotions, and register societal norms and cues more adeptly so as to produce higher sensitivity to other cultures and ways of life.
•	Cross-cultural competence cultural intelligence: the capacity to function effectively across national, ethnic, and organizational cultures.
•	TCK have been found to have higher levels of general adjustment as opposed to mono cultural children. Cultural adaptability is also a benefit, although may also come as a challenge which results from lack of cultural balance. 
•	The major benefit, however, is related to language exposure.


Challenges
•	Confused Loyalties Third culture kids can experience a lot of confusion with politics and values. This is especially the case when moving from collectivist to individualist cultures, or vice versa, as the values within each culture are different from the other.
•	Difficulties with adjusting to adult life: the mixture of influences from the various cultures that the individual has lived can create challenges in developing an identity as well as with a sense of belonging. Feelings of rootlessness and restlessness can make the transition to adulthood a challenging period for TCKs.
•	This issue is also related with the identity crisis, on a cultural level, not being able to feel a sense of oneness with any one nationality or culture. 
•	Painful awareness of reality: difficulty adjusting to cultures where the only culture that is discussed or focused on is itself.
•	Ignorance of home culture: TCKs are often lacking in knowledge about their home nation, culture, town, and/or family. 
•	Understanding a culture's sense of humor, however, is a commonly cited difficulty with the transition back to a home culture. There are also general societal norms and practices that will not be known when a TCK is first re-introduced to his/her home culture but those are eventually learned.

In her article for The Guardian in 2016 ‘Am I rootless, or am I free? ‘Third culture kids’ like me make it up as we go along’, Ndela Faye explores her experience of being a TCK. The challenges and benefits. She has been able to find a new perspective on the being a TCK. 

“Being rootless has given me a sense of freedom. I feel grateful for the experiences I’ve had, and I am proud to feel, above all, like a citizen of the world. The possibilities for the future are endless. The sense of being at home anywhere, yet feeling that home is nowhere, is part of who I am. I’ve gradually built myself an identity that is a collection of pieces, each of which I’ve handpicked; choosing the best bits in order to create a whole.” Ndela Faye 2016





taken from madisonzeller.com

Useem, Ruth Hill; Downie, Richard D. (1975-11-30). "Third-Culture Kids". Today's Education.

Melles, E.A.; Schwartz, J. (2013). "Does the third culture kid experience predict levels of prejudice?". International Journal of Intercultural Relations. 37 (2): 260–267. doi:10.1016/j.ijintrel.2012.08.001

Tokuhama-Espinosa, Tracey (2003-01-01). The Multilingual Mind: Issues Discussed By, For, and about People Living with Many Languages. Greenwood Publishing Group. ISBN 9780897899185.

Pollock, D.C., & Van Reken, R.E. (2009). Third culture kids: The experience of growing up among worlds. Boston: Nicholas Brealy.

Faye, N. March 2016, ‘Am I rootless, or am I free? ‘Third culture kids’ like me make it up as we go along’ https://www.theguardian.com/commentisfree/2016/mar/09/third-culture-kid-identity-different-cultures- 
A term that refers to a broad range of psychological therapies delivered within a short time-frame (e.g., 8 sessions). Examples include: (a) guided self-help, (b) low-intensity CBT, and (d) modular CBT. 

#Wherever possible services should be needs led rather than service led. 
#Low intensity does not mean brief. It may be appropriate to offer a long term low intensity form of help. 
#Interventions are designed to support self-management of problems.
#Low intensity interventions are more akin to guided self-help than traditional forms of therapy. 

!!More operational definitions of low intensity 
#a form of guided self-help explicitly chosen by the parent or young person as a form of help that they would like. 
#following a set protocol of help.
#a fixed length of appointments.
#less frequent contact than normal intensity. Maybe termly check-ins. Not traditional weekly appointments.
# involving less face to face contact. Practitioner contact with parent or young person being predominantly by phone or email. 
#setting a resource limit. Agreeing a general allocation of time to each case as, for example, being less than 10 hours. 
 
For cases seen in the CWP programme, some or all of the above should apply. These are offered as general guidance and it is the task of local partnerships to develop more specific local protocols of practice that are consistent with  these. 

Some services may choose to have have definitions linked to the number of contacts and some may choose to define low intensity self help as being following a set of self help materials. The important thing is for local partnerships ot have explicit protocols against which to measure outcomes. 

!!Linked pages
[[Nine Components of Guided Self Help]]
!!!!!Sources: Peter Fuggle; Royal College of Psychiatry;Peter Fonagy and colleagues (What works for whom; Second Edition) 


!!''A working definition''
*A helpful working definition of behaviour problems is provided by the Royal College of Psychiatry. 
*Behavioural problems can happen in children of all ages. Some children have serious behavioural problems. The signs to look out for are:
**if the child continues to behave badly for several months or longer, is repeatedly being disobedient, cheeky and aggressive;
**if their behaviour is out of the ordinary, and seriously breaks the rules accepted in their home and school. This is much more than ordinary childish mischief or adolescent rebelliousness. (Royal College of Psychiatry Information leaflet)
!!''Risk factors''
Risk factors for behaviour problems include:

** impulsiveness
**low IQ and low school achievement
**poor parental supervision,
**punitive or erratic parental discipline
**cold parental attitude
**child physical abuse
**parental conflict
**disrupted families
**antisocial parents
**large family size
**low family income
**antisocial peers
**schools with high delinquency rates
**high-crime neighborhoods 
(Murray, Irving, Farrington, Colman, & Bloxsom, 2010).

*Attention Deficit Hyperactivity Disorder (ADHD) is often also present with behaviour problems. A study by Larson, Russ, Kahn, and Halfon (2011) found that 27% of children with ADHD had a comorbid CD,

Links to other pages:

[[Types of Behaviour Problems]]
CWP stands for Children’s Wellbeing Practitioner and is a new role which has been developed and is being rolled out across the country. In London and the South East this is being led by the London and South East CYP IAPT Learning Collaborative.

CWPs are being employed  within children and young people’s mental health services across London and the South East of England. 

The programme is a response to the target for offering evidence based intervention to 70,000 more children and young people annually by 2020, by training up 1700 new staff in evidence based treatments, outlined in Implementing the Five Year Forward View for Mental Health.

''Who will CWPs work with?''

The CWPs will be trained over the course of a year to offer brief, focused evidence- based interventions in the form of low intensity support and guided self-help to young people who demonstrate mild/moderate:

* Anxiety (primary and secondary school age) 
* Low mood (adolescents) 
* Common behavioural difficulties (working with parents for under 8s)

Skills will be measured against [[Core Competencies for CWP Practitioners]]

As such, these new teams of CWP – essentially a new sub-service – will be placed upstream in the pathway in primary care, schools, and the voluntary sector, as well as CAMHS in some areas. 
!!!!Source: Vicki Curry

!!!@@color:red;THIS PAGE IS CURRENTLY BEING WRITTEN AND IS AWAITING REVIEW@@ 

!!!Introduction
In the guided self-help (GSH) model, we refer to a Session 0, which takes place prior to session 1 of each GSH intervention.  

It does not matter if this is not called “session 0”. It might have a different name in your service, e.g. assessment, Choice appointment.  However, once the information as outlined below has been gathered and the most appropriate GSH agreed, the practitioner then moves on to Session 1 in the relevant GSH protocol.

!!!The purpose of a session 0

The purpose of this session is assessment: to gather enough information about the child/young person’s (CYP) difficulties to enable the pracitioner, in collaboration with the CYP/parent, to decide which of the four possible GSH interventions is the most appropriate to undertake. 

This general assessment is likely to include:

*clarification of the main problem for which the CYP/parent is seeking support, 
*brief background information (developmental/school/family history),
* impact of the problem on the life of the CYP/parent,
* strengths, 
*risk assessment, 
*RCADS/SDQ 
*basic idea of goals or what YP/parent would like to achieve from sessions. 


!!!Do practitioners always need to conduct a “Session 0”?
Sometimes a CYP receives a full assessment from CAMHS or a similar service, from which a referral to the practitioners service seems appropriate.  As long as the practitioner and their supervisor think there is enough information in this assessment session to make a decision about the main presenting problem and which GSH intervention is most appropriate, there is no need to conduct another assessment in the form of a session 0.  If this is the case, the practitioner may start with session 1 of the appropriate GSH intervention.  However, it is important that in this session 1, the practitioner briefly reviews the assessment completed by the other clinician/service with the CYP/parent to confirm the information gathered and clarify the choice of GSH intervention.  We would also suggest that the practitioner check in about risk in Session 1.  Then the practitioner can move onto the main content of session 1 for the chosen GSH intervention e.g. psychoeducation, formulation, goal setting. 

!!Session 0 for different ages/presenting difficulties
The interventions for younger children (managing behaviour problems and the Creswell et al “overcoming anxiety” manual) primarily involve work with parents – although the referred person is the child. The other two interventions (adolescent anxiety and low mood) work primarily with the referred young person.  Therefore, the nature of the session 0/assessment session may be slightly different.  For this reason, we have written a Session 0 guide for work with parents of younger children ([[click here|Session 0 for Younger Children: General Assessment]]) ; and a Session 0 guide for work with adolescents ([[click here|Session 0 for Adolescents: General Assessment]]).   
*Speaker discusses headline of the dilemma 
*Questions to help the person reflect and not advice
*Then reflections while the person with the dilemma listens 
*Then person with the dilemma discusses what they have decided to do 
!! What is the fight or flight response and where does it come from?
When we feel [[Anxiety|What is Anxiety?]], our bodies are reacting in a way that was a response that evolved in our ancestors to help us survive. 

To put it simply, when we are in danger, an old 'system' in our brains is triggered, which quickly springs into action, sending signals to our body to get ready for action: To Fight or Flee from the danger. Our bodies then prepare to to this by pumping lots of blood around the body (fast heart rate and quick breathing), sweating (keeping our bodies cool), and tensing muscles (which can result in trembling).

However, this 'system' is now quite outdated, as the dangers/problems that we experience in modern day rarely require us to run away or fight, which can leave us with an uncomfortable feeling in our bodies, as our bodies don't use up the energy that they were quickly making for this response.

''Below is a video which helps to explain this response:''
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/0RB9fAGxSOU" frameborder="0" allowfullscreen></html>

In some ways this is the million dollar question that the whole service is designed to try to discover. The important starting point here is that this is not restricted to professional forms of help. Help is a universal form of social interaction and behaviour and children, young people and parents will need help in inviting them to think more widely than just thinking about 'going to services'. 
The practitioner's enquiry needs to linked to the problem that they have come for help with.Some examples. 
#//When you are feeling low, is there anything that helps you get through these feelings better?//
#//If you are feeling really frustrated by Johny's behaviour, who helps you to  get yourself back on track?//
#//If you getting really worried about something, what or who helps you to feel a bit better?//
However what may be seen as helpful may be less directly to do with the problem than we may anticipate. Here are some examples:

//What I would really like is for my Mum to stop criticizing me and always trying to control things.//
//I just want a decent phone//.
//My Dad just doesn't trust me. He doesn't say it. He is always checking my room for blades. I just want him to stop doing this.//
//I would like someone to talk to my Head of Year and arrange for me not to have to do PE.//
//I just want to talk to someone, someone who isn't going to tell me what to do.//
//i hate talking about this stuff with other people. I feel so embarrassed. Is there a good website I could go to?//
//I just want someone to pay for my gym membership.//
//I just want someone to talk to my parents about allowing me to go out at the weekend.//
//I just want need some money. My mates have money but my parents don't trust me with any money now.//
//I just want to be allowed to drink at the weekend. I know i shouldn't do it all week but just at the weekend is what everyone does.//
//I cant stand it when my parents argue. Can you get them to stop and then I would get myself sorted.//

Some of these things may be very hard to know how to respond to in an immediate way. They may be outside the area of influence that the worker has or they may be not desirable for lots of other reasons. However, what is key is that these ideas are not forgotten or dismissed and that they are seen as crucial to establishing a sense for the young person that their perspective will be respected, thought about and included in some way in the plan. 






A term that refers to a broad range of psychological therapies delivered within a short time-frame (e.g., 8 sessions). Examples include: (a) guided self-help, (b) low-intensity CBT, and (d) modular CBT. 

#Wherever possible services should be needs led rather than service led. 
#Low intensity does not mean brief. It may be appropriate to offer a long term low intensity form of help. 
#Interventions are designed to support self-management of problems.
#Low intensity interventions are more akin to guided self-help than traditional forms of therapy. 

!!More operational definitions of low intensity 
#a form of guided self-help explicitly chosen by the parent or young person as a form of help that they would like. 
#following a set protocol of help.
#a fixed length of appointments.
#less frequent contact than normal intensity. Maybe termly check-ins. Not traditional weekly appointments.
# involving less face to face contact. Practitioner contact with parent or young person being predominantly by phone or email. 
#setting a resource limit. Agreeing a general allocation of time to each case as, for example, being less than 10 hours. 
 
For cases seen in the CWP programme, some or all of the above should apply. These are offered as general guidance and it is the task of local partnerships to develop more specific local protocols of practice that are consistent with  these. 

Some services may choose to have have definitions linked to the number of contacts and some may choose to define low intensity self help as being following a set of self help materials. The important thing is for local partnerships ot have explicit protocols against which to measure outcomes. 
A panic attack is an abrupt surge of intense fear or intense discomfort that reaches a peak within minutes, and during which time four or more of the following symptoms occur. The abrupt surge can occur from a calm state or an anxious state DSM – 5 (American Psychiatric Association, 2013):

#Palpitations, pounding heart, or accelerated heart rate
#Sweating
#Trembling or shaking
#Sensations of shortness of breath or smothering
#Feeling of choking
#Chest pain or discomfort
#Nausea or abdominal distress	8. Feeling dizzy, unsteady, lightheaded, or faint
#Chills or heat sensations
#Paresthesias (numbness or tingling sensations)
#Derealization (feelings of unreality) or depersonalization (being detached from oneself)
#Fear of losing control or going crazy
#Fear of dying

People with Panic Disorder are a subset of people experiencing panic attacks which are recurrent and unexpected. Panic attacks arise from the “catastrophic misinterpretation of certain bodily sensations” and so interventions should target these cognitions. i.e. They are not always triggered by anticipating or encountering a phobic situation, or sudden increase in the severity of a phobic situation.

*Also, the main fear in panic disorder is of having a panic attack and its consequences rather than of situation, place, activity etc (eg as would be the case for someone with a phobia.)
*The problem is that our body’s “alarm system” was designed many, many years ago, when people had to cope with dangers in order to survive. 
*Nowadays, we are rarely faced with the sort of life or death threats our ancestors faced. We have different threats, mainly related to stress. 
*Exam worries, overworking, moving house or school for example, can all be stressful, and can raise our anxiety levels to the point where our “alarm system” is triggered. 
*It is a bit like a “stress” thermometer – which when it reaches a certain level results in panic. 
*Whilst a panic attack may be unpleasant, it is not dangerous but quite the opposite. It is a system designed to protect us, not harm us.
*Panic is a form of fear. It is our body’s alarm system signalling threat. It prepares our body to fight or run away from danger. But as there is no physical danger it is a false alarm. 
*A panic attack may be unpleasant but it is not dangerous.

Panic attacks are, by definition, VERY scary and anxiety is VERY aversive
People therefore, understandably, start doing certain things:

#Avoidance: Avoiding situations and places associated with panic attack or an increased likelihood of having a panic attack.
#Safety Behaviours:  Doing certain things to prevent a panic attack, try to stop it once its begun or in some way make themselves safe from the perceived harm or threat.

These can mean that people:

*Never find out that nothing terrible was going to happen
*Dread going back into the situation
*Lose confidence in their ability to cope alone.

''Panic attacks: what can hep''

*Recognise whether, or not, you are having panic attacks
*Understand panic using specific psychoeducation, what causes it and what keeps it going (use a specific panic formulation)
*Accept that panic cannot harm you
*Learn techniques to reduce panic; this should mainly involve questioning the misinterpretation of bodily sensations with cognitive techniques as above and then facing situations the YP avoids. 
*Also, relaxation, controlled breathing and distraction can help e.g. in an exam situation. 




Two brief presentations by Dr Pooky Knightsmith from the Charlie Waller Centre in Reading 

!!!What is Self harm? 
https://www.youtube.com/watch?v=e_XIRxIp1fI

!!!What not to do in response to others self harm

https://www.youtube.com/watch?v=gfRwez8ergg
!!Introduction 
There are many similarities between guided self help and therapy and therapies are very heterogeneous with some therapies being more explicitly supportive of a self management approach and some less so. Because of this it may be unhelpful to try to come to categorical differences between guided self help and therapy. There is a risk that this question could generate a lot of somewhat academic discussion which may be less helpful to the front line practitioner. The intention here is to try to articulate some pragmatic frameworks that may be helpful in guiding practitioner decision making and behaviour. 
!!Difference in desired outcome 
In general, therapy adopts a position similar to a medical model of assuming an obligation to provide treatment (help) to the client (patient) until the problem is cured or remediated. Clearly this position is complicated for problems in which treatment or therapy is only relatively effective for a proportion of cases within the resources available to the process of help. This is the most common situation in child and young people's mental health where therapies are only modestly effective at best. This can result in 'treatments' becoming prolonged based on the obligation of the practitioner to the client to continue until things get better. In general, there is mixed evidence as to whether longer 'treatments' lead to improved outcomes so that longer treatment are likely to be offered as much out of a sense of obligation to the client than on the basis of improved outcomes. In contrast, guided self help has no explicit obligation to achieve 'cure' but an ambition to increase coping and self management capacity within clearly agreed time frames and resources.
!!The position of expertise
In traditional therapy, the therapist holds a position of expertise in the work. (For some therapies, there maybe a complex relationship to this expertise which results in adopting non-expert positions in working with the client.) However, the client sees the therapist as possessing some expertise which will be helpful to the client's problems or condition. In guided self help, the relationship is constructed slightly differently; the expertise is seen to exist  in the self help materials that are being shared with the client AND in the practitioner's expertise in making this knowledge available to the young person or parent. The expertise of the practitioner is in helping the client to access and utilise the materials which they are being offered and in the practitioner's familiarity in how best to make use of these ideas. In this way, the practitioner is not expected to hold a position of unique expertise about the problems being presented but a position of knowledge of materials that might help this problem or condition. 
However it would be wrong to exaggerate the separation of self help materials and the expertise of the practitioner. Such a distinction would apply to all evidence based practice in which the practitioner is helping a client make use of an evidence based intervention. In some ways, the process in guided self help is just more transparent than in some traditional forms of therapy in which the expertise may be experienced as residing 'in the therapist' rather than  'in the treatment'. 

''An educational example''. Let us take an educational example and consider the role of a teacher. In the traditional role of a teacher, the teacher would have knowledge of the subject. So a teacher of Russian would be able to speak Russian and use this knowledge to teach Russian. A educational 'self help' practitioner would  be able to help students to learn Russian by being very familiar with educational materials for Russian, have some basic knowledge of the subject but would not rely on their own knowledge but on the knowledge in the texts and materials that they can collaboratively share with the student.  The approach would encourage the practitioner and the student to learn together. The assumption is that the practitioner is very interested in Russian and ''will have extensive experience and confidence in helping students learn the subject'', will be familiar with common pitfalls, be creative in getting round these pitfalls and will be confident in the expertise that they hold. 
!!Guided self help as a learning approach 
The outcome of guided self help is that, at the end of the helping process, the client will have learnt what is generally considered to be a helpful approach to a particular problem, what the research says is likely to work etc and, with active support from the Wellbeing Practitioner, will have had an opportunity to see how this applies for the parent or young person in  his/her particular case. It is not assumed that this will result in positive change for all cases but the outcome is that the client will know what many do in this situation and will have had a chance to consider this, or try this out in their own case. So the helping process is like a learning course with objectives at the end of the course that the client will have learnt both knowledge and skills in relation to their problem. If we continue with example of learning Russian, some may go on and continue to speak the  language but some may not. 
!!Guided self help as having a clear curriculum with a beginning, middle and end. 
The assumption is that the client will be aware of th course that they are doing form the beginning, will know what is involved and will be able to anticipate the completion of the course from the beginning. just like an evening class, there is no surprise when the course finishes after seven contacts or sessions. having clear course materials which describe the course that can be shared with the client at the beginning of the course is important for the process.  
!!Some implications of adopting this position in working with families.  
Guided self help will give greater prominence to: 
#supporting autonomous 'helping' behaviour by the client
#promote joint learning activity for the practitioner and the client to work on together
#collaborative approach to looking at self help materials and working out what this means for the individual family. 
#be more focused on what happens in the clients life than what happens in contacts with the client
#be less focused on the relationship with the practitioner than may be the case in many therapies.
#give greater prominence to adopting a role of a coach' (see [[The basic stance for GSH]])
#frame the process of help as having some learning objectives and being like an educational course 
#have a clear shared curriculum with a clear end point. 



!!!''Key points''
*We all worry but for some worry can become excessive and unhelpful. 
*Worry tends to be about two different types of fear:
*Hypothetical fear – a worry about something that may happen in the future, e.g. family member dying, house being broken into, failing exams and not getting into university.
*Current problems – a worry about a problem that YP is experiencing, e.g. not being able to focus on revision, friends arguing, being bullied at school. 
*The interventions for these types of worry differ. 
!!!''Self help materials for worry'' 
Camden and Islington Mental Health Trust have produced a stress and worry workbook with very good psycho-education materials. See link below. 
 https://drive.google.com/drive/folders/0B-tACu2wi4-4a0NocmRXaElfOHM

!!!''Worry: what can help'' 

''Hypothetical fear'' 

*A worry about something that may happen in the future, e.g. family member dying, house being broken into, failing exams and not getting into university. Intervention = try and let worry go (utilize distraction or re-focusing of attention e.g. 5, 4, 3, 2, 1) 
*utilize worry time (writing the thought down and letting it go until planned worry time).

''Current problems''

* a worry about a problem that YP is experiencing, e.g. not being able to focus on revision, friends arguing, being bullied at school.
*Intervention = [[Problem Solving]] 
Source: Natasha Byrne and Duncan Law

Excerpt from CWP Operational Guidance for London and South East

View Operational Guidance here: https://drive.google.com/file/d/1KXOkFEFMGyJ3h5EHPP6MKyl3T0Gs_cCM/view?usp=sharing

! CWPs should:
* Assess and support people with low level mental health problems
* Signpost people and facilitate access to other services when appropriate
* Work through a variety of media such as telephone, internet and face-to-face and in a range of settings close to where families live - such as schools, health centres, community or youth centres or children’s centres.
* Offer low intensity, focused, evidence based interventions outlined in the CWP curriculum and certificate training programme:

<<<
* Guided self help
* Behavioural activation
* Problem solving
* Cognitive restructuring
* Exposure and habituation / Exposure and
* Response prevention
* Worry management strategies
* Social Learning theory-based parent support
* Behavioural and emotional regulation strategies (sleeping, toileting, feeding etc.)
* Computer based CBT
* Lifestyle management
<<<

* Review children and young peoples’ progress and record outcomes achieved
* Be able to access specialist input quickly when appropriate


! CWPs should not:
* Routinely assess and triage children and young people with severe, complex or enduring mental health problems or those presenting with complex issues
* Support children and young people with high
* levels of risk or needing a specialist level of care or intervention
* Work in isolation 
* Be involved in complex, or moderate to high need situations or presentations
* Hold cases that reach CAMHS thresholds 
* Close cases until all recording including monitoring of outcomes is completed
* Operate without appropriate supervision
Source: Natasha Byrne and Duncan Law

From Cohort 1 CWPs

! Things that might make it difficult for CWPs to be open and honest in supervision

* Power imbalance, both perceived and real, in terms of:
* Authority (they manage you) , They are more senior than you , They have more knowledge than you 
* Worries that they might take it personally – and this might cause a rupture the relationship personally and professionally 
* Could it impact on your appraisal?
* Could impact on your pay and your job?
* It could highlight vulnerabilities and weaknesses 
* What if they don't listen to you and it doesn't make any difference- what's the point of taking a risk and being open?
* Timing of supervision- it can be hard to “open up a can of worms” and talk about difficulties with a supervisor when you’re about to go and see a client
* Lack of knowledge about confidentiality in terms of supervision:  Who do supervisors talk to about what is discussed?  Where does the information go? Could there be any “consequences” to issues discussed in supervision (e.g. appraisal, job, pay)
* If it is being filmed – this might make it hard to disclose certain things. Are they allowed to say “no” to supervision being filmed? Can they ask for the camera to be switched off if they are talking about something personal?


! What supervisors can do to help CWPs be open and honest in supervision:  

* Showing that they have made mistakes too, e.g. through giving case examples and/or showing video of their sessions where it might have gone wrong
* Keeping the CWPs at the centre of the process - e.g. checking they're ok with the agenda, and checking in with the CWP at different points re how they're finding it
* Being clear and open about how the information in supervision is used e.g. Who do they discuss it with, limits of confidentiality, who gets to hear about it,  could it be used against them? Putting these kinds of things in their contracts
* Be a bit humble - e.g. talking about  they might learn from the supervisee, as well as the other way round
* Being honest if there are limitations to their role e.g. service issues - be a bit human about their feelings about this too if they have any
* The CWP is likely to focus on the negative- so make sure they also think about positives and strengths, e.g. praise small achievements that have been made
* Sometimes having an opportunity for group supervision might be good in addition to individual supervision- more CWPs in the room might address the power imbalance a bit 
* Trying to get a balance between asking the CWP what they think and for their ideas in supervision, but also sharing the supervisor’s ideas and giving advice
Whats helping/what isn't helpful about supervising CWPs 

Next year supervisor course: 

* Teaching supervisors on the model, modules, POD, online guide in the first few weeks of training 
* Understanding the context of working, how to protect the CWPs time (i.e. not do tier 3 CAMHS work)
*Tension between CWP and tier 3 workers due to case load when working in CAMHS services. Found not to be the case when not physical near CAMHS and accepting referrals from schools. Suggested to think about where CWPs are placed beforehand. 
*Collecting case examples (on wiki?)
*Shared learning on how to 'get going' 


Involvement in Friday sessions: 

* Practice day rather than teaching in the morning and then practice in the afternoon 
* Practice day on less frequent basis 
*Good for CWPs to get experience of different supervisors 
*Possible to come in more than once a month in the early phase 
*Fridays good to join up with course team to be aware of what CWPs are being taught 

How to get around permissions with videoing sessions? 

*Transferring the data to be marked (making it anonymous)
*How did cohort 1 get around this? 
**Could't put USB sticks in SLAM very secure 
**Couldn't transfer data from iPads to computer system
**able to create a drive on the 365 just for CWPs, then video on iPads, zip the files as they are big, then upload onto 365
**Woudn't upload from the wifi so had to upload on 4G which meant it was used quickly 
**also can only store so much on the iPad 

Tip= keep the faith and prepare for short time frames as it takes a long time due to complexity 

*iPads good as they are mobile, and can also have password protection (camcorders can't) 
*Also need log in and log out for USB sticks 
*Used Android not Apple due to protection issues 
*IAPT used camcorded and transfer SD sticks to computer on sites 
*Need two tablets if you are recording with a table, one for outcomes and one for recording
**one site used laptop for recording and tablet for outcomes 

Tip- good to take a few cases yourself as a supervisor so you can learn the model and CWP can observe you
You will be asked to attend (in collaboration with your CWPs) on Fridays to support them in their skills practice sessions. You will be asked to join these sessions approximately once a month/5 weeks. In addition, you will also have the opportunity to meet as a group away from the CWP teaching to share ideas with other Supervisors/Service Development Leads, troubleshoot and work on the service development aspect of the role. These sessions will be facilitated by Duncan Law - lead for the CWP Supervisor/Service Development Lead component of the programme. 
In this video created by Mayo Clinic, teens describe common signs that a teen is considering suicide and how best to help. This could help remind you what the signs are. Could also be a really useful tool to start a discussion with parents about what they can do.

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/3BByqa7bhto" frameborder="0" allowfullscreen></iframe></html>
* Parenting support is a low-level brief guided self-help intervention for parents of children between 2 - 9 years with subthreshold/ mild behavioural problems. The aim is to support parents with evidence-based strategies to manage and prevent the escalation of behavioural problems in their child.
* Additionally, if the parent cannot access a group in their area until a later point in time, this may be an appropriate ‘holding’ intervention (if agreed with supervisor).
!!!!!Source: Deb ~McNally and the Manchester Collaborative 
!!!How do conduct problems happen? 
There are multiple factors that contribute towards the development of conduct problems in young children. These include:

*child factor (poor conflict control, impulsivity and ADHD, learning delays and poor social skills); 
*contextual factors (poverty, parental crime, substance abuse or mental health difficulties, life stressors); 
*school risk factors (classroom aggression, deviant peers, poor teacher response, peer rejection); 
*parent  factors (harsh and ineffective parenting, poor monitoring and low stimulation). ''Parenting factors are the most influential and the easiest to change.''
*''Conduct problems become increasingly resistant over time''. Therefore, intervention that begins as early as possible while the young child’s brain is still developing and is flexible can make the most change. Early intervention is a way to prevent or reduce aggressive behaviour problems in young children. 
*The research shows that childhood aggression and challenging behaviour is one of the best predictors of adolescent and adult violent offending and criminality.  
*''Parenting interventions are cost effective''. Severe behavioural problems accrue a significant cost to society - the estimated lifetime cost is £260,000 per child. The estimated cost of a group-parenting programme per child is £1,300. 
* Research has shown that there is a critical period in the early years of a child’s life that are optimal for development. The early years of a child’s life predict future academic, interpersonal, social and emotional outcomes. Therefore, parents have an important and influential role.  
*Research has demonstrated that factors within the parent-child relationship and parenting approach increases the risk of children developing emotional and behavioural problems. In particular, a lack of warmth from the parents, harsh, rigid or inflexible discipline, inconsistency in approach, parental mental health and martial conflict increase the risk (Coie, 1996; Loeber & Farrington, 1998).

{{manc}}
!! What do we mean by Therapist Effects?
The Law of Variability means that no two individuals faces, bodies, reactions or behaviors are identical. 
This means that all therapists will have different effects on patient outcomes compared to another therapist. 

!! How do Therapist Effects impact on Outcomes?
A meta-analysis of 14,519 patients across 46 studies estimated that around 5% of variability in outcomes is due to Therapist Effects
Okiishi et al (2003) found that there are differences in the outcomes of least effective and most effective therapists (n=407):

* Most effective therapists had more than double the percentage of clients 'recovered' after treatment when compared to least effective therapists (22.4%, 10.61%)

* Most effective therapists also had a higher percentage of clients 'improved' when compared to worst to least effective therapists

* Least effective therapists had a higher percentage of clients with 'no change' (61.46%, 50.86%) or 'deterioration' (10.56%, 5.2%) when compared to most effective therapists

!! What explanations are there for Therapist Effects?
Interestingly, these therapist effects are NOT explained by:

* Demographics e.g. age, gender, ethnicity

* Professional Features e.g. qualification, job role, years of experience

* Theoretical Orientation e.g. CBT, IPT

** Beutler et al, 2004, Baldwin and imel, 2013, Pybis et al, 2017)

However there do seem to be associations between Therapists Effects and:

*''@@color:purple; Therapeutic Self Doubt (Increased self doubt was associated with better outcomes)@@''

* Facilitative Interpersonal Skills 

* Reflective Functioning

* Deliberate Practice 

** Nissen-Lie et al, 2017, Anderson et al, 2009, Cologon et al, 2017, Choe et al, 2015

One important actor to consider in IAPT is [[Staff Burnout]]


 As the CWP programme is a fairly new one, our learning from both a course and service development perspective is constantly growing. In order to ensure the CWP role fits within your service, your role will involve not only providing hands on supervision to your CWPs, but working closely with your service leads and managers to develop robust processes around the implementation of CWPs into the local workforce. 

<<list-links "[tag[FAQ Supervisor]]">>
Work your way through the below competencies and once you think you can meet all the competencies answer the Quiz linked at the bottom of the page. 

''Hint:'' To meet these competencies you may wish to look at the [[User Guide]] which has a helpful navigating video!

# [[Need to know what is included in each section of the top menu)|CWP site map]]
# [[Need to be able to login - register ones account|How to login]]
# [[Need to know where the search bar is and what type of things you can look for - spelling|Using the Search Bar]]
#[[The difference between Title matches vs All matches (all pages with the word in the page) in the search bar|Using the Search Bar]]
# [[Need to know how pages close and open pages - 'Story River'|How Pages Open in the Wiki Guide]]
# [[How to see which pages you have open|How Pages Open in the Wiki Guide]]
# [[How to Print]]
# [[How to open and access google documents|How to Access Google Documents]]
# [[Identify web page links|What does a Web Page Link Look Like]]
# [[Use and understand tags|How to Use and Understand 'Tags']]
# [[How to Give Feedback]]


!!Complete [[Wiki User Quiz!]]
Please complete the below questions


<iframe src="https://docs.google.com/forms/d/e/1FAIpQLSei1r3ngbGVL9RB-azSh61nensXO6s5ky6dhv-tdbTi2FyzVg/viewform?embedded=true" width="750" height="1433" frameborder="0" marginheight="0" marginwidth="0">Loading...</iframe>
How will the CWPs know if the young people's difficulties are mild/moderate and therefore appropriate to work with?
It is likely that CWPs will have some involvement in the assessment process; however, it will be the supervisor's responsibility for ensuring that they are seeing the correct cases. Regular supervision will allow CWPs to flag any issues around their cases and if it is felt that some cases aren't appropriate, these will need to be stepped up/down or signposted onto another service.
!!! What is Anxiety?
Anxiety is our bodies build-in alarm system which helps us to respond to danger. This response can sometimes be really helpful, as it helps us to make quick decisions and act quickly to remove ourselves from danger. This quick response is related to something called the [[Fight or Flight]] response. However, sometimes this response can be less helpful and, instead of helping us to better manage a situation, can interfere with our everyday functioning. 

Anxiety can be associated with negative thoughts and [[Worry]].

!!! What techniques can help with Anxiety?
There are some techniques which can help to reduce the bodily response while feeling anxious, and other techniques which try to challenge or change the core reason for the anxiety. Both types of techniques can be considered helpful but the latter is considered to be a more helpful long term solution. 
Here you can find useful techniques for [[Improving Mental Well-being]]

!!! Will I always have anxiety?
One of the common worries when experiencing anxiety or beginning treatment can be whether the anxiety will go away, or whether it is something that you will always have. We found a useful web-page which discusses this here:
<<link-pdf "Will I always have anxiety?" "http://www.themix.org.uk/mental-health/anxiety-ocd-and-phobias/will-i-always-have-anxiety-6127.html">>
The idea behind this model of teaching is to encourage supervisors to provide hands on support to CWPs as part of group exercises and group discussions throughout the day. Supervisors will also work with the teaching staff to develop aspects of the curriculum which will later be taught as part of these co-teaching training days.Teaching staff and practice tutors have been recruited to provide this training and will lead these sessions, however, you might be asked to contribute by developing specific sessions or workshops on areas you have expertise in.
Unfortunately the CWP Supervisor/Service Development Lead course is not accredited by a University so you will not receive a formal qualification upon completion. However, you will receive a certificate of attendance and certificate of completion for your contribution to the programme and this will be provided by the London and South East CYP IAPT Collaborative.
*Formulation underpins everything- working with these thoughts and behaviours 
*Look out for avoidance or 'safety behaviours' 
!!!Psychoeducation 
*Fight or Flight 
*How their thoughts connect to behaviours and feelings (help people think about these links using pictures) 
*Anxiety is normal, and that it can't hurt you (overwhelming physical sensations like heart beating so it causes worry for young people and parents) 
!!!Fight or flight role play 
*Alarm system to keep safe (either run away from something or fight it) 
*Why would we still need this response in life now? Useful in a life threatening attack 
*Don't worry about remembering the complicated terms i.e. chemicals adrenaline and cortisol 
*Become expert with physiology of the human body- confident to know the reasons for the feelings in the body 
*Feedback
**Useful to hear how to adapt to someone younger i.e. dinosaurs
**Useful to hear how to validate from own personal experiences/examples 
!!!Rating scale of anxiety 
*Be clear what 0 means, can use a traffic light system for young children 
*Important to do a rating scale for a thing they are not scared of in the beginning (creates a concrete anchor, or baseline for reference) 
*10/10 is a life threatening situation which creates a maximum anxiety to compare with the anxiety issue they are seeing you for 
!!!Parent involvement 
*Modelling- gain knowledge about anxiety to change thoughts and behaviours 
*Motivation for children to take part 
*Remember strategies for children when they are in a anxious situation 
*No clear evidence of effect 
!!!Other Points 
*Needle phobia different from other anxiety disorders 
*Blood pressure rises when you are anxious which makes it unlikely you will faint (as your blood pressure lowers when you faint) 
!!!Graded exposure 
*Go back to the steps if young person claims they did exposure homework but it didn't work 
*Swimming pool example 
*Dogs Trust help out with exposure exercises 
!!!Barriers and how to overcome: 
*Distraction/reassurance= encourage to stop in exposure 
*Too distressed= need to come down in the hierarchy 
*Can't rate anxiety= using colours or symbols 
*Role of therapists= feel confident in the model 
*Refusing= go back a step, incentives, readdress goals 
*Parents= explain the rational, psychoeducation, evidence based
*Video discussion
** Using the word 'Vomit' - good to test out if its not anxiety provoking, careful not to avoid the word, using the word can be good modelling showing the young person that its a safe word to say 
**Able to advise young people and families on where to access resources needed for exposure tasks 
*If something happens in between the exposure tasks- depends on how the young person reacts
!!!Safety behaviour 
*Reinforces the idea there is something to be scared about so we would aim to reduce
*Use steps for reducing safety behaviours on hierarchy chart i.e. things they are avoiding, things they are doing to keep themselves safe, things other people are doing to keep you safe  
*CWP to read up on different coping strategies before suggesting the young people 
!!!Rewards 
*Ideas for adolescents- later bed time, more like on the play station, go somewhere with their friends, negotiate a point system and goal 
!!!Working with thoughts and feelings 
*What are the thoughts? How do the thoughts make you feel? 
*Thinking traps that we fall into 
*Idea of testing out predictions and testing out thoughts with actions 
!!!Q&A 
*Think about GSH as a course, there is clear information they need to go through and that there will be an end. If they aren't ready by the end of the 'course' then thinking about stepping up or down is important. 
*Emphasis is on young person and parents on doing the activities, the CWP is there is trouble shoot and to guide clients to relevant information 

!Source: Duncan Law

____

To aid online working, there is now an editable PDF versions of the GBO. They can be accessed and downloaded here 

https://goals-in-therapy.com/2020/07/07/online-working-and-the-gbo-interactive-pdf-versions-of-the-tool/

All GBO tools are free to download and use by anyone!
[img[baby and parent hands.jpg]]

Research has demonstrated the important role of parents in child development. Parents/ carers are crucial to the improvement of the mental wellbeing of children and young people. The [[Child Anxiety]] and [[Behaviour Problems]] interventions both adpot the parent led approach, as such most of the work is done by supporting parent parents. For more information about these interventions/materials and resources for these interventions please go to [[Helping]].

For pages providing helpful but more general information about working with parents please see below:

<<list-links "[tag[Parents]]">>
!!''Why work through parents for children with anxiety'' 
!!!Evidence base overview
*No difference in outcomes with CBT trained therapists and CBT novices if they are following the manual
*For some children treatment gains are higher at follow up than end of treatment (makes sense because they are taught techniques and are expected to put them into practice once treatment has ended)
!!!Rationale and aims
*Parents need tools to use at home with YP - makes sense to focus on parents
*Emphasis on building confidence rather than reducing anxiety
!!!Difficulties that can be faced
*Need to be thinking about how I explain this to a parent (different levels of literacy skills/language barriers etc)
*Parents becoming anxious: Need to make sure there is a focus on normalising
!!!Explaining anxiety: What is anxiety?
*Self disclosure can be helpful e.g. when my children do something that makes me feel anxious, I get angry and yell
*Normal emotion and can be useful in right amount e.g. when we are in danger
*Physical symptoms: heart beating faster. A less known experience is depersonalisation (feeling a bit 'floaty')
*Thoughts: underestimate ability to cope or over-estimate danger 
*Behaviours: clingy, fidgetty, anger
!!!What might you do to help explain anxiety?
*Keep it visual and fun: draw on a body where you feel anxiety/ a game / a word bank (feelings)
*Use videos on youtube
*Ask young person to make a video to explain it to someone else
!!!Helping parents decide whether their child's anxiety has become a 'problem'
*There is normal worry and anxiety at different developmental stages
*If anxiety leads to avoidance of social situations, schools etc, this can significantly hinder/restrict them and parent 
*Important to distinguish anxiety from panic attack: panic attack is an extreme physical response and interpretation of these symptoms (e.g. I am going to have a heart attack) and trying to stop these things from happening. Some parents might use the term panic attack when they mean 'very anxious'. If this is the case, it is important to use appropriate language with the parents ('very anxious')
!!!Understanding anxiety in children and parents
*We are hard-wired to protect children from danger (at all costs). This can be really helpful at times but research shows that we can sometimes protect our children when they need to learn to protect themselves
*Anxiety is maintained by both children do and other people do (parents, family members, teachers etc)
!!!What might cause anxiety in childhood?:
*Need to think about life events and experiences 
*Genes
*Learning by example. Children are designed to be watchful of their caregivers (very attuned to what they do) and will learn. Parents can't always contain their own anxiety but can be aware of what they show etc
*Learning from other people's reactions: e.g. you show them you aren't sure they can cope
*Coping experiences: has the child been given a chance to learn they can tolerate their anxiety? If we protect them too much they don't get these learning experiences (and then when parents aren't there, they don't know how to cope)
!!!What keeps anxiety going?
*Vicious cycles of thoughts, physical sensations and behaviours 
*Things others do: reassurance from parents, don't encourage them to do things they are anxious about 
!!!Role play
*Linking psycho-education to research can be helpful - weight to what you say and distances it from emotion
*'Get out clause' can be useful: 'some if this will fit with you and some won't'
*Explaining in a conversational way (not presenting information) - working it out together
!!!Normalising
*We are evolutionarily designed to protect children (need to resist primal urges - which is hard!)
*Use day to day examples: child is about to do something scary and parent says 'are you okay? are you sure? etc'
*You are really good at helping him with x. Need to think about how to teach him to do the things YOU are really good at doing, so that he can learn to do it himself. 
!!!!Source: Laura Bowyer and Vicki Curry 
Two video summaries about working with parents with children or young people with anxiety problems. 

''Working with parents of young people'' 

<html><iframe width="560" height="315" src="https://youtube.com/embed/TdT1N1pF55c" frameborder="0" allowfullscreen></html>


''Working with parents of children with anxiety problems''. 

<html><iframe width="560" height="315" src="https://youtube.com/embed/r5CCj73Pl9o" frameborder="0" allowfullscreen></html>

!!!!Source: Laura Bowyer
!!''Working with ROMS''  
*Outcome monitoring improves the effectiveness of mental health interventions
*It has the potential to improve the long-term trajectory of young people e.g. less suicidality if they respond to CBT in their youth
*Outcome monitoring is one of the principles of IAPT
*Using the measure at a number of time points i.e. beginning, middle and end of treatment is a routine outcome measurement (ROMs).
*If someone is scoring high on measures, it doesn't necessarily indicate a diagnosis
*Symptoms may be high, which suggests the young person isn't coping well and we would like to see those symptoms to come down before the end of treatment
*Diagnosis is not important, does the measure capture what is important to track e.g. the effectiveness of my intervention as a practitioner
*CWPs are ideally aiming for session by session use of measures where possible 
!!''The benefits of ROMS''
*Improves clinicians’ ability to detect worsening of symptoms (Lambert, 2010)
*Reduces drop out (e.g. Miller et al., 2006) 
*Forestalls drop out (Whipple & Lambert, 2011) 
*Achieves better outcomes, faster (Bickman et al., 2011 & Lambert et al., 2005)
*helps to keep off-track cases (i.e., patients not progressing well) on-track (Lambert et al., 2003)
*Helps with quality assurance 
*Helps with research 

!!''Related topics''
In London, nearly all partnerships use POD to record outcomes.

 

*[[How to Use POD]]



In this video from Mind 13 people, aged 18-25 talk about what it's like to live with a mental health problem, and what helps them cope. Very useful video to start discussion about mental health for young people 

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/_y97VF5UJcc" frameborder="0" allowfullscreen></iframe></html>
!! What is a Young Champion?

Our team of Young Champions at the Anna Freud national Centre for Children and Families work with us to ensure that the views and experiences of young people help shape the work we do, covering topics such as clinical services, digital innovation, research and training.

!! What do Young Champions do?

Our Young Champions get involved in activities such as:
* Designing new services and projects at the Centre
* Co-facilitating workshops and trainings
* Taking part in public speaking opportunities through the media or at events, to talk about their experiences and/or raise awareness of the work we deliver
* Influencing clinical services and policy at a local and national level.

To find out more about our Young Champions or to find out how to become a Young Champion visit: https://www.annafreud.org/children-young-people/young-champions/

{{af-logo-green-new.png}}

!! What is a Young Champion?

Our team of Young Champions at the Anna Freud national Centre for Children and Families work with us to ensure that the views and experiences of young people help shape the work we do, covering topics such as clinical services, digital innovation, research and training.

!! What do Young Champions do?

Our Young Champions get involved in activities such as:

* Designing new services and projects at the Centre
* Co-facilitating workshops and trainings
* Taking part in public speaking opportunities through the media or at events, to talk about their experiences and/or raise awareness of the work we deliver
* Influencing clinical services and policy at a local and national level.

To find out more about our Young Champions or to find out how to become a Young Champion visit: https://www.annafreud.org/children-young-people/young-champions/

{{af-logo-green-new.png}}

This is an excellent five minute clip about three young people talking about living with anxiety. 

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/ZoSeJntYT8U" frameborder="0" allowfullscreen></iframe></html>
Here are some short films about young people and their experiences of depression. Could aid conversations with CYP about depression.

'I'm Fine' addresses the hidden nature of teen depression:

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/8g_kA2soWOo" frameborder="0" allowfullscreen></iframe></html>



This short film depicts the journey through depression of Leah and her family. Depression and Childhood Trauma: Leah's Story:

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/DtPRg_Ibn-c" frameborder="0" allowfullscreen></iframe></html>
Please see below for some short videos about self-harm. 

'No Harm Done: Responding to Self-Harm' was created in partnership with YoungMinds. This is a vital resource co-produced by young people, parents and professionals and explains how to work with young people who self-harm. 
A really useful resource to support conversations surrounding self-harm with parents, teachers and CYP

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/uKGciUB8OSg" frameborder="0" allowfullscreen></iframe></html>

This video is a vital resource about the experience of young people that self-harm. 'Why I Cut Myself'

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/XUBBb8ck3Fo" frameborder="0" allowfullscreen></iframe></html>
This is an excellent five minute clip about three young people talking about living with anxiety

<html><iframe width="560" height="315" src="https://www.youtube.com/embed/ZoSeJntYT8U" frameborder="0" allowfullscreen></iframe></html>

Young Minds is a mental health charity working with young people and their families who have mental health concerns. 

They have developed some fantastic [[resources|https://youngminds.org.uk/resources/]] that you may find helpful when working with CYP and their families.
 
It has many support lines you may want to refer those you work with to, such as:

Young people [[helpline|https://youngminds.org.uk/find-help/get-urgent-help/]]

A parent [[helpline|https://youngminds.org.uk/find-help/for-parents/]]



























! ''__This is a test__''


this will be an interesting journey 

what is the difference between diversity and inclusion?


https://lnkd.in/gP_ncJe

!!''Chapter 1:'' 

* What are fears and worries?
* What do we mean by fears and worries?

Worries fears and anxiety have 3 things in common:

The way we think: Often when we feel anxious we will be thinking that something bad will happen. Our thoughts tend to focus on potential threats and how to escape them. This can sometimes be useful e.g. if your child is about to step onto a busy road, it is good to be focussed on the potential danger and getting your child out of the way.
































{"tiddlers":{"$:/Acknowledgements":{"title":"$:/Acknowledgements","text":"TiddlyWiki incorporates code from these fine OpenSource projects:\n\n* [[The Stanford Javascript Crypto Library|http://bitwiseshiftleft.github.io/sjcl/]]\n* [[The Jasmine JavaScript Test Framework|https://jasmine.github.io/]]\n* [[Normalize.css by Nicolas Gallagher|http://necolas.github.io/normalize.css/]]\n\nAnd media from these projects:\n\n* World flag icons from [[Wikipedia|http://commons.wikimedia.org/wiki/Category:SVG_flags_by_country]]\n"},"$:/core/copyright.txt":{"title":"$:/core/copyright.txt","type":"text/plain","text":"TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright (c) 2004-2007, Jeremy Ruston\nCopyright (c) 2007-2024, UnaMesa Association\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."},"$:/core/icon":{"title":"$:/core/icon","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> viewBox=\"0 0 128 128\"><path d=\"M64 0l54.56 32v64L64 128 9.44 96V32L64 0zm21.127 95.408c-3.578-.103-5.15-.094-6.974-3.152l-1.42.042c-1.653-.075-.964-.04-2.067-.097-1.844-.07-1.548-1.86-1.873-2.8-.52-3.202.687-6.43.65-9.632-.014-1.14-1.593-5.17-2.157-6.61-1.768.34-3.546.406-5.34.497-4.134-.01-8.24-.527-12.317-1.183-.8 3.35-3.16 8.036-1.21 11.44 2.37 3.52 4.03 4.495 6.61 4.707 2.572.212 3.16 3.18 2.53 4.242-.55.73-1.52.864-2.346 1.04l-1.65.08c-1.296-.046-2.455-.404-3.61-.955-1.93-1.097-3.925-3.383-5.406-5.024.345.658.55 1.938.24 2.53-.878 1.27-4.665 1.26-6.4.47-1.97-.89-6.73-7.162-7.468-11.86 1.96-3.78 4.812-7.07 6.255-11.186-3.146-2.05-4.83-5.384-4.61-9.16l.08-.44c-3.097.59-1.49.37-4.82.628-10.608-.032-19.935-7.37-14.68-18.774.34-.673.664-1.287 1.243-.994.466.237.4 1.18.166 2.227-3.005 13.627 11.67 13.732 20.69 11.21.89-.25 2.67-1.936 3.905-2.495 2.016-.91 4.205-1.282 6.376-1.55 5.4-.63 11.893 2.276 15.19 2.37 3.3.096 7.99-.805 10.87-.615 2.09.098 4.143.483 6.16 1.03 1.306-6.49 1.4-11.27 4.492-12.38 1.814.293 3.213 2.818 4.25 4.167 2.112-.086 4.12.46 6.115 1.066 3.61-.522 6.642-2.593 9.833-4.203-3.234 2.69-3.673 7.075-3.303 11.127.138 2.103-.444 4.386-1.164 6.54-1.348 3.507-3.95 7.204-6.97 7.014-1.14-.036-1.805-.695-2.653-1.4-.164 1.427-.81 2.7-1.434 3.96-1.44 2.797-5.203 4.03-8.687 7.016-3.484 2.985 1.114 13.65 2.23 15.594 1.114 1.94 4.226 2.652 3.02 4.406-.37.58-.936.785-1.54 1.01l-.82.11zm-40.097-8.85l.553.14c.694-.27 2.09.15 2.83.353-1.363-1.31-3.417-3.24-4.897-4.46-.485-1.47-.278-2.96-.174-4.46l.02-.123c-.582 1.205-1.322 2.376-1.72 3.645-.465 1.71 2.07 3.557 3.052 4.615l.336.3z\" fill-rule=\"evenodd\"/></svg>"},"$:/core/images/add-comment":{"title":"$:/core/images/add-comment","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-add-comment tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 56H36a8 8 0 100 16h20v20a8 8 0 1016 0V72h20a8 8 0 100-16H72V36a8 8 0 10-16 0v20zm-12.595 58.362c-6.683 7.659-20.297 12.903-36.006 12.903-2.196 0-4.35-.102-6.451-.3 9.652-3.836 17.356-12.24 21.01-22.874C8.516 94.28 0 79.734 0 63.5 0 33.953 28.206 10 63 10s63 23.953 63 53.5S97.794 117 63 117c-6.841 0-13.428-.926-19.595-2.638z\"/></svg>"},"$:/core/images/advanced-search-button":{"title":"$:/core/images/advanced-search-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-advanced-search-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M74.565 87.985A47.776 47.776 0 0148 96C21.49 96 0 74.51 0 48S21.49 0 48 0s48 21.49 48 48c0 9.854-2.97 19.015-8.062 26.636l34.347 34.347a9.443 9.443 0 010 13.36 9.446 9.446 0 01-13.36 0l-34.36-34.358zM48 80c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/><circle cx=\"48\" cy=\"48\" r=\"8\"/><circle cx=\"28\" cy=\"48\" r=\"8\"/><circle cx=\"68\" cy=\"48\" r=\"8\"/></g></svg>"},"$:/core/images/auto-height":{"title":"$:/core/images/auto-height","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-auto-height tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M67.987 114.356l-.029-14.477a4 4 0 00-2.067-3.494l-15.966-8.813-1.933 7.502H79.9c4.222 0 5.564-5.693 1.786-7.58L49.797 71.572 48.01 79.15h31.982c4.217 0 5.564-5.682 1.795-7.575L49.805 55.517l-1.795 7.575h31.982c4.212 0 5.563-5.67 1.805-7.57l-16.034-8.105 2.195 3.57V35.614l9.214 9.213a4 4 0 105.656-5.656l-16-16a4 4 0 00-5.656 0l-16 16a4 4 0 105.656 5.656l9.13-9.13v15.288a4 4 0 002.195 3.57l16.035 8.106 1.804-7.57H48.01c-4.217 0-5.564 5.682-1.795 7.574l31.982 16.059 1.795-7.575H48.01c-4.222 0-5.564 5.693-1.787 7.579l31.89 15.923 1.787-7.578H47.992c-4.133 0-5.552 5.504-1.933 7.501l15.966 8.813-2.067-3.494.029 14.436-9.159-9.158a4 4 0 00-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656l-9.185 9.184zM16 20h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"},"$:/core/images/blank":{"title":"$:/core/images/blank","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-blank tc-image-button\" viewBox=\"0 0 128 128\"/>"},"$:/core/images/bold":{"title":"$:/core/images/bold","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-bold tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.146 51.81V21.87h26.353c2.51 0 4.93.21 7.26.628 2.33.418 4.392 1.165 6.185 2.24 1.793 1.076 3.227 2.57 4.302 4.482 1.076 1.913 1.614 4.363 1.614 7.35 0 5.379-1.613 9.263-4.84 11.653-3.227 2.39-7.35 3.586-12.37 3.586H41.146zM13 0v128h62.028a65.45 65.45 0 0016.762-2.151c5.438-1.434 10.278-3.645 14.52-6.633 4.244-2.988 7.62-6.842 10.13-11.563 2.51-4.721 3.764-10.308 3.764-16.762 0-8.008-1.942-14.85-5.826-20.527-3.884-5.677-9.77-9.65-17.658-11.921 5.737-2.75 10.069-6.275 12.997-10.577 2.928-4.303 4.392-9.681 4.392-16.135 0-5.976-.986-10.995-2.958-15.059-1.972-4.063-4.75-7.32-8.336-9.77-3.585-2.45-7.888-4.213-12.907-5.289C84.888.538 79.33 0 73.235 0H13zm28.146 106.129V70.992H71.8c6.095 0 10.995 1.404 14.7 4.212 3.705 2.81 5.558 7.5 5.558 14.073 0 3.347-.568 6.096-1.703 8.247-1.136 2.151-2.66 3.854-4.572 5.11-1.912 1.254-4.123 2.15-6.633 2.688-2.51.538-5.139.807-7.888.807H41.146z\"/></svg>"},"$:/core/images/cancel-button":{"title":"$:/core/images/cancel-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-cancel-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 76.314l-16.97 16.97a7.999 7.999 0 01-11.314 0c-3.118-3.118-3.124-8.19 0-11.313L52.686 65l-16.97-16.97a7.999 7.999 0 010-11.314c3.118-3.118 8.19-3.124 11.313 0L64 53.686l16.97-16.97a7.999 7.999 0 0111.314 0c3.118 3.118 3.124 8.19 0 11.313L75.314 65l16.97 16.97a7.999 7.999 0 010 11.314c-3.118 3.118-8.19 3.124-11.313 0L64 76.314zM64 129c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 1 0 29.654 0 65c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 17 64 17 16 38.49 16 65s21.49 48 48 48z\"/></svg>"},"$:/core/images/chevron-down":{"title":"$:/core/images/chevron-down","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-chevron-down tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.053 85.456a7.889 7.889 0 01-5.6-2.316L2.473 27.16a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0L64.05 66.344l50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.105 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.317z\"/><path d=\"M64.053 124.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></g></svg>"},"$:/core/images/chevron-left":{"title":"$:/core/images/chevron-left","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-chevron-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M47.544 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L66.656 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.105 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.317-5.595z\"/><path d=\"M8.931 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L28.041 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.104 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.316-5.595z\"/></g></svg>"},"$:/core/images/chevron-right":{"title":"$:/core/images/chevron-right","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-chevron-right tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M83.456 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196L64.344 63.95 13.963 13.567a7.92 7.92 0 010-11.195c3.086-3.085 8.105-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.317 5.595z\"/><path d=\"M122.069 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></g></svg>"},"$:/core/images/chevron-up":{"title":"$:/core/images/chevron-up","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-chevron-up tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M63.947 44.544c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 63.656l-50.382 50.382a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.317z\"/><path d=\"M63.947 5.931c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 25.041 13.567 75.423a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.104 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.316z\"/></g></svg>"},"$:/core/images/clone-button":{"title":"$:/core/images/clone-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-clone-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M32.265 96v24.002A7.996 7.996 0 0040.263 128h79.74a7.996 7.996 0 007.997-7.998v-79.74a7.996 7.996 0 00-7.998-7.997H96V48h12.859a2.99 2.99 0 012.994 2.994v57.865a2.99 2.99 0 01-2.994 2.994H50.994A2.99 2.99 0 0148 108.859V96H32.265z\"/><path d=\"M40 56h-7.993C27.588 56 24 52.418 24 48c0-4.41 3.585-8 8.007-8H40v-7.993C40 27.588 43.582 24 48 24c4.41 0 8 3.585 8 8.007V40h7.993C68.412 40 72 43.582 72 48c0 4.41-3.585 8-8.007 8H56v7.993C56 68.412 52.418 72 48 72c-4.41 0-8-3.585-8-8.007V56zM8 0C3.58 0 0 3.588 0 8v80c0 4.419 3.588 8 8 8h80c4.419 0 8-3.588 8-8V8c0-4.419-3.588-8-8-8H8zM19 16A2.997 2.997 0 0016 19.001v57.998A2.997 2.997 0 0019.001 80h57.998A2.997 2.997 0 0080 76.999V19.001A2.997 2.997 0 0076.999 16H19.001z\"/></g></svg>"},"$:/core/images/close-all-button":{"title":"$:/core/images/close-all-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-close-all-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M28 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L16.686 100 2.543 85.856a8 8 0 0111.313-11.313L28 88.686l14.144-14.143a8 8 0 0111.313 11.313L39.314 100l14.143 14.144a8 8 0 01-11.313 11.313L28 111.314zM28 39.314L13.856 53.457A8 8 0 012.543 42.144L16.686 28 2.543 13.856A8 8 0 0113.856 2.543L28 16.686 42.144 2.543a8 8 0 0111.313 11.313L39.314 28l14.143 14.144a8 8 0 01-11.313 11.313L28 39.314zM100 39.314L85.856 53.457a8 8 0 01-11.313-11.313L88.686 28 74.543 13.856A8 8 0 0185.856 2.543L100 16.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 28l14.143 14.144a8 8 0 01-11.313 11.313L100 39.314zM100 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L88.686 100 74.543 85.856a8 8 0 0111.313-11.313L100 88.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 100l14.143 14.144a8 8 0 01-11.313 11.313L100 111.314z\"/></g></svg>"},"$:/core/images/close-button":{"title":"$:/core/images/close-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-close-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M65.086 75.41l-50.113 50.113c-3.121 3.121-8.192 3.126-11.316.002-3.118-3.118-3.123-8.19.002-11.316l50.114-50.114L3.659 13.982C.538 10.86.533 5.79 3.657 2.666c3.118-3.118 8.19-3.123 11.316.002l50.113 50.114L115.2 2.668c3.121-3.121 8.192-3.126 11.316-.002 3.118 3.118 3.123 8.19-.002 11.316L76.4 64.095l50.114 50.114c3.121 3.121 3.126 8.192.002 11.316-3.118 3.118-8.19 3.123-11.316-.002L65.086 75.409z\"/></svg>"},"$:/core/images/close-others-button":{"title":"$:/core/images/close-others-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-close-others-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48zm0-16c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32zm0-16c8.837 0 16-7.163 16-16s-7.163-16-16-16-16 7.163-16 16 7.163 16 16 16z\"/></svg>"},"$:/core/images/copy-clipboard":{"title":"$:/core/images/copy-clipboard","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-copy-clipboard tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"33\" height=\"8\" x=\"40\" y=\"40\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"82\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"54\" rx=\"4\"/><rect width=\"33\" height=\"8\" x=\"40\" y=\"96\" rx=\"4\"/><rect width=\"12\" height=\"8\" x=\"40\" y=\"68\" rx=\"4\"/><path d=\"M40 16H24c-4.419 0-8 3.59-8 8a8.031 8.031 0 000 .01v95.98a8.03 8.03 0 000 .01c0 4.41 3.581 8 8 8h80a7.975 7.975 0 005.652-2.34 7.958 7.958 0 002.348-5.652v-16.016c0-4.414-3.582-7.992-8-7.992-4.41 0-8 3.578-8 7.992V112H32V32h64v8.008C96 44.422 99.582 48 104 48c4.41 0 8-3.578 8-7.992V23.992a7.963 7.963 0 00-2.343-5.651A7.995 7.995 0 00104.001 16H88c0-4.41-3.585-8-8.007-8H48.007C43.588 8 40 11.582 40 16zm4-1.004A4.001 4.001 0 0148 11h32c2.21 0 4 1.797 4 3.996v4.008A4.001 4.001 0 0180 23H48c-2.21 0-4-1.797-4-3.996v-4.008z\"/><rect width=\"66\" height=\"16\" x=\"62\" y=\"64\" rx=\"8\"/><path d=\"M84.657 82.343l-16-16v11.314l16-16a8 8 0 10-11.314-11.314l-16 16a8 8 0 000 11.314l16 16a8 8 0 1011.314-11.314z\"/></g></svg>"},"$:/core/images/delete-button":{"title":"$:/core/images/delete-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-delete-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(12)\"><rect width=\"105\" height=\"16\" y=\"11\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"28\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"8\" y=\"16\" rx=\"8\"/><rect width=\"88\" height=\"16\" x=\"8\" y=\"112\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"80\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"56\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"32\" y=\"16\" rx=\"8\"/></g></svg>"},"$:/core/images/discord":{"title":"$:/core/images/discord","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-discord tc-image-button\" viewBox=\"0 -28.5 256 256\"><path d=\"M216.856 16.597A208.502 208.502 0 0 0 164.042 0c-2.275 4.113-4.933 9.645-6.766 14.046-19.692-2.961-39.203-2.961-58.533 0-1.832-4.4-4.55-9.933-6.846-14.046a207.809 207.809 0 0 0-52.855 16.638C5.618 67.147-3.443 116.4 1.087 164.956c22.169 16.555 43.653 26.612 64.775 33.193A161.094 161.094 0 0 0 79.735 175.3a136.413 136.413 0 0 1-21.846-10.632 108.636 108.636 0 0 0 5.356-4.237c42.122 19.702 87.89 19.702 129.51 0a131.66 131.66 0 0 0 5.355 4.237 136.07 136.07 0 0 1-21.886 10.653c4.006 8.02 8.638 15.67 13.873 22.848 21.142-6.58 42.646-16.637 64.815-33.213 5.316-56.288-9.08-105.09-38.056-148.36ZM85.474 135.095c-12.645 0-23.015-11.805-23.015-26.18s10.149-26.2 23.015-26.2c12.867 0 23.236 11.804 23.015 26.2.02 14.375-10.148 26.18-23.015 26.18Zm85.051 0c-12.645 0-23.014-11.805-23.014-26.18s10.148-26.2 23.014-26.2c12.867 0 23.236 11.804 23.015 26.2 0 14.375-10.148 26.18-23.015 26.18Z\"/></svg>"},"$:/core/images/done-button":{"title":"$:/core/images/done-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-done-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M42.26 111.032c-2.051.001-4.103-.78-5.668-2.345L2.662 74.758a8 8 0 01-.005-11.32c3.118-3.117 8.192-3.12 11.32.007l28.278 28.278 72.124-72.124a8.002 8.002 0 0111.314-.001c3.118 3.118 3.124 8.19 0 11.315l-77.78 77.78a7.978 7.978 0 01-5.658 2.343z\"/></svg>"},"$:/core/images/down-arrow":{"title":"$:/core/images/down-arrow","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-down-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.177 100.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.086 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></svg>"},"$:/core/images/download-button":{"title":"$:/core/images/download-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-download-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\" class=\"tc-image-download-button-ring\"/><path d=\"M34.35 66.43l26.892 27.205a4.57 4.57 0 006.516 0L94.65 66.43a4.7 4.7 0 000-6.593 4.581 4.581 0 00-3.258-1.365h-8.46c-2.545 0-4.608-2.087-4.608-4.661v-15.15c0-2.575-2.063-4.662-4.608-4.662H55.284c-2.545 0-4.608 2.087-4.608 4.662v15.15c0 2.574-2.063 4.661-4.608 4.661h-8.46c-2.545 0-4.608 2.087-4.608 4.662a4.69 4.69 0 001.35 3.296z\"/></g></svg>"},"$:/core/images/edit-button":{"title":"$:/core/images/edit-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-edit-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M95.627 10.059l-5.656 5.657 11.313 11.313 5.657-5.656-11.314-11.314zm5.657-5.657l1.966-1.966c3.123-3.122 8.194-3.129 11.319-.005 3.117 3.118 3.122 8.192-.005 11.32l-1.966 1.965-11.314-11.314zm-16.97 16.97l-60.25 60.25a8.12 8.12 0 00-.322.342c-.1.087-.198.179-.295.275-5.735 5.735-10.702 22.016-10.702 22.016s16.405-5.09 22.016-10.702c.095-.096.186-.193.272-.292a8.12 8.12 0 00.345-.325l60.25-60.25-11.314-11.313zM35.171 124.19c6.788-.577 13.898-2.272 23.689-5.348 1.825-.573 3.57-1.136 6.336-2.04 16-5.226 21.877-6.807 28.745-7.146 8.358-.413 13.854 2.13 17.58 8.699a4 4 0 006.959-3.946c-5.334-9.406-13.745-13.296-24.933-12.744-7.875.39-14.057 2.052-30.835 7.533-2.739.894-4.46 1.45-6.25 2.012-19.46 6.112-30.77 7.072-39.597 1.747a4 4 0 10-4.132 6.85c6.333 3.82 13.754 5.12 22.438 4.383z\"/></g></svg>"},"$:/core/images/erase":{"title":"$:/core/images/erase","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-erase tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.087 127.996l63.015-63.015c6.535-6.535 6.528-17.115-.003-23.646L99.466 17.702c-6.539-6.538-17.117-6.532-23.646-.003L4.898 88.62c-6.535 6.534-6.528 17.115.003 23.646l15.73 15.73h39.456zm-34.95-7.313l-14.324-14.325c-3.267-3.268-3.268-8.564-.008-11.824L46.269 59.07l35.462 35.462-26.15 26.15H25.137z\"/></svg>"},"$:/core/images/excise":{"title":"$:/core/images/excise","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-excise tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 107.314l-2.343 2.343a8 8 0 11-11.314-11.314l16-16a8 8 0 0111.314 0l16 16a8 8 0 11-11.314 11.314L72 107.314v14.284c0 3.536-3.582 6.402-8 6.402s-8-2.866-8-6.402v-14.284zM0 40.007C0 35.585 3.59 32 8 32c4.418 0 8 3.588 8 8.007v31.986C16 76.415 12.41 80 8 80c-4.418 0-8-3.588-8-8.007V40.007zm32 0C32 35.585 35.59 32 40 32c4.418 0 8 3.588 8 8.007v31.986C48 76.415 44.41 80 40 80c-4.418 0-8-3.588-8-8.007V40.007zm48 0C80 35.585 83.59 32 88 32c4.418 0 8 3.588 8 8.007v31.986C96 76.415 92.41 80 88 80c-4.418 0-8-3.588-8-8.007V40.007zm-24-32C56 3.585 59.59 0 64 0c4.418 0 8 3.588 8 8.007v31.986C72 44.415 68.41 48 64 48c-4.418 0-8-3.588-8-8.007V8.007zm56 32c0-4.422 3.59-8.007 8-8.007 4.418 0 8 3.588 8 8.007v31.986c0 4.422-3.59 8.007-8 8.007-4.418 0-8-3.588-8-8.007V40.007z\"/></svg>"},"$:/core/images/export-button":{"title":"$:/core/images/export-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-export-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.003 128H119.993a7.984 7.984 0 005.664-2.349v.007A7.975 7.975 0 00128 120V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v56H16V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v64c0 4.418 3.59 8 8 8h.003zm48.62-100.689l-8.965 8.966c-3.125 3.125-8.195 3.13-11.319.005-3.118-3.118-3.122-8.192.005-11.319L58.962 2.346A7.986 7.986 0 0164.625 0l-.006.002c2.05-.001 4.102.78 5.666 2.344l22.618 22.617c3.124 3.125 3.129 8.195.005 11.319-3.118 3.118-8.192 3.122-11.319-.005l-8.965-8.966v61.256c0 4.411-3.582 8-8 8-4.41 0-8-3.582-8-8V27.311z\"/></svg>"},"$:/core/images/file":{"title":"$:/core/images/file","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-file tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M111.968 30.5H112V120a8 8 0 01-8 8H24a8 8 0 01-8-8V8a8 8 0 018-8h57v.02a7.978 7.978 0 015.998 2.337l22.627 22.627a7.975 7.975 0 012.343 5.516zM81 8H24v112h80V30.5H89c-4.418 0-8-3.578-8-8V8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"68\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"84\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"100\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/></svg>"},"$:/core/images/fixed-height":{"title":"$:/core/images/fixed-height","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-fixed-height tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60 35.657l-9.172 9.171a4 4 0 11-5.656-5.656l16-16a4 4 0 015.656 0l16 16a4 4 0 01-5.656 5.656L68 35.657v57.686l9.172-9.171a4 4 0 115.656 5.656l-16 16a4 4 0 01-5.656 0l-16-16a4 4 0 115.656-5.656L60 93.343V35.657zM16 116h96a4 4 0 100-8H16a4 4 0 100 8zm0-96h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"},"$:/core/images/fold-all-button":{"title":"$:/core/images/fold-all-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-fold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M64.03 20.004c-2.05 0-4.102.78-5.667 2.344L35.746 44.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 22.348a7.986 7.986 0 00-5.663-2.346zM64.03 85.002c-2.05-.001-4.102.78-5.667 2.344l-22.617 22.617c-3.125 3.125-3.13 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.966 16.966 16.966c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.192-.005-11.319L69.687 87.346A7.986 7.986 0 0064.024 85z\"/></g></svg>"},"$:/core/images/fold-button":{"title":"$:/core/images/fold-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-fold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M64.03 25.004c-2.05 0-4.102.78-5.667 2.344L35.746 49.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 27.348a7.986 7.986 0 00-5.663-2.346zM64.005 67.379c-2.05 0-4.102.78-5.666 2.344L35.722 92.34c-3.125 3.125-3.13 8.195-.006 11.32 3.118 3.117 8.192 3.121 11.32-.006L64 86.69l16.965 16.965c3.125 3.125 8.195 3.13 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L69.663 69.723A7.986 7.986 0 0064 67.377z\"/></g></svg>"},"$:/core/images/fold-others-button":{"title":"$:/core/images/fold-others-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-fold-others tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" y=\"56.031\" rx=\"8\"/><path d=\"M86.632 79.976c-2.05 0-4.102.78-5.666 2.345L64 99.286 47.034 82.321a7.986 7.986 0 00-5.662-2.346l.005.001c-2.05 0-4.102.78-5.666 2.345l-22.618 22.617c-3.124 3.125-3.129 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.966-16.966 16.965 16.966a7.986 7.986 0 005.663 2.346l-.005-.002c2.05 0 4.102-.78 5.666-2.344l16.965-16.966 16.966 16.966c3.125 3.124 8.194 3.129 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L92.289 82.321a7.986 7.986 0 00-5.663-2.346zM86.7 48.024c-2.05 0-4.102-.78-5.666-2.345L64.07 28.714 47.103 45.679a7.986 7.986 0 01-5.663 2.346l.005-.001c-2.05 0-4.101-.78-5.666-2.345L13.162 23.062c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L41.44 28.714l16.966-16.966a7.986 7.986 0 015.662-2.346l-.005.002c2.05 0 4.102.78 5.666 2.344l16.966 16.966 16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L92.358 45.679a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"},"$:/core/images/folder":{"title":"$:/core/images/folder","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-folder tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.694 128H8C3.58 128 0 124.414 0 119.996V48.004C0 43.584 3.584 40 7.999 40H16v-8c0-4.418 3.578-8 8-8h32a8 8 0 018 8v8h40.001c4.418 0 7.999 3.586 7.999 8.004V59.83l-8-.082v-7.749A4 4 0 0099.997 48H56V36c0-2.21-1.793-4-4.004-4H28.004A4 4 0 0024 36v12H12.003A4 4 0 008 52v64a4 4 0 004.003 4h46.76l-3.069 8z\"/><path d=\"M23.873 55.5h96.003c4.417 0 7.004 4.053 5.774 9.063l-13.344 54.374c-1.228 5.005-5.808 9.063-10.223 9.063H6.08c-4.417 0-7.003-4.053-5.774-9.063L13.65 64.563c1.228-5.005 5.808-9.063 10.223-9.063zm1.78 8.5h87.994c2.211 0 3.504 2.093 2.891 4.666l-11.12 46.668c-.614 2.577-2.902 4.666-5.115 4.666H12.31c-2.211 0-3.504-2.093-2.891-4.666l11.12-46.668C21.152 66.09 23.44 64 25.653 64z\"/></g></svg>"},"$:/core/images/full-screen-button":{"title":"$:/core/images/full-screen-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-full-screen-button tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 8a8 8 0 018-8h32a8 8 0 110 16H16v24a8 8 0 11-16 0V8zM128 120a8 8 0 01-8 8H88a8 8 0 110-16h24V88a8 8 0 1116 0v32zM8 128a8 8 0 01-8-8V88a8 8 0 1116 0v24h24a8 8 0 110 16H8zM120 0a8 8 0 018 8v32a8 8 0 11-16 0V16H88a8 8 0 110-16h32z\"/></svg>"},"$:/core/images/github":{"title":"$:/core/images/github","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-github tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M63.938 1.607c-35.336 0-63.994 28.69-63.994 64.084 0 28.312 18.336 52.329 43.768 60.802 3.202.59 4.37-1.388 4.37-3.088 0-1.518-.056-5.55-.087-10.897-17.802 3.871-21.558-8.591-21.558-8.591-2.911-7.404-7.108-9.375-7.108-9.375-5.81-3.973.44-3.895.44-3.895 6.424.453 9.803 6.606 9.803 6.606 5.709 9.791 14.981 6.963 18.627 5.322.582-4.138 2.236-6.963 4.063-8.564-14.211-1.617-29.153-7.117-29.153-31.672 0-6.995 2.495-12.718 6.589-17.195-.66-1.621-2.856-8.14.629-16.96 0 0 5.37-1.722 17.597 6.57 5.104-1.424 10.58-2.132 16.022-2.16 5.438.028 10.91.736 16.022 2.16 12.22-8.292 17.582-6.57 17.582-6.57 3.493 8.82 1.297 15.339.64 16.96 4.102 4.477 6.578 10.2 6.578 17.195 0 24.618-14.966 30.035-29.22 31.62 2.295 1.98 4.342 5.89 4.342 11.87 0 8.564-.079 15.476-.079 17.576 0 1.715 1.155 3.71 4.4 3.084 25.413-8.493 43.733-32.494 43.733-60.798 0-35.394-28.657-64.084-64.006-64.084\"/></svg>"},"$:/core/images/gitter":{"title":"$:/core/images/gitter","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-gitter tc-image-button\" viewBox=\"0 0 18 25\"><path d=\"M15 5h2v10h-2zM10 5h2v20h-2zM5 5h2v20H5zM0 0h2v15H0z\"/></svg>"},"$:/core/images/globe":{"title":"$:/core/images/globe","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-globe tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M72.811 37.128v2.554c0 2.196.978 6.881 0 8.832-1.466 2.928-4.65 3.54-6.394 5.867-1.182 1.577-4.618 10.601-3.69 12.92 3.969 9.922 11.534 3.187 17.962 9.293.864.821 2.887 2.273 3.296 3.296 3.29 8.223-7.576 15.009 3.757 26.3 1.245 1.24 3.813-3.817 4.079-4.614.852-2.563 6.725-5.45 9.088-7.053 2.02-1.37 4.873-2.667 6.328-4.745 2.27-3.244 1.48-7.514 3.098-10.745 2.139-4.274 3.828-9.635 5.998-13.966 3.898-7.781 4.721 2.093 5.067 2.439.358.357 1.011 0 1.517 0 .094 0 1.447.099 1.516 0 .65-.935-1.043-17.92-1.318-19.297-1.404-7.01-6.944-15.781-11.865-20.5-6.274-6.015-7.09-16.197-18.259-14.954-.204.022-5.084 10.148-7.777 13.512-3.728 4.657-2.47-4.153-6.526-4.153-.081 0-1.183-.103-1.253 0-.586.88-1.44 3.896-2.306 4.417-.265.16-1.722-.239-1.846 0-2.243 4.3 8.256 2.212 5.792 7.952-2.352 5.481-6.328-1.997-6.328 8.56M44.467 7.01c9.685 6.13.682 12.198 2.694 16.215 1.655 3.303 4.241 5.395 1.714 9.814-2.063 3.608-6.87 3.966-9.623 6.723-3.04 3.044-5.464 8.94-6.79 12.911-1.617 4.843 14.547 6.866 12.063 11.008-1.386 2.311-6.746 1.466-8.437.198-1.165-.873-3.593-.546-4.417-1.78-2.613-3.915-2.26-8.023-3.625-12.128-.938-2.822-6.313-2.12-7.844-.593-.523.522-.33 1.792-.33 2.505 0 5.285 7.12 3.316 7.12 6.46 0 14.636 3.927 6.534 11.14 11.336 10.036 6.683 7.844 7.303 14.946 14.404 3.673 3.673 7.741 3.686 9.425 9.294 1.602 5.331-9.327 5.339-11.716 7.448-1.123.991-2.813 4.146-4.219 4.615-1.792.598-3.234.496-4.944 1.78-2.427 1.82-3.9 4.932-4.02 4.81-2.148-2.147-3.52-15.479-3.89-18.257-.588-4.42-5.59-5.54-6.986-9.03-1.57-3.927 1.524-9.52-1.129-13.761-6.52-10.424-11.821-14.5-15.35-26.292-.942-3.148 3.342-6.529 4.877-8.833 1.877-2.816 2.662-5.854 4.746-8.635C22.147 24.19 40.855 9.461 43.857 8.635l.61-1.625z\"/><path d=\"M64 126c34.242 0 62-27.758 62-62 0-34.242-27.758-62-62-62C29.758 2 2 29.758 2 64c0 34.242 27.758 62 62 62zm0-6c30.928 0 56-25.072 56-56S94.928 8 64 8 8 33.072 8 64s25.072 56 56 56z\"/></g></svg>"},"$:/core/images/heading-1":{"title":"$:/core/images/heading-1","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-heading-1 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M14 30h13.25v30.104H61.7V30h13.25v75.684H61.7V71.552H27.25v34.132H14V30zm70.335 13.78c2.544 0 5.017-.212 7.42-.636 2.403-.424 4.576-1.13 6.52-2.12 1.942-.99 3.603-2.261 4.981-3.816 1.378-1.555 2.28-3.463 2.703-5.724h9.858v74.2h-13.25V53.32H84.335v-9.54z\"/></svg>"},"$:/core/images/heading-2":{"title":"$:/core/images/heading-2","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-heading-2 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm119.52 75.684H74.85c.07-6.148 1.555-11.519 4.452-16.112 2.897-4.593 6.855-8.586 11.872-11.978a133.725 133.725 0 017.526-5.141 59.6 59.6 0 007.208-5.353c2.19-1.908 3.993-3.975 5.406-6.201 1.413-2.226 2.155-4.788 2.226-7.685 0-1.343-.159-2.774-.477-4.293a11.357 11.357 0 00-1.855-4.24c-.919-1.307-2.19-2.403-3.816-3.286-1.625-.883-3.745-1.325-6.36-1.325-2.403 0-4.399.477-5.989 1.431-1.59.954-2.862 2.261-3.816 3.922-.954 1.66-1.66 3.622-2.12 5.883-.46 2.261-.724 4.7-.795 7.314H76.23c0-4.099.548-7.897 1.643-11.395 1.095-3.498 2.738-6.519 4.93-9.063 2.19-2.544 4.857-4.54 8.002-5.989C93.95 30.724 97.606 30 101.775 30c4.523 0 8.303.742 11.342 2.226 3.039 1.484 5.494 3.357 7.367 5.618 1.873 2.261 3.198 4.717 3.975 7.367.777 2.65 1.166 5.176 1.166 7.579 0 2.968-.46 5.653-1.378 8.056a25.942 25.942 0 01-3.71 6.625 37.5 37.5 0 01-5.3 5.565 79.468 79.468 0 01-6.148 4.77 165.627 165.627 0 01-6.36 4.24 94.28 94.28 0 00-5.883 4.028c-1.802 1.343-3.374 2.738-4.717 4.187-1.343 1.449-2.261 2.986-2.756 4.611h36.146v10.812z\"/></svg>"},"$:/core/images/heading-3":{"title":"$:/core/images/heading-3","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-heading-3 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm88.885 32.224c1.979.07 3.957-.07 5.936-.424 1.979-.353 3.745-.972 5.3-1.855a10.365 10.365 0 003.763-3.657c.954-1.555 1.431-3.463 1.431-5.724 0-3.18-1.078-5.724-3.233-7.632-2.155-1.908-4.929-2.862-8.32-2.862-2.12 0-3.958.424-5.513 1.272a11.318 11.318 0 00-3.869 3.445c-1.025 1.449-1.784 3.074-2.279 4.876a18.335 18.335 0 00-.636 5.565H75.381c.141-3.604.813-6.943 2.014-10.017 1.201-3.074 2.844-5.742 4.93-8.003 2.084-2.261 4.61-4.028 7.578-5.3C92.871 30.636 96.228 30 99.973 30a29.2 29.2 0 018.533 1.272c2.791.848 5.3 2.085 7.526 3.71s4.01 3.692 5.353 6.201c1.343 2.509 2.014 5.388 2.014 8.639 0 3.745-.848 7.014-2.544 9.805-1.696 2.791-4.346 4.823-7.95 6.095v.212c4.24.848 7.544 2.95 9.911 6.307s3.551 7.438 3.551 12.243c0 3.533-.707 6.696-2.12 9.487a21.538 21.538 0 01-5.724 7.102c-2.403 1.943-5.194 3.445-8.374 4.505-3.18 1.06-6.537 1.59-10.07 1.59-4.31 0-8.074-.618-11.289-1.855s-5.9-2.986-8.056-5.247c-2.155-2.261-3.798-4.982-4.929-8.162-1.13-3.18-1.731-6.713-1.802-10.6h12.084c-.141 4.523.972 8.286 3.34 11.289 2.366 3.003 5.917 4.505 10.652 4.505 4.028 0 7.402-1.148 10.123-3.445 2.72-2.297 4.081-5.565 4.081-9.805 0-2.897-.565-5.194-1.696-6.89a10.97 10.97 0 00-4.452-3.869c-1.837-.883-3.904-1.431-6.2-1.643a58.067 58.067 0 00-7.05-.212v-9.01z\"/></svg>"},"$:/core/images/heading-4":{"title":"$:/core/images/heading-4","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-heading-4 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8 30h13.25v30.104H55.7V30h13.25v75.684H55.7V71.552H21.25v34.132H8V30zm76.59 48.548h22.471V45.9h-.212L84.59 78.548zm43.46 9.54h-9.54v17.596H107.06V88.088h-31.8V76.11l31.8-44.626h11.448v47.064h9.54v9.54z\"/></svg>"},"$:/core/images/heading-5":{"title":"$:/core/images/heading-5","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-heading-5 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm77.755 1.484h38.372v10.812H92.765L88.95 61.164l.212.212c1.625-1.837 3.692-3.233 6.201-4.187 2.509-.954 5-1.431 7.473-1.431 3.675 0 6.96.618 9.858 1.855 2.897 1.237 5.335 2.968 7.314 5.194s3.48 4.858 4.505 7.897c1.025 3.039 1.537 6.325 1.537 9.858 0 2.968-.477 6.024-1.43 9.169a25.161 25.161 0 01-4.559 8.586c-2.085 2.58-4.752 4.7-8.003 6.36-3.25 1.66-7.137 2.491-11.66 2.491-3.604 0-6.943-.477-10.017-1.431-3.074-.954-5.777-2.385-8.109-4.293-2.332-1.908-4.187-4.258-5.565-7.049-1.378-2.791-2.138-6.06-2.279-9.805h12.084c.353 4.028 1.731 7.12 4.134 9.275 2.403 2.155 5.583 3.233 9.54 3.233 2.544 0 4.7-.424 6.466-1.272 1.767-.848 3.198-2.014 4.293-3.498 1.095-1.484 1.873-3.215 2.332-5.194.46-1.979.69-4.099.69-6.36 0-2.05-.284-4.01-.849-5.883-.565-1.873-1.413-3.516-2.544-4.929-1.13-1.413-2.597-2.544-4.399-3.392-1.802-.848-3.904-1.272-6.307-1.272-2.544 0-4.929.477-7.155 1.431-2.226.954-3.834 2.738-4.823 5.353H75.805l7.95-40.598z\"/></svg>"},"$:/core/images/heading-6":{"title":"$:/core/images/heading-6","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-heading-6 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm106.587 20.246c-.283-3.039-1.36-5.494-3.233-7.367-1.873-1.873-4.399-2.809-7.579-2.809-2.19 0-4.08.406-5.67 1.219a12.435 12.435 0 00-4.029 3.233c-1.095 1.343-1.979 2.88-2.65 4.611a37.696 37.696 0 00-1.643 5.459 46.08 46.08 0 00-.9 5.671 722.213 722.213 0 00-.478 5.247l.212.212c1.625-2.968 3.87-5.176 6.731-6.625 2.862-1.449 5.954-2.173 9.275-2.173 3.675 0 6.96.636 9.858 1.908 2.897 1.272 5.353 3.021 7.367 5.247 2.014 2.226 3.551 4.858 4.611 7.897 1.06 3.039 1.59 6.325 1.59 9.858 0 3.604-.583 6.943-1.749 10.017-1.166 3.074-2.844 5.76-5.035 8.056-2.19 2.297-4.805 4.081-7.844 5.353-3.039 1.272-6.395 1.908-10.07 1.908-5.441 0-9.91-1.007-13.409-3.021-3.498-2.014-6.254-4.77-8.268-8.268-2.014-3.498-3.41-7.597-4.187-12.296-.777-4.7-1.166-9.77-1.166-15.211 0-4.452.477-8.94 1.431-13.462.954-4.523 2.526-8.639 4.717-12.349 2.19-3.71 5.07-6.731 8.64-9.063C92.676 31.166 97.075 30 102.304 30c2.968 0 5.76.495 8.374 1.484 2.615.99 4.93 2.367 6.943 4.134 2.014 1.767 3.657 3.887 4.93 6.36 1.271 2.473 1.978 5.23 2.12 8.268h-12.085zm-11.66 46.852c2.19 0 4.099-.442 5.724-1.325a12.869 12.869 0 004.081-3.445c1.095-1.413 1.908-3.056 2.438-4.929.53-1.873.795-3.798.795-5.777s-.265-3.887-.795-5.724c-.53-1.837-1.343-3.445-2.438-4.823-1.095-1.378-2.456-2.491-4.08-3.339-1.626-.848-3.534-1.272-5.725-1.272-2.19 0-4.116.406-5.777 1.219-1.66.813-3.056 1.908-4.187 3.286-1.13 1.378-1.979 2.986-2.544 4.823-.565 1.837-.848 3.78-.848 5.83 0 2.05.283 3.993.848 5.83.565 1.837 1.413 3.48 2.544 4.929a12.39 12.39 0 004.187 3.445c1.66.848 3.586 1.272 5.777 1.272z\"/></svg>"},"$:/core/images/help":{"title":"$:/core/images/help","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-help tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M36.055 111.441c-5.24 4.396-15.168 7.362-26.555 7.362-1.635 0-3.24-.06-4.806-.179 7.919-2.64 14.062-8.6 16.367-16.014C8.747 92.845 1.05 78.936 1.05 63.5c0-29.547 28.206-53.5 63-53.5s63 23.953 63 53.5-28.206 53.5-63 53.5c-10.055 0-19.56-2-27.994-5.559zm35.35-33.843a536.471 536.471 0 00.018-4.682 199.02 199.02 0 00-.023-3.042c.008-1.357.595-2.087 3.727-4.235.112-.077 1.085-.74 1.386-.948 3.093-2.133 5.022-3.786 6.762-6.187 2.34-3.228 3.558-7.077 3.558-11.649 0-13.292-9.86-21.952-21.455-21.952-11.103 0-22.499 9.609-24.066 22.295a6.023 6.023 0 1011.956 1.477c.806-6.527 6.972-11.726 12.11-11.726 5.265 0 9.408 3.64 9.408 9.906 0 3.634-1.1 5.153-5.111 7.919l-1.362.93c-2.682 1.84-4.227 3.1-5.7 4.931-2.109 2.62-3.242 5.717-3.258 9.314.013.892.02 1.86.022 2.981a470.766 470.766 0 01-.022 4.943 6.023 6.023 0 1012.046.12l.003-.395zm-6.027 24.499a7.529 7.529 0 100-15.058 7.529 7.529 0 000 15.058z\"/></svg>"},"$:/core/images/home-button":{"title":"$:/core/images/home-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-home-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112.985 119.502c.01-.165.015-.331.015-.499V67.568c3.137 2.948 8.076 2.884 11.134-.174a7.999 7.999 0 00-.002-11.316L70.396 2.343A7.978 7.978 0 0064.734 0a7.957 7.957 0 00-5.656 2.343L33 28.42V8.007C33 3.585 29.41 0 25 0c-4.418 0-8 3.59-8 8.007V44.42L5.342 56.078c-3.125 3.125-3.12 8.198-.002 11.316a7.999 7.999 0 0011.316-.003l.344-.343v52.945a8.11 8.11 0 000 .007c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8a8.11 8.11 0 00-.015-.498zM97 112V51.574L64.737 19.31 33 51.048V112h64z\"/></svg>"},"$:/core/images/import-button":{"title":"$:/core/images/import-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-import-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M114.832 60.436s3.235-3.27 6.921.417c3.686 3.686.231 7.14.231 7.14l-42.153 42.92s-30.765 32.367-58.798 4.333C-7 87.213 24.59 55.623 24.59 55.623L67.363 12.85s22.725-24.6 43.587-3.738c20.862 20.862-3.96 43.09-3.96 43.09l-35.04 35.04S49.903 112.546 36.426 99.07c-13.476-13.477 11.83-35.523 11.83-35.523l35.04-35.04s3.902-3.902 7.78-.023c3.879 3.878.118 7.921.118 7.921l-35.04 35.04s-13.212 13.212-8.872 17.551c4.34 4.34 16.77-9.653 16.77-9.653l35.04-35.04s16.668-14.598 3.966-27.3c-13.893-13.892-27.565 3.702-27.565 3.702l-42.91 42.91s-23.698 23.698-3.658 43.738 43.012-4.385 43.012-4.385l42.895-42.533z\"/></svg>"},"$:/core/images/info-button":{"title":"$:/core/images/info-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-info-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(.05)\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\"/><circle cx=\"64\" cy=\"32\" r=\"8\"/><rect width=\"16\" height=\"56\" x=\"56\" y=\"48\" rx=\"8\"/></g></svg>"},"$:/core/images/input-button":{"title":"$:/core/images/input-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-input-button tc-image-button\" viewBox=\"0 0 22 22\"><path d=\"M1.375 22h19.249c.365 0 .716-.145.973-.404v.001c.258-.257.404-.607.403-.972v-11a1.376 1.376 0 0 0-2.75 0v9.625H2.75V9.625a1.376 1.376 0 0 0-2.75 0v11C0 21.384.617 22 1.375 22Z\"/><path d=\"m9.732 11.904-1.541-1.541a1.375 1.375 0 1 0-1.944 1.944l3.887 3.888c.258.258.608.402.973.402h-.001c.353 0 .705-.134.974-.402l3.888-3.889a1.376 1.376 0 0 0 .001-1.944 1.377 1.377 0 0 0-1.946 0l-1.541 1.542V1.376a1.375 1.375 0 1 0-2.75 0v10.528Z\"/></svg>"},"$:/core/images/italic":{"title":"$:/core/images/italic","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-italic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M66.711 0h22.41L62.408 128H40z\"/></svg>"},"$:/core/images/layout-button":{"title":"$:/core/images/layout-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-layout-button tc-image-button\" viewBox=\"0 0 24 24\" stroke-width=\"1\" stroke=\"none\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><rect x=\"2\" y=\"2\" width=\"7\" height=\"7\" rx=\"2\"/><rect x=\"2\" y=\"13\" width=\"7\" height=\"9\" rx=\"2\"/><rect x=\"12\" y=\"2\" width=\"10\" height=\"20\" rx=\"2\"/></svg>"},"$:/core/images/left-arrow":{"title":"$:/core/images/left-arrow","created":"20150315234410875","modified":"20150315235324760","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-left-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 64.177c0-2.026.771-4.054 2.317-5.6l55.98-55.98a7.92 7.92 0 0111.195.001c3.086 3.085 3.092 8.104.001 11.195L19.111 64.175l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.086-8.105 3.092-11.196.001l-55.98-55.98A7.892 7.892 0 010 64.177z\"/></svg>"},"$:/core/images/line-width":{"title":"$:/core/images/line-width","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-line-width tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M16 18h96a2 2 0 000-4H16a2 2 0 100 4zm0 17h96a4 4 0 100-8H16a4 4 0 100 8zm0 21h96a6 6 0 000-12H16a6 6 0 100 12zm0 29h96c5.523 0 10-4.477 10-10s-4.477-10-10-10H16c-5.523 0-10 4.477-10 10s4.477 10 10 10zm0 43h96c8.837 0 16-7.163 16-16s-7.163-16-16-16H16c-8.837 0-16 7.163-16 16s7.163 16 16 16z\"/></svg>"},"$:/core/images/link":{"title":"$:/core/images/link","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-link tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M42.263 69.38a31.919 31.919 0 006.841 10.13c12.5 12.5 32.758 12.496 45.255 0l22.627-22.628c12.502-12.501 12.497-32.758 0-45.255-12.5-12.5-32.758-12.496-45.254 0L49.104 34.255a32.333 32.333 0 00-2.666 3.019 36.156 36.156 0 0121.94.334l14.663-14.663c6.25-6.25 16.382-6.254 22.632-.004 6.248 6.249 6.254 16.373-.004 22.631l-22.62 22.62c-6.25 6.25-16.381 6.254-22.631.004a15.93 15.93 0 01-4.428-8.433 11.948 11.948 0 00-7.59 3.48l-6.137 6.137z\"/><path d=\"M86.35 59.234a31.919 31.919 0 00-6.84-10.13c-12.5-12.5-32.758-12.497-45.255 0L11.627 71.732c-12.501 12.5-12.496 32.758 0 45.254 12.5 12.5 32.758 12.497 45.255 0L79.51 94.36a32.333 32.333 0 002.665-3.02 36.156 36.156 0 01-21.94-.333l-14.663 14.663c-6.25 6.25-16.381 6.253-22.63.004-6.25-6.249-6.255-16.374.003-22.632l22.62-22.62c6.25-6.25 16.381-6.253 22.631-.003a15.93 15.93 0 014.428 8.432 11.948 11.948 0 007.59-3.48l6.137-6.136z\"/></g></svg>"},"$:/core/images/linkify":{"title":"$:/core/images/linkify","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-linkify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M17.031 31.919H9.048V96.85h7.983v6.92H0V25h17.031v6.919zm24.66 0h-7.983V96.85h7.983v6.92H24.66V25h17.03v6.919zM67.77 56.422l11.975-3.903 2.306 7.096-12.063 3.903 7.628 10.379-6.12 4.435-7.63-10.467-7.45 10.2-5.943-4.523L58.1 63.518 45.95 59.35l2.306-7.096 12.064 4.17V43.825h7.45v12.596zM86.31 96.85h7.982V31.92H86.31V25h17.031v78.77H86.31v-6.92zm24.659 0h7.983V31.92h-7.983V25H128v78.77h-17.031v-6.92z\"/></svg>"},"$:/core/images/list-bullet":{"title":"$:/core/images/list-bullet","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-list-bullet tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M11.636 40.273c6.427 0 11.637-5.21 11.637-11.637C23.273 22.21 18.063 17 11.636 17 5.21 17 0 22.21 0 28.636c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.637 0-6.426-5.21-11.636-11.637-11.636C5.21 51.91 0 57.12 0 63.545c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.636 0-6.427-5.21-11.637-11.637-11.637C5.21 86.818 0 92.028 0 98.455c0 6.426 5.21 11.636 11.636 11.636zM34.91 22.818H128v11.637H34.91V22.818zm0 34.91H128v11.636H34.91V57.727zm0 34.908H128v11.637H34.91V92.636z\"/></svg>"},"$:/core/images/list-number":{"title":"$:/core/images/list-number","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-list-number tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M33.84 22.356H128v11.77H33.84v-11.77zm0 35.31H128v11.77H33.84v-11.77zm0 35.311H128v11.77H33.84v-11.77zM.38 42.631v-2.223h.998c.826 0 1.445-.14 1.858-.42.413-.28.619-.948.619-2.002V22.769c0-1.442-.193-2.336-.58-2.683-.385-.347-1.477-.52-3.275-.52v-2.143c3.502-.147 6.252-.955 8.25-2.423h2.117v22.865c0 .921.15 1.575.449 1.963.3.387.949.58 1.948.58h.998v2.223H.38zm-.3 35.356v-1.902c7.19-6.554 10.786-12.58 10.786-18.08 0-1.562-.326-2.81-.979-3.744-.652-.934-1.524-1.402-2.616-1.402-.893 0-1.655.317-2.287.952-.633.634-.95 1.364-.95 2.192 0 .974.247 1.829.74 2.563.106.16.16.28.16.36 0 .147-.16.28-.48.4-.213.08-.752.308-1.618.681-.839.374-1.358.561-1.558.561-.24 0-.512-.37-.819-1.111A6.2 6.2 0 010 57.064c0-1.949.849-3.544 2.547-4.785 1.698-1.242 3.798-1.862 6.302-1.862 2.463 0 4.53.67 6.202 2.012 1.67 1.341 2.506 3.093 2.506 5.256a8.644 8.644 0 01-.849 3.724c-.566 1.201-1.92 3.053-4.064 5.556a165.471 165.471 0 01-6.272 6.938h11.445l-1.019 5.726h-2.117c.08-.28.12-.534.12-.76 0-.388-.1-.631-.3-.731-.2-.1-.599-.15-1.198-.15H.08zm12.124 19.207c1.745.04 3.236.637 4.474 1.792 1.239 1.154 1.858 2.773 1.858 4.855 0 2.99-1.132 5.393-3.396 7.208-2.263 1.815-5 2.723-8.209 2.723-2.01 0-3.669-.384-4.974-1.151C.652 111.853 0 110.849 0 109.607c0-.774.27-1.398.809-1.872.54-.474 1.128-.71 1.768-.71.639 0 1.162.2 1.568.6.406.4.782 1.055 1.128 1.962.466 1.268 1.239 1.902 2.317 1.902 1.265 0 2.287-.477 3.066-1.431.78-.955 1.169-2.686 1.169-5.196 0-1.709-.12-3.023-.36-3.944-.24-.921-.792-1.382-1.658-1.382-.586 0-1.185.307-1.797.921-.493.494-.932.741-1.319.741-.333 0-.602-.147-.809-.44-.206-.294-.31-.574-.31-.841 0-.32.104-.594.31-.821.207-.227.69-.594 1.449-1.102 2.876-1.922 4.314-4.017 4.314-6.287 0-1.188-.306-2.092-.919-2.713a3.001 3.001 0 00-2.217-.93c-.799 0-1.525.263-2.177.79-.653.528-.979 1.158-.979 1.892 0 .641.253 1.235.76 1.782.172.2.259.367.259.5 0 .121-.57.428-1.708.922-1.139.494-1.854.74-2.147.74-.413 0-.75-.333-1.009-1-.26-.668-.39-1.282-.39-1.842 0-1.749.93-3.224 2.787-4.425 1.858-1.202 3.965-1.802 6.322-1.802 2.064 0 3.851.447 5.363 1.341 1.511.895 2.267 2.116 2.267 3.664 0 1.362-.57 2.623-1.708 3.784a13.387 13.387 0 01-3.945 2.784z\"/></svg>"},"$:/core/images/list":{"title":"$:/core/images/list","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-list tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M87.748 128H23.999c-4.418 0-7.999-3.59-7.999-8.007V8.007C16 3.585 19.588 0 24 0h80c4.419 0 8 3.59 8 8.007V104H91.25c-.965 0-1.84.392-2.473 1.025a3.476 3.476 0 00-1.029 2.476V128zm8-.12l15.88-15.88h-15.88v15.88zM40 15.508A3.502 3.502 0 0143.5 12h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 20h-55a3.498 3.498 0 01-3.5-3.509v-.982zM32 22a6 6 0 100-12 6 6 0 000 12zm8 9.509A3.502 3.502 0 0143.5 28h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 36h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 44h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 52h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 60h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 68h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 76h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 84h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 92h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 100h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.505 3.505 0 0143.497 108h33.006A3.497 3.497 0 0180 111.509v.982A3.505 3.505 0 0176.503 116H43.497A3.497 3.497 0 0140 112.491v-.982zM32 38a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12z\"/></svg>"},"$:/core/images/locked-padlock":{"title":"$:/core/images/locked-padlock","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-locked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M96.472 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h8c.003-15.723.303-47.731 32.16-47.731 31.794 0 32.305 32.057 32.312 47.731zm-15.897 0H48.44c.002-16.287.142-32 15.719-32 15.684 0 16.977 16.136 16.415 32zM67.732 92.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"},"$:/core/images/mail":{"title":"$:/core/images/mail","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-mail tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M122.827 104.894a7.986 7.986 0 01-2.834.516H8.007c-.812 0-1.597-.12-2.335-.345l34.163-34.163 20.842 20.842a3.998 3.998 0 003.418 1.134 4.003 4.003 0 003.395-1.134L88.594 70.64c.075.09.155.176.24.26l33.993 33.994zm5.076-6.237c.064-.406.097-.823.097-1.247v-64c0-.669-.082-1.318-.237-1.94L94.23 65.006c.09.075.177.154.261.239l33.413 33.413zm-127.698.56A8.023 8.023 0 010 97.41v-64c0-.716.094-1.41.271-2.071l33.907 33.906L.205 99.218zM5.93 25.684a8.012 8.012 0 012.078-.273h111.986c.766 0 1.507.108 2.209.308L64.083 83.837 5.93 25.683z\"/></svg>"},"$:/core/images/mastodon":{"title":"$:/core/images/mastodon","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-mastodon tc-image-button\" viewBox=\"0 0 128 128\">\n  <path d=\"M112.716,76.735C111.231,85.764 99.411,95.646 85.836,97.561C78.757,98.559 71.787,99.476 64.355,99.073C52.201,98.415 42.61,95.646 42.61,95.646C42.61,97.044 42.683,98.374 42.829,99.619C44.409,113.79 54.723,114.639 64.493,115.035C74.354,115.434 83.134,112.163 83.134,112.163L83.539,122.695C83.539,122.695 76.642,127.071 64.355,127.875C57.58,128.315 49.167,127.674 39.369,124.61C18.118,117.965 14.463,91.202 13.904,64.048C13.733,55.985 13.839,48.383 13.839,42.024C13.839,14.257 29.238,6.118 29.238,6.118C37.002,1.905 50.326,0.134 64.177,-0L64.517,-0C78.369,0.134 91.701,1.905 99.465,6.118C99.465,6.118 114.864,14.257 114.864,42.024C114.864,42.024 115.057,62.511 112.716,76.735ZM96.7,44.179C96.7,37.307 95.219,31.847 92.245,27.807C89.177,23.767 85.16,21.696 80.174,21.696C74.403,21.696 70.034,24.316 67.146,29.556L64.337,35.118L61.529,29.556C58.64,24.316 54.271,21.696 48.501,21.696C43.514,21.696 39.497,23.767 36.43,27.807C33.455,31.847 31.974,37.307 31.974,44.179L31.974,77.8L43.249,77.8L43.249,45.167C43.249,38.288 45.699,34.796 50.599,34.796C56.017,34.796 58.733,38.938 58.733,47.128L58.733,64.99L69.941,64.99L69.941,47.128C69.941,38.938 72.657,34.796 78.075,34.796C82.975,34.796 85.425,38.288 85.425,45.167L85.425,77.8L96.7,77.8L96.7,44.179Z\"/>\n</svg>\n"},"$:/core/images/menu-button":{"title":"$:/core/images/menu-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-menu-button tc-image-button\" viewBox=\"0 0 128 128\"><rect width=\"128\" height=\"16\" y=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"56\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"96\" rx=\"8\"/></svg>"},"$:/core/images/minus-button":{"title":"$:/core/images/minus-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-minus-button tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64 0c35.346 0 64 28.654 64 64 0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64C0 28.654 28.654 0 64 0zm.332 16c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\"/><rect width=\"80\" height=\"16\" x=\"24\" y=\"56\" rx=\"8\"/></svg>"},"$:/core/images/mono-block":{"title":"$:/core/images/mono-block","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-mono-block tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M23.965 32.967h.357c.755 0 1.328.192 1.72.577.39.384.586.947.586 1.688 0 .824-.206 1.418-.618 1.782-.413.363-1.094.545-2.045.545h-6.31c-.965 0-1.65-.178-2.056-.535-.405-.356-.608-.954-.608-1.792 0-.811.203-1.391.608-1.74.406-.35 1.09-.525 2.055-.525h.734l-.86-2.453H8.471l-.902 2.453h.734c.95 0 1.632.178 2.044.535.413.356.619.933.619 1.73 0 .824-.206 1.418-.619 1.782-.412.363-1.094.545-2.044.545h-5.41c-.964 0-1.649-.182-2.054-.545-.406-.364-.608-.958-.608-1.782 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.719-.577h.356l5.62-15.641H6.835c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.95-.619-1.76 0-.825.207-1.42.619-1.783.412-.363 1.094-.545 2.044-.545h7.863c1.244 0 2.118.67 2.62 2.013v.063l6.647 18.2zM12.98 17.326l-3.04 8.848h6.08l-3.04-8.848zm22.402 9.372v6.395h3.145c2.223 0 3.788-.245 4.697-.734.908-.49 1.362-1.307 1.362-2.453 0-1.16-.433-1.985-1.3-2.474-.866-.49-2.383-.734-4.55-.734h-3.354zm10.693-2.327c1.524.559 2.642 1.324 3.355 2.295.713.972 1.07 2.212 1.07 3.722 0 1.272-.308 2.432-.923 3.48-.615 1.049-1.496 1.909-2.642 2.58a7.499 7.499 0 01-2.254.849c-.832.174-2.01.262-3.533.262H30.202c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.782 0-.741.189-1.304.566-1.688.378-.385.93-.577 1.657-.577h.356V17.326h-.356c-.727 0-1.28-.196-1.657-.587-.377-.392-.566-.965-.566-1.72 0-.81.203-1.401.608-1.771.406-.37 1.062-.556 1.971-.556h9.645c2.95 0 5.19.573 6.72 1.72 1.53 1.145 2.296 2.823 2.296 5.031 0 1.09-.234 2.052-.703 2.883-.468.832-1.163 1.513-2.086 2.045zM35.381 17.2v5.284h2.83c1.72 0 2.932-.203 3.638-.609.706-.405 1.06-1.09 1.06-2.054 0-.909-.319-1.573-.955-1.992-.636-.42-1.667-.63-3.093-.63h-3.48zm35.863-3.816c.28-.503.566-.86.86-1.07.293-.21.664-.314 1.111-.314.685 0 1.17.182 1.457.545.287.364.43.986.43 1.866l.042 5.452c0 .964-.157 1.614-.472 1.95-.314.335-.884.503-1.709.503-.587 0-1.037-.14-1.352-.42-.314-.28-.584-.796-.807-1.551-.364-1.328-.944-2.282-1.74-2.862-.797-.58-1.901-.87-3.313-.87-2.153 0-3.802.727-4.948 2.18-1.147 1.454-1.72 3.558-1.72 6.311 0 2.74.58 4.844 1.74 6.311 1.16 1.468 2.817 2.202 4.97 2.202 1.467 0 3.085-.49 4.854-1.468 1.768-.978 2.883-1.467 3.344-1.467.545 0 1.003.23 1.373.692.37.46.556 1.034.556 1.719 0 1.23-1.084 2.39-3.25 3.48-2.167 1.09-4.606 1.636-7.318 1.636-3.662 0-6.625-1.21-8.89-3.627-2.264-2.419-3.396-5.578-3.396-9.478 0-3.76 1.146-6.884 3.438-9.372 2.293-2.488 5.2-3.732 8.723-3.732.992 0 1.97.112 2.935.335.964.224 1.992.574 3.082 1.049zm10.22 19.583V17.326h-.356c-.755 0-1.328-.196-1.72-.587-.39-.392-.586-.965-.586-1.72 0-.81.21-1.401.629-1.771.42-.37 1.097-.556 2.034-.556h5.178c2.922 0 5.06.126 6.416.377 1.356.252 2.51.671 3.46 1.258 1.691 1.007 2.988 2.443 3.89 4.31.9 1.865 1.352 4.021 1.352 6.467 0 2.586-.514 4.847-1.541 6.783-1.028 1.936-2.485 3.4-4.372 4.393-.853.447-1.852.772-2.998.975-1.147.203-2.852.304-5.116.304h-6.269c-.965 0-1.65-.178-2.055-.535-.406-.356-.608-.954-.608-1.792 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.72-.577h.356zm5.41-15.725v15.725h1.195c2.642 0 4.592-.646 5.85-1.94 1.258-1.292 1.887-3.28 1.887-5.965 0-2.641-.64-4.612-1.918-5.912-1.28-1.3-3.205-1.95-5.777-1.95-.335 0-.59.003-.765.01a7.992 7.992 0 00-.472.032zm35.067-.126h-9.75v5.368h3.69v-.252c0-.797.175-1.39.524-1.782.35-.392.88-.587 1.594-.587.629 0 1.142.178 1.54.534.4.357.598.808.598 1.353 0 .028.007.118.021.272.014.154.021.308.021.462v4.34c0 .936-.167 1.607-.503 2.013-.335.405-.88.608-1.635.608-.713 0-1.251-.19-1.615-.567-.363-.377-.545-.936-.545-1.677v-.377h-3.69v6.269h9.75v-2.495c0-.937.178-1.608.534-2.013.357-.405.94-.608 1.75-.608.798 0 1.367.2 1.71.597.342.399.513 1.073.513 2.024v5.074c0 .755-.146 1.258-.44 1.51-.293.251-.873.377-1.74.377h-17.172c-.923 0-1.583-.182-1.982-.545-.398-.364-.597-.958-.597-1.782 0-.741.189-1.304.566-1.688.377-.385.93-.577 1.656-.577h.357V17.326h-.357c-.712 0-1.261-.2-1.646-.598-.384-.398-.576-.968-.576-1.709 0-.81.203-1.401.608-1.771.405-.37 1.062-.556 1.97-.556h17.173c.853 0 1.43.13 1.73.388.3.258.45.772.45 1.54v4.698c0 .95-.174 1.631-.524 2.044-.35.412-.915.618-1.698.618-.81 0-1.394-.21-1.75-.629-.357-.419-.535-1.097-.535-2.033v-2.202zM19.77 47.641c.267-.504.55-.86.85-1.07.3-.21.675-.314 1.122-.314.685 0 1.17.181 1.457.545.287.363.43.985.43 1.866l.042 5.451c0 .965-.157 1.615-.472 1.95-.314.336-.891.504-1.73.504-.587 0-1.045-.144-1.373-.43-.329-.287-.598-.8-.807-1.541-.378-1.342-.958-2.3-1.74-2.873-.783-.573-1.88-.86-3.292-.86-2.153 0-3.799.727-4.938 2.181-1.14 1.454-1.709 3.557-1.709 6.311s.598 4.882 1.793 6.385C10.599 67.248 12.294 68 14.488 68c.503 0 1.077-.06 1.72-.179a23.809 23.809 0 002.264-.555v-3.313h-2.37c-.95 0-1.624-.175-2.023-.524-.398-.35-.597-.93-.597-1.74 0-.84.199-1.437.597-1.793.399-.357 1.073-.535 2.024-.535h7.569c.978 0 1.667.175 2.065.524.398.35.598.937.598 1.762 0 .74-.2 1.31-.598 1.708-.398.399-.975.598-1.73.598h-.335v5.242c0 .447-.05.758-.147.933-.098.174-.293.353-.587.534-.797.476-2.062.895-3.795 1.258a25.576 25.576 0 01-5.263.546c-3.662 0-6.625-1.21-8.89-3.628-2.264-2.418-3.397-5.577-3.397-9.477 0-3.76 1.147-6.884 3.44-9.372 2.292-2.488 5.199-3.732 8.721-3.732.979 0 1.954.112 2.925.335.972.224 2.003.573 3.093 1.049zm15.84 3.941v4.823h6.857v-4.823h-.336c-.754 0-1.331-.195-1.73-.587-.398-.391-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.364 1.093-.545 2.044-.545h5.41c.95 0 1.624.181 2.023.545.398.363.597.957.597 1.782 0 .755-.192 1.328-.576 1.72-.385.39-.947.586-1.688.586h-.357v15.642h.357c.755 0 1.328.192 1.719.576.391.385.587.947.587 1.688 0 .825-.203 1.419-.608 1.782-.405.364-1.09.546-2.055.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.2-1.303.598-1.688.398-.384.975-.576 1.73-.576h.335v-6.186h-6.856v6.186h.335c.755 0 1.331.192 1.73.576.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.412.364-1.094.546-2.044.546h-5.41c-.964 0-1.65-.179-2.055-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.392-.384.965-.576 1.72-.576h.356V51.582h-.356c-.741 0-1.304-.195-1.688-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.073-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.335zm31.754 0v15.642h3.523c.95 0 1.632.178 2.044.534.412.357.618.933.618 1.73 0 .811-.21 1.402-.629 1.772-.419.37-1.097.556-2.033.556H58.433c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.957-.619-1.782 0-.81.203-1.39.608-1.74.406-.35 1.09-.524 2.055-.524h3.523V51.582h-3.523c-.95 0-1.632-.181-2.044-.545-.412-.363-.619-.95-.619-1.761 0-.825.203-1.412.608-1.761.406-.35 1.09-.524 2.055-.524h12.455c.992 0 1.684.174 2.075.524.392.35.587.936.587 1.761 0 .81-.202 1.398-.608 1.761-.405.364-1.09.545-2.054.545h-3.523zm30.496 0v11.994c0 1.873-.122 3.228-.367 4.067a5.876 5.876 0 01-1.227 2.244c-.74.852-1.768 1.495-3.082 1.929-1.314.433-2.893.65-4.738.65-1.3 0-2.555-.126-3.764-.378a16.843 16.843 0 01-3.491-1.132c-.615-.28-1.017-.643-1.206-1.09-.188-.448-.283-1.175-.283-2.18v-4.32c0-1.202.175-2.04.525-2.516.349-.475.957-.713 1.824-.713 1.244 0 1.929.915 2.054 2.747.014.321.035.566.063.733.168 1.622.545 2.73 1.133 3.324.587.594 1.523.89 2.81.89 1.593 0 2.714-.422 3.364-1.268.65-.845.975-2.386.975-4.623V51.582H88.93c-.95 0-1.632-.181-2.044-.545-.413-.363-.619-.95-.619-1.761 0-.825.2-1.412.598-1.761.398-.35 1.086-.524 2.065-.524h10.693c.979 0 1.667.174 2.065.524.399.35.598.936.598 1.761 0 .81-.206 1.398-.619 1.761-.412.364-1.093.545-2.044.545h-1.761zm14.644 0v6.353l6.48-6.478c-.728-.084-1.238-.29-1.531-.619-.294-.328-.44-.85-.44-1.562 0-.825.198-1.419.597-1.782.398-.364 1.073-.545 2.023-.545h5.137c.95 0 1.625.181 2.023.545.399.363.598.957.598 1.782 0 .769-.2 1.345-.598 1.73-.398.384-.982.576-1.75.576h-.483l-6.101 6.06c1.132.839 2.167 1.94 3.103 3.302.937 1.363 2.034 3.456 3.292 6.28h.692c.825 0 1.44.188 1.845.566.405.377.608.943.608 1.698 0 .825-.206 1.419-.619 1.782-.412.364-1.093.546-2.044.546h-2.579c-1.132 0-2.048-.762-2.746-2.286-.126-.28-.224-.503-.294-.67-.923-1.958-1.768-3.467-2.537-4.53a16.616 16.616 0 00-2.705-2.914l-1.97 1.887v3.92h.335c.755 0 1.331.193 1.73.577.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.413.364-1.094.546-2.045.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.391-.384.965-.576 1.72-.576h.356V51.582h-.357c-.74 0-1.303-.195-1.687-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.072-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.336zM13.44 96.326l4.005-11.889c.251-.782.6-1.352 1.048-1.709.447-.356 1.041-.534 1.782-.534h3.271c.95 0 1.632.182 2.044.545.413.363.619.957.619 1.782 0 .755-.2 1.328-.598 1.72-.398.39-.975.587-1.73.587h-.335l.587 15.641h.357c.754 0 1.32.192 1.698.577.377.384.566.947.566 1.687 0 .825-.2 1.42-.598 1.783-.398.363-1.072.545-2.023.545h-4.718c-.95 0-1.624-.178-2.023-.535-.398-.356-.597-.954-.597-1.793 0-.74.192-1.303.576-1.687.385-.385.954-.577 1.709-.577h.335l-.293-12.79-3.061 9.52c-.224.712-.542 1.226-.954 1.54-.413.315-.982.472-1.709.472-.727 0-1.303-.157-1.73-.472-.426-.314-.751-.828-.975-1.54l-3.04-9.52-.294 12.79h.336c.755 0 1.324.192 1.709.577.384.384.576.947.576 1.687 0 .825-.202 1.42-.608 1.783-.405.363-1.076.545-2.013.545H2.621c-.937 0-1.608-.182-2.013-.545-.405-.364-.608-.958-.608-1.783 0-.74.192-1.303.577-1.687.384-.385.954-.577 1.708-.577h.336l.608-15.641h-.336c-.754 0-1.331-.196-1.73-.588-.398-.39-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.363 1.093-.545 2.044-.545h3.27c.728 0 1.311.175 1.752.524.44.35.8.923 1.08 1.72l4.109 11.888zm30.454 2.054V86.828H42.74c-.922 0-1.583-.182-1.981-.546-.398-.363-.598-.95-.598-1.76 0-.812.2-1.402.598-1.773.398-.37 1.059-.555 1.981-.555h5.955c.909 0 1.566.185 1.97.555.406.37.609.961.609 1.772 0 .741-.192 1.31-.577 1.709-.384.398-.933.598-1.646.598h-.356v19.038c0 .657-.07 1.069-.21 1.237-.14.167-.454.251-.943.251h-2.097c-.67 0-1.143-.07-1.415-.21-.273-.14-.507-.384-.703-.733l-8.722-15.327v11.385h1.216c.909 0 1.559.175 1.95.524.392.35.587.93.587 1.74 0 .825-.199 1.42-.597 1.783-.399.363-1.045.545-1.94.545h-6.017c-.909 0-1.566-.182-1.971-.545-.406-.364-.608-.958-.608-1.783 0-.74.188-1.303.566-1.687.377-.385.936-.577 1.677-.577h.336V86.828h-.336c-.713 0-1.265-.2-1.656-.598-.392-.398-.587-.968-.587-1.709 0-.81.206-1.401.618-1.772.413-.37 1.066-.555 1.96-.555h3.44c.824 0 1.383.108 1.677.325.293.216.622.653.985 1.31l7.989 14.551zM64.66 86.366c-1.803 0-3.218.727-4.245 2.18-1.028 1.455-1.541 3.474-1.541 6.06 0 2.586.517 4.613 1.551 6.08 1.034 1.468 2.446 2.202 4.235 2.202 1.804 0 3.222-.73 4.257-2.19 1.034-1.461 1.551-3.492 1.551-6.092 0-2.586-.513-4.605-1.54-6.06-1.028-1.453-2.45-2.18-4.268-2.18zm0-4.864c3.44 0 6.27 1.23 8.492 3.69 2.223 2.46 3.334 5.598 3.334 9.414 0 3.844-1.104 6.99-3.313 9.436-2.208 2.446-5.046 3.669-8.513 3.669-3.424 0-6.255-1.234-8.491-3.701-2.237-2.467-3.355-5.602-3.355-9.404 0-3.83 1.108-6.971 3.323-9.424 2.216-2.454 5.057-3.68 8.523-3.68zM87.461 98.17v4.298h2.16c.908 0 1.555.175 1.94.524.384.35.576.93.576 1.74 0 .825-.196 1.42-.587 1.783-.392.363-1.035.545-1.93.545h-7.254c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.783 0-.74.189-1.303.566-1.687.378-.385.93-.577 1.657-.577h.356V86.828h-.356c-.713 0-1.262-.2-1.646-.598-.385-.398-.577-.968-.577-1.709 0-.81.203-1.401.608-1.772.406-.37 1.063-.555 1.971-.555h8.66c3.424 0 6.014.657 7.768 1.97 1.754 1.315 2.631 3.25 2.631 5.809 0 2.697-.873 4.738-2.62 6.122-1.748 1.384-4.34 2.076-7.78 2.076h-3.564zm0-11.343v6.625h2.977c1.65 0 2.89-.28 3.722-.839.832-.559 1.248-1.397 1.248-2.516 0-1.048-.43-1.855-1.29-2.421-.86-.566-2.086-.85-3.68-.85h-2.977zm27.267 20.568l-1.636 1.636a12.37 12.37 0 011.772-.44c.58-.098 1.15-.147 1.709-.147 1.104 0 2.268.164 3.491.492 1.223.329 1.967.493 2.233.493.447 0 1.03-.15 1.75-.45.72-.301 1.206-.452 1.458-.452.517 0 .947.2 1.29.598.342.398.513.898.513 1.5 0 .796-.472 1.474-1.415 2.033-.944.56-2.1.839-3.47.839-.937 0-2.139-.22-3.607-.66-1.467-.441-2.53-.661-3.187-.661-.992 0-2.11.272-3.354.817-1.244.546-2.013.818-2.307.818a2.14 2.14 0 01-1.53-.597c-.42-.399-.63-.878-.63-1.437 0-.391.134-.807.4-1.247.265-.44.733-1.01 1.404-1.709l2.118-2.139c-2.335-.852-4.194-2.386-5.578-4.602-1.384-2.215-2.075-4.763-2.075-7.642 0-3.802 1.104-6.909 3.312-9.32 2.209-2.411 5.053-3.617 8.534-3.617 3.467 0 6.304 1.209 8.513 3.627 2.208 2.418 3.312 5.522 3.312 9.31 0 3.774-1.097 6.884-3.291 9.33-2.195 2.446-4.977 3.67-8.345 3.67a22.5 22.5 0 01-1.384-.043zm1.195-21.03c-1.803 0-3.218.727-4.246 2.18-1.027 1.455-1.54 3.474-1.54 6.06 0 2.586.516 4.613 1.55 6.08 1.035 1.468 2.447 2.202 4.236 2.202 1.803 0 3.222-.73 4.256-2.19 1.035-1.461 1.552-3.492 1.552-6.092 0-2.586-.514-4.605-1.541-6.06-1.028-1.453-2.45-2.18-4.267-2.18z\"/></svg>"},"$:/core/images/mono-line":{"title":"$:/core/images/mono-line","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-mono-line tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.437 84.523h.908c1.922 0 3.381.489 4.378 1.468.997.979 1.495 2.411 1.495 4.298 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388h-16.07c-2.456 0-4.2-.454-5.232-1.361-1.032-.908-1.548-2.43-1.548-4.565 0-2.065.516-3.542 1.548-4.432 1.032-.89 2.776-1.334 5.232-1.334h1.869l-2.19-6.247H20.983l-2.296 6.247h1.87c2.42 0 4.155.453 5.205 1.361 1.05.908 1.575 2.376 1.575 4.405 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388H6.781c-2.456 0-4.2-.463-5.233-1.388C.516 93.9 0 92.389 0 90.289c0-1.887.498-3.32 1.495-4.298.997-.979 2.456-1.468 4.378-1.468h.908l14.308-39.83h-4.271c-2.42 0-4.156-.462-5.206-1.387-1.05-.926-1.575-2.42-1.575-4.485 0-2.1.525-3.613 1.575-4.538 1.05-.926 2.785-1.388 5.206-1.388h20.021c3.168 0 5.392 1.708 6.674 5.125v.16l16.924 46.343zm-27.976-39.83L24.72 67.225h15.483l-7.742-22.53zM89.506 68.56v16.284h8.008c5.66 0 9.646-.623 11.96-1.869 2.313-1.245 3.47-3.328 3.47-6.246 0-2.955-1.103-5.055-3.31-6.3-2.207-1.246-6.069-1.869-11.586-1.869h-8.542zm27.229-5.926c3.88 1.423 6.727 3.372 8.542 5.846 1.815 2.474 2.723 5.633 2.723 9.477 0 3.239-.783 6.193-2.35 8.862-1.565 2.67-3.808 4.859-6.726 6.567-1.709.997-3.622 1.718-5.74 2.163-2.118.445-5.116.667-8.996.667h-27.87c-2.349 0-4.03-.463-5.045-1.388-1.014-.926-1.521-2.438-1.521-4.538 0-1.887.48-3.32 1.441-4.298.961-.979 2.367-1.468 4.218-1.468h.907v-39.83h-.907c-1.851 0-3.257-.498-4.218-1.494-.961-.997-1.441-2.456-1.441-4.378 0-2.065.516-3.568 1.548-4.512 1.032-.943 2.705-1.414 5.018-1.414h24.56c7.51 0 13.214 1.459 17.111 4.377 3.898 2.92 5.847 7.19 5.847 12.814 0 2.776-.597 5.223-1.789 7.341-1.192 2.118-2.963 3.853-5.312 5.206zm-27.23-18.26v13.455h7.208c4.378 0 7.466-.516 9.264-1.549 1.797-1.032 2.696-2.776 2.696-5.232 0-2.313-.81-4.004-2.43-5.072-1.619-1.068-4.244-1.602-7.874-1.602h-8.863z\"/></svg>"},"$:/core/images/network-activity":{"title":"$:/core/images/network-activity","tags":"$:/tags/Image","text":"<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-network-activity tc-image-button\" viewBox=\"0 0 128 128\"><g class={{{ [{$:/state/http-requests}match[0]then[]else[tc-network-activity-background]] }}}>\n<$list filter=\"[{$:/state/http-requests}match[0]]\" variable=\"ignore\">\n<path d=\"M64.043 45.153a4.002 4.002 0 0 1 4.367 2.21l.084.188 30.403 73.4a4 4 0 0 1-7.307 3.25l-.084-.188-3.103-7.49-8.898 8.899a3.985 3.985 0 0 1-2.624 1.166l-.205.005a3.987 3.987 0 0 1-2.828-1.171l-9.849-9.848-9.847 9.848a3.985 3.985 0 0 1-2.624 1.166l-.204.005a3.987 3.987 0 0 1-2.829-1.171l-8.899-8.9-3.102 7.491a4 4 0 1 1-7.391-3.062l30.403-73.4a4.001 4.001 0 0 1 4.495-2.39l.042-.008Zm13.636 56.74-8.023 8.024 7.02 7.019 8.023-8.022-7.02-7.02Zm-27.353.008-7.019 7.019 8.016 8.016 7.019-7.02-8.016-8.015Zm13.68-13.68-8.023 8.023 8.016 8.016 8.023-8.023-8.016-8.016Zm-8.971-8.971-4.687 11.315 8.001-8.001-3.314-3.314Zm17.933.009-3.305 3.305 7.979 7.979-4.674-11.284ZM64 57.607l-5.666 13.68c.096.072.188.15.278.232l.133.126 5.261 5.262 5.262-5.262c.128-.127.261-.244.4-.35L64 57.607Zm0-34.69a8 8 0 1 1 0 16 8 8 0 0 1 0-16Z\"/>\n</$list>\n<$list filter=\"[{$:/state/http-requests}!match[0]]\" variable=\"ignore\">\n<path d=\"M109.395.952a4.002 4.002 0 0 1 3.787 2.708C117.529 11.62 120 20.753 120 30.462c0 15.186-6.044 28.96-15.858 39.047a4 4 0 1 1-6.47-4.626l-.12-.094C106.466 56.074 112 43.914 112 30.462c0-8.492-2.205-16.469-6.074-23.39l.054-.036a4 4 0 0 1 3.415-6.084Zm-90.762 0a4 4 0 0 1 3.072 6.562l.093.06A47.786 47.786 0 0 0 16 30.463c0 13.315 5.42 25.363 14.176 34.058l-.01.007a4 4 0 1 1-6.312 4.863l-.063.05C14.017 59.359 8 45.613 8 30.462c0-9.77 2.502-18.956 6.9-26.952A4.002 4.002 0 0 1 18.634.952Z\"/><path d=\"M64.043 44.698a4.002 4.002 0 0 1 4.367 2.21l.084.188 30.403 73.4a4 4 0 0 1-7.307 3.25l-.084-.188-3.103-7.49-8.898 8.9a3.985 3.985 0 0 1-2.624 1.166l-.205.005a3.987 3.987 0 0 1-2.828-1.172l-9.849-9.848-9.847 9.848a3.985 3.985 0 0 1-2.624 1.167l-.204.005a3.987 3.987 0 0 1-2.829-1.172l-8.899-8.899-3.102 7.49a4 4 0 0 1-7.391-3.061l30.403-73.4a4.001 4.001 0 0 1 4.495-2.39l.042-.009ZM77.68 101.44l-8.023 8.023 7.02 7.019 8.023-8.022-7.02-7.02Zm-27.353.007-7.019 7.019 8.016 8.016 7.019-7.019-8.016-8.016Zm13.68-13.68-8.023 8.023 8.016 8.016 8.023-8.023-8.016-8.016Zm-8.971-8.971L50.348 90.11l8.001-8.001-3.314-3.314Zm17.933.009-3.305 3.305 7.979 7.979-4.674-11.284ZM64 57.152l-5.666 13.68c.096.073.188.15.278.232l.133.127 5.261 5.261 5.262-5.261c.128-.128.261-.244.4-.351L64 57.152ZM38.503 1.058a4 4 0 0 1 2.7 6.952l.17-.175C35.582 13.625 32 21.625 32 30.462c0 8.838 3.582 16.838 9.374 22.629a4 4 0 0 1-5.659 5.658l-.01.01C28.473 51.52 24 41.526 24 30.485 24 19.567 28.374 9.67 35.466 2.453a3.995 3.995 0 0 1 3.037-1.395ZM89.369.952c1.14 0 2.17.478 2.899 1.244l.005-.006C99.518 9.43 104 19.434 104 30.485c0 10.826-4.3 20.648-11.287 27.85a4 4 0 1 1-6.054-5.213l-.032-.032C92.418 47.299 96 39.299 96 30.462c0-8.73-3.496-16.643-9.164-22.416A4 4 0 0 1 89.368.952Zm-39.282 11.14a4 4 0 0 1 2.59 7.048l.01.009A15.95 15.95 0 0 0 48 30.462a15.95 15.95 0 0 0 4.687 11.315l-.01.01a4 4 0 1 1-5.82 5.47l.173.177A23.925 23.925 0 0 1 40 30.462a23.925 23.925 0 0 1 7.03-16.97l.01.01a3.991 3.991 0 0 1 3.047-1.41Zm27.895.07a3.99 3.99 0 0 1 2.984 1.336l.006-.005A23.925 23.925 0 0 1 88 30.463a23.92 23.92 0 0 1-6.707 16.642l-.3.305a4 4 0 1 1-5.679-5.632v-.002A15.95 15.95 0 0 0 80 30.462a15.95 15.95 0 0 0-4.685-11.312 4.012 4.012 0 0 1-1.333-2.987 4 4 0 0 1 4-4ZM64 22.463a8 8 0 1 1 0 16 8 8 0 0 1 0-16Z\"/>\n</$list>\n</g></svg>"},"$:/core/images/new-button":{"title":"$:/core/images/new-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-new-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 72H8.007C3.591 72 0 68.418 0 64c0-4.41 3.585-8 8.007-8H56V8.007C56 3.591 59.582 0 64 0c4.41 0 8 3.585 8 8.007V56h47.993c4.416 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H72v47.993c0 4.416-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V72z\"/></svg>"},"$:/core/images/new-here-button":{"title":"$:/core/images/new-here-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-new-here-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.838 20.935l-3.572.938c-3.688.968-8.23 4.43-10.136 7.731L3.37 96.738c-1.905 3.3-.771 7.524 2.534 9.432l33.717 19.466c3.297 1.904 7.53.78 9.435-2.521l38.76-67.134c1.905-3.3 2.632-8.963 1.623-12.646L83.285 20.88c-1.009-3.68-4.821-5.884-8.513-4.915l-7.603 1.995.043.287c.524 3.394 2.053 7.498 4.18 11.55.418.163.829.36 1.23.59a8.864 8.864 0 014.438 8.169c.104.132.21.264.316.395l-.386.318a8.663 8.663 0 01-1.082 3.137c-2.42 4.192-7.816 5.608-12.051 3.163-4.12-2.379-5.624-7.534-3.476-11.671-2.177-4.394-3.788-8.874-4.543-12.964z\"/><path d=\"M69.554 44.76c-5.944-7.476-10.74-17.196-11.955-25.059-1.68-10.875 3.503-18.216 15.082-18.04 10.407.158 19.975 5.851 24.728 13.785 5.208 8.695 2.95 17.868-6.855 20.496l-2.037-7.601c4.232-1.134 4.999-4.248 2.24-8.853-3.37-5.626-10.465-9.848-18.146-9.965-6.392-.097-8.31 2.62-7.323 9.01.999 6.465 5.318 15.138 10.582 21.65l-.072.06c.559 1.553-4.17 6.44-5.938 4.888l-.005.004-.028-.034a1.323 1.323 0 01-.124-.135 2.618 2.618 0 01-.149-.205z\"/><rect width=\"16\" height=\"48\" x=\"96\" y=\"80\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"80\" y=\"96\" rx=\"8\"/></g></svg>"},"$:/core/images/new-image-button":{"title":"$:/core/images/new-image-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-new-image-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.362 73.627l15.826-27.41a2.626 2.626 0 00-.962-3.59l-50.01-28.872a2.626 2.626 0 00-3.588.961L30.058 36.49l10.04-5.261c3.042-1.595 6.771.114 7.55 3.46l3.607 17.702 9.88.85a5.25 5.25 0 014.571 3.77c.034.115.1.344.199.671.165.553.353 1.172.562 1.843.595 1.914 1.23 3.85 1.872 5.678.207.588.412 1.156.614 1.701.625 1.685 1.209 3.114 1.725 4.207.255.54.485.977.726 1.427.214.212.547.425 1.011.622 1.141.482 2.784.74 4.657.758.864.008 1.71-.034 2.492-.11.448-.043.753-.085.871-.104.315-.053.625-.077.927-.076zM37.47 2.649A5.257 5.257 0 0144.649.725l63.645 36.746a5.257 5.257 0 011.923 7.178L73.47 108.294a5.257 5.257 0 01-7.177 1.923L2.649 73.47a5.257 5.257 0 01-1.924-7.177L37.471 2.649zm42.837 50.49a5.25 5.25 0 105.25-9.092 5.25 5.25 0 00-5.25 9.093zM96 112h-7.993c-4.419 0-8.007-3.582-8.007-8 0-4.41 3.585-8 8.007-8H96v-7.993C96 83.588 99.582 80 104 80c4.41 0 8 3.585 8 8.007V96h7.993c4.419 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H112v7.993c0 4.419-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V112zM33.347 51.791c7.428 7.948 9.01 10.69 7.449 13.394-1.56 2.703-13.838-2.328-16.094 1.58-2.256 3.908-.907 3.258-2.437 5.908l19.73 11.39s-5.605-8.255-4.235-10.628c2.515-4.356 8.77-1.256 10.365-4.019 2.414-4.181-5.103-9.639-14.778-17.625z\"/></svg>"},"$:/core/images/new-journal-button":{"title":"$:/core/images/new-journal-button","tags":"$:/tags/Image","text":"<$parameters size=\"22pt\" day=<<now \"DD\">>><svg width=<<size>> height=<<size>> class=\"tc-image-new-journal-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.545 112.818v11.818c0 1.306 1.086 2.364 2.425 2.364h6.06c1.34 0 2.425-1.058 2.425-2.364v-11.818h12.12c1.34 0 2.425-1.058 2.425-2.363v-5.91c0-1.305-1.085-2.363-2.424-2.363h-12.121V90.364c0-1.306-1.086-2.364-2.425-2.364h-6.06c-1.34 0-2.425 1.058-2.425 2.364v11.818h-12.12c-1.34 0-2.425 1.058-2.425 2.363v5.91c0 1.305 1.085 2.363 2.424 2.363h12.121zM60.016 4.965c-4.781-2.76-10.897-1.118-13.656 3.66L5.553 79.305A9.993 9.993 0 009.21 92.963l51.04 29.468c4.78 2.76 10.897 1.118 13.655-3.66l40.808-70.681a9.993 9.993 0 00-3.658-13.656L60.016 4.965zm-3.567 27.963a6 6 0 106-10.393 6 6 0 00-6 10.393zm31.697 17.928a6 6 0 106-10.392 6 6 0 00-6 10.392z\"/><text class=\"tc-fill-background\" font-family=\"Helvetica\" font-size=\"47.172\" font-weight=\"bold\" transform=\"rotate(30 25.742 95.82)\"><tspan x=\"42\" y=\"77.485\" text-anchor=\"middle\"><$text text=<<day>>/></tspan></text></g></svg></$parameters>"},"$:/core/images/opacity":{"title":"$:/core/images/opacity","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-opacity tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.362 65a51.595 51.595 0 01-1.942 6H82.584a35.867 35.867 0 002.997-6h16.78zm.472-2c.423-1.961.734-3.963.929-6H87.656a35.78 35.78 0 01-1.368 6h16.546zm-3.249 10a51.847 51.847 0 01-3.135 6H75.812a36.205 36.205 0 005.432-6h18.341zm-4.416 8c-1.424 2.116-3 4.12-4.71 6H60.46a35.843 35.843 0 0012.874-6h21.834zm-7.513-34h16.107C101.247 20.627 79.033 0 52 0 23.281 0 0 23.281 0 52c0 25.228 17.965 46.26 41.8 51h20.4a51.66 51.66 0 0015.875-6H39v-2h42.25a52.257 52.257 0 007.288-6H39v-2h4.539C27.739 83.194 16 68.968 16 52c0-19.882 16.118-36 36-36 18.186 0 33.222 13.484 35.656 31zm.22 2h16.039a52.823 52.823 0 010 6H87.877a36.483 36.483 0 000-6z\"/><path d=\"M76 128c28.719 0 52-23.281 52-52s-23.281-52-52-52-52 23.281-52 52 23.281 52 52 52zm0-16c19.882 0 36-16.118 36-36S95.882 40 76 40 40 56.118 40 76s16.118 36 36 36z\"/><path d=\"M37 58h53v4H37v-4zm3-8h53v4H40v-4zm0-8h53v4H40v-4zm-8 24h53v4H32v-4zm-2 8h53v4H30v-4zm-3 8h53v4H27v-4z\"/></g></svg>"},"$:/core/images/open-window":{"title":"$:/core/images/open-window","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-open-window tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M16 112h88.994c3.87 0 7.006 3.59 7.006 8 0 4.418-3.142 8-7.006 8H7.006C3.136 128 0 124.41 0 120a9.321 9.321 0 010-.01V24.01C0 19.586 3.59 16 8 16c4.418 0 8 3.584 8 8.01V112z\"/><path d=\"M96 43.196V56a8 8 0 1016 0V24c0-4.41-3.585-8-8.007-8H72.007C67.588 16 64 19.582 64 24c0 4.41 3.585 8 8.007 8H84.57l-36.3 36.299a8 8 0 00-.001 11.316c3.117 3.117 8.19 3.123 11.316-.003L96 43.196zM32 7.999C32 3.581 35.588 0 40 0h80c4.419 0 8 3.588 8 8v80c0 4.419-3.588 8-8 8H40c-4.419 0-8-3.588-8-8V8z\"/></g></svg>"},"$:/core/images/options-button":{"title":"$:/core/images/options-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-options-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M110.488 76a47.712 47.712 0 01-5.134 12.384l6.724 6.724c3.123 3.123 3.132 8.192.011 11.313l-5.668 5.668c-3.12 3.12-8.186 3.117-11.313-.01l-6.724-6.725c-3.82 2.258-7.98 4-12.384 5.134v9.505c0 4.417-3.578 8.007-7.992 8.007h-8.016C55.58 128 52 124.415 52 119.993v-9.505a47.712 47.712 0 01-12.384-5.134l-6.724 6.725c-3.123 3.122-8.192 3.131-11.313.01l-5.668-5.668c-3.12-3.12-3.116-8.186.01-11.313l6.725-6.724c-2.257-3.82-4-7.98-5.134-12.384H8.007C3.591 76 0 72.422 0 68.01v-8.017C0 55.58 3.585 52 8.007 52h9.505a47.712 47.712 0 015.134-12.383l-6.724-6.725c-3.123-3.122-3.132-8.191-.011-11.312l5.668-5.669c3.12-3.12 8.186-3.116 11.313.01l6.724 6.725c3.82-2.257 7.98-4 12.384-5.134V8.007C52 3.591 55.578 0 59.992 0h8.016C72.42 0 76 3.585 76 8.007v9.505a47.712 47.712 0 0112.384 5.134l6.724-6.724c3.123-3.123 8.192-3.132 11.313-.01l5.668 5.668c3.12 3.12 3.116 8.186-.01 11.312l-6.725 6.725c2.257 3.82 4 7.979 5.134 12.383h9.505c4.416 0 8.007 3.578 8.007 7.992v8.017c0 4.411-3.585 7.991-8.007 7.991h-9.505zM64 96c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/></svg>"},"$:/core/images/paint":{"title":"$:/core/images/paint","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-paint tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M83.527 76.19C90.43 69.287 91.892 59 87.91 50.665l37.903-37.902c2.919-2.92 2.913-7.659 0-10.572a7.474 7.474 0 00-10.572 0L77.338 40.093c-8.335-3.982-18.622-2.521-25.526 4.383l31.715 31.715zm-2.643 2.644L49.169 47.119S8.506 81.243 0 80.282c0 0 3.782 5.592 6.827 8.039 14.024-5.69 37.326-24.6 37.326-24.6l.661.66S19.45 90.222 9.18 92.047c1.222 1.44 4.354 4.053 6.247 5.776 5.417-1.488 34.733-28.57 34.733-28.57l.661.66-32.407 31.022 5.285 5.286L56.106 75.2l.662.66s-27.864 30.536-28.684 32.432c0 0 6.032 6.853 7.569 7.824.702-2.836 27.884-33.485 27.884-33.485l.661.66s-20.597 23.755-24.964 36.732c3.21 3.549 7.5 5.137 10.926 6.298-2.19-11.817 30.724-47.487 30.724-47.487z\"/></svg>"},"$:/core/images/palette":{"title":"$:/core/images/palette","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-palette tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.247 39.182a93.52 93.52 0 00-16.228-1.4C28.662 37.781 0 57.131 0 81.002c0 9.642 4.676 18.546 12.58 25.735C23.504 91.19 26.34 72.395 36.89 63.562c15.183-12.713 26.538-7.828 26.538-7.828l16.82-16.552zm26.535 9.655c13.049 7.913 21.257 19.392 21.257 32.166 0 9.35.519 17.411-11.874 25.08-10.797 6.681-3.824-6.536-11.844-10.898s-19.946 1.308-18.213 7.906c3.2 12.181 19.422 11.455 6.314 16.658-13.107 5.202-18.202 4.476-28.403 4.476-7.821 0-15.315-.947-22.243-2.68 9.844-4.197 27.88-12.539 33.354-19.456C82.788 92.409 87.37 80 83.324 72.484c-.194-.359 11.215-11.668 23.458-23.647zM1.134 123.867l-.66.002c33.479-14.94 22.161-64.226 58.818-64.226.317 1.418.644 2.944 1.062 4.494-25.907-4.166-23.567 48.031-59.22 59.73zm.713-.007c38.872-.506 78.152-22.347 78.152-44.813-9.27 0-14.073-3.48-16.816-7.942-16.597-7.003-30.365 45.715-61.336 52.755zm65.351-64.008c-4.45 4.115 4.886 16.433 11.318 11.318l45.27-45.27c11.317-11.318 0-22.635-11.318-11.318-11.317 11.318-33.518 34.405-45.27 45.27z\"/></svg>"},"$:/core/images/permalink-button":{"title":"$:/core/images/permalink-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-permalink-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.483 48l-7.387 32h-25.58l7.388-32h25.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L100.598 32h3.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-7.096l-7.387 32H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H85.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L69.402 96h-25.58L38.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L27.402 96h-3.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h7.096l7.387-32H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h18.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L58.598 32h25.58z\"/></svg>"},"$:/core/images/permaview-button":{"title":"$:/core/images/permaview-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-permaview-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.483 48l-1.846 8h-5.58l1.847-8h5.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L101.598 32h2.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-6.096l-1.847 8h7.944c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H92.364l-1.846 8H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H86.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L70.402 96h-5.58L59.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L48.402 96h-5.58L37.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L26.402 96h-2.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h6.096l1.847-8h-7.944C19.59 72 16 68.418 16 64c0-4.41 3.581-8 8-8h11.637l1.846-8H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h17.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L57.598 32h5.58L68.8 7.642c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L79.598 32h5.58zM53.904 48l-1.847 8h5.58l1.846-8h-5.579zm22.039 24l-1.847 8h-5.58l1.847-8h5.58zm-27.58 0l-1.846 8h5.579l1.847-8h-5.58z\"/></svg>"},"$:/core/images/picture":{"title":"$:/core/images/picture","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-picture tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112 68.233v-48.23A4.001 4.001 0 00107.997 16H20.003A4.001 4.001 0 0016 20.003v38.31l9.241-14.593c2.8-4.422 9.023-5.008 12.6-1.186l18.247 20.613 13.687-6.407a8 8 0 018.903 1.492 264.97 264.97 0 002.92 2.739 249.44 249.44 0 006.798 6.066 166.5 166.5 0 002.106 1.778c2.108 1.747 3.967 3.188 5.482 4.237.748.518 1.383.92 2.044 1.33.444.117 1.046.144 1.809.05 1.873-.233 4.238-1.144 6.723-2.547a36.016 36.016 0 003.205-2.044c.558-.4.93-.686 1.07-.802.376-.31.765-.577 1.165-.806zM0 8.007A8.01 8.01 0 018.007 0h111.986A8.01 8.01 0 01128 8.007v111.986a8.01 8.01 0 01-8.007 8.007H8.007A8.01 8.01 0 010 119.993V8.007zM95 42a8 8 0 100-16 8 8 0 000 16zM32 76c15.859 4.83 20.035 7.244 20.035 12S32 95.471 32 102.347c0 6.876 1.285 4.99 1.285 9.653H68s-13.685-6.625-13.685-10.8c0-7.665 10.615-8.34 10.615-13.2 0-7.357-14.078-8.833-32.93-12z\"/></svg>"},"$:/core/images/plugin-generic-language":{"title":"$:/core/images/plugin-generic-language","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> viewBox=\"0 0 128 128\" class=\"tc-image-plugin-generic-language tc-image-button\"><path fill-rule=\"evenodd\" d=\"M61.207 68.137c-4.324 2.795-6.999 6.656-6.999 10.921 0 7.906 9.19 14.424 21.042 15.336 2.162 3.902 8.598 6.785 16.318 7.01-5.126-1.125-9.117-3.742-10.62-7.01C92.805 93.487 102 86.967 102 79.059c0-8.53-10.699-15.445-23.896-15.445-6.599 0-12.572 1.729-16.897 4.524zm12.794-14.158c-4.324 2.795-10.298 4.524-16.897 4.524-2.619 0-5.14-.272-7.497-.775-3.312 2.25-8.383 3.69-14.067 3.69l-.255-.002c4.119-.892 7.511-2.747 9.478-5.13-6.925-2.704-11.555-7.617-11.555-13.228 0-8.53 10.699-15.445 23.896-15.445C70.301 27.613 81 34.528 81 43.058c0 4.265-2.675 8.126-6.999 10.921zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>"},"$:/core/images/plugin-generic-plugin":{"title":"$:/core/images/plugin-generic-plugin","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> viewBox=\"0 0 128 128\" class=\"tc-image-plugin-generic-plugin tc-image-button\"><path fill-rule=\"evenodd\" d=\"M40.397 76.446V95.34h14.12l-.001-.005a6.912 6.912 0 005.364-11.593l.046-.023a6.912 6.912 0 119.979.526l.086.055a6.914 6.914 0 004.408 10.948l-.023.092h21.32V75.568l-.15.038a6.912 6.912 0 00-11.593-5.364l-.022-.046a6.912 6.912 0 11.526-9.979l.055-.086a6.914 6.914 0 0010.948-4.408c.079.018.158.038.236.059v-15.74h-21.32l.023-.094a6.914 6.914 0 01-4.408-10.947 10.23 10.23 0 00-.086-.055 6.912 6.912 0 10-9.979-.526l-.046.023a6.912 6.912 0 01-5.364 11.593l.001.005h-14.12v12.847A6.912 6.912 0 0129.5 59.843l-.054.086a6.912 6.912 0 10-.526 9.979l.023.046a6.912 6.912 0 0111.455 6.492zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>"},"$:/core/images/plugin-generic-theme":{"title":"$:/core/images/plugin-generic-theme","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> viewBox=\"0 0 128 128\" class=\"tc-image-plugin-generic-theme tc-image-button\"><path fill-rule=\"evenodd\" d=\"M29.408 91.472L51.469 69.41l-.004-.005a2.22 2.22 0 01.004-3.146c.87-.87 2.281-.872 3.147-.005l9.465 9.464a2.22 2.22 0 01-.005 3.147c-.87.87-2.28.871-3.147.005l-.005-.005-22.061 22.062a6.686 6.686 0 11-9.455-9.455zM60.802 66.38c-2.436-2.704-4.465-5.091-5.817-6.869-6.855-9.014-10.313-4.268-14.226 0-3.913 4.268 1.03 7.726-2.683 10.741-3.713 3.015-3.484 4.06-9.752-1.455-6.267-5.516-6.7-7.034-3.823-10.181 2.877-3.147 5.281 1.808 11.159-3.785 5.877-5.593.94-10.55.94-10.55s12.237-25.014 28.588-23.167c16.351 1.848-6.186-2.392-11.792 17.226-2.4 8.4.447 6.42 4.998 9.968 1.394 1.086 6.03 4.401 11.794 8.685l20.677-20.676 1.615-4.766 7.84-4.689 3.151 3.152-4.688 7.84-4.766 1.615-20.224 20.223c12.663 9.547 28.312 22.146 28.312 26.709 0 7.217-3.071 11.526-9.535 9.164-4.693-1.715-18.768-15.192-28.753-25.897l-2.893 2.893-3.151-3.152 3.029-3.029zM63.953 0l54.56 32v64l-54.56 32-54.56-32V32l54.56-32z\"/></svg>"},"$:/core/images/plus-button":{"title":"$:/core/images/plus-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-plus-button tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64-.333c35.346 0 64 28.654 64 64 0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64 0-35.346 28.654-64 64-64zM64 16c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\"/><rect width=\"80\" height=\"16\" x=\"24\" y=\"56\" rx=\"8\"/><rect width=\"16\" height=\"80\" x=\"56\" y=\"24\" rx=\"8\"/></svg>"},"$:/core/images/preview-closed":{"title":"$:/core/images/preview-closed","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-preview-closed tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M.088 64a7.144 7.144 0 001.378 5.458C16.246 88.818 39.17 100.414 64 100.414c24.83 0 47.753-11.596 62.534-30.956A7.144 7.144 0 00127.912 64C110.582 78.416 88.304 87.086 64 87.086 39.696 87.086 17.418 78.416.088 64z\"/><rect width=\"4\" height=\"16\" x=\"62\" y=\"96\" rx=\"4\"/><rect width=\"4\" height=\"16\" x=\"78\" y=\"93\" rx=\"4\" transform=\"rotate(-5 80 101)\"/><rect width=\"4\" height=\"16\" x=\"46\" y=\"93\" rx=\"4\" transform=\"rotate(5 48 101)\"/><rect width=\"4\" height=\"16\" x=\"30\" y=\"88\" rx=\"4\" transform=\"rotate(10 32 96)\"/><rect width=\"4\" height=\"16\" x=\"94\" y=\"88\" rx=\"4\" transform=\"rotate(-10 96 96)\"/><rect width=\"4\" height=\"16\" x=\"110\" y=\"80\" rx=\"4\" transform=\"rotate(-20 112 88)\"/><rect width=\"4\" height=\"16\" x=\"14\" y=\"80\" rx=\"4\" transform=\"rotate(20 16 88)\"/></g></svg>"},"$:/core/images/preview-open":{"title":"$:/core/images/preview-open","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-preview-open tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.11 99.588c-24.83 0-47.754-11.596-62.534-30.957a7.148 7.148 0 010-8.675C16.356 40.596 39.28 29 64.11 29c24.83 0 47.753 11.596 62.534 30.956a7.148 7.148 0 010 8.675c-14.78 19.36-37.703 30.957-62.534 30.957zm46.104-32.007c1.44-1.524 1.44-3.638 0-5.162C99.326 50.9 82.439 44 64.147 44S28.968 50.9 18.08 62.42c-1.44 1.523-1.44 3.637 0 5.16C28.968 79.1 45.855 86 64.147 86s35.179-6.9 46.067-18.42z\"/><path d=\"M63.5 88C76.479 88 87 77.479 87 64.5S76.479 41 63.5 41 40 51.521 40 64.5 50.521 88 63.5 88z\"/></g></svg>"},"$:/core/images/print-button":{"title":"$:/core/images/print-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-print-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M112 71V30.5h-.032c-.035-2-.816-3.99-2.343-5.516L86.998 2.357A7.978 7.978 0 0081 .02V0H24a8 8 0 00-8 8v63h8V8h57v14.5c0 4.422 3.582 8 8 8h15V71h8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/><path d=\"M0 80.005C0 71.165 7.156 64 16 64h96c8.836 0 16 7.155 16 16.005v31.99c0 8.84-7.156 16.005-16 16.005H16c-8.836 0-16-7.155-16-16.005v-31.99zM104 96a8 8 0 100-16 8 8 0 000 16z\"/></g></svg>"},"$:/core/images/quote":{"title":"$:/core/images/quote","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-quote tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M51.219 117.713V62.199H27.427c0-8.891 1.683-16.401 5.047-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.36 3.184-20.728 6.669-6.368 3.484-11.835 7.87-16.401 13.157C9.524 27.113 5.98 33.241 3.456 40.21.933 47.18-.21 54.63.03 62.56v55.153H51.22zm76.781 0V62.199h-23.791c0-8.891 1.682-16.401 5.046-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.359 3.184-20.727 6.669-6.369 3.484-11.836 7.87-16.402 13.157-4.566 5.287-8.11 11.415-10.634 18.384-2.523 6.97-3.665 14.42-3.424 22.35v55.153H128z\"/></svg>"},"$:/core/images/refresh-button":{"title":"$:/core/images/refresh-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-refresh-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M106.369 39.433c10.16 20.879 6.57 46.764-10.771 64.106-21.87 21.87-57.327 21.87-79.196 0-21.87-21.87-21.87-57.326 0-79.196a8 8 0 1111.314 11.314c-15.621 15.62-15.621 40.947 0 56.568 15.62 15.621 40.947 15.621 56.568 0C97.72 78.79 99.6 58.175 89.924 42.73l-6.44 12.264a8 8 0 11-14.166-7.437L84.435 18.76a8 8 0 0110.838-3.345l28.873 15.345a8 8 0 11-7.51 14.129l-10.267-5.457zm-8.222-12.368c-.167-.19-.336-.38-.506-.57l.96-.296-.454.866z\"/></svg>"},"$:/core/images/right-arrow":{"title":"$:/core/images/right-arrow","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-right-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M99.069 64.173c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></svg>"},"$:/core/images/rotate-left":{"title":"$:/core/images/rotate-left","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-rotate-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"32\" height=\"80\" rx=\"8\"/><rect width=\"80\" height=\"32\" x=\"48\" y=\"96\" rx=\"8\"/><path d=\"M61.32 36.65c19.743 2.45 35.023 19.287 35.023 39.693a4 4 0 01-8 0c0-15.663-11.254-28.698-26.117-31.46l3.916 3.916a4 4 0 11-5.657 5.657L49.172 43.142a4 4 0 010-5.657l11.313-11.313a4 4 0 115.657 5.656l-4.821 4.822z\"/></g></svg>"},"$:/core/images/save-button-dynamic":{"title":"$:/core/images/save-button-dynamic","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-save-button-dynamic tc-image-button\" viewBox=\"0 0 128 128\">\n<g class=\"tc-image-save-button-dynamic-clean\">\n<path fill-rule=\"evenodd\" d=\"M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z\"/>\n</g>\n<g class=\"tc-image-save-button-dynamic-dirty\">\n<path d=\"M64.856912,0 C100.203136,0 128.856912,28.653776 128.856912,64 C128.856912,99.346224 100.203136,128 64.856912,128 C29.510688,128 0.856911958,99.346224 0.856911958,64 C0.856911958,28.653776 29.510688,0 64.856912,0 Z M64.856912,16 C38.347244,16 16.856912,37.490332 16.856912,64 C16.856912,90.509668 38.347244,112 64.856912,112 C91.3665799,112 112.856912,90.509668 112.856912,64 C112.856912,37.490332 91.3665799,16 64.856912,16 Z\"></path>\n<circle cx=\"65\" cy=\"64\" r=\"32\"></circle>\n</g>\n</svg>"},"$:/core/images/save-button":{"title":"$:/core/images/save-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-save-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z\"/></svg>"},"$:/core/images/size":{"title":"$:/core/images/size","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-size tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M92.343 26l-9.171 9.172a4 4 0 105.656 5.656l16-16a4 4 0 000-5.656l-16-16a4 4 0 10-5.656 5.656L92.343 18H22a4 4 0 00-4 4v70.343l-9.172-9.171a4 4 0 10-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656L26 92.343V22l-4 4h70.343zM112 52v64l4-4H52a4 4 0 100 8h64a4 4 0 004-4V52a4 4 0 10-8 0z\"/></svg>"},"$:/core/images/spiral":{"title":"$:/core/images/spiral","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-spiral tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.534 68.348c3.39 0 6.097-2.62 6.476-5.968l-4.755-.538 4.75.583c.377-3.07-1.194-6.054-3.89-7.78-2.757-1.773-6.34-2.01-9.566-.7-3.46 1.403-6.14 4.392-7.35 8.148l-.01.026c-1.3 4.08-.72 8.64 1.58 12.52 2.5 4.2 6.77 7.2 11.76 8.27 5.37 1.15 11.11-.05 15.83-3.31 5.04-3.51 8.46-9.02 9.45-15.3 1.05-6.7-.72-13.63-4.92-19.19l.02.02c-4.42-5.93-11.2-9.82-18.78-10.78-7.96-1.01-16.13 1.31-22.59 6.43-6.81 5.39-11.18 13.41-12.11 22.26-.98 9.27 1.87 18.65 7.93 26.02 6.32 7.69 15.6 12.56 25.74 13.48 10.54.96 21.15-2.42 29.45-9.4l.01-.01c8.58-7.25 13.94-17.78 14.86-29.21.94-11.84-2.96-23.69-10.86-32.9-8.19-9.5-19.95-15.36-32.69-16.27-13.16-.94-26.24 3.49-36.34 12.34l.01-.01c-10.41 9.08-16.78 22.1-17.68 36.15-.93 14.44 4.03 28.77 13.79 39.78 10.03 11.32 24.28 18.2 39.6 19.09 15.73.92 31.31-4.56 43.24-15.234 12.23-10.954 19.61-26.44 20.5-43.074a4.785 4.785 0 00-4.52-5.03 4.778 4.778 0 00-5.03 4.52c-.75 14.1-7 27.2-17.33 36.45-10.03 8.98-23.11 13.58-36.3 12.81-12.79-.75-24.67-6.48-33-15.89-8.07-9.11-12.17-20.94-11.41-32.827.74-11.52 5.942-22.15 14.43-29.54l.01-.01c8.18-7.17 18.74-10.75 29.35-9.998 10.21.726 19.6 5.41 26.11 12.96 6.24 7.273 9.32 16.61 8.573 25.894-.718 8.9-4.88 17.064-11.504 22.66l.01-.007c-6.36 5.342-14.44 7.92-22.425 7.19-7.604-.68-14.52-4.314-19.21-10.027-4.44-5.4-6.517-12.23-5.806-18.94.67-6.3 3.76-11.977 8.54-15.766 4.46-3.54 10.05-5.128 15.44-4.44 5.03.63 9.46 3.18 12.32 7.01l.02.024c2.65 3.5 3.75 7.814 3.1 11.92-.59 3.71-2.58 6.925-5.45 8.924-2.56 1.767-5.61 2.403-8.38 1.81-2.42-.516-4.42-1.92-5.53-3.79-.93-1.56-1.15-3.3-.69-4.75l-4.56-1.446L59.325 65c.36-1.12 1.068-1.905 1.84-2.22.25-.103.48-.14.668-.13.06.006.11.015.14.025.01 0 .01 0-.01-.01a1.047 1.047 0 01-.264-.332c-.15-.29-.23-.678-.18-1.11l-.005.04c.15-1.332 1.38-2.523 3.035-2.523-2.65 0-4.79 2.144-4.79 4.787s2.14 4.785 4.78 4.785z\"/></svg>"},"$:/core/images/stamp":{"title":"$:/core/images/stamp","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-stamp tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M49.733 64H16.01C11.584 64 8 67.583 8 72.003V97h112V72.003A8 8 0 00111.99 64H78.267A22.813 22.813 0 0175.5 53.077c0-6.475 2.687-12.324 7.009-16.497A22.818 22.818 0 0087 22.952C87 10.276 76.703 0 64 0S41 10.276 41 22.952c0 5.103 1.669 9.817 4.491 13.628 4.322 4.173 7.009 10.022 7.009 16.497 0 3.954-1.002 7.675-2.767 10.923zM8 104h112v8H8v-8z\"/></svg>"},"$:/core/images/standard-layout":{"title":"$:/core/images/standard-layout","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-standard-layout tc-image-button\" viewBox=\"0 0 128 128\">\n    <path d=\"M71.93 72A8.07 8.07 0 0 1 80 80.07v7.86A8.071 8.071 0 0 1 71.93 96H8.07A8.067 8.067 0 0 1 0 87.93v-7.86A8.072 8.072 0 0 1 8.07 72h63.86Zm0 32a8.07 8.07 0 0 1 8.07 8.07v7.86a8.071 8.071 0 0 1-8.07 8.07H8.07A8.067 8.067 0 0 1 0 119.93v-7.86A8.072 8.072 0 0 1 8.07 104h63.86Zm0-104A8.068 8.068 0 0 1 80 8.07v47.86A8.073 8.073 0 0 1 71.93 64H8.07A8.07 8.07 0 0 1 0 55.93V8.07A8.072 8.072 0 0 1 8.07 0h63.86Zm48 0c2.14 0 4.193.85 5.706 2.364A8.067 8.067 0 0 1 128 8.07v111.86c0 2.14-.85 4.193-2.364 5.706A8.067 8.067 0 0 1 119.93 128H96.07c-2.14 0-4.193-.85-5.706-2.364A8.067 8.067 0 0 1 88 119.93V8.07c0-2.14.85-4.193 2.364-5.706A8.067 8.067 0 0 1 96.07 0h23.86ZM116 24h-16a3.995 3.995 0 0 0-2.828 1.172 3.995 3.995 0 0 0 0 5.656A3.995 3.995 0 0 0 100 32h16a3.995 3.995 0 0 0 2.828-1.172 3.995 3.995 0 0 0 0-5.656A3.995 3.995 0 0 0 116 24Z\"/>\n</svg>"},"$:/core/images/star-filled":{"title":"$:/core/images/star-filled","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-star-filled tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M61.836 96.823l37.327 27.287c2.72 1.99 6.379-.69 5.343-3.912L90.29 75.988l-1.26 3.91 37.285-27.345c2.718-1.993 1.32-6.327-2.041-6.33l-46.113-.036 3.3 2.416L67.176 4.416c-1.04-3.221-5.563-3.221-6.604 0L46.29 48.603l3.3-2.416-46.113.036c-3.362.003-4.759 4.337-2.04 6.33L38.72 79.898l-1.26-3.91-14.216 44.21c-1.036 3.223 2.622 5.901 5.343 3.912l37.326-27.287h-4.078z\"/></svg>"},"$:/core/images/storyview-classic":{"title":"$:/core/images/storyview-classic","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-storyview-classic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm0 48C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0 32C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"},"$:/core/images/storyview-pop":{"title":"$:/core/images/storyview-pop","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-storyview-pop tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm-7.99 40C11.587 56 8 59.578 8 63.992v16.016C8 84.422 11.584 88 16.01 88h95.98c4.424 0 8.01-3.578 8.01-7.992V63.992c0-4.414-3.584-7.992-8.01-7.992H16.01zM24 96C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0-32C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"},"$:/core/images/storyview-zoomin":{"title":"$:/core/images/storyview-zoomin","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-storyview-zoomin tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16A8 8 0 0016 24.009V71.99C16 76.414 19.588 80 24 80h80a8 8 0 008-8.009V24.01c0-4.423-3.588-8.009-8-8.009H24z\"/></svg>"},"$:/core/images/strikethrough":{"title":"$:/core/images/strikethrough","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-strikethrough tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M92.794 38.726h15.422c-.229-6.74-1.514-12.538-3.856-17.393-2.342-4.855-5.54-8.881-9.596-12.08-4.055-3.199-8.767-5.54-14.136-7.025C75.258.743 69.433 0 63.15 0a62.76 62.76 0 00-16.364 2.142C41.474 3.57 36.733 5.74 32.564 8.653c-4.17 2.913-7.511 6.626-10.025 11.138-2.513 4.512-3.77 9.853-3.77 16.022 0 5.597 1.115 10.252 3.342 13.965 2.228 3.712 5.198 6.74 8.91 9.081 3.713 2.342 7.911 4.227 12.595 5.655a194.641 194.641 0 0014.308 3.77c4.855 1.085 9.624 2.142 14.308 3.17 4.683 1.028 8.881 2.37 12.594 4.027 3.713 1.656 6.683 3.798 8.91 6.425 2.228 2.628 3.342 6.055 3.342 10.281 0 4.456-.914 8.111-2.742 10.967a19.953 19.953 0 01-7.197 6.768c-2.97 1.657-6.311 2.828-10.024 3.513a60.771 60.771 0 01-11.052 1.028c-4.57 0-9.025-.571-13.366-1.713-4.34-1.143-8.139-2.913-11.394-5.312-3.256-2.4-5.884-5.455-7.883-9.168-1.999-3.712-2.998-8.139-2.998-13.28H15c0 7.426 1.342 13.852 4.027 19.278 2.684 5.426 6.34 9.881 10.966 13.365 4.627 3.484 9.996 6.083 16.107 7.797 6.112 1.713 12.595 2.57 19.449 2.57 5.597 0 11.223-.657 16.878-1.97 5.655-1.314 10.767-3.428 15.336-6.34 4.57-2.914 8.31-6.683 11.224-11.31 2.913-4.626 4.37-10.195 4.37-16.707 0-6.054-1.115-11.08-3.342-15.079-2.228-3.998-5.198-7.31-8.91-9.938-3.713-2.627-7.911-4.712-12.595-6.254a170.83 170.83 0 00-14.308-4.027 549.669 549.669 0 00-14.308-3.17c-4.683-.971-8.881-2.2-12.594-3.684-3.713-1.485-6.683-3.399-8.91-5.74-2.228-2.342-3.342-5.398-3.342-9.168 0-3.998.771-7.34 2.313-10.024 1.543-2.685 3.599-4.826 6.17-6.426 2.57-1.599 5.51-2.741 8.824-3.427a49.767 49.767 0 0110.11-1.028c8.453 0 15.393 1.97 20.819 5.912 5.426 3.94 8.596 10.31 9.51 19.106z\"/><path d=\"M5 54h118v16H5z\"/></g></svg>"},"$:/core/images/subscript":{"title":"$:/core/images/subscript","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-subscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 128.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"},"$:/core/images/superscript":{"title":"$:/core/images/superscript","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-superscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 63.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"},"$:/core/images/tag-button":{"title":"$:/core/images/tag-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-tag-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M18.164 47.66l.004 4.105c.003 3.823 2.19 9.097 4.885 11.792l61.85 61.85c2.697 2.697 7.068 2.69 9.769-.01L125.767 94.3a6.903 6.903 0 00.01-9.77L63.928 22.683c-2.697-2.697-7.976-4.88-11.796-4.881l-27.076-.007a6.902 6.902 0 00-6.91 6.91l.008 9.96.287.033c3.73.411 8.489-.044 13.365-1.153a9.702 9.702 0 0111.14-3.662l.291-.13.128.285a9.7 9.7 0 013.3 2.17c3.796 3.796 3.801 9.945.012 13.734-3.618 3.618-9.386 3.777-13.204.482-5.365 1.122-10.674 1.596-15.309 1.237z\"/><path d=\"M47.633 39.532l.023.051c-9.689 4.356-21.584 6.799-30.396 5.828C5.273 44.089-1.028 36.43 2.443 24.078 5.562 12.976 14.3 4.361 24.047 1.548c10.68-3.083 19.749 1.968 19.749 13.225h-8.623c0-4.859-3.078-6.573-8.735-4.94-6.91 1.995-13.392 8.383-15.694 16.577-1.915 6.818.417 9.653 7.46 10.43 7.126.785 17.531-1.352 25.917-5.121l.027.06.036-.017c1.76-.758 6.266 6.549 3.524 7.74a2.8 2.8 0 01-.075.03z\"/></g></svg>"},"$:/core/images/theme-button":{"title":"$:/core/images/theme-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-theme-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.854 66.945a122.626 122.626 0 01-3.9-4.819c-11.064-14.548-16.645-6.888-22.96 0-6.315 6.888 1.664 12.47-4.33 17.335-5.993 4.866-5.623 6.552-15.737-2.35-10.115-8.9-10.815-11.351-6.172-16.43 4.644-5.08 8.524 2.918 18.01-6.108 9.485-9.026 1.517-17.026 1.517-17.026S42.03-2.824 68.42.157c26.39 2.982-9.984-3.86-19.031 27.801-3.874 13.556.72 10.362 8.066 16.087 1.707 1.33 6.428 4.732 12.671 9.318-6.129 5.879-11.157 10.669-14.273 13.582zm11.641 12.947c16.013 17.036 37.742 37.726 45.117 40.42 10.432 3.813 15.388-3.141 15.388-14.79 0-7.151-23.83-26.542-43.924-41.769-7.408 7.156-13.376 12.953-16.58 16.139z\"/><path d=\"M11.069 109.828L46.31 74.587a3.56 3.56 0 115.037-5.032l15.098 15.098a3.56 3.56 0 11-5.032 5.037l-35.24 35.241c-4.171 4.17-10.933 4.17-15.104 0-4.17-4.17-4.17-10.933 0-15.103zM124.344 6.622l5.034 5.034-7.49 12.524-7.613 2.58L61.413 79.62l-5.034-5.034 52.861-52.862 2.58-7.614 12.524-7.49z\"/></g></svg>"},"$:/core/images/timestamp-off":{"title":"$:/core/images/timestamp-off","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-timestamp-off tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M58.25 35.88c-18.777 0-33.998 15.224-33.998 33.998 0 18.773 15.22 34.002 33.998 34.002 18.784 0 34.002-15.23 34.002-34.002 0-18.774-15.218-33.998-34.002-33.998zm-3.03 50.123H44.196v-34H55.22v34zm16.976 0H61.17v-34h11.025v34z\"/></g></svg>"},"$:/core/images/timestamp-on":{"title":"$:/core/images/timestamp-on","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-timestamp-on tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M13.41 27.178a5.005 5.005 0 01-7.045-.613 5.008 5.008 0 01.616-7.047l9.95-8.348a5 5 0 016.429 7.661l-9.95 8.348zm89.573 0a5.005 5.005 0 007.045-.613 5.008 5.008 0 00-.616-7.047l-9.95-8.348a5 5 0 00-6.428 7.661l9.95 8.348zM65.097 71.072c0 3.826-3.09 6.928-6.897 6.928-3.804.006-6.9-3.102-6.903-6.928 0 0 4.76-39.072 6.903-39.072s6.897 39.072 6.897 39.072z\"/></g></svg>"},"$:/core/images/tip":{"title":"$:/core/images/tip","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-tip tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128.242c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64 0 35.346 28.654 64 64 64zm11.936-36.789c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349C54.33 94.05 58.824 95.82 64 95.82c5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.456c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zM64.3 24.242c11.618 0 23.699 7.82 23.699 24.2S75.92 71.754 75.92 83.576c0 5.873-5.868 9.26-11.92 9.26s-12.027-3.006-12.027-9.26C51.973 71.147 40 65.47 40 48.442s12.683-24.2 24.301-24.2z\"/></svg>"},"$:/core/images/transcludify":{"title":"$:/core/images/transcludify","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-transcludify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M0 59.482c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.651-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02C1.36 67.377.591 67.288 0 67.288v-7.806zm24.66 0c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.65-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02c-.946-.177-1.715-.266-2.306-.266v-7.806zm43.965-3.538L80.6 52.041l2.306 7.097-12.063 3.903 7.628 10.378-6.12 4.435-7.63-10.467-7.45 10.201-5.943-4.524 7.628-10.023-12.152-4.17 2.306-7.096 12.064 4.17V43.347h7.451v12.596zm34.425 11.344c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806zm24.66 0c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806z\"/></svg>"},"$:/core/images/twitter":{"title":"$:/core/images/twitter","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-twitter tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.626 115.803A73.376 73.376 0 012 104.235c2.022.238 4.08.36 6.166.36 12.111 0 23.258-4.117 32.105-11.023-11.312-.208-20.859-7.653-24.148-17.883a25.98 25.98 0 0011.674-.441C15.971 72.881 7.061 62.474 7.061 49.997c0-.108 0-.216.002-.323a25.824 25.824 0 0011.709 3.22c-6.936-4.617-11.5-12.5-11.5-21.433 0-4.719 1.274-9.142 3.5-12.945 12.75 15.579 31.797 25.83 53.281 26.904-.44-1.884-.67-3.85-.67-5.868 0-14.22 11.575-25.75 25.852-25.75a25.865 25.865 0 0118.869 8.132 51.892 51.892 0 0016.415-6.248c-1.93 6.012-6.029 11.059-11.366 14.246A51.844 51.844 0 00128 25.878a52.428 52.428 0 01-12.9 13.33c.05 1.104.075 2.214.075 3.33 0 34.028-26 73.265-73.549 73.265\"/></svg>"},"$:/core/images/underline":{"title":"$:/core/images/underline","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-underline tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M7 117.421h114.248V128H7v-10.579zm97.871-18.525V0h-16.26v55.856c0 4.463-.605 8.576-1.816 12.338-1.212 3.762-3.03 7.046-5.452 9.851-2.423 2.806-5.452 4.974-9.086 6.504-3.635 1.53-7.939 2.296-12.912 2.296-6.25 0-11.159-1.786-14.73-5.356-3.57-3.571-5.356-8.417-5.356-14.538V0H23v65.038c0 5.356.542 10.234 1.626 14.633 1.084 4.4 2.965 8.194 5.643 11.382 2.678 3.188 6.185 5.643 10.52 7.365 4.337 1.721 9.756 2.582 16.26 2.582 7.27 0 13.582-1.435 18.938-4.304 5.356-2.87 9.755-7.365 13.199-13.486h.382v15.686h15.303z\"/></svg>"},"$:/core/images/unfold-all-button":{"title":"$:/core/images/unfold-all-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-unfold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M63.945 60.624c-2.05 0-4.101-.78-5.666-2.345L35.662 35.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 41.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 58.279a7.986 7.986 0 01-5.663 2.346zM64.004 124.565c-2.05 0-4.102-.78-5.666-2.345L35.721 99.603c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 105.255l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.662 122.22a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"},"$:/core/images/unfold-button":{"title":"$:/core/images/unfold-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-unfold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M63.945 63.624c-2.05 0-4.101-.78-5.666-2.345L35.662 38.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 44.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 61.279a7.986 7.986 0 01-5.663 2.346zM64.004 105.682c-2.05.001-4.102-.78-5.666-2.344L35.721 80.721c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 86.373l16.966-16.966c3.124-3.125 8.194-3.13 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319l-22.617 22.617a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"},"$:/core/images/unlocked-padlock":{"title":"$:/core/images/unlocked-padlock","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-unlocked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M48.627 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h6.136c-10.455-12.651-27.364-35.788-4.3-55.142 24.636-20.672 45.835 4.353 55.777 16.201 9.943 11.85-2.676 22.437-12.457 9.892-9.78-12.545-21.167-24.146-33.207-14.043-12.041 10.104-1.757 22.36 8.813 34.958 2.467 2.94 3.641 5.732 3.865 8.134zm19.105 28.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"},"$:/core/images/up-arrow":{"title":"$:/core/images/up-arrow","created":"20150316000544368","modified":"20150316000831867","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-up-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M63.892.281c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.104 3.092-11.196 0L63.894 19.393 13.513 69.774a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98A7.892 7.892 0 0163.893.28z\"/></svg>"},"$:/core/images/video":{"title":"$:/core/images/video","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-video tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 12c-34.91 0-55.273 2.917-58.182 5.833C2.91 20.75 0 41.167 0 64.5c0 23.333 2.91 43.75 5.818 46.667C8.728 114.083 29.091 117 64 117c34.91 0 55.273-2.917 58.182-5.833C125.09 108.25 128 87.833 128 64.5c0-23.333-2.91-43.75-5.818-46.667C119.272 14.917 98.909 12 64 12zm-9.084 32.618c-3.813-2.542-6.905-.879-6.905 3.698v31.368c0 4.585 3.099 6.235 6.905 3.698l22.168-14.779c3.813-2.542 3.806-6.669 0-9.206L54.916 44.618z\"/></svg>"},"$:/core/images/warning":{"title":"$:/core/images/warning","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-warning tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z\"/></svg>"},"$:/language/Buttons/AdvancedSearch/Caption":{"title":"$:/language/Buttons/AdvancedSearch/Caption","text":"advanced search"},"$:/language/Buttons/AdvancedSearch/Hint":{"title":"$:/language/Buttons/AdvancedSearch/Hint","text":"Advanced search"},"$:/language/Buttons/Cancel/Caption":{"title":"$:/language/Buttons/Cancel/Caption","text":"cancel"},"$:/language/Buttons/Cancel/Hint":{"title":"$:/language/Buttons/Cancel/Hint","text":"Discard changes to this tiddler"},"$:/language/Buttons/Clone/Caption":{"title":"$:/language/Buttons/Clone/Caption","text":"clone"},"$:/language/Buttons/Clone/Hint":{"title":"$:/language/Buttons/Clone/Hint","text":"Clone this tiddler"},"$:/language/Buttons/Close/Caption":{"title":"$:/language/Buttons/Close/Caption","text":"close"},"$:/language/Buttons/Close/Hint":{"title":"$:/language/Buttons/Close/Hint","text":"Close this tiddler"},"$:/language/Buttons/CloseAll/Caption":{"title":"$:/language/Buttons/CloseAll/Caption","text":"close all"},"$:/language/Buttons/CloseAll/Hint":{"title":"$:/language/Buttons/CloseAll/Hint","text":"Close all tiddlers"},"$:/language/Buttons/CloseOthers/Caption":{"title":"$:/language/Buttons/CloseOthers/Caption","text":"close others"},"$:/language/Buttons/CloseOthers/Hint":{"title":"$:/language/Buttons/CloseOthers/Hint","text":"Close other tiddlers"},"$:/language/Buttons/ControlPanel/Caption":{"title":"$:/language/Buttons/ControlPanel/Caption","text":"control panel"},"$:/language/Buttons/ControlPanel/Hint":{"title":"$:/language/Buttons/ControlPanel/Hint","text":"Open control panel"},"$:/language/Buttons/CopyToClipboard/Caption":{"title":"$:/language/Buttons/CopyToClipboard/Caption","text":"copy to clipboard"},"$:/language/Buttons/CopyToClipboard/Hint":{"title":"$:/language/Buttons/CopyToClipboard/Hint","text":"Copy this text to the clipboard"},"$:/language/Buttons/Delete/Caption":{"title":"$:/language/Buttons/Delete/Caption","text":"delete"},"$:/language/Buttons/Delete/Hint":{"title":"$:/language/Buttons/Delete/Hint","text":"Delete this tiddler"},"$:/language/Buttons/DeleteTiddlers/Caption":{"title":"$:/language/Buttons/DeleteTiddlers/Caption","text":"delete tiddlers"},"$:/language/Buttons/DeleteTiddlers/Hint":{"title":"$:/language/Buttons/DeleteTiddlers/Hint","text":"Delete tiddlers"},"$:/language/Buttons/Edit/Caption":{"title":"$:/language/Buttons/Edit/Caption","text":"edit"},"$:/language/Buttons/Edit/Hint":{"title":"$:/language/Buttons/Edit/Hint","text":"Edit this tiddler"},"$:/language/Buttons/Encryption/Caption":{"title":"$:/language/Buttons/Encryption/Caption","text":"encryption"},"$:/language/Buttons/Encryption/Hint":{"title":"$:/language/Buttons/Encryption/Hint","text":"Set or clear a password for saving this wiki"},"$:/language/Buttons/Encryption/ClearPassword/Caption":{"title":"$:/language/Buttons/Encryption/ClearPassword/Caption","text":"clear password"},"$:/language/Buttons/Encryption/ClearPassword/Hint":{"title":"$:/language/Buttons/Encryption/ClearPassword/Hint","text":"Clear the password and save this wiki without encryption"},"$:/language/Buttons/Encryption/SetPassword/Caption":{"title":"$:/language/Buttons/Encryption/SetPassword/Caption","text":"set password"},"$:/language/Buttons/Encryption/SetPassword/Hint":{"title":"$:/language/Buttons/Encryption/SetPassword/Hint","text":"Set a password for saving this wiki with encryption"},"$:/language/Buttons/EmergencyDownload/Caption":{"title":"$:/language/Buttons/EmergencyDownload/Caption","text":"download tiddlers as json"},"$:/language/Buttons/ExportPage/Caption":{"title":"$:/language/Buttons/ExportPage/Caption","text":"export all"},"$:/language/Buttons/ExportPage/Hint":{"title":"$:/language/Buttons/ExportPage/Hint","text":"Export all tiddlers"},"$:/language/Buttons/ExportTiddler/Caption":{"title":"$:/language/Buttons/ExportTiddler/Caption","text":"export tiddler"},"$:/language/Buttons/ExportTiddler/Hint":{"title":"$:/language/Buttons/ExportTiddler/Hint","text":"Export tiddler"},"$:/language/Buttons/ExportTiddlers/Caption":{"title":"$:/language/Buttons/ExportTiddlers/Caption","text":"export tiddlers"},"$:/language/Buttons/ExportTiddlers/Hint":{"title":"$:/language/Buttons/ExportTiddlers/Hint","text":"Export tiddlers"},"$:/language/Buttons/SidebarSearch/Hint":{"title":"$:/language/Buttons/SidebarSearch/Hint","text":"Select the sidebar search field"},"$:/language/Buttons/Fold/Caption":{"title":"$:/language/Buttons/Fold/Caption","text":"fold tiddler"},"$:/language/Buttons/Fold/Hint":{"title":"$:/language/Buttons/Fold/Hint","text":"Fold the body of this tiddler"},"$:/language/Buttons/Fold/FoldBar/Caption":{"title":"$:/language/Buttons/Fold/FoldBar/Caption","text":"fold-bar"},"$:/language/Buttons/Fold/FoldBar/Hint":{"title":"$:/language/Buttons/Fold/FoldBar/Hint","text":"Optional bars to fold and unfold tiddlers"},"$:/language/Buttons/Unfold/Caption":{"title":"$:/language/Buttons/Unfold/Caption","text":"unfold tiddler"},"$:/language/Buttons/Unfold/Hint":{"title":"$:/language/Buttons/Unfold/Hint","text":"Unfold the body of this tiddler"},"$:/language/Buttons/FoldOthers/Caption":{"title":"$:/language/Buttons/FoldOthers/Caption","text":"fold other tiddlers"},"$:/language/Buttons/FoldOthers/Hint":{"title":"$:/language/Buttons/FoldOthers/Hint","text":"Fold the bodies of other opened tiddlers"},"$:/language/Buttons/FoldAll/Caption":{"title":"$:/language/Buttons/FoldAll/Caption","text":"fold all tiddlers"},"$:/language/Buttons/FoldAll/Hint":{"title":"$:/language/Buttons/FoldAll/Hint","text":"Fold the bodies of all opened tiddlers"},"$:/language/Buttons/UnfoldAll/Caption":{"title":"$:/language/Buttons/UnfoldAll/Caption","text":"unfold all tiddlers"},"$:/language/Buttons/UnfoldAll/Hint":{"title":"$:/language/Buttons/UnfoldAll/Hint","text":"Unfold the bodies of all opened tiddlers"},"$:/language/Buttons/FullScreen/Caption":{"title":"$:/language/Buttons/FullScreen/Caption","text":"full-screen"},"$:/language/Buttons/FullScreen/Hint":{"title":"$:/language/Buttons/FullScreen/Hint","text":"Enter or leave full-screen mode"},"$:/language/Buttons/Help/Caption":{"title":"$:/language/Buttons/Help/Caption","text":"help"},"$:/language/Buttons/Help/Hint":{"title":"$:/language/Buttons/Help/Hint","text":"Show help panel"},"$:/language/Buttons/Import/Caption":{"title":"$:/language/Buttons/Import/Caption","text":"import"},"$:/language/Buttons/Import/Hint":{"title":"$:/language/Buttons/Import/Hint","text":"Import many types of file including text, image, TiddlyWiki or JSON"},"$:/language/Buttons/Info/Caption":{"title":"$:/language/Buttons/Info/Caption","text":"info"},"$:/language/Buttons/Info/Hint":{"title":"$:/language/Buttons/Info/Hint","text":"Show information for this tiddler"},"$:/language/Buttons/Home/Caption":{"title":"$:/language/Buttons/Home/Caption","text":"home"},"$:/language/Buttons/Home/Hint":{"title":"$:/language/Buttons/Home/Hint","text":"Open the default tiddlers"},"$:/language/Buttons/Language/Caption":{"title":"$:/language/Buttons/Language/Caption","text":"language"},"$:/language/Buttons/Language/Hint":{"title":"$:/language/Buttons/Language/Hint","text":"Choose the user interface language"},"$:/language/Buttons/LayoutSwitcher/Hint":{"title":"$:/language/Buttons/LayoutSwitcher/Hint","text":"Open layout switcher"},"$:/language/Buttons/LayoutSwitcher/Caption":{"title":"$:/language/Buttons/LayoutSwitcher/Caption","text":"layout"},"$:/language/Buttons/Manager/Caption":{"title":"$:/language/Buttons/Manager/Caption","text":"tiddler manager"},"$:/language/Buttons/Manager/Hint":{"title":"$:/language/Buttons/Manager/Hint","text":"Open tiddler manager"},"$:/language/Buttons/More/Caption":{"title":"$:/language/Buttons/More/Caption","text":"more"},"$:/language/Buttons/More/Hint":{"title":"$:/language/Buttons/More/Hint","text":"More actions"},"$:/language/Buttons/NewHere/Caption":{"title":"$:/language/Buttons/NewHere/Caption","text":"new here"},"$:/language/Buttons/NewHere/Hint":{"title":"$:/language/Buttons/NewHere/Hint","text":"Create a new tiddler tagged with this one"},"$:/language/Buttons/NetworkActivity/Caption":{"title":"$:/language/Buttons/NetworkActivity/Caption","text":"network activity"},"$:/language/Buttons/NetworkActivity/Hint":{"title":"$:/language/Buttons/NetworkActivity/Hint","text":"Cancel all network activity"},"$:/language/Buttons/NewJournal/Caption":{"title":"$:/language/Buttons/NewJournal/Caption","text":"new journal"},"$:/language/Buttons/NewJournal/Hint":{"title":"$:/language/Buttons/NewJournal/Hint","text":"Create a new journal tiddler"},"$:/language/Buttons/NewJournalHere/Caption":{"title":"$:/language/Buttons/NewJournalHere/Caption","text":"new journal here"},"$:/language/Buttons/NewJournalHere/Hint":{"title":"$:/language/Buttons/NewJournalHere/Hint","text":"Create a new journal tiddler tagged with this one"},"$:/language/Buttons/NewImage/Caption":{"title":"$:/language/Buttons/NewImage/Caption","text":"new image"},"$:/language/Buttons/NewImage/Hint":{"title":"$:/language/Buttons/NewImage/Hint","text":"Create a new image tiddler"},"$:/language/Buttons/NewMarkdown/Caption":{"title":"$:/language/Buttons/NewMarkdown/Caption","text":"new Markdown tiddler"},"$:/language/Buttons/NewMarkdown/Hint":{"title":"$:/language/Buttons/NewMarkdown/Hint","text":"Create a new Markdown tiddler"},"$:/language/Buttons/NewTiddler/Caption":{"title":"$:/language/Buttons/NewTiddler/Caption","text":"new tiddler"},"$:/language/Buttons/NewTiddler/Hint":{"title":"$:/language/Buttons/NewTiddler/Hint","text":"Create a new tiddler"},"$:/language/Buttons/OpenControlPanel/Hint":{"title":"$:/language/Buttons/OpenControlPanel/Hint","text":"Open control panel"},"$:/language/Buttons/OpenWindow/Caption":{"title":"$:/language/Buttons/OpenWindow/Caption","text":"open in new window"},"$:/language/Buttons/OpenWindow/Hint":{"title":"$:/language/Buttons/OpenWindow/Hint","text":"Open tiddler in new window"},"$:/language/Buttons/Palette/Caption":{"title":"$:/language/Buttons/Palette/Caption","text":"palette"},"$:/language/Buttons/Palette/Hint":{"title":"$:/language/Buttons/Palette/Hint","text":"Choose the colour palette"},"$:/language/Buttons/Permalink/Caption":{"title":"$:/language/Buttons/Permalink/Caption","text":"permalink"},"$:/language/Buttons/Permalink/Hint":{"title":"$:/language/Buttons/Permalink/Hint","text":"Set browser address bar to a direct link to this tiddler"},"$:/language/Buttons/Permaview/Caption":{"title":"$:/language/Buttons/Permaview/Caption","text":"permaview"},"$:/language/Buttons/Permaview/Hint":{"title":"$:/language/Buttons/Permaview/Hint","text":"Set browser address bar to a direct link to all the tiddlers in this story"},"$:/language/Buttons/Print/Caption":{"title":"$:/language/Buttons/Print/Caption","text":"print page"},"$:/language/Buttons/Print/Hint":{"title":"$:/language/Buttons/Print/Hint","text":"Print the current page"},"$:/language/Buttons/Refresh/Caption":{"title":"$:/language/Buttons/Refresh/Caption","text":"refresh"},"$:/language/Buttons/Refresh/Hint":{"title":"$:/language/Buttons/Refresh/Hint","text":"Perform a full refresh of the wiki"},"$:/language/Buttons/Save/Caption":{"title":"$:/language/Buttons/Save/Caption","text":"ok"},"$:/language/Buttons/Save/Hint":{"title":"$:/language/Buttons/Save/Hint","text":"Confirm changes to this tiddler"},"$:/language/Buttons/SaveWiki/Caption":{"title":"$:/language/Buttons/SaveWiki/Caption","text":"save changes"},"$:/language/Buttons/SaveWiki/Hint":{"title":"$:/language/Buttons/SaveWiki/Hint","text":"Save changes"},"$:/language/Buttons/StoryView/Caption":{"title":"$:/language/Buttons/StoryView/Caption","text":"storyview"},"$:/language/Buttons/StoryView/Hint":{"title":"$:/language/Buttons/StoryView/Hint","text":"Choose the story visualisation"},"$:/language/Buttons/HideSideBar/Caption":{"title":"$:/language/Buttons/HideSideBar/Caption","text":"hide sidebar"},"$:/language/Buttons/HideSideBar/Hint":{"title":"$:/language/Buttons/HideSideBar/Hint","text":"Hide sidebar"},"$:/language/Buttons/ShowSideBar/Caption":{"title":"$:/language/Buttons/ShowSideBar/Caption","text":"show sidebar"},"$:/language/Buttons/ShowSideBar/Hint":{"title":"$:/language/Buttons/ShowSideBar/Hint","text":"Show sidebar"},"$:/language/Buttons/TagManager/Caption":{"title":"$:/language/Buttons/TagManager/Caption","text":"tag manager"},"$:/language/Buttons/TagManager/Hint":{"title":"$:/language/Buttons/TagManager/Hint","text":"Open tag manager"},"$:/language/Buttons/TestCaseImport/Caption":{"title":"$:/language/Buttons/TestCaseImport/Caption","text":"import tiddlers"},"$:/language/Buttons/TestCaseImport/Hint":{"title":"$:/language/Buttons/TestCaseImport/Hint","text":"Import tiddlers"},"$:/language/Buttons/Timestamp/Caption":{"title":"$:/language/Buttons/Timestamp/Caption","text":"timestamps"},"$:/language/Buttons/Timestamp/Hint":{"title":"$:/language/Buttons/Timestamp/Hint","text":"Choose whether modifications update timestamps"},"$:/language/Buttons/Timestamp/On/Caption":{"title":"$:/language/Buttons/Timestamp/On/Caption","text":"timestamps are on"},"$:/language/Buttons/Timestamp/On/Hint":{"title":"$:/language/Buttons/Timestamp/On/Hint","text":"Update timestamps when tiddlers are modified"},"$:/language/Buttons/Timestamp/Off/Caption":{"title":"$:/language/Buttons/Timestamp/Off/Caption","text":"timestamps are off"},"$:/language/Buttons/Timestamp/Off/Hint":{"title":"$:/language/Buttons/Timestamp/Off/Hint","text":"Don't update timestamps when tiddlers are modified"},"$:/language/Buttons/Theme/Caption":{"title":"$:/language/Buttons/Theme/Caption","text":"theme"},"$:/language/Buttons/Theme/Hint":{"title":"$:/language/Buttons/Theme/Hint","text":"Choose the display theme"},"$:/language/Buttons/Bold/Caption":{"title":"$:/language/Buttons/Bold/Caption","text":"bold"},"$:/language/Buttons/Bold/Hint":{"title":"$:/language/Buttons/Bold/Hint","text":"Apply bold formatting to selection"},"$:/language/Buttons/Clear/Caption":{"title":"$:/language/Buttons/Clear/Caption","text":"clear"},"$:/language/Buttons/Clear/Hint":{"title":"$:/language/Buttons/Clear/Hint","text":"Clear image to solid colour"},"$:/language/Buttons/EditorHeight/Caption":{"title":"$:/language/Buttons/EditorHeight/Caption","text":"editor height"},"$:/language/Buttons/EditorHeight/Caption/Auto":{"title":"$:/language/Buttons/EditorHeight/Caption/Auto","text":"Automatically adjust height to fit content"},"$:/language/Buttons/EditorHeight/Caption/Fixed":{"title":"$:/language/Buttons/EditorHeight/Caption/Fixed","text":"Fixed height:"},"$:/language/Buttons/EditorHeight/Hint":{"title":"$:/language/Buttons/EditorHeight/Hint","text":"Choose the height of the text editor"},"$:/language/Buttons/Excise/Caption":{"title":"$:/language/Buttons/Excise/Caption","text":"excise"},"$:/language/Buttons/Excise/Caption/Excise":{"title":"$:/language/Buttons/Excise/Caption/Excise","text":"Perform excision"},"$:/language/Buttons/Excise/Caption/MacroName":{"title":"$:/language/Buttons/Excise/Caption/MacroName","text":"Macro name:"},"$:/language/Buttons/Excise/Caption/NewTitle":{"title":"$:/language/Buttons/Excise/Caption/NewTitle","text":"Title of new tiddler:"},"$:/language/Buttons/Excise/Caption/Replace":{"title":"$:/language/Buttons/Excise/Caption/Replace","text":"Replace excised text with:"},"$:/language/Buttons/Excise/Caption/Replace/Macro":{"title":"$:/language/Buttons/Excise/Caption/Replace/Macro","text":"macro"},"$:/language/Buttons/Excise/Caption/Replace/Link":{"title":"$:/language/Buttons/Excise/Caption/Replace/Link","text":"link"},"$:/language/Buttons/Excise/Caption/Replace/Transclusion":{"title":"$:/language/Buttons/Excise/Caption/Replace/Transclusion","text":"transclusion"},"$:/language/Buttons/Excise/Caption/Tag":{"title":"$:/language/Buttons/Excise/Caption/Tag","text":"Tag new tiddler with the title of this tiddler"},"$:/language/Buttons/Excise/Caption/TiddlerExists":{"title":"$:/language/Buttons/Excise/Caption/TiddlerExists","text":"Warning: tiddler already exists"},"$:/language/Buttons/Excise/DefaultTitle":{"title":"$:/language/Buttons/Excise/DefaultTitle","text":"New Excision"},"$:/language/Buttons/Excise/Hint":{"title":"$:/language/Buttons/Excise/Hint","text":"Excise the selected text into a new tiddler"},"$:/language/Buttons/Heading1/Caption":{"title":"$:/language/Buttons/Heading1/Caption","text":"heading 1"},"$:/language/Buttons/Heading1/Hint":{"title":"$:/language/Buttons/Heading1/Hint","text":"Apply heading level 1 formatting to lines containing selection"},"$:/language/Buttons/Heading2/Caption":{"title":"$:/language/Buttons/Heading2/Caption","text":"heading 2"},"$:/language/Buttons/Heading2/Hint":{"title":"$:/language/Buttons/Heading2/Hint","text":"Apply heading level 2 formatting to lines containing selection"},"$:/language/Buttons/Heading3/Caption":{"title":"$:/language/Buttons/Heading3/Caption","text":"heading 3"},"$:/language/Buttons/Heading3/Hint":{"title":"$:/language/Buttons/Heading3/Hint","text":"Apply heading level 3 formatting to lines containing selection"},"$:/language/Buttons/Heading4/Caption":{"title":"$:/language/Buttons/Heading4/Caption","text":"heading 4"},"$:/language/Buttons/Heading4/Hint":{"title":"$:/language/Buttons/Heading4/Hint","text":"Apply heading level 4 formatting to lines containing selection"},"$:/language/Buttons/Heading5/Caption":{"title":"$:/language/Buttons/Heading5/Caption","text":"heading 5"},"$:/language/Buttons/Heading5/Hint":{"title":"$:/language/Buttons/Heading5/Hint","text":"Apply heading level 5 formatting to lines containing selection"},"$:/language/Buttons/Heading6/Caption":{"title":"$:/language/Buttons/Heading6/Caption","text":"heading 6"},"$:/language/Buttons/Heading6/Hint":{"title":"$:/language/Buttons/Heading6/Hint","text":"Apply heading level 6 formatting to lines containing selection"},"$:/language/Buttons/Italic/Caption":{"title":"$:/language/Buttons/Italic/Caption","text":"italic"},"$:/language/Buttons/Italic/Hint":{"title":"$:/language/Buttons/Italic/Hint","text":"Apply italic formatting to selection"},"$:/language/Buttons/LineWidth/Caption":{"title":"$:/language/Buttons/LineWidth/Caption","text":"line width"},"$:/language/Buttons/LineWidth/Hint":{"title":"$:/language/Buttons/LineWidth/Hint","text":"Set line width for painting"},"$:/language/Buttons/Link/Caption":{"title":"$:/language/Buttons/Link/Caption","text":"link"},"$:/language/Buttons/Link/Hint":{"title":"$:/language/Buttons/Link/Hint","text":"Create wikitext link"},"$:/language/Buttons/Linkify/Caption":{"title":"$:/language/Buttons/Linkify/Caption","text":"wikilink"},"$:/language/Buttons/Linkify/Hint":{"title":"$:/language/Buttons/Linkify/Hint","text":"Wrap selection in square brackets"},"$:/language/Buttons/ListBullet/Caption":{"title":"$:/language/Buttons/ListBullet/Caption","text":"bulleted list"},"$:/language/Buttons/ListBullet/Hint":{"title":"$:/language/Buttons/ListBullet/Hint","text":"Apply bulleted list formatting to lines containing selection"},"$:/language/Buttons/ListNumber/Caption":{"title":"$:/language/Buttons/ListNumber/Caption","text":"numbered list"},"$:/language/Buttons/ListNumber/Hint":{"title":"$:/language/Buttons/ListNumber/Hint","text":"Apply numbered list formatting to lines containing selection"},"$:/language/Buttons/MonoBlock/Caption":{"title":"$:/language/Buttons/MonoBlock/Caption","text":"monospaced block"},"$:/language/Buttons/MonoBlock/Hint":{"title":"$:/language/Buttons/MonoBlock/Hint","text":"Apply monospaced block formatting to lines containing selection"},"$:/language/Buttons/MonoLine/Caption":{"title":"$:/language/Buttons/MonoLine/Caption","text":"monospaced"},"$:/language/Buttons/MonoLine/Hint":{"title":"$:/language/Buttons/MonoLine/Hint","text":"Apply monospaced character formatting to selection"},"$:/language/Buttons/Opacity/Caption":{"title":"$:/language/Buttons/Opacity/Caption","text":"opacity"},"$:/language/Buttons/Opacity/Hint":{"title":"$:/language/Buttons/Opacity/Hint","text":"Set painting opacity"},"$:/language/Buttons/Paint/Caption":{"title":"$:/language/Buttons/Paint/Caption","text":"paint colour"},"$:/language/Buttons/Paint/Hint":{"title":"$:/language/Buttons/Paint/Hint","text":"Set painting colour"},"$:/language/Buttons/Picture/Caption":{"title":"$:/language/Buttons/Picture/Caption","text":"picture"},"$:/language/Buttons/Picture/Hint":{"title":"$:/language/Buttons/Picture/Hint","text":"Insert picture"},"$:/language/Buttons/Preview/Caption":{"title":"$:/language/Buttons/Preview/Caption","text":"preview"},"$:/language/Buttons/Preview/Hint":{"title":"$:/language/Buttons/Preview/Hint","text":"Show preview pane"},"$:/language/Buttons/PreviewType/Caption":{"title":"$:/language/Buttons/PreviewType/Caption","text":"preview type"},"$:/language/Buttons/PreviewType/Hint":{"title":"$:/language/Buttons/PreviewType/Hint","text":"Choose preview type"},"$:/language/Buttons/Quote/Caption":{"title":"$:/language/Buttons/Quote/Caption","text":"quote"},"$:/language/Buttons/Quote/Hint":{"title":"$:/language/Buttons/Quote/Hint","text":"Apply quoted text formatting to lines containing selection"},"$:/language/Buttons/RotateLeft/Caption":{"title":"$:/language/Buttons/RotateLeft/Caption","text":"rotate left"},"$:/language/Buttons/RotateLeft/Hint":{"title":"$:/language/Buttons/RotateLeft/Hint","text":"Rotate image left by 90 degrees"},"$:/language/Buttons/Size/Caption":{"title":"$:/language/Buttons/Size/Caption","text":"image size"},"$:/language/Buttons/Size/Caption/Height":{"title":"$:/language/Buttons/Size/Caption/Height","text":"Height:"},"$:/language/Buttons/Size/Caption/Resize":{"title":"$:/language/Buttons/Size/Caption/Resize","text":"Resize image"},"$:/language/Buttons/Size/Caption/Width":{"title":"$:/language/Buttons/Size/Caption/Width","text":"Width:"},"$:/language/Buttons/Size/Hint":{"title":"$:/language/Buttons/Size/Hint","text":"Set image size"},"$:/language/Buttons/Stamp/Caption":{"title":"$:/language/Buttons/Stamp/Caption","text":"stamp"},"$:/language/Buttons/Stamp/Caption/New":{"title":"$:/language/Buttons/Stamp/Caption/New","text":"Add your own"},"$:/language/Buttons/Stamp/Hint":{"title":"$:/language/Buttons/Stamp/Hint","text":"Insert a preconfigured snippet of text"},"$:/language/Buttons/Stamp/New/Title":{"title":"$:/language/Buttons/Stamp/New/Title","text":"Name as shown in menu"},"$:/language/Buttons/Stamp/New/Text":{"title":"$:/language/Buttons/Stamp/New/Text","text":"Text of snippet. (Remember to add a descriptive title in the caption field)."},"$:/language/Buttons/Strikethrough/Caption":{"title":"$:/language/Buttons/Strikethrough/Caption","text":"strikethrough"},"$:/language/Buttons/Strikethrough/Hint":{"title":"$:/language/Buttons/Strikethrough/Hint","text":"Apply strikethrough formatting to selection"},"$:/language/Buttons/Subscript/Caption":{"title":"$:/language/Buttons/Subscript/Caption","text":"subscript"},"$:/language/Buttons/Subscript/Hint":{"title":"$:/language/Buttons/Subscript/Hint","text":"Apply subscript formatting to selection"},"$:/language/Buttons/Superscript/Caption":{"title":"$:/language/Buttons/Superscript/Caption","text":"superscript"},"$:/language/Buttons/Superscript/Hint":{"title":"$:/language/Buttons/Superscript/Hint","text":"Apply superscript formatting to selection"},"$:/language/Buttons/ToggleSidebar/Hint":{"title":"$:/language/Buttons/ToggleSidebar/Hint","text":"Toggle the sidebar visibility"},"$:/language/Buttons/Transcludify/Caption":{"title":"$:/language/Buttons/Transcludify/Caption","text":"transclusion"},"$:/language/Buttons/Transcludify/Hint":{"title":"$:/language/Buttons/Transcludify/Hint","text":"Wrap selection in curly brackets"},"$:/language/Buttons/Underline/Caption":{"title":"$:/language/Buttons/Underline/Caption","text":"underline"},"$:/language/Buttons/Underline/Hint":{"title":"$:/language/Buttons/Underline/Hint","text":"Apply underline formatting to selection"},"$:/language/ControlPanel/Advanced/Caption":{"title":"$:/language/ControlPanel/Advanced/Caption","text":"Advanced"},"$:/language/ControlPanel/Advanced/Hint":{"title":"$:/language/ControlPanel/Advanced/Hint","text":"Internal information about this TiddlyWiki"},"$:/language/ControlPanel/Appearance/Caption":{"title":"$:/language/ControlPanel/Appearance/Caption","text":"Appearance"},"$:/language/ControlPanel/Appearance/Hint":{"title":"$:/language/ControlPanel/Appearance/Hint","text":"Ways to customise the appearance of your TiddlyWiki."},"$:/language/ControlPanel/Basics/AnimDuration/Prompt":{"title":"$:/language/ControlPanel/Basics/AnimDuration/Prompt","text":"Animation duration"},"$:/language/ControlPanel/Basics/AutoFocus/Prompt":{"title":"$:/language/ControlPanel/Basics/AutoFocus/Prompt","text":"Default focus field for new tiddlers"},"$:/language/ControlPanel/Basics/Caption":{"title":"$:/language/ControlPanel/Basics/Caption","text":"Basics"},"$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint":{"title":"$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint","text":"Use &#91;&#91;double square brackets&#93;&#93; for titles with spaces. Or you can choose to {{retain story ordering||$:/snippets/retain-story-ordering-button}}"},"$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt":{"title":"$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt","text":"Default tiddlers"},"$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint":{"title":"$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint","text":"Choose which tiddlers are displayed at startup"},"$:/language/ControlPanel/Basics/Language/Prompt":{"title":"$:/language/ControlPanel/Basics/Language/Prompt","text":"Hello! Current language:"},"$:/language/ControlPanel/Basics/NewJournal/Title/Prompt":{"title":"$:/language/ControlPanel/Basics/NewJournal/Title/Prompt","text":"Title of new journal tiddlers"},"$:/language/ControlPanel/Basics/NewJournal/Text/Prompt":{"title":"$:/language/ControlPanel/Basics/NewJournal/Text/Prompt","text":"Text for new journal tiddlers"},"$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt":{"title":"$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt","text":"Tags for new journal tiddlers"},"$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt":{"title":"$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt","text":"Title of new tiddlers"},"$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt":{"title":"$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt","text":"Tags for new tiddlers"},"$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt":{"title":"$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt","text":"Number of overridden shadow tiddlers"},"$:/language/ControlPanel/Basics/RemoveTags":{"title":"$:/language/ControlPanel/Basics/RemoveTags","text":"Update to current format"},"$:/language/ControlPanel/Basics/RemoveTags/Hint":{"title":"$:/language/ControlPanel/Basics/RemoveTags/Hint","text":"Update the tags configuration to the latest format"},"$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt":{"title":"$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt","text":"Number of shadow tiddlers"},"$:/language/ControlPanel/Basics/Subtitle/Prompt":{"title":"$:/language/ControlPanel/Basics/Subtitle/Prompt","text":"Subtitle"},"$:/language/ControlPanel/Basics/SystemTiddlers/Prompt":{"title":"$:/language/ControlPanel/Basics/SystemTiddlers/Prompt","text":"Number of system tiddlers"},"$:/language/ControlPanel/Basics/Tags/Prompt":{"title":"$:/language/ControlPanel/Basics/Tags/Prompt","text":"Number of tags"},"$:/language/ControlPanel/Basics/Tiddlers/Prompt":{"title":"$:/language/ControlPanel/Basics/Tiddlers/Prompt","text":"Number of tiddlers"},"$:/language/ControlPanel/Basics/Title/Prompt":{"title":"$:/language/ControlPanel/Basics/Title/Prompt","text":"Title of this ~TiddlyWiki"},"$:/language/ControlPanel/Basics/Username/Prompt":{"title":"$:/language/ControlPanel/Basics/Username/Prompt","text":"Username for signing edits"},"$:/language/ControlPanel/Basics/Version/Prompt":{"title":"$:/language/ControlPanel/Basics/Version/Prompt","text":"~TiddlyWiki version"},"$:/language/ControlPanel/Cascades/Caption":{"title":"$:/language/ControlPanel/Cascades/Caption","text":"Cascades"},"$:/language/ControlPanel/Cascades/Hint":{"title":"$:/language/ControlPanel/Cascades/Hint","text":"These global rules are used to dynamically choose certain templates. The result of the cascade is the result of the first filter in the sequence that returns a result"},"$:/language/ControlPanel/Cascades/TagPrompt":{"title":"$:/language/ControlPanel/Cascades/TagPrompt","text":"Filters tagged <$macrocall $name=\"tag\" tag=<<currentTiddler>>/>"},"$:/language/ControlPanel/EditorTypes/Caption":{"title":"$:/language/ControlPanel/EditorTypes/Caption","text":"Editor Types"},"$:/language/ControlPanel/EditorTypes/Editor/Caption":{"title":"$:/language/ControlPanel/EditorTypes/Editor/Caption","text":"Editor"},"$:/language/ControlPanel/EditorTypes/Hint":{"title":"$:/language/ControlPanel/EditorTypes/Hint","text":"These tiddlers determine which editor is used to edit specific tiddler types."},"$:/language/ControlPanel/EditorTypes/Type/Caption":{"title":"$:/language/ControlPanel/EditorTypes/Type/Caption","text":"Type"},"$:/language/ControlPanel/EditTemplateBody/Caption":{"title":"$:/language/ControlPanel/EditTemplateBody/Caption","text":"Edit Template Body"},"$:/language/ControlPanel/EditTemplateBody/Hint":{"title":"$:/language/ControlPanel/EditTemplateBody/Hint","text":"This rule cascade is used by the default edit template to dynamically choose the template for editing the body of a tiddler."},"$:/language/ControlPanel/FieldEditor/Caption":{"title":"$:/language/ControlPanel/FieldEditor/Caption","text":"Field Editor"},"$:/language/ControlPanel/FieldEditor/Hint":{"title":"$:/language/ControlPanel/FieldEditor/Hint","text":"This rules cascade is used to dynamically choose the template for rendering a tiddler field based on its name. It is used within the Edit Template."},"$:/language/ControlPanel/Info/Caption":{"title":"$:/language/ControlPanel/Info/Caption","text":"Info"},"$:/language/ControlPanel/Info/Hint":{"title":"$:/language/ControlPanel/Info/Hint","text":"Information about this TiddlyWiki"},"$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt":{"title":"$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt","text":"Type shortcut here"},"$:/language/ControlPanel/KeyboardShortcuts/Add/Caption":{"title":"$:/language/ControlPanel/KeyboardShortcuts/Add/Caption","text":"add shortcut"},"$:/language/ControlPanel/KeyboardShortcuts/Caption":{"title":"$:/language/ControlPanel/KeyboardShortcuts/Caption","text":"Keyboard Shortcuts"},"$:/language/ControlPanel/KeyboardShortcuts/Hint":{"title":"$:/language/ControlPanel/KeyboardShortcuts/Hint","text":"Manage keyboard shortcut assignments"},"$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption":{"title":"$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption","text":"No keyboard shortcuts assigned"},"$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint":{"title":"$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint","text":"remove keyboard shortcut"},"$:/language/ControlPanel/KeyboardShortcuts/Platform/All":{"title":"$:/language/ControlPanel/KeyboardShortcuts/Platform/All","text":"All platforms"},"$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac":{"title":"$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac","text":"Macintosh platform only"},"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac":{"title":"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac","text":"Non-Macintosh platforms only"},"$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux":{"title":"$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux","text":"Linux platform only"},"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux":{"title":"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux","text":"Non-Linux platforms only"},"$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows":{"title":"$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows","text":"Windows platform only"},"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows":{"title":"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows","text":"Non-Windows platforms only"},"$:/language/ControlPanel/LayoutSwitcher/Caption":{"title":"$:/language/ControlPanel/LayoutSwitcher/Caption","text":"Layout"},"$:/language/ControlPanel/LoadedModules/Caption":{"title":"$:/language/ControlPanel/LoadedModules/Caption","text":"Loaded Modules"},"$:/language/ControlPanel/LoadedModules/Hint":{"title":"$:/language/ControlPanel/LoadedModules/Hint","text":"These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process."},"$:/language/ControlPanel/Palette/Caption":{"title":"$:/language/ControlPanel/Palette/Caption","text":"Palette"},"$:/language/ControlPanel/Palette/Editor/Clone/Caption":{"title":"$:/language/ControlPanel/Palette/Editor/Clone/Caption","text":"clone"},"$:/language/ControlPanel/Palette/Editor/Clone/Prompt":{"title":"$:/language/ControlPanel/Palette/Editor/Clone/Prompt","text":"It is recommended that you clone this shadow palette before editing it"},"$:/language/ControlPanel/Palette/Editor/Delete/Hint":{"title":"$:/language/ControlPanel/Palette/Editor/Delete/Hint","text":"delete this entry from the current palette"},"$:/language/ControlPanel/Palette/Editor/Names/External/Show":{"title":"$:/language/ControlPanel/Palette/Editor/Names/External/Show","text":"Show color names that are not part of the current palette"},"$:/language/ControlPanel/Palette/Editor/Prompt/Modified":{"title":"$:/language/ControlPanel/Palette/Editor/Prompt/Modified","text":"This shadow palette has been modified"},"$:/language/ControlPanel/Palette/Editor/Prompt":{"title":"$:/language/ControlPanel/Palette/Editor/Prompt","text":"Editing"},"$:/language/ControlPanel/Palette/Editor/Reset/Caption":{"title":"$:/language/ControlPanel/Palette/Editor/Reset/Caption","text":"reset"},"$:/language/ControlPanel/Palette/HideEditor/Caption":{"title":"$:/language/ControlPanel/Palette/HideEditor/Caption","text":"hide editor"},"$:/language/ControlPanel/Palette/Prompt":{"title":"$:/language/ControlPanel/Palette/Prompt","text":"Current palette:"},"$:/language/ControlPanel/Palette/ShowEditor/Caption":{"title":"$:/language/ControlPanel/Palette/ShowEditor/Caption","text":"show editor"},"$:/language/ControlPanel/Parsing/Caption":{"title":"$:/language/ControlPanel/Parsing/Caption","text":"Parsing"},"$:/language/ControlPanel/Parsing/Hint":{"title":"$:/language/ControlPanel/Parsing/Hint","text":"Here you can globally disable/enable wiki parser rules. For changes to take effect, save and reload your wiki. Disabling certain parser rules can prevent <$text text=\"TiddlyWiki\"/> from functioning correctly. Use [[safe mode|https://tiddlywiki.com/#SafeMode]] to restore normal operation."},"$:/language/ControlPanel/Parsing/Block/Caption":{"title":"$:/language/ControlPanel/Parsing/Block/Caption","text":"Block Parse Rules"},"$:/language/ControlPanel/Parsing/Inline/Caption":{"title":"$:/language/ControlPanel/Parsing/Inline/Caption","text":"Inline Parse Rules"},"$:/language/ControlPanel/Parsing/Pragma/Caption":{"title":"$:/language/ControlPanel/Parsing/Pragma/Caption","text":"Pragma Parse Rules"},"$:/language/ControlPanel/Plugins/Add/Caption":{"title":"$:/language/ControlPanel/Plugins/Add/Caption","text":"Get more plugins"},"$:/language/ControlPanel/Plugins/Add/Hint":{"title":"$:/language/ControlPanel/Plugins/Add/Hint","text":"Install plugins from the official library"},"$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint":{"title":"$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint","text":"This plugin is already installed at version <$text text=<<installedVersion>>/>"},"$:/language/ControlPanel/Plugins/AlsoRequires":{"title":"$:/language/ControlPanel/Plugins/AlsoRequires","text":"Also requires:"},"$:/language/ControlPanel/Plugins/Caption":{"title":"$:/language/ControlPanel/Plugins/Caption","text":"Plugins"},"$:/language/ControlPanel/Plugins/Disable/Caption":{"title":"$:/language/ControlPanel/Plugins/Disable/Caption","text":"disable"},"$:/language/ControlPanel/Plugins/Disable/Hint":{"title":"$:/language/ControlPanel/Plugins/Disable/Hint","text":"Disable this plugin when reloading page"},"$:/language/ControlPanel/Plugins/Disabled/Status":{"title":"$:/language/ControlPanel/Plugins/Disabled/Status","text":"(disabled)"},"$:/language/ControlPanel/Plugins/Downgrade/Caption":{"title":"$:/language/ControlPanel/Plugins/Downgrade/Caption","text":"downgrade"},"$:/language/ControlPanel/Plugins/Empty/Hint":{"title":"$:/language/ControlPanel/Plugins/Empty/Hint","text":"None"},"$:/language/ControlPanel/Plugins/Enable/Caption":{"title":"$:/language/ControlPanel/Plugins/Enable/Caption","text":"enable"},"$:/language/ControlPanel/Plugins/Enable/Hint":{"title":"$:/language/ControlPanel/Plugins/Enable/Hint","text":"Enable this plugin when reloading page"},"$:/language/ControlPanel/Plugins/Install/Caption":{"title":"$:/language/ControlPanel/Plugins/Install/Caption","text":"install"},"$:/language/ControlPanel/Plugins/Installed/Hint":{"title":"$:/language/ControlPanel/Plugins/Installed/Hint","text":"Currently installed plugins:"},"$:/language/ControlPanel/Plugins/Languages/Caption":{"title":"$:/language/ControlPanel/Plugins/Languages/Caption","text":"Languages"},"$:/language/ControlPanel/Plugins/Languages/Hint":{"title":"$:/language/ControlPanel/Plugins/Languages/Hint","text":"Language pack plugins"},"$:/language/ControlPanel/Plugins/NoInfoFound/Hint":{"title":"$:/language/ControlPanel/Plugins/NoInfoFound/Hint","text":"No ''\"<$text text=<<currentTab>>/>\"'' found"},"$:/language/ControlPanel/Plugins/NotInstalled/Hint":{"title":"$:/language/ControlPanel/Plugins/NotInstalled/Hint","text":"This plugin is not currently installed"},"$:/language/ControlPanel/Plugins/OpenPluginLibrary":{"title":"$:/language/ControlPanel/Plugins/OpenPluginLibrary","text":"Open plugin library"},"$:/language/ControlPanel/Plugins/ClosePluginLibrary":{"title":"$:/language/ControlPanel/Plugins/ClosePluginLibrary","text":"Close plugin library"},"$:/language/ControlPanel/Plugins/PluginWillRequireReload":{"title":"$:/language/ControlPanel/Plugins/PluginWillRequireReload","text":"(requires reload)"},"$:/language/ControlPanel/Plugins/Plugins/Caption":{"title":"$:/language/ControlPanel/Plugins/Plugins/Caption","text":"Plugins"},"$:/language/ControlPanel/Plugins/Plugins/Hint":{"title":"$:/language/ControlPanel/Plugins/Plugins/Hint","text":"Plugins"},"$:/language/ControlPanel/Plugins/Reinstall/Caption":{"title":"$:/language/ControlPanel/Plugins/Reinstall/Caption","text":"reinstall"},"$:/language/ControlPanel/Plugins/Stability/Deprecated":{"title":"$:/language/ControlPanel/Plugins/Stability/Deprecated","text":"DEPRECATED"},"$:/language/ControlPanel/Plugins/Stability/Experimental":{"title":"$:/language/ControlPanel/Plugins/Stability/Experimental","text":"EXPERIMENTAL"},"$:/language/ControlPanel/Plugins/Stability/Legacy":{"title":"$:/language/ControlPanel/Plugins/Stability/Legacy","text":"LEGACY"},"$:/language/ControlPanel/Plugins/Stability/Stable":{"title":"$:/language/ControlPanel/Plugins/Stability/Stable","text":"STABLE"},"$:/language/ControlPanel/Plugins/Themes/Caption":{"title":"$:/language/ControlPanel/Plugins/Themes/Caption","text":"Themes"},"$:/language/ControlPanel/Plugins/Themes/Hint":{"title":"$:/language/ControlPanel/Plugins/Themes/Hint","text":"Theme plugins"},"$:/language/ControlPanel/Plugins/Update/Caption":{"title":"$:/language/ControlPanel/Plugins/Update/Caption","text":"update"},"$:/language/ControlPanel/Plugins/Updates/Caption":{"title":"$:/language/ControlPanel/Plugins/Updates/Caption","text":"Updates"},"$:/language/ControlPanel/Plugins/Updates/Hint":{"title":"$:/language/ControlPanel/Plugins/Updates/Hint","text":"Available updates to installed plugins"},"$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption":{"title":"$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption","text":"Update <<update-count>> plugins"},"$:/language/ControlPanel/Plugins/SubPluginPrompt":{"title":"$:/language/ControlPanel/Plugins/SubPluginPrompt","text":"With <<count>> sub-plugins available"},"$:/language/ControlPanel/Saving/Caption":{"title":"$:/language/ControlPanel/Saving/Caption","text":"Saving"},"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description":{"title":"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description","text":"Permit automatic saving for the download saver"},"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint":{"title":"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint","text":"Enable Autosave for Download Saver"},"$:/language/ControlPanel/Saving/DownloadSaver/Caption":{"title":"$:/language/ControlPanel/Saving/DownloadSaver/Caption","text":"Download Saver"},"$:/language/ControlPanel/Saving/DownloadSaver/Hint":{"title":"$:/language/ControlPanel/Saving/DownloadSaver/Hint","text":"These settings apply to the HTML5-compatible download saver"},"$:/language/ControlPanel/Saving/General/Caption":{"title":"$:/language/ControlPanel/Saving/General/Caption","text":"General"},"$:/language/ControlPanel/Saving/General/Hint":{"title":"$:/language/ControlPanel/Saving/General/Hint","text":"These settings apply to all the loaded savers"},"$:/language/ControlPanel/Saving/Hint":{"title":"$:/language/ControlPanel/Saving/Hint","text":"Settings used for saving the entire TiddlyWiki as a single file via a saver module"},"$:/language/ControlPanel/Saving/GitService/Branch":{"title":"$:/language/ControlPanel/Saving/GitService/Branch","text":"Target branch for saving"},"$:/language/ControlPanel/Saving/GitService/CommitMessage":{"title":"$:/language/ControlPanel/Saving/GitService/CommitMessage","text":"Saved by TiddlyWiki"},"$:/language/ControlPanel/Saving/GitService/Description":{"title":"$:/language/ControlPanel/Saving/GitService/Description","text":"These settings are only used when saving to <<service-name>>"},"$:/language/ControlPanel/Saving/GitService/Filename":{"title":"$:/language/ControlPanel/Saving/GitService/Filename","text":"Filename of target file (e.g. `index.html`)"},"$:/language/ControlPanel/Saving/GitService/Path":{"title":"$:/language/ControlPanel/Saving/GitService/Path","text":"Path to target file (e.g. `/wiki/`)"},"$:/language/ControlPanel/Saving/GitService/Repo":{"title":"$:/language/ControlPanel/Saving/GitService/Repo","text":"Target repository (e.g. `Jermolene/TiddlyWiki5`)"},"$:/language/ControlPanel/Saving/GitService/ServerURL":{"title":"$:/language/ControlPanel/Saving/GitService/ServerURL","text":"Server API URL"},"$:/language/ControlPanel/Saving/GitService/UserName":{"title":"$:/language/ControlPanel/Saving/GitService/UserName","text":"Username"},"$:/language/ControlPanel/Saving/GitService/GitHub/Caption":{"title":"$:/language/ControlPanel/Saving/GitService/GitHub/Caption","text":"~GitHub Saver"},"$:/language/ControlPanel/Saving/GitService/GitHub/Password":{"title":"$:/language/ControlPanel/Saving/GitService/GitHub/Password","text":"Password, OAUTH token, or personal access token (see [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] for details)"},"$:/language/ControlPanel/Saving/GitService/GitLab/Caption":{"title":"$:/language/ControlPanel/Saving/GitService/GitLab/Caption","text":"~GitLab Saver"},"$:/language/ControlPanel/Saving/GitService/GitLab/Password":{"title":"$:/language/ControlPanel/Saving/GitService/GitLab/Password","text":"Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] for details)"},"$:/language/ControlPanel/Saving/GitService/Gitea/Caption":{"title":"$:/language/ControlPanel/Saving/GitService/Gitea/Caption","text":"Gitea Saver"},"$:/language/ControlPanel/Saving/GitService/Gitea/Password":{"title":"$:/language/ControlPanel/Saving/GitService/Gitea/Password","text":"Personal access token for API (via Gitea’s web interface: `Settings | Applications | Generate New Token`)"},"$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading":{"title":"$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading","text":"Advanced Settings"},"$:/language/ControlPanel/Saving/TiddlySpot/BackupDir":{"title":"$:/language/ControlPanel/Saving/TiddlySpot/BackupDir","text":"Backup Directory"},"$:/language/ControlPanel/Saving/TiddlySpot/ControlPanel":{"title":"$:/language/ControlPanel/Saving/TiddlySpot/ControlPanel","text":"~TiddlySpot Control Panel"},"$:/language/ControlPanel/Saving/TiddlySpot/Backups":{"title":"$:/language/ControlPanel/Saving/TiddlySpot/Backups","text":"Backups"},"$:/language/ControlPanel/Saving/TiddlySpot/Caption":{"title":"$:/language/ControlPanel/Saving/TiddlySpot/Caption","text":"~TiddlySpot Saver"},"$:/language/ControlPanel/Saving/TiddlySpot/Description":{"title":"$:/language/ControlPanel/Saving/TiddlySpot/Description","text":"These settings are only used when saving to [[TiddlySpot|http://tiddlyspot.com]], [[TiddlyHost|https://tiddlyhost.com]], or a compatible remote server. See [[here|https://github.com/simonbaird/tiddlyhost/wiki/TiddlySpot-Saver-configuration-for-Tiddlyhost-and-Tiddlyspot]] for information on ~TiddlySpot and ~TiddlyHost saving configuration."},"$:/language/ControlPanel/Saving/TiddlySpot/Filename":{"title":"$:/language/ControlPanel/Saving/TiddlySpot/Filename","text":"Upload Filename"},"$:/language/ControlPanel/Saving/TiddlySpot/Heading":{"title":"$:/language/ControlPanel/Saving/TiddlySpot/Heading","text":"~TiddlySpot"},"$:/language/ControlPanel/Saving/TiddlySpot/Hint":{"title":"$:/language/ControlPanel/Saving/TiddlySpot/Hint","text":"//The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.//"},"$:/language/ControlPanel/Saving/TiddlySpot/Password":{"title":"$:/language/ControlPanel/Saving/TiddlySpot/Password","text":"Password"},"$:/language/ControlPanel/Saving/TiddlySpot/ReadOnly":{"title":"$:/language/ControlPanel/Saving/TiddlySpot/ReadOnly","text":"Note that [[TiddlySpot|http://tiddlyspot.com]] no longer allows the creation of new sites. For new sites, you can use [[TiddlyHost|https://tiddlyhost.com]], a new hosting service that replaces ~TiddlySpot."},"$:/language/ControlPanel/Saving/TiddlySpot/ServerURL":{"title":"$:/language/ControlPanel/Saving/TiddlySpot/ServerURL","text":"Server URL"},"$:/language/ControlPanel/Saving/TiddlySpot/UploadDir":{"title":"$:/language/ControlPanel/Saving/TiddlySpot/UploadDir","text":"Upload Directory"},"$:/language/ControlPanel/Saving/TiddlySpot/UserName":{"title":"$:/language/ControlPanel/Saving/TiddlySpot/UserName","text":"Wiki Name"},"$:/language/ControlPanel/Settings/AutoSave/Caption":{"title":"$:/language/ControlPanel/Settings/AutoSave/Caption","text":"Autosave"},"$:/language/ControlPanel/Settings/AutoSave/Disabled/Description":{"title":"$:/language/ControlPanel/Settings/AutoSave/Disabled/Description","text":"Do not save changes automatically"},"$:/language/ControlPanel/Settings/AutoSave/Enabled/Description":{"title":"$:/language/ControlPanel/Settings/AutoSave/Enabled/Description","text":"Save changes automatically"},"$:/language/ControlPanel/Settings/AutoSave/Hint":{"title":"$:/language/ControlPanel/Settings/AutoSave/Hint","text":"Attempt to automatically save changes during editing when using a supporting saver"},"$:/language/ControlPanel/Settings/CamelCase/Caption":{"title":"$:/language/ControlPanel/Settings/CamelCase/Caption","text":"Camel Case Wiki Links"},"$:/language/ControlPanel/Settings/CamelCase/Hint":{"title":"$:/language/ControlPanel/Settings/CamelCase/Hint","text":"You can globally disable automatic linking of ~CamelCase phrases. Requires reload to take effect"},"$:/language/ControlPanel/Settings/CamelCase/Description":{"title":"$:/language/ControlPanel/Settings/CamelCase/Description","text":"Enable automatic ~CamelCase linking"},"$:/language/ControlPanel/Settings/Caption":{"title":"$:/language/ControlPanel/Settings/Caption","text":"Settings"},"$:/language/ControlPanel/Settings/EditorToolbar/Caption":{"title":"$:/language/ControlPanel/Settings/EditorToolbar/Caption","text":"Editor Toolbar"},"$:/language/ControlPanel/Settings/EditorToolbar/Hint":{"title":"$:/language/ControlPanel/Settings/EditorToolbar/Hint","text":"Enable or disable the editor toolbar:"},"$:/language/ControlPanel/Settings/EditorToolbar/Description":{"title":"$:/language/ControlPanel/Settings/EditorToolbar/Description","text":"Show editor toolbar"},"$:/language/ControlPanel/Settings/InfoPanelMode/Caption":{"title":"$:/language/ControlPanel/Settings/InfoPanelMode/Caption","text":"Tiddler Info Panel Mode"},"$:/language/ControlPanel/Settings/InfoPanelMode/Hint":{"title":"$:/language/ControlPanel/Settings/InfoPanelMode/Hint","text":"Control when the tiddler info panel closes:"},"$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description":{"title":"$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description","text":"Tiddler info panel closes automatically"},"$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description":{"title":"$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description","text":"Tiddler info panel stays open until explicitly closed"},"$:/language/ControlPanel/Settings/Hint":{"title":"$:/language/ControlPanel/Settings/Hint","text":"These settings let you customise the behaviour of TiddlyWiki."},"$:/language/ControlPanel/Settings/NavigationAddressBar/Caption":{"title":"$:/language/ControlPanel/Settings/NavigationAddressBar/Caption","text":"Navigation Address Bar"},"$:/language/ControlPanel/Settings/NavigationAddressBar/Hint":{"title":"$:/language/ControlPanel/Settings/NavigationAddressBar/Hint","text":"Behaviour of the browser address bar when navigating to a tiddler:"},"$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description":{"title":"$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description","text":"Do not update the address bar"},"$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description":{"title":"$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description","text":"Include the target tiddler"},"$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description":{"title":"$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description","text":"Include the target tiddler and the current story sequence"},"$:/language/ControlPanel/Settings/NavigationHistory/Caption":{"title":"$:/language/ControlPanel/Settings/NavigationHistory/Caption","text":"Navigation History"},"$:/language/ControlPanel/Settings/NavigationHistory/Hint":{"title":"$:/language/ControlPanel/Settings/NavigationHistory/Hint","text":"Update browser history when navigating to a tiddler:"},"$:/language/ControlPanel/Settings/NavigationHistory/No/Description":{"title":"$:/language/ControlPanel/Settings/NavigationHistory/No/Description","text":"Do not update history"},"$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description":{"title":"$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description","text":"Update history"},"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption":{"title":"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption","text":"Permalink/permaview Mode"},"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint":{"title":"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint","text":"Choose how permalink/permaview is handled:"},"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description":{"title":"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description","text":"Copy permalink/permaview URL to clipboard"},"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description":{"title":"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description","text":"Update address bar with permalink/permaview URL"},"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption":{"title":"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption","text":"Performance Instrumentation"},"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint":{"title":"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint","text":"Displays performance statistics in the browser developer console. Requires reload to take effect"},"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description":{"title":"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description","text":"Enable performance instrumentation"},"$:/language/ControlPanel/Settings/RecentLimit/Caption":{"title":"$:/language/ControlPanel/Settings/RecentLimit/Caption","text":"Recent Tab Limit"},"$:/language/ControlPanel/Settings/RecentLimit/Hint":{"title":"$:/language/ControlPanel/Settings/RecentLimit/Hint","text":"Maximum number of tiddlers to be displayed under the sidebar \"Recent\" tab"},"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption":{"title":"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption","text":"Toolbar Button Style"},"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint":{"title":"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint","text":"Choose the style for toolbar buttons:"},"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless":{"title":"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless","text":"Borderless"},"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed":{"title":"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed","text":"Boxed"},"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded":{"title":"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded","text":"Rounded"},"$:/language/ControlPanel/Settings/ToolbarButtons/Caption":{"title":"$:/language/ControlPanel/Settings/ToolbarButtons/Caption","text":"Toolbar Buttons"},"$:/language/ControlPanel/Settings/ToolbarButtons/Hint":{"title":"$:/language/ControlPanel/Settings/ToolbarButtons/Hint","text":"Default toolbar button appearance:"},"$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description":{"title":"$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description","text":"Include icon"},"$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description":{"title":"$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description","text":"Include text"},"$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption":{"title":"$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption","text":"Default Sidebar Tab"},"$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint":{"title":"$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint","text":"Specify which sidebar tab is displayed by default"},"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption":{"title":"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption","text":"Default More Sidebar Tab"},"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint":{"title":"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint","text":"Specify which More sidebar tab is displayed by default"},"$:/language/ControlPanel/Settings/LinkToBehaviour/Caption":{"title":"$:/language/ControlPanel/Settings/LinkToBehaviour/Caption","text":"Tiddler Opening Behaviour"},"$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint":{"title":"$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint","text":"Navigation from //within// the story river"},"$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint":{"title":"$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint","text":"Navigation from //outside// the story river"},"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove":{"title":"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove","text":"Open above the current tiddler"},"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow":{"title":"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow","text":"Open below the current tiddler"},"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop":{"title":"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop","text":"Open at the top of the story river"},"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom":{"title":"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom","text":"Open at the bottom of the story river"},"$:/language/ControlPanel/Settings/TitleLinks/Caption":{"title":"$:/language/ControlPanel/Settings/TitleLinks/Caption","text":"Tiddler Titles"},"$:/language/ControlPanel/Settings/TitleLinks/Hint":{"title":"$:/language/ControlPanel/Settings/TitleLinks/Hint","text":"Optionally display tiddler titles as links"},"$:/language/ControlPanel/Settings/TitleLinks/No/Description":{"title":"$:/language/ControlPanel/Settings/TitleLinks/No/Description","text":"Do not display tiddler titles as links"},"$:/language/ControlPanel/Settings/TitleLinks/Yes/Description":{"title":"$:/language/ControlPanel/Settings/TitleLinks/Yes/Description","text":"Display tiddler titles as links"},"$:/language/ControlPanel/Settings/MissingLinks/Caption":{"title":"$:/language/ControlPanel/Settings/MissingLinks/Caption","text":"Wiki Links"},"$:/language/ControlPanel/Settings/MissingLinks/Hint":{"title":"$:/language/ControlPanel/Settings/MissingLinks/Hint","text":"Choose whether to link to tiddlers that do not exist yet"},"$:/language/ControlPanel/Settings/MissingLinks/Description":{"title":"$:/language/ControlPanel/Settings/MissingLinks/Description","text":"Enable links to missing tiddlers"},"$:/language/ControlPanel/SocialCard/Caption":{"title":"$:/language/ControlPanel/SocialCard/Caption","text":"Social Media Card"},"$:/language/ControlPanel/SocialCard/Domain/Prompt":{"title":"$:/language/ControlPanel/SocialCard/Domain/Prompt","text":"Domain name to display for the link (for example, ''tiddlywiki.com'')"},"$:/language/ControlPanel/SocialCard/Hint":{"title":"$:/language/ControlPanel/SocialCard/Hint","text":"This information is used by social and messaging services to display a preview card for links to this TiddlyWiki when hosted online"},"$:/language/ControlPanel/SocialCard/PreviewUrl/Prompt":{"title":"$:/language/ControlPanel/SocialCard/PreviewUrl/Prompt","text":"Full URL to preview image for this TiddlyWiki"},"$:/language/ControlPanel/SocialCard/PreviewUrl/Preview":{"title":"$:/language/ControlPanel/SocialCard/PreviewUrl/Preview","text":"Preview image:"},"$:/language/ControlPanel/SocialCard/Url/Prompt":{"title":"$:/language/ControlPanel/SocialCard/Url/Prompt","text":"Full URL of this TiddlyWiki"},"$:/language/ControlPanel/StoryTiddler/Caption":{"title":"$:/language/ControlPanel/StoryTiddler/Caption","text":"Story Tiddler"},"$:/language/ControlPanel/StoryTiddler/Hint":{"title":"$:/language/ControlPanel/StoryTiddler/Hint","text":"This rule cascade is used to dynamically choose the template for displaying a tiddler in the story river."},"$:/language/ControlPanel/StoryView/Caption":{"title":"$:/language/ControlPanel/StoryView/Caption","text":"Story View"},"$:/language/ControlPanel/StoryView/Prompt":{"title":"$:/language/ControlPanel/StoryView/Prompt","text":"Current view:"},"$:/language/ControlPanel/Stylesheets/Caption":{"title":"$:/language/ControlPanel/Stylesheets/Caption","text":"Stylesheets"},"$:/language/ControlPanel/Stylesheets/Expand/Caption":{"title":"$:/language/ControlPanel/Stylesheets/Expand/Caption","text":"Expand All"},"$:/language/ControlPanel/Stylesheets/Hint":{"title":"$:/language/ControlPanel/Stylesheets/Hint","text":"This is the rendered CSS of the current stylesheet tiddlers tagged with <<tag \"$:/tags/Stylesheet\">>"},"$:/language/ControlPanel/Stylesheets/Restore/Caption":{"title":"$:/language/ControlPanel/Stylesheets/Restore/Caption","text":"Restore"},"$:/language/ControlPanel/TestCases/Caption":{"title":"$:/language/ControlPanel/TestCases/Caption","text":"Test Cases"},"$:/language/ControlPanel/TestCases/Hint":{"title":"$:/language/ControlPanel/TestCases/Hint","text":"Test cases are self contained examples for testing and learning"},"$:/language/ControlPanel/TestCases/All/Caption":{"title":"$:/language/ControlPanel/TestCases/All/Caption","text":"All Test Cases"},"$:/language/ControlPanel/TestCases/All/Hint":{"title":"$:/language/ControlPanel/TestCases/All/Hint","text":"All Test Cases"},"$:/language/ControlPanel/TestCases/Failed/Caption":{"title":"$:/language/ControlPanel/TestCases/Failed/Caption","text":"Failed Test Cases"},"$:/language/ControlPanel/TestCases/Failed/Hint":{"title":"$:/language/ControlPanel/TestCases/Failed/Hint","text":"Only Failed Test Cases"},"$:/language/ControlPanel/Theme/Caption":{"title":"$:/language/ControlPanel/Theme/Caption","text":"Theme"},"$:/language/ControlPanel/Theme/Prompt":{"title":"$:/language/ControlPanel/Theme/Prompt","text":"Current theme:"},"$:/language/ControlPanel/TiddlerFields/Caption":{"title":"$:/language/ControlPanel/TiddlerFields/Caption","text":"Tiddler Fields"},"$:/language/ControlPanel/TiddlerFields/Hint":{"title":"$:/language/ControlPanel/TiddlerFields/Hint","text":"This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers)."},"$:/language/ControlPanel/TiddlerColour/Caption":{"title":"$:/language/ControlPanel/TiddlerColour/Caption","text":"Tiddler Colour"},"$:/language/ControlPanel/TiddlerColour/Hint":{"title":"$:/language/ControlPanel/TiddlerColour/Hint","text":"This rules cascade is used to dynamically choose the colour for a tiddler (used for the icon and the associated tag pill)."},"$:/language/ControlPanel/TiddlerIcon/Caption":{"title":"$:/language/ControlPanel/TiddlerIcon/Caption","text":"Tiddler Icon"},"$:/language/ControlPanel/TiddlerIcon/Hint":{"title":"$:/language/ControlPanel/TiddlerIcon/Hint","text":"This rules cascade is used to dynamically choose the icon for a tiddler."},"$:/language/ControlPanel/Toolbars/Caption":{"title":"$:/language/ControlPanel/Toolbars/Caption","text":"Toolbars"},"$:/language/ControlPanel/Toolbars/EditToolbar/Caption":{"title":"$:/language/ControlPanel/Toolbars/EditToolbar/Caption","text":"Edit Toolbar"},"$:/language/ControlPanel/Toolbars/EditToolbar/Hint":{"title":"$:/language/ControlPanel/Toolbars/EditToolbar/Hint","text":"Choose which buttons are displayed for tiddlers in edit mode. Drag and drop to change the ordering"},"$:/language/ControlPanel/Toolbars/Hint":{"title":"$:/language/ControlPanel/Toolbars/Hint","text":"Select which toolbar buttons are displayed"},"$:/language/ControlPanel/Toolbars/PageControls/Caption":{"title":"$:/language/ControlPanel/Toolbars/PageControls/Caption","text":"Page Toolbar"},"$:/language/ControlPanel/Toolbars/PageControls/Hint":{"title":"$:/language/ControlPanel/Toolbars/PageControls/Hint","text":"Choose which buttons are displayed on the main page toolbar. Drag and drop to change the ordering"},"$:/language/ControlPanel/Toolbars/EditorToolbar/Caption":{"title":"$:/language/ControlPanel/Toolbars/EditorToolbar/Caption","text":"Editor Toolbar"},"$:/language/ControlPanel/Toolbars/EditorToolbar/Hint":{"title":"$:/language/ControlPanel/Toolbars/EditorToolbar/Hint","text":"Choose which buttons are displayed in the editor toolbar. Note that some buttons will only appear when editing tiddlers of a certain type. Drag and drop to change the ordering"},"$:/language/ControlPanel/Toolbars/ViewToolbar/Caption":{"title":"$:/language/ControlPanel/Toolbars/ViewToolbar/Caption","text":"View Toolbar"},"$:/language/ControlPanel/Toolbars/ViewToolbar/Hint":{"title":"$:/language/ControlPanel/Toolbars/ViewToolbar/Hint","text":"Choose which buttons are displayed for tiddlers in view mode. Drag and drop to change the ordering"},"$:/language/ControlPanel/Tools/Download/Full/Caption":{"title":"$:/language/ControlPanel/Tools/Download/Full/Caption","text":"Download full wiki"},"$:/language/ControlPanel/ViewTemplateBody/Caption":{"title":"$:/language/ControlPanel/ViewTemplateBody/Caption","text":"View Template Body"},"$:/language/ControlPanel/ViewTemplateBody/Hint":{"title":"$:/language/ControlPanel/ViewTemplateBody/Hint","text":"This rule cascade is used by the default view template to dynamically choose the template for displaying the body of a tiddler."},"$:/language/ControlPanel/ViewTemplateTitle/Caption":{"title":"$:/language/ControlPanel/ViewTemplateTitle/Caption","text":"View Template Title"},"$:/language/ControlPanel/ViewTemplateTitle/Hint":{"title":"$:/language/ControlPanel/ViewTemplateTitle/Hint","text":"This rule cascade is used by the default view template to dynamically choose the template for displaying the title of a tiddler."},"$:/language/ControlPanel/ViewTemplateSubtitle/Caption":{"title":"$:/language/ControlPanel/ViewTemplateSubtitle/Caption","text":"View Template Subtitle"},"$:/language/ControlPanel/ViewTemplateSubtitle/Hint":{"title":"$:/language/ControlPanel/ViewTemplateSubtitle/Hint","text":"This rule cascade is used by the default view template to dynamically choose the template for displaying the subtitle of a tiddler."},"$:/language/ControlPanel/ViewTemplateTags/Caption":{"title":"$:/language/ControlPanel/ViewTemplateTags/Caption","text":"View Template Tags"},"$:/language/ControlPanel/ViewTemplateTags/Hint":{"title":"$:/language/ControlPanel/ViewTemplateTags/Hint","text":"This rule cascade is used by the default view template to dynamically choose the template for displaying the tags area of a tiddler."},"$:/language/Date/DaySuffix/1":{"title":"$:/language/Date/DaySuffix/1","text":"st"},"$:/language/Date/DaySuffix/2":{"title":"$:/language/Date/DaySuffix/2","text":"nd"},"$:/language/Date/DaySuffix/3":{"title":"$:/language/Date/DaySuffix/3","text":"rd"},"$:/language/Date/DaySuffix/4":{"title":"$:/language/Date/DaySuffix/4","text":"th"},"$:/language/Date/DaySuffix/5":{"title":"$:/language/Date/DaySuffix/5","text":"th"},"$:/language/Date/DaySuffix/6":{"title":"$:/language/Date/DaySuffix/6","text":"th"},"$:/language/Date/DaySuffix/7":{"title":"$:/language/Date/DaySuffix/7","text":"th"},"$:/language/Date/DaySuffix/8":{"title":"$:/language/Date/DaySuffix/8","text":"th"},"$:/language/Date/DaySuffix/9":{"title":"$:/language/Date/DaySuffix/9","text":"th"},"$:/language/Date/DaySuffix/10":{"title":"$:/language/Date/DaySuffix/10","text":"th"},"$:/language/Date/DaySuffix/11":{"title":"$:/language/Date/DaySuffix/11","text":"th"},"$:/language/Date/DaySuffix/12":{"title":"$:/language/Date/DaySuffix/12","text":"th"},"$:/language/Date/DaySuffix/13":{"title":"$:/language/Date/DaySuffix/13","text":"th"},"$:/language/Date/DaySuffix/14":{"title":"$:/language/Date/DaySuffix/14","text":"th"},"$:/language/Date/DaySuffix/15":{"title":"$:/language/Date/DaySuffix/15","text":"th"},"$:/language/Date/DaySuffix/16":{"title":"$:/language/Date/DaySuffix/16","text":"th"},"$:/language/Date/DaySuffix/17":{"title":"$:/language/Date/DaySuffix/17","text":"th"},"$:/language/Date/DaySuffix/18":{"title":"$:/language/Date/DaySuffix/18","text":"th"},"$:/language/Date/DaySuffix/19":{"title":"$:/language/Date/DaySuffix/19","text":"th"},"$:/language/Date/DaySuffix/20":{"title":"$:/language/Date/DaySuffix/20","text":"th"},"$:/language/Date/DaySuffix/21":{"title":"$:/language/Date/DaySuffix/21","text":"st"},"$:/language/Date/DaySuffix/22":{"title":"$:/language/Date/DaySuffix/22","text":"nd"},"$:/language/Date/DaySuffix/23":{"title":"$:/language/Date/DaySuffix/23","text":"rd"},"$:/language/Date/DaySuffix/24":{"title":"$:/language/Date/DaySuffix/24","text":"th"},"$:/language/Date/DaySuffix/25":{"title":"$:/language/Date/DaySuffix/25","text":"th"},"$:/language/Date/DaySuffix/26":{"title":"$:/language/Date/DaySuffix/26","text":"th"},"$:/language/Date/DaySuffix/27":{"title":"$:/language/Date/DaySuffix/27","text":"th"},"$:/language/Date/DaySuffix/28":{"title":"$:/language/Date/DaySuffix/28","text":"th"},"$:/language/Date/DaySuffix/29":{"title":"$:/language/Date/DaySuffix/29","text":"th"},"$:/language/Date/DaySuffix/30":{"title":"$:/language/Date/DaySuffix/30","text":"th"},"$:/language/Date/DaySuffix/31":{"title":"$:/language/Date/DaySuffix/31","text":"st"},"$:/language/Date/Long/Day/0":{"title":"$:/language/Date/Long/Day/0","text":"Sunday"},"$:/language/Date/Long/Day/1":{"title":"$:/language/Date/Long/Day/1","text":"Monday"},"$:/language/Date/Long/Day/2":{"title":"$:/language/Date/Long/Day/2","text":"Tuesday"},"$:/language/Date/Long/Day/3":{"title":"$:/language/Date/Long/Day/3","text":"Wednesday"},"$:/language/Date/Long/Day/4":{"title":"$:/language/Date/Long/Day/4","text":"Thursday"},"$:/language/Date/Long/Day/5":{"title":"$:/language/Date/Long/Day/5","text":"Friday"},"$:/language/Date/Long/Day/6":{"title":"$:/language/Date/Long/Day/6","text":"Saturday"},"$:/language/Date/Long/Month/1":{"title":"$:/language/Date/Long/Month/1","text":"January"},"$:/language/Date/Long/Month/2":{"title":"$:/language/Date/Long/Month/2","text":"February"},"$:/language/Date/Long/Month/3":{"title":"$:/language/Date/Long/Month/3","text":"March"},"$:/language/Date/Long/Month/4":{"title":"$:/language/Date/Long/Month/4","text":"April"},"$:/language/Date/Long/Month/5":{"title":"$:/language/Date/Long/Month/5","text":"May"},"$:/language/Date/Long/Month/6":{"title":"$:/language/Date/Long/Month/6","text":"June"},"$:/language/Date/Long/Month/7":{"title":"$:/language/Date/Long/Month/7","text":"July"},"$:/language/Date/Long/Month/8":{"title":"$:/language/Date/Long/Month/8","text":"August"},"$:/language/Date/Long/Month/9":{"title":"$:/language/Date/Long/Month/9","text":"September"},"$:/language/Date/Long/Month/10":{"title":"$:/language/Date/Long/Month/10","text":"October"},"$:/language/Date/Long/Month/11":{"title":"$:/language/Date/Long/Month/11","text":"November"},"$:/language/Date/Long/Month/12":{"title":"$:/language/Date/Long/Month/12","text":"December"},"$:/language/Date/Period/am":{"title":"$:/language/Date/Period/am","text":"am"},"$:/language/Date/Period/pm":{"title":"$:/language/Date/Period/pm","text":"pm"},"$:/language/Date/Short/Day/0":{"title":"$:/language/Date/Short/Day/0","text":"Sun"},"$:/language/Date/Short/Day/1":{"title":"$:/language/Date/Short/Day/1","text":"Mon"},"$:/language/Date/Short/Day/2":{"title":"$:/language/Date/Short/Day/2","text":"Tue"},"$:/language/Date/Short/Day/3":{"title":"$:/language/Date/Short/Day/3","text":"Wed"},"$:/language/Date/Short/Day/4":{"title":"$:/language/Date/Short/Day/4","text":"Thu"},"$:/language/Date/Short/Day/5":{"title":"$:/language/Date/Short/Day/5","text":"Fri"},"$:/language/Date/Short/Day/6":{"title":"$:/language/Date/Short/Day/6","text":"Sat"},"$:/language/Date/Short/Month/1":{"title":"$:/language/Date/Short/Month/1","text":"Jan"},"$:/language/Date/Short/Month/2":{"title":"$:/language/Date/Short/Month/2","text":"Feb"},"$:/language/Date/Short/Month/3":{"title":"$:/language/Date/Short/Month/3","text":"Mar"},"$:/language/Date/Short/Month/4":{"title":"$:/language/Date/Short/Month/4","text":"Apr"},"$:/language/Date/Short/Month/5":{"title":"$:/language/Date/Short/Month/5","text":"May"},"$:/language/Date/Short/Month/6":{"title":"$:/language/Date/Short/Month/6","text":"Jun"},"$:/language/Date/Short/Month/7":{"title":"$:/language/Date/Short/Month/7","text":"Jul"},"$:/language/Date/Short/Month/8":{"title":"$:/language/Date/Short/Month/8","text":"Aug"},"$:/language/Date/Short/Month/9":{"title":"$:/language/Date/Short/Month/9","text":"Sep"},"$:/language/Date/Short/Month/10":{"title":"$:/language/Date/Short/Month/10","text":"Oct"},"$:/language/Date/Short/Month/11":{"title":"$:/language/Date/Short/Month/11","text":"Nov"},"$:/language/Date/Short/Month/12":{"title":"$:/language/Date/Short/Month/12","text":"Dec"},"$:/language/RelativeDate/Future/Days":{"title":"$:/language/RelativeDate/Future/Days","text":"<<period>> days from now"},"$:/language/RelativeDate/Future/Hours":{"title":"$:/language/RelativeDate/Future/Hours","text":"<<period>> hours from now"},"$:/language/RelativeDate/Future/Minutes":{"title":"$:/language/RelativeDate/Future/Minutes","text":"<<period>> minutes from now"},"$:/language/RelativeDate/Future/Months":{"title":"$:/language/RelativeDate/Future/Months","text":"<<period>> months from now"},"$:/language/RelativeDate/Future/Second":{"title":"$:/language/RelativeDate/Future/Second","text":"1 second from now"},"$:/language/RelativeDate/Future/Seconds":{"title":"$:/language/RelativeDate/Future/Seconds","text":"<<period>> seconds from now"},"$:/language/RelativeDate/Future/Years":{"title":"$:/language/RelativeDate/Future/Years","text":"<<period>> years from now"},"$:/language/RelativeDate/Past/Days":{"title":"$:/language/RelativeDate/Past/Days","text":"<<period>> days ago"},"$:/language/RelativeDate/Past/Hours":{"title":"$:/language/RelativeDate/Past/Hours","text":"<<period>> hours ago"},"$:/language/RelativeDate/Past/Minutes":{"title":"$:/language/RelativeDate/Past/Minutes","text":"<<period>> minutes ago"},"$:/language/RelativeDate/Past/Months":{"title":"$:/language/RelativeDate/Past/Months","text":"<<period>> months ago"},"$:/language/RelativeDate/Past/Second":{"title":"$:/language/RelativeDate/Past/Second","text":"1 second ago"},"$:/language/RelativeDate/Past/Seconds":{"title":"$:/language/RelativeDate/Past/Seconds","text":"<<period>> seconds ago"},"$:/language/RelativeDate/Past/Years":{"title":"$:/language/RelativeDate/Past/Years","text":"<<period>> years ago"},"$:/language/Docs/ModuleTypes/allfilteroperator":{"title":"$:/language/Docs/ModuleTypes/allfilteroperator","text":"A sub-operator for the ''all'' filter operator."},"$:/language/Docs/ModuleTypes/animation":{"title":"$:/language/Docs/ModuleTypes/animation","text":"Animations that may be used with the RevealWidget."},"$:/language/Docs/ModuleTypes/authenticator":{"title":"$:/language/Docs/ModuleTypes/authenticator","text":"Defines how requests are authenticated by the built-in HTTP server."},"$:/language/Docs/ModuleTypes/bitmapeditoroperation":{"title":"$:/language/Docs/ModuleTypes/bitmapeditoroperation","text":"A bitmap editor toolbar operation."},"$:/language/Docs/ModuleTypes/command":{"title":"$:/language/Docs/ModuleTypes/command","text":"Commands that can be executed under Node.js."},"$:/language/Docs/ModuleTypes/config":{"title":"$:/language/Docs/ModuleTypes/config","text":"Data to be inserted into `$tw.config`."},"$:/language/Docs/ModuleTypes/filteroperator":{"title":"$:/language/Docs/ModuleTypes/filteroperator","text":"Individual filter operator methods."},"$:/language/Docs/ModuleTypes/global":{"title":"$:/language/Docs/ModuleTypes/global","text":"Global data to be inserted into `$tw`."},"$:/language/Docs/ModuleTypes/info":{"title":"$:/language/Docs/ModuleTypes/info","text":"Publishes system information via the [[$:/temp/info-plugin]] pseudo-plugin."},"$:/language/Docs/ModuleTypes/isfilteroperator":{"title":"$:/language/Docs/ModuleTypes/isfilteroperator","text":"Parameters for the ''is'' filter operator."},"$:/language/Docs/ModuleTypes/library":{"title":"$:/language/Docs/ModuleTypes/library","text":"Generic module type for general purpose JavaScript modules."},"$:/language/Docs/ModuleTypes/macro":{"title":"$:/language/Docs/ModuleTypes/macro","text":"JavaScript macro definitions."},"$:/language/Docs/ModuleTypes/parser":{"title":"$:/language/Docs/ModuleTypes/parser","text":"Parsers for different content types."},"$:/language/Docs/ModuleTypes/route":{"title":"$:/language/Docs/ModuleTypes/route","text":"Defines how individual URL patterns are handled by the built-in HTTP server."},"$:/language/Docs/ModuleTypes/saver":{"title":"$:/language/Docs/ModuleTypes/saver","text":"Savers handle different methods for saving files from the browser."},"$:/language/Docs/ModuleTypes/startup":{"title":"$:/language/Docs/ModuleTypes/startup","text":"Startup functions."},"$:/language/Docs/ModuleTypes/storyview":{"title":"$:/language/Docs/ModuleTypes/storyview","text":"Story views customise the animation and behaviour of list widgets."},"$:/language/Docs/ModuleTypes/texteditoroperation":{"title":"$:/language/Docs/ModuleTypes/texteditoroperation","text":"A text editor toolbar operation."},"$:/language/Docs/ModuleTypes/tiddlerdeserializer":{"title":"$:/language/Docs/ModuleTypes/tiddlerdeserializer","text":"Converts different content types into tiddlers."},"$:/language/Docs/ModuleTypes/tiddlerfield":{"title":"$:/language/Docs/ModuleTypes/tiddlerfield","text":"Defines the behaviour of an individual tiddler field."},"$:/language/Docs/ModuleTypes/tiddlermethod":{"title":"$:/language/Docs/ModuleTypes/tiddlermethod","text":"Adds methods to the `$tw.Tiddler` prototype."},"$:/language/Docs/ModuleTypes/upgrader":{"title":"$:/language/Docs/ModuleTypes/upgrader","text":"Applies upgrade processing to tiddlers during an upgrade/import."},"$:/language/Docs/ModuleTypes/utils":{"title":"$:/language/Docs/ModuleTypes/utils","text":"Adds methods to `$tw.utils`."},"$:/language/Docs/ModuleTypes/utils-browser":{"title":"$:/language/Docs/ModuleTypes/utils-browser","text":"Adds browser-specific methods to `$tw.utils`."},"$:/language/Docs/ModuleTypes/utils-node":{"title":"$:/language/Docs/ModuleTypes/utils-node","text":"Adds Node.js-specific methods to `$tw.utils`."},"$:/language/Docs/ModuleTypes/widget":{"title":"$:/language/Docs/ModuleTypes/widget","text":"Widgets encapsulate DOM rendering and refreshing."},"$:/language/Docs/ModuleTypes/wikimethod":{"title":"$:/language/Docs/ModuleTypes/wikimethod","text":"Adds methods to `$tw.Wiki`."},"$:/language/Docs/ModuleTypes/wikirule":{"title":"$:/language/Docs/ModuleTypes/wikirule","text":"Individual parser rules for the main WikiText parser."},"$:/language/Docs/PaletteColours/alert-background":{"title":"$:/language/Docs/PaletteColours/alert-background","text":"Alert background"},"$:/language/Docs/PaletteColours/alert-border":{"title":"$:/language/Docs/PaletteColours/alert-border","text":"Alert border"},"$:/language/Docs/PaletteColours/alert-highlight":{"title":"$:/language/Docs/PaletteColours/alert-highlight","text":"Alert highlight"},"$:/language/Docs/PaletteColours/alert-muted-foreground":{"title":"$:/language/Docs/PaletteColours/alert-muted-foreground","text":"Alert muted foreground"},"$:/language/Docs/PaletteColours/background":{"title":"$:/language/Docs/PaletteColours/background","text":"General background"},"$:/language/Docs/PaletteColours/blockquote-bar":{"title":"$:/language/Docs/PaletteColours/blockquote-bar","text":"Blockquote bar"},"$:/language/Docs/PaletteColours/button-background":{"title":"$:/language/Docs/PaletteColours/button-background","text":"Default button background"},"$:/language/Docs/PaletteColours/button-border":{"title":"$:/language/Docs/PaletteColours/button-border","text":"Default button border"},"$:/language/Docs/PaletteColours/button-foreground":{"title":"$:/language/Docs/PaletteColours/button-foreground","text":"Default button foreground"},"$:/language/Docs/PaletteColours/dirty-indicator":{"title":"$:/language/Docs/PaletteColours/dirty-indicator","text":"Unsaved changes indicator"},"$:/language/Docs/PaletteColours/code-background":{"title":"$:/language/Docs/PaletteColours/code-background","text":"Code background"},"$:/language/Docs/PaletteColours/code-border":{"title":"$:/language/Docs/PaletteColours/code-border","text":"Code border"},"$:/language/Docs/PaletteColours/code-foreground":{"title":"$:/language/Docs/PaletteColours/code-foreground","text":"Code foreground"},"$:/language/Docs/PaletteColours/download-background":{"title":"$:/language/Docs/PaletteColours/download-background","text":"Download button background"},"$:/language/Docs/PaletteColours/download-foreground":{"title":"$:/language/Docs/PaletteColours/download-foreground","text":"Download button foreground"},"$:/language/Docs/PaletteColours/dragger-background":{"title":"$:/language/Docs/PaletteColours/dragger-background","text":"Dragger background"},"$:/language/Docs/PaletteColours/dragger-foreground":{"title":"$:/language/Docs/PaletteColours/dragger-foreground","text":"Dragger foreground"},"$:/language/Docs/PaletteColours/dropdown-background":{"title":"$:/language/Docs/PaletteColours/dropdown-background","text":"Dropdown background"},"$:/language/Docs/PaletteColours/dropdown-border":{"title":"$:/language/Docs/PaletteColours/dropdown-border","text":"Dropdown border"},"$:/language/Docs/PaletteColours/dropdown-tab-background-selected":{"title":"$:/language/Docs/PaletteColours/dropdown-tab-background-selected","text":"Dropdown tab background for selected tabs"},"$:/language/Docs/PaletteColours/dropdown-tab-background":{"title":"$:/language/Docs/PaletteColours/dropdown-tab-background","text":"Dropdown tab background"},"$:/language/Docs/PaletteColours/dropzone-background":{"title":"$:/language/Docs/PaletteColours/dropzone-background","text":"Dropzone background"},"$:/language/Docs/PaletteColours/external-link-background-hover":{"title":"$:/language/Docs/PaletteColours/external-link-background-hover","text":"External link background hover"},"$:/language/Docs/PaletteColours/external-link-background-visited":{"title":"$:/language/Docs/PaletteColours/external-link-background-visited","text":"External link background visited"},"$:/language/Docs/PaletteColours/external-link-background":{"title":"$:/language/Docs/PaletteColours/external-link-background","text":"External link background"},"$:/language/Docs/PaletteColours/external-link-foreground-hover":{"title":"$:/language/Docs/PaletteColours/external-link-foreground-hover","text":"External link foreground hover"},"$:/language/Docs/PaletteColours/external-link-foreground-visited":{"title":"$:/language/Docs/PaletteColours/external-link-foreground-visited","text":"External link foreground visited"},"$:/language/Docs/PaletteColours/external-link-foreground":{"title":"$:/language/Docs/PaletteColours/external-link-foreground","text":"External link foreground"},"$:/language/Docs/PaletteColours/foreground":{"title":"$:/language/Docs/PaletteColours/foreground","text":"General foreground"},"$:/language/Docs/PaletteColours/menubar-background":{"title":"$:/language/Docs/PaletteColours/menubar-background","text":"Menu bar background"},"$:/language/Docs/PaletteColours/menubar-foreground":{"title":"$:/language/Docs/PaletteColours/menubar-foreground","text":"Menu bar foreground"},"$:/language/Docs/PaletteColours/message-background":{"title":"$:/language/Docs/PaletteColours/message-background","text":"Message box background"},"$:/language/Docs/PaletteColours/message-border":{"title":"$:/language/Docs/PaletteColours/message-border","text":"Message box border"},"$:/language/Docs/PaletteColours/message-foreground":{"title":"$:/language/Docs/PaletteColours/message-foreground","text":"Message box foreground"},"$:/language/Docs/PaletteColours/modal-backdrop":{"title":"$:/language/Docs/PaletteColours/modal-backdrop","text":"Modal backdrop"},"$:/language/Docs/PaletteColours/modal-background":{"title":"$:/language/Docs/PaletteColours/modal-background","text":"Modal background"},"$:/language/Docs/PaletteColours/modal-border":{"title":"$:/language/Docs/PaletteColours/modal-border","text":"Modal border"},"$:/language/Docs/PaletteColours/modal-footer-background":{"title":"$:/language/Docs/PaletteColours/modal-footer-background","text":"Modal footer background"},"$:/language/Docs/PaletteColours/modal-footer-border":{"title":"$:/language/Docs/PaletteColours/modal-footer-border","text":"Modal footer border"},"$:/language/Docs/PaletteColours/modal-header-border":{"title":"$:/language/Docs/PaletteColours/modal-header-border","text":"Modal header border"},"$:/language/Docs/PaletteColours/muted-foreground":{"title":"$:/language/Docs/PaletteColours/muted-foreground","text":"General muted foreground"},"$:/language/Docs/PaletteColours/notification-background":{"title":"$:/language/Docs/PaletteColours/notification-background","text":"Notification background"},"$:/language/Docs/PaletteColours/notification-border":{"title":"$:/language/Docs/PaletteColours/notification-border","text":"Notification border"},"$:/language/Docs/PaletteColours/page-background":{"title":"$:/language/Docs/PaletteColours/page-background","text":"Page background"},"$:/language/Docs/PaletteColours/pre-background":{"title":"$:/language/Docs/PaletteColours/pre-background","text":"Preformatted code background"},"$:/language/Docs/PaletteColours/pre-border":{"title":"$:/language/Docs/PaletteColours/pre-border","text":"Preformatted code border"},"$:/language/Docs/PaletteColours/primary":{"title":"$:/language/Docs/PaletteColours/primary","text":"General primary"},"$:/language/Docs/PaletteColours/select-tag-background":{"title":"$:/language/Docs/PaletteColours/select-tag-background","text":"`<select>` element background"},"$:/language/Docs/PaletteColours/select-tag-foreground":{"title":"$:/language/Docs/PaletteColours/select-tag-foreground","text":"`<select>` element text"},"$:/language/Docs/PaletteColours/sidebar-button-foreground":{"title":"$:/language/Docs/PaletteColours/sidebar-button-foreground","text":"Sidebar button foreground"},"$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover":{"title":"$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover","text":"Sidebar controls foreground hover"},"$:/language/Docs/PaletteColours/sidebar-controls-foreground":{"title":"$:/language/Docs/PaletteColours/sidebar-controls-foreground","text":"Sidebar controls foreground"},"$:/language/Docs/PaletteColours/sidebar-foreground-shadow":{"title":"$:/language/Docs/PaletteColours/sidebar-foreground-shadow","text":"Sidebar foreground shadow"},"$:/language/Docs/PaletteColours/sidebar-foreground":{"title":"$:/language/Docs/PaletteColours/sidebar-foreground","text":"Sidebar foreground"},"$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover":{"title":"$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover","text":"Sidebar muted foreground hover"},"$:/language/Docs/PaletteColours/sidebar-muted-foreground":{"title":"$:/language/Docs/PaletteColours/sidebar-muted-foreground","text":"Sidebar muted foreground"},"$:/language/Docs/PaletteColours/sidebar-tab-background-selected":{"title":"$:/language/Docs/PaletteColours/sidebar-tab-background-selected","text":"Sidebar tab background for selected tabs"},"$:/language/Docs/PaletteColours/sidebar-tab-background":{"title":"$:/language/Docs/PaletteColours/sidebar-tab-background","text":"Sidebar tab background"},"$:/language/Docs/PaletteColours/sidebar-tab-border-selected":{"title":"$:/language/Docs/PaletteColours/sidebar-tab-border-selected","text":"Sidebar tab border for selected tabs"},"$:/language/Docs/PaletteColours/sidebar-tab-border":{"title":"$:/language/Docs/PaletteColours/sidebar-tab-border","text":"Sidebar tab border"},"$:/language/Docs/PaletteColours/sidebar-tab-divider":{"title":"$:/language/Docs/PaletteColours/sidebar-tab-divider","text":"Sidebar tab divider"},"$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected":{"title":"$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected","text":"Sidebar tab foreground for selected tabs"},"$:/language/Docs/PaletteColours/sidebar-tab-foreground":{"title":"$:/language/Docs/PaletteColours/sidebar-tab-foreground","text":"Sidebar tab foreground"},"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover":{"title":"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover","text":"Sidebar tiddler link foreground hover"},"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground":{"title":"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground","text":"Sidebar tiddler link foreground"},"$:/language/Docs/PaletteColours/stability-stable":{"title":"$:/language/Docs/PaletteColours/stability-stable","text":"Badge for stability level \"stable\""},"$:/language/Docs/PaletteColours/stability-experimental":{"title":"$:/language/Docs/PaletteColours/stability-experimental","text":"Badge for stability level \"experimental\""},"$:/language/Docs/PaletteColours/stability-deprecated":{"title":"$:/language/Docs/PaletteColours/stability-deprecated","text":"Badge for stability level \"deprecated\""},"$:/language/Docs/PaletteColours/stability-legacy":{"title":"$:/language/Docs/PaletteColours/stability-legacy","text":"Badge for stability level \"legacy\""},"$:/language/Docs/PaletteColours/testcase-accent-level-1":{"title":"$:/language/Docs/PaletteColours/testcase-accent-level-1","text":"Test case accent colour with no nesting"},"$:/language/Docs/PaletteColours/testcase-accent-level-2":{"title":"$:/language/Docs/PaletteColours/testcase-accent-level-2","text":"Test case accent colour with 2nd level nesting"},"$:/language/Docs/PaletteColours/testcase-accent-level-3":{"title":"$:/language/Docs/PaletteColours/testcase-accent-level-3","text":"Test case accent colour with 3rd level nesting or higher"},"$:/language/Docs/PaletteColours/site-title-foreground":{"title":"$:/language/Docs/PaletteColours/site-title-foreground","text":"Site title foreground"},"$:/language/Docs/PaletteColours/static-alert-foreground":{"title":"$:/language/Docs/PaletteColours/static-alert-foreground","text":"Static alert foreground"},"$:/language/Docs/PaletteColours/tab-background-selected":{"title":"$:/language/Docs/PaletteColours/tab-background-selected","text":"Tab background for selected tabs"},"$:/language/Docs/PaletteColours/tab-background":{"title":"$:/language/Docs/PaletteColours/tab-background","text":"Tab background"},"$:/language/Docs/PaletteColours/tab-border-selected":{"title":"$:/language/Docs/PaletteColours/tab-border-selected","text":"Tab border for selected tabs"},"$:/language/Docs/PaletteColours/tab-border":{"title":"$:/language/Docs/PaletteColours/tab-border","text":"Tab border"},"$:/language/Docs/PaletteColours/tab-divider":{"title":"$:/language/Docs/PaletteColours/tab-divider","text":"Tab divider"},"$:/language/Docs/PaletteColours/tab-foreground-selected":{"title":"$:/language/Docs/PaletteColours/tab-foreground-selected","text":"Tab foreground for selected tabs"},"$:/language/Docs/PaletteColours/tab-foreground":{"title":"$:/language/Docs/PaletteColours/tab-foreground","text":"Tab foreground"},"$:/language/Docs/PaletteColours/table-border":{"title":"$:/language/Docs/PaletteColours/table-border","text":"Table border"},"$:/language/Docs/PaletteColours/table-footer-background":{"title":"$:/language/Docs/PaletteColours/table-footer-background","text":"Table footer background"},"$:/language/Docs/PaletteColours/table-header-background":{"title":"$:/language/Docs/PaletteColours/table-header-background","text":"Table header background"},"$:/language/Docs/PaletteColours/tag-background":{"title":"$:/language/Docs/PaletteColours/tag-background","text":"Tag background"},"$:/language/Docs/PaletteColours/tag-foreground":{"title":"$:/language/Docs/PaletteColours/tag-foreground","text":"Tag foreground"},"$:/language/Docs/PaletteColours/tiddler-background":{"title":"$:/language/Docs/PaletteColours/tiddler-background","text":"Tiddler background"},"$:/language/Docs/PaletteColours/tiddler-border":{"title":"$:/language/Docs/PaletteColours/tiddler-border","text":"Tiddler border"},"$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover":{"title":"$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover","text":"Tiddler controls foreground hover"},"$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected":{"title":"$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected","text":"Tiddler controls foreground for selected controls"},"$:/language/Docs/PaletteColours/tiddler-controls-foreground":{"title":"$:/language/Docs/PaletteColours/tiddler-controls-foreground","text":"Tiddler controls foreground"},"$:/language/Docs/PaletteColours/tiddler-editor-background":{"title":"$:/language/Docs/PaletteColours/tiddler-editor-background","text":"Tiddler editor background"},"$:/language/Docs/PaletteColours/tiddler-editor-border-image":{"title":"$:/language/Docs/PaletteColours/tiddler-editor-border-image","text":"Tiddler editor border image"},"$:/language/Docs/PaletteColours/tiddler-editor-border":{"title":"$:/language/Docs/PaletteColours/tiddler-editor-border","text":"Tiddler editor border"},"$:/language/Docs/PaletteColours/tiddler-editor-fields-even":{"title":"$:/language/Docs/PaletteColours/tiddler-editor-fields-even","text":"Tiddler editor background for even fields"},"$:/language/Docs/PaletteColours/tiddler-editor-fields-odd":{"title":"$:/language/Docs/PaletteColours/tiddler-editor-fields-odd","text":"Tiddler editor background for odd fields"},"$:/language/Docs/PaletteColours/tiddler-info-background":{"title":"$:/language/Docs/PaletteColours/tiddler-info-background","text":"Tiddler info panel background"},"$:/language/Docs/PaletteColours/tiddler-info-border":{"title":"$:/language/Docs/PaletteColours/tiddler-info-border","text":"Tiddler info panel border"},"$:/language/Docs/PaletteColours/tiddler-info-tab-background":{"title":"$:/language/Docs/PaletteColours/tiddler-info-tab-background","text":"Tiddler info panel tab background"},"$:/language/Docs/PaletteColours/tiddler-link-background":{"title":"$:/language/Docs/PaletteColours/tiddler-link-background","text":"Tiddler link background"},"$:/language/Docs/PaletteColours/tiddler-link-foreground":{"title":"$:/language/Docs/PaletteColours/tiddler-link-foreground","text":"Tiddler link foreground"},"$:/language/Docs/PaletteColours/tiddler-subtitle-foreground":{"title":"$:/language/Docs/PaletteColours/tiddler-subtitle-foreground","text":"Tiddler subtitle foreground"},"$:/language/Docs/PaletteColours/tiddler-title-foreground":{"title":"$:/language/Docs/PaletteColours/tiddler-title-foreground","text":"Tiddler title foreground"},"$:/language/Docs/PaletteColours/toolbar-new-button":{"title":"$:/language/Docs/PaletteColours/toolbar-new-button","text":"Toolbar 'new tiddler' button foreground"},"$:/language/Docs/PaletteColours/toolbar-options-button":{"title":"$:/language/Docs/PaletteColours/toolbar-options-button","text":"Toolbar 'options' button foreground"},"$:/language/Docs/PaletteColours/toolbar-save-button":{"title":"$:/language/Docs/PaletteColours/toolbar-save-button","text":"Toolbar 'save' button foreground"},"$:/language/Docs/PaletteColours/toolbar-info-button":{"title":"$:/language/Docs/PaletteColours/toolbar-info-button","text":"Toolbar 'info' button foreground"},"$:/language/Docs/PaletteColours/toolbar-edit-button":{"title":"$:/language/Docs/PaletteColours/toolbar-edit-button","text":"Toolbar 'edit' button foreground"},"$:/language/Docs/PaletteColours/toolbar-close-button":{"title":"$:/language/Docs/PaletteColours/toolbar-close-button","text":"Toolbar 'close' button foreground"},"$:/language/Docs/PaletteColours/toolbar-delete-button":{"title":"$:/language/Docs/PaletteColours/toolbar-delete-button","text":"Toolbar 'delete' button foreground"},"$:/language/Docs/PaletteColours/toolbar-cancel-button":{"title":"$:/language/Docs/PaletteColours/toolbar-cancel-button","text":"Toolbar 'cancel' button foreground"},"$:/language/Docs/PaletteColours/toolbar-done-button":{"title":"$:/language/Docs/PaletteColours/toolbar-done-button","text":"Toolbar 'done' button foreground"},"$:/language/Docs/PaletteColours/untagged-background":{"title":"$:/language/Docs/PaletteColours/untagged-background","text":"Untagged pill background"},"$:/language/Docs/PaletteColours/very-muted-foreground":{"title":"$:/language/Docs/PaletteColours/very-muted-foreground","text":"Very muted foreground"},"$:/language/EditTemplate/Caption":{"title":"$:/language/EditTemplate/Caption","text":"Editor"},"$:/language/EditTemplate/Body/External/Hint":{"title":"$:/language/EditTemplate/Body/External/Hint","text":"This tiddler shows content stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself"},"$:/language/EditTemplate/Body/Placeholder":{"title":"$:/language/EditTemplate/Body/Placeholder","text":"Type the text for this tiddler"},"$:/language/EditTemplate/Body/Preview/Type/Output":{"title":"$:/language/EditTemplate/Body/Preview/Type/Output","text":"output"},"$:/language/EditTemplate/Body/Preview/Type/DiffShadow":{"title":"$:/language/EditTemplate/Body/Preview/Type/DiffShadow","text":"differences from shadow (if any)"},"$:/language/EditTemplate/Body/Preview/Type/DiffCurrent":{"title":"$:/language/EditTemplate/Body/Preview/Type/DiffCurrent","text":"differences from current"},"$:/language/EditTemplate/Field/Remove/Caption":{"title":"$:/language/EditTemplate/Field/Remove/Caption","text":"remove field"},"$:/language/EditTemplate/Field/Remove/Hint":{"title":"$:/language/EditTemplate/Field/Remove/Hint","text":"Remove field"},"$:/language/EditTemplate/Field/Dropdown/Caption":{"title":"$:/language/EditTemplate/Field/Dropdown/Caption","text":"field list"},"$:/language/EditTemplate/Field/Dropdown/Hint":{"title":"$:/language/EditTemplate/Field/Dropdown/Hint","text":"Show field list"},"$:/language/EditTemplate/Fields/Add/Button":{"title":"$:/language/EditTemplate/Fields/Add/Button","text":"add"},"$:/language/EditTemplate/Fields/Add/Button/Hint":{"title":"$:/language/EditTemplate/Fields/Add/Button/Hint","text":"Add the new field to the tiddler"},"$:/language/EditTemplate/Fields/Add/Name/Placeholder":{"title":"$:/language/EditTemplate/Fields/Add/Name/Placeholder","text":"field name"},"$:/language/EditTemplate/Fields/Add/Prompt":{"title":"$:/language/EditTemplate/Fields/Add/Prompt","text":"Add a new field:"},"$:/language/EditTemplate/Fields/Add/Value/Placeholder":{"title":"$:/language/EditTemplate/Fields/Add/Value/Placeholder","text":"field value"},"$:/language/EditTemplate/Fields/Add/Dropdown/System":{"title":"$:/language/EditTemplate/Fields/Add/Dropdown/System","text":"System fields"},"$:/language/EditTemplate/Fields/Add/Dropdown/User":{"title":"$:/language/EditTemplate/Fields/Add/Dropdown/User","text":"User fields"},"$:/language/EditTemplate/Shadow/Warning":{"title":"$:/language/EditTemplate/Shadow/Warning","text":"This is a shadow tiddler. Any changes you make will override the default version from the plugin <<pluginLink>>"},"$:/language/EditTemplate/Shadow/OverriddenWarning":{"title":"$:/language/EditTemplate/Shadow/OverriddenWarning","text":"This is a modified shadow tiddler. You can revert to the default version in the plugin <<pluginLink>> by deleting this tiddler"},"$:/language/EditTemplate/Tags/Add/Button":{"title":"$:/language/EditTemplate/Tags/Add/Button","text":"add"},"$:/language/EditTemplate/Tags/Add/Button/Hint":{"title":"$:/language/EditTemplate/Tags/Add/Button/Hint","text":"add tag"},"$:/language/EditTemplate/Tags/Add/Placeholder":{"title":"$:/language/EditTemplate/Tags/Add/Placeholder","text":"tag name"},"$:/language/EditTemplate/Tags/ClearInput/Caption":{"title":"$:/language/EditTemplate/Tags/ClearInput/Caption","text":"clear input"},"$:/language/EditTemplate/Tags/ClearInput/Hint":{"title":"$:/language/EditTemplate/Tags/ClearInput/Hint","text":"Clear tag input"},"$:/language/EditTemplate/Tags/Dropdown/Caption":{"title":"$:/language/EditTemplate/Tags/Dropdown/Caption","text":"tag list"},"$:/language/EditTemplate/Tags/Dropdown/Hint":{"title":"$:/language/EditTemplate/Tags/Dropdown/Hint","text":"Show tag list"},"$:/language/EditTemplate/Tags/EmptyMessage":{"title":"$:/language/EditTemplate/Tags/EmptyMessage","text":"No tags found"},"$:/language/EditTemplate/Tags/EmptyMessage/System":{"title":"$:/language/EditTemplate/Tags/EmptyMessage/System","text":"No system tags found"},"$:/language/EditTemplate/Title/BadCharacterWarning":{"title":"$:/language/EditTemplate/Title/BadCharacterWarning","text":"Warning: avoid using any of the characters <<bad-chars>> in tiddler titles"},"$:/language/EditTemplate/Title/Exists/Prompt":{"title":"$:/language/EditTemplate/Title/Exists/Prompt","text":"Target tiddler already exists"},"$:/language/EditTemplate/Title/Relink/Prompt":{"title":"$:/language/EditTemplate/Title/Relink/Prompt","text":"Update ''<$text text=<<fromTitle>>/>'' to ''<$text text=<<toTitle>>/>'' in the //tags// and //list// fields of other tiddlers"},"$:/language/EditTemplate/Title/References/Prompt":{"title":"$:/language/EditTemplate/Title/References/Prompt","text":"The following references to this tiddler will not be automatically updated:"},"$:/language/EditTemplate/Type/Dropdown/Caption":{"title":"$:/language/EditTemplate/Type/Dropdown/Caption","text":"content type list"},"$:/language/EditTemplate/Type/Dropdown/Hint":{"title":"$:/language/EditTemplate/Type/Dropdown/Hint","text":"Show content type list"},"$:/language/EditTemplate/Type/Delete/Caption":{"title":"$:/language/EditTemplate/Type/Delete/Caption","text":"delete content type"},"$:/language/EditTemplate/Type/Delete/Hint":{"title":"$:/language/EditTemplate/Type/Delete/Hint","text":"Delete content type"},"$:/language/EditTemplate/Type/Placeholder":{"title":"$:/language/EditTemplate/Type/Placeholder","text":"content type"},"$:/language/EditTemplate/Type/Prompt":{"title":"$:/language/EditTemplate/Type/Prompt","text":"Type:"},"$:/language/Exporters/StaticRiver":{"title":"$:/language/Exporters/StaticRiver","text":"Static HTML"},"$:/language/Exporters/JsonFile":{"title":"$:/language/Exporters/JsonFile","text":"JSON file"},"$:/language/Exporters/CsvFile":{"title":"$:/language/Exporters/CsvFile","text":"CSV file"},"$:/language/Exporters/TidFile":{"title":"$:/language/Exporters/TidFile","text":"TID text file"},"$:/language/Docs/Fields/_canonical_uri":{"title":"$:/language/Docs/Fields/_canonical_uri","text":"The full URI of an external image tiddler"},"$:/language/Docs/Fields/author":{"title":"$:/language/Docs/Fields/author","text":"Name of the author of a plugin"},"$:/language/Docs/Fields/bag":{"title":"$:/language/Docs/Fields/bag","text":"The name of the bag from which a tiddler came"},"$:/language/Docs/Fields/caption":{"title":"$:/language/Docs/Fields/caption","text":"The text to be displayed on a tab or button"},"$:/language/Docs/Fields/class":{"title":"$:/language/Docs/Fields/class","text":"The CSS class applied to a tiddler when rendering it - see [[Custom styles by user-class]].  Also used for [[Modals]]"},"$:/language/Docs/Fields/code-body":{"title":"$:/language/Docs/Fields/code-body","text":"The view template will display the tiddler as code if set to ''yes''"},"$:/language/Docs/Fields/color":{"title":"$:/language/Docs/Fields/color","text":"The CSS color value associated with a tiddler"},"$:/language/Docs/Fields/component":{"title":"$:/language/Docs/Fields/component","text":"The name of the component responsible for an [[alert tiddler|AlertMechanism]]"},"$:/language/Docs/Fields/core-version":{"title":"$:/language/Docs/Fields/core-version","text":"For a plugin, indicates what version of TiddlyWiki with which it is compatible"},"$:/language/Docs/Fields/current-tiddler":{"title":"$:/language/Docs/Fields/current-tiddler","text":"Used to cache the top tiddler in a [[history list|HistoryMechanism]]"},"$:/language/Docs/Fields/created":{"title":"$:/language/Docs/Fields/created","text":"The date a tiddler was created"},"$:/language/Docs/Fields/creator":{"title":"$:/language/Docs/Fields/creator","text":"The name of the person who created a tiddler"},"$:/language/Docs/Fields/dependents":{"title":"$:/language/Docs/Fields/dependents","text":"For a plugin, lists the dependent plugin titles"},"$:/language/Docs/Fields/description":{"title":"$:/language/Docs/Fields/description","text":"The descriptive text for a plugin, or a modal dialogue"},"$:/language/Docs/Fields/draft.of":{"title":"$:/language/Docs/Fields/draft.of","text":"For draft tiddlers, contains the title of the tiddler of which this is a draft"},"$:/language/Docs/Fields/draft.title":{"title":"$:/language/Docs/Fields/draft.title","text":"For draft tiddlers, contains the proposed new title of the tiddler"},"$:/language/Docs/Fields/footer":{"title":"$:/language/Docs/Fields/footer","text":"The footer text for a modal"},"$:/language/Docs/Fields/hide-body":{"title":"$:/language/Docs/Fields/hide-body","text":"The view template will hide bodies of tiddlers if set to ''yes''"},"$:/language/Docs/Fields/icon":{"title":"$:/language/Docs/Fields/icon","text":"The title of the tiddler containing the icon associated with a tiddler"},"$:/language/Docs/Fields/library":{"title":"$:/language/Docs/Fields/library","text":"Indicates that a tiddler should be saved as a JavaScript library if set to ''yes''"},"$:/language/Docs/Fields/list":{"title":"$:/language/Docs/Fields/list","text":"An ordered list of tiddler titles associated with a tiddler"},"$:/language/Docs/Fields/list-before":{"title":"$:/language/Docs/Fields/list-before","text":"If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty"},"$:/language/Docs/Fields/list-after":{"title":"$:/language/Docs/Fields/list-after","text":"If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles, or at the end of the list if this field is present but empty"},"$:/language/Docs/Fields/modified":{"title":"$:/language/Docs/Fields/modified","text":"The date and time at which a tiddler was last modified"},"$:/language/Docs/Fields/modifier":{"title":"$:/language/Docs/Fields/modifier","text":"The tiddler title associated with the person who last modified a tiddler"},"$:/language/Docs/Fields/module-type":{"title":"$:/language/Docs/Fields/module-type","text":"For javascript tiddlers, specifies what kind of module it is"},"$:/language/Docs/Fields/name":{"title":"$:/language/Docs/Fields/name","text":"The human readable name associated with a plugin tiddler"},"$:/language/Docs/Fields/parent-plugin":{"title":"$:/language/Docs/Fields/parent-plugin","text":"For a plugin, specifies which plugin of which it is a sub-plugin"},"$:/language/Docs/Fields/plugin-priority":{"title":"$:/language/Docs/Fields/plugin-priority","text":"A numerical value indicating the priority of a plugin tiddler"},"$:/language/Docs/Fields/plugin-type":{"title":"$:/language/Docs/Fields/plugin-type","text":"The type of plugin in a plugin tiddler"},"$:/language/Docs/Fields/stability":{"title":"$:/language/Docs/Fields/stability","text":"The development status of a plugin: deprecated, experimental, stable, or legacy"},"$:/language/Docs/Fields/revision":{"title":"$:/language/Docs/Fields/revision","text":"The revision of the tiddler held at the server"},"$:/language/Docs/Fields/released":{"title":"$:/language/Docs/Fields/released","text":"Date of a TiddlyWiki release"},"$:/language/Docs/Fields/source":{"title":"$:/language/Docs/Fields/source","text":"The source URL associated with a tiddler"},"$:/language/Docs/Fields/subtitle":{"title":"$:/language/Docs/Fields/subtitle","text":"The subtitle text for a modal"},"$:/language/Docs/Fields/tags":{"title":"$:/language/Docs/Fields/tags","text":"A list of tags associated with a tiddler"},"$:/language/Docs/Fields/text":{"title":"$:/language/Docs/Fields/text","text":"The body text of a tiddler"},"$:/language/Docs/Fields/throttle.refresh":{"title":"$:/language/Docs/Fields/throttle.refresh","text":"If present, throttles refreshes of this tiddler"},"$:/language/Docs/Fields/title":{"title":"$:/language/Docs/Fields/title","text":"The unique name of a tiddler"},"$:/language/Docs/Fields/toc-link":{"title":"$:/language/Docs/Fields/toc-link","text":"Suppresses the tiddler's link in a Table of Contents tree if set to ''no''"},"$:/language/Docs/Fields/type":{"title":"$:/language/Docs/Fields/type","text":"The content type of a tiddler"},"$:/language/Docs/Fields/version":{"title":"$:/language/Docs/Fields/version","text":"Version information for a plugin"},"$:/language/Docs/Fields/_is_skinny":{"title":"$:/language/Docs/Fields/_is_skinny","text":"If present, indicates that the tiddler text field must be loaded from the server"},"$:/language/Filters/AllTiddlers":{"title":"$:/language/Filters/AllTiddlers","text":"All tiddlers except system tiddlers"},"$:/language/Filters/RecentSystemTiddlers":{"title":"$:/language/Filters/RecentSystemTiddlers","text":"Recently modified tiddlers, including system tiddlers"},"$:/language/Filters/RecentTiddlers":{"title":"$:/language/Filters/RecentTiddlers","text":"Recently modified tiddlers"},"$:/language/Filters/AllTags":{"title":"$:/language/Filters/AllTags","text":"All tags except system tags"},"$:/language/Filters/Missing":{"title":"$:/language/Filters/Missing","text":"Missing tiddlers"},"$:/language/Filters/Drafts":{"title":"$:/language/Filters/Drafts","text":"Draft tiddlers"},"$:/language/Filters/Orphans":{"title":"$:/language/Filters/Orphans","text":"Orphan tiddlers"},"$:/language/Filters/SystemTiddlers":{"title":"$:/language/Filters/SystemTiddlers","text":"System tiddlers"},"$:/language/Filters/ShadowTiddlers":{"title":"$:/language/Filters/ShadowTiddlers","text":"Shadow tiddlers"},"$:/language/Filters/OverriddenShadowTiddlers":{"title":"$:/language/Filters/OverriddenShadowTiddlers","text":"Overridden shadow tiddlers"},"$:/language/Filters/SessionTiddlers":{"title":"$:/language/Filters/SessionTiddlers","text":"Tiddlers modified since the wiki was loaded"},"$:/language/Filters/SystemTags":{"title":"$:/language/Filters/SystemTags","text":"System tags"},"$:/language/Filters/StoryList":{"title":"$:/language/Filters/StoryList","text":"Tiddlers in the story river, excluding <$text text=\"$:/AdvancedSearch\"/>"},"$:/language/Filters/TypedTiddlers":{"title":"$:/language/Filters/TypedTiddlers","text":"Non wiki-text tiddlers"},"GettingStarted":{"title":"GettingStarted","text":"\\define lingo-base() $:/language/ControlPanel/Basics/\nWelcome to ~TiddlyWiki and the ~TiddlyWiki community\n\nBefore you start storing important information in ~TiddlyWiki it is vital to make sure that you can reliably save changes. See https://tiddlywiki.com/#GettingStarted for details\n\n!! Set up this ~TiddlyWiki\n\n<div class=\"tc-control-panel\">\n\n|tc-table-no-border tc-first-col-min-width tc-first-link-nowrap|k\n| <$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link>|<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n| <$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link>|<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|^ <$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link><br><<lingo DefaultTiddlers/TopHint>>|<$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n</div>\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n"},"$:/language/Help/build":{"title":"$:/language/Help/build","description":"Automatically run configured commands","text":"Build the specified build targets for the current wiki. If no build targets are specified then all available targets will be built.\n\n```\n--build <target> [<target> ...]\n```\n\nBuild targets are defined in the `tiddlywiki.info` file of a wiki folder.\n\n"},"$:/language/Help/clearpassword":{"title":"$:/language/Help/clearpassword","description":"Clear a password for subsequent crypto operations","text":"Clear the password for subsequent crypto operations\n\n```\n--clearpassword\n```\n"},"$:/language/Help/commands":{"title":"$:/language/Help/commands","description":"Run commands returned from a filter","text":"Sequentially run the command tokens returned from a filter\n\n```\n--commands <filter>\n```\n\nExamples\n\n```\n--commands \"[enlist:raw{$:/build-commands-as-text}]\"\n```\n\n```\n--commands \"[{$:/build-commands-as-json}jsonindexes[]] :map[{$:/build-commands-as-json}jsonget<currentTiddler>]\"\n```\n"},"$:/language/Help/default":{"title":"$:/language/Help/default","text":"\\define commandTitle()\n$:/language/Help/$(command)$\n\\end\n\\whitespace trim\n```\nusage: tiddlywiki [<wikifolder>] [--<command> [<args>...]...]\n```\n\nAvailable commands:\n\n<ul>\n<$list filter=\"[commands[]sort[title]]\" variable=\"command\">\n<li><$link to=<<commandTitle>>><$macrocall $name=\"command\" $type=\"text/plain\" $output=\"text/plain\"/></$link>:\n&#32;\n<$transclude tiddler=<<commandTitle>> field=\"description\"/></li>\n</$list>\n</ul>\n\nTo get detailed help on a command:\n\n```\ntiddlywiki --help <command>\n```\n"},"$:/language/Help/deletetiddlers":{"title":"$:/language/Help/deletetiddlers","description":"Deletes a group of tiddlers","text":"<<.from-version \"5.1.20\">> Deletes a group of tiddlers identified by a filter.\n\n```\n--deletetiddlers <filter>\n```\n"},"$:/language/Help/editions":{"title":"$:/language/Help/editions","description":"Lists the available editions of TiddlyWiki","text":"Lists the names and descriptions of the available editions. You can create a new wiki of a specified edition with the `--init` command.\n\n```\n--editions\n```\n"},"$:/language/Help/fetch":{"title":"$:/language/Help/fetch","description":"Fetch tiddlers from wiki by URL","text":"Fetch one or more files over HTTP/HTTPS, and import the tiddlers matching a filter, optionally transforming the incoming titles.\n\n```\n--fetch file <url> <import-filter> <transform-filter>\n--fetch files <url-filter> <import-filter> <transform-filter>\n--fetch raw-file <url> <transform-filter>\n--fetch raw-files <url-filter> <transform-filter>\n```\n\nThe \"file\" and \"files\" variants fetch the specified files and attempt to import the tiddlers within them (the same processing as if the files were dragged into the browser window). The \"raw-file\" and \"raw-files\" variants fetch the specified files and then store the raw file data in tiddlers, without applying the import logic.\n\nWith the \"file\" and \"raw-file\" variants only a single file is fetched and the first parameter is the URL of the file to read.\n\nWith the \"files\" and \"raw-files\" variants, multiple files are fetched and the first parameter is a filter yielding a list of URLs of the files to read. For example, given a set of tiddlers tagged \"remote-server\" that have a field \"url\" the filter `[tag[remote-server]get[url]]` will retrieve all the available URLs.\n\nFor the \"file\" and \"files\" variants, the `<import-filter>` parameter specifies a filter determining which tiddlers are imported. It defaults to `[all[tiddlers]]` if not provided.\n\nFor all variants, the `<transform-filter>` parameter specifies an optional filter that transforms the titles of the imported tiddlers. For example, `[addprefix[$:/myimports/]]` would add the prefix `$:/myimports/` to each title.\n\nPreceding the `--fetch` command with `--verbose` will output progress information during the import.\n\nNote that TiddlyWiki will not fetch an older version of an already loaded plugin.\n\nThe following example retrieves all the non-system tiddlers from https://tiddlywiki.com and saves them to a JSON file:\n\n```\ntiddlywiki --verbose --fetch file \"https://tiddlywiki.com/\" \"[!is[system]]\" \"\" --rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[!is[system]]\"\n```\n\nThe following example retrieves the \"favicon\" file from tiddlywiki.com and saves it in a file called \"output.ico\". Note that the intermediate tiddler \"Icon Tiddler\" is quoted in the \"--fetch\" command because it is being used as a transformation filter to replace the default title, while there are no quotes for the \"--savetiddler\" command because it is being used directly as a title.\n\n```\ntiddlywiki --verbose --fetch raw-file \"https://tiddlywiki.com/favicon.ico\" \"[[Icon Tiddler]]\" --savetiddler \"Icon Tiddler\" output.ico\n```\n\n"},"$:/language/Help/help":{"title":"$:/language/Help/help","description":"Display help for TiddlyWiki commands","text":"Displays help text for a command:\n\n```\n--help [<command>]\n```\n\nIf the command name is omitted then a list of available commands is displayed.\n"},"$:/language/Help/import":{"title":"$:/language/Help/import","description":"Import tiddlers from a file","text":"Import tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The deserializer must be explicitly specified, unlike the `load` command which infers the deserializer from the file extension.\n\n```\n--import <filepath> <deserializer> [<title>] [<encoding>]\n```\n\nThe deserializers in the core include:\n\n* application/javascript\n* application/json\n* application/x-tiddler\n* application/x-tiddler-html-div\n* application/x-tiddlers\n* text/html\n* text/plain\n\nThe title of the imported tiddler defaults to the filename.\n\nThe encoding defaults to \"utf8\", but can be \"base64\" for importing binary files.\n\nNote that TiddlyWiki will not import an older version of an already loaded plugin.\n"},"$:/language/Help/init":{"title":"$:/language/Help/init","description":"Initialise a new wiki folder","text":"Initialise an empty [[WikiFolder|WikiFolders]] with a copy of the specified edition.\n\n```\n--init <edition> [<edition> ...]\n```\n\nFor example:\n\n```\ntiddlywiki ./MyWikiFolder --init empty\n```\n\nNote:\n\n* The wiki folder directory will be created if necessary\n* The \"edition\" defaults to ''empty''\n* The init command will fail if the wiki folder is not empty\n* The init command removes any `includeWikis` definitions in the edition's `tiddlywiki.info` file\n* When multiple editions are specified, editions initialised later will overwrite any files shared with earlier editions (so, the final `tiddlywiki.info` file will be copied from the last edition)\n* `--editions` returns a list of available editions\n"},"$:/language/Help/listen":{"title":"$:/language/Help/listen","description":"Provides an HTTP server interface to TiddlyWiki","text":"Serves a wiki over HTTP.\n\nThe listen command uses NamedCommandParameters:\n\n```\n--listen [<name>=<value>]...\n```\n\nAll parameters are optional with safe defaults, and can be specified in any order. The recognised parameters are:\n\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''credentials'' - pathname of credentials CSV file (relative to wiki folder)\n* ''anon-username'' - the username for signing edits for anonymous users\n* ''username'' - optional username for basic authentication\n* ''password'' - optional password for basic authentication\n* ''authenticated-user-header'' - optional name of request header to be used for trusted authentication.\n* ''readers'' - comma-separated list of principals allowed to read from this wiki\n* ''writers'' - comma-separated list of principals allowed to write to this wiki\n* ''csrf-disable'' - set to \"yes\" to disable CSRF checks (defaults to \"no\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''tls-cert'' - pathname of TLS certificate file (relative to wiki folder)\n* ''tls-key'' - pathname of TLS key file (relative to wiki folder)\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n* ''gzip'' - set to \"yes\" to enable gzip compression for some http endpoints (defaults to \"no\")\n* ''use-browser-cache'' - set to \"yes\" to allow the browser to cache responses to save bandwidth (defaults to \"no\")\n\nFor information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\n"},"$:/language/Help/load":{"title":"$:/language/Help/load","description":"Load tiddlers from a file","text":"Load tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The processing applied to incoming files is determined by the file extension. Use the alternative `import` command if you need to specify the deserializer and encoding explicitly.\n\n```\n--load <filepath> [noerror]\n--load <dirpath> [noerror]\n```\n\nBy default, the load command raises an error if no tiddlers are found. The error can be suppressed by providing the optional \"noerror\" parameter.\n\nTo load tiddlers from an encrypted TiddlyWiki file you should first specify the password with the PasswordCommand. For example:\n\n```\ntiddlywiki ./MyWiki --password pa55w0rd --load my_encrypted_wiki.html\n```\n\nNote that TiddlyWiki will not load an older version of an already loaded plugin.\n"},"$:/language/Help/makelibrary":{"title":"$:/language/Help/makelibrary","description":"Construct library plugin required by upgrade process","text":"Constructs the `$:/UpgradeLibrary` tiddler for the upgrade process.\n\nThe upgrade library is formatted as an ordinary plugin tiddler with the plugin type `library`. It contains a copy of each of the plugins, themes and language packs available within the TiddlyWiki5 repository.\n\nThis command is intended for internal use; it is only relevant to users constructing a custom upgrade procedure.\n\n```\n--makelibrary <title>\n```\n\nThe title argument defaults to `$:/UpgradeLibrary`.\n"},"$:/language/Help/notfound":{"title":"$:/language/Help/notfound","text":"No such help item"},"$:/language/Help/output":{"title":"$:/language/Help/output","description":"Set the base output directory for subsequent commands","text":"Sets the base output directory for subsequent commands. The default output directory is the `output` subdirectory of the edition directory.\n\n```\n--output <pathname>\n```\n\nIf the specified pathname is relative then it is resolved relative to the current working directory. For example `--output .` sets the output directory to the current working directory.\n\n"},"$:/language/Help/password":{"title":"$:/language/Help/password","description":"Set a password for subsequent crypto operations","text":"Set a password for subsequent crypto operations\n\n```\n--password <password>\n```\n\n''Note'': This should not be used for serving TiddlyWiki with password protection. Instead, see the password option under the [[ServerCommand]].\n"},"$:/language/Help/render":{"title":"$:/language/Help/render","description":"Renders individual tiddlers to files","text":"Render individual tiddlers identified by a filter and save the results to the specified files.\n\nOptionally, the title of a template tiddler can be specified. In this case, instead of directly rendering each tiddler, the template tiddler is rendered with the \"currentTiddler\" variable set to the title of the tiddler that is being rendered.\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [ [<name>] [<value>] ]*\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be rendered\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]addsuffix[.html]]`, which uses the unchanged tiddler title as the filename\n* ''render-type'': Optional render type: `text/html` (the default) returns the full HTML text and `text/plain` just returns the text content (ie it ignores HTML tags and other unprintable material)\n* ''template'': Optional template through which each tiddler is rendered\n* ''name'': Name of optional variables\n* ''value'': Value of optional variables\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets: `--render \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being rendered, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* Multiple ''name''/''value'' pairs can be used to pass more than one variable\n* The `--render` command is a more flexible replacement for both the `--rendertiddler` and `--rendertiddlers` commands, which are deprecated\n\nExamples:\n\n* `--render '[!is[system]]' '[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]'` -- renders all non-system tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles and the extension HTML\n* `--render '.' 'tiddlers.json' 'text/plain' '$:/core/templates/exporters/JsonFile' 'exportFilter' '[tag[HelloThere]]'` -- renders the tiddlers tagged \"HelloThere\" to a JSON file named \"tiddlers.json\"\n"},"$:/language/Help/rendertiddler":{"title":"$:/language/Help/rendertiddler","description":"Render an individual tiddler as a specified ContentType","text":"(Note: The `--rendertiddler` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender an individual tiddler as a specified ContentType, defaulting to `text/html` and save it to the specified filename.\n\nOptionally the title of a template tiddler can be specified, in which case the template tiddler is rendered with the \"currentTiddler\" variable set to the tiddler that is being rendered (the first parameter value).\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--rendertiddler <title> <filename> [<type>] [<template>] [<name>] [<value>]\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n\nFor example, the following command saves all tiddlers matching the filter `[tag[done]]` to a JSON file titled `output.json` by employing the core template `$:/core/templates/exporters/JsonFile`.\n\n```\n--rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[tag[done]]\"\n```\n"},"$:/language/Help/rendertiddlers":{"title":"$:/language/Help/rendertiddlers","description":"Render tiddlers matching a filter to a specified ContentType","text":"(Note: The `--rendertiddlers` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender a set of tiddlers matching a filter to separate files of a specified ContentType (defaults to `text/html`) and extension (defaults to `.html`).\n\n```\n--rendertiddlers '<filter>' <template> <pathname> [<type>] [<extension>] [\"noclean\"]\n```\n\nFor example:\n\n```\n--rendertiddlers '[!is[system]]' $:/core/templates/static.tiddler.html ./static text/plain\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny files in the target directory are deleted unless the ''noclean'' flag is specified. The target directory is recursively created if it is missing.\n"},"$:/language/Help/save":{"title":"$:/language/Help/save","description":"Saves individual raw tiddlers to files","text":"Saves individual tiddlers identified by a filter in their raw text or binary format to the specified files.\n\n```\n--save <tiddler-filter> <filename-filter>\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be saved\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]]`, which uses the unchanged tiddler title as the filename\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When saving a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets: `--save \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being saved, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--save` command is a more flexible replacement for both the `--savetiddler` and `--savetiddlers` commands, which are deprecated\n\nExamples:\n\n* `--save \"[!is[system]is[image]]\" \"[encodeuricomponent[]addprefix[tiddlers/]]\"` -- saves all non-system image tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles\n"},"$:/language/Help/savetiddler":{"title":"$:/language/Help/savetiddler","description":"Saves a raw tiddler to a file","text":"(Note: The `--savetiddler` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves an individual tiddler in its raw text or binary format to the specified filename.\n\n```\n--savetiddler <title> <filename>\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n"},"$:/language/Help/savetiddlers":{"title":"$:/language/Help/savetiddlers","description":"Saves a group of raw tiddlers to a directory","text":"(Note: The `--savetiddlers` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves a group of tiddlers in their raw text or binary format to the specified directory.\n\n```\n--savetiddlers <filter> <pathname> [\"noclean\"]\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nThe output directory is cleared of existing files before saving the specified files. The deletion can be disabled by specifying the ''noclean'' flag.\n\nAny missing directories in the pathname are automatically created.\n"},"$:/language/Help/savewikifolder":{"title":"$:/language/Help/savewikifolder","description":"Saves a wiki to a new wiki folder","text":"<<.from-version \"5.1.20\">> Saves the current wiki as a wiki folder, including tiddlers, plugins and configuration:\n\n```\n--savewikifolder <wikifolderpath> [<filter>] [ [<name>=<value>] ]*\n```\n\n* The target wiki folder must be empty or non-existent\n* The filter specifies which tiddlers should be included. It is optional, defaulting to `[all[tiddlers]]`\n* Plugins from the official plugin library are replaced with references to those plugins in the `tiddlywiki.info` file\n* Custom plugins are unpacked into their own folder\n\nThe following options are supported:\n\n* ''filter'': a filter expression that defines the tiddlers to include in the output.\n* ''explodePlugins'': defaults to \"yes\"\n** ''yes'' will \"explode\" plugins into separate tiddler files and save them to the plugin directory within the wiki folder\n** ''no'' will suppress exploding plugins into their constituent tiddler files. It will save the plugin as a single JSON tiddler in the tiddlers folder\n\nNote that both ''explodePlugins'' options will produce wiki folders that build the exact same original wiki. The difference lies in how plugins are represented in the wiki folder.\n\nA common usage is to convert a TiddlyWiki HTML file into a wiki folder:\n\n```\ntiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder\n```\n\nSave the plugin to the tiddlers directory of the target wiki folder:\n\n```\ntiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder explodePlugins=no\n```\n"},"$:/language/Help/server":{"title":"$:/language/Help/server","description":"(deprecated: see 'listen' command) Provides an HTTP server interface to TiddlyWiki","text":"Legacy command to serve a wiki over HTTP.\n\n```\n--server <port> <root-tiddler> <root-render-type> <root-serve-type> <username> <password> <host> <path-prefix> <debug-level>\n```\n\nThe parameters are:\n\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''username'' - the default username for signing edits\n* ''password'' - optional password for basic authentication\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n\nIf the password parameter is specified then the browser will prompt the user for the username and password. Note that the password is transmitted in plain text so this implementation should only be used on a trusted network or over HTTPS.\n\nFor example:\n\n```\n--server 8080 $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n\nThe username and password can be specified as empty strings if you need to set the hostname or pathprefix and don't want to require a password.\n\n\n```\n--server 8080 $:/core/save/all text/plain text/html \"\" \"\" 192.168.0.245\n```\n\nUsing an address like this exposes your system to the local network. For information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\nTo run multiple TiddlyWiki servers at the same time you'll need to put each one on a different port. It can be useful to use an environment variable to pass the port number to the Node.js process. This example references an environment variable called \"MY_PORT_NUMBER\":\n\n```\n--server MY_PORT_NUMBER $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n"},"$:/language/Help/setfield":{"title":"$:/language/Help/setfield","description":"Prepares external tiddlers for use","text":"//Note that this command is experimental and may change or be replaced before being finalised//\n\nSets the specified field of a group of tiddlers to the result of wikifying a template tiddler with the `currentTiddler` variable set to the tiddler.\n\n```\n--setfield <filter> <fieldname> <templatetitle> <rendertype>\n```\n\nThe parameters are:\n\n* ''filter'' - filter identifying the tiddlers to be affected\n* ''fieldname'' - the field to modify (defaults to \"text\")\n* ''templatetitle'' - the tiddler to wikify into the specified field. If blank or missing then the specified field is deleted\n* ''rendertype'' - the text type to render (defaults to \"text/plain\"; \"text/html\" can be used to include HTML tags)\n"},"$:/language/Help/unpackplugin":{"title":"$:/language/Help/unpackplugin","description":"Unpack the payload tiddlers from a plugin","text":"Extract the payload tiddlers from a plugin, creating them as ordinary tiddlers:\n\n```\n--unpackplugin <title>\n```\n"},"$:/language/Help/verbose":{"title":"$:/language/Help/verbose","description":"Triggers verbose output mode","text":"Triggers verbose output, useful for debugging\n\n```\n--verbose\n```\n"},"$:/language/Help/version":{"title":"$:/language/Help/version","description":"Displays the version number of TiddlyWiki","text":"Displays the version number of TiddlyWiki.\n\n```\n--version\n```\n"},"$:/language/Import/Editor/Import/Heading":{"title":"$:/language/Import/Editor/Import/Heading","text":"Import images and insert them into the editor."},"$:/language/Import/Imported/Hint":{"title":"$:/language/Import/Imported/Hint","text":"The following tiddlers were imported:"},"$:/language/Import/Listing/Cancel/Caption":{"title":"$:/language/Import/Listing/Cancel/Caption","text":"Cancel"},"$:/language/Import/Listing/Cancel/Warning":{"title":"$:/language/Import/Listing/Cancel/Warning","text":"Do you wish to cancel the import?"},"$:/language/Import/Listing/Hint":{"title":"$:/language/Import/Listing/Hint","text":"These tiddlers are ready to import:"},"$:/language/Import/Listing/Import/Caption":{"title":"$:/language/Import/Listing/Import/Caption","text":"Import"},"$:/language/Import/Listing/Select/Caption":{"title":"$:/language/Import/Listing/Select/Caption","text":"Select"},"$:/language/Import/Listing/Status/Caption":{"title":"$:/language/Import/Listing/Status/Caption","text":"Status"},"$:/language/Import/Listing/Title/Caption":{"title":"$:/language/Import/Listing/Title/Caption","text":"Title"},"$:/language/Import/Listing/Preview":{"title":"$:/language/Import/Listing/Preview","text":"Preview:"},"$:/language/Import/Listing/Preview/Text":{"title":"$:/language/Import/Listing/Preview/Text","text":"Text"},"$:/language/Import/Listing/Preview/TextRaw":{"title":"$:/language/Import/Listing/Preview/TextRaw","text":"Text (Raw)"},"$:/language/Import/Listing/Preview/Fields":{"title":"$:/language/Import/Listing/Preview/Fields","text":"Fields"},"$:/language/Import/Listing/Preview/Diff":{"title":"$:/language/Import/Listing/Preview/Diff","text":"Diff"},"$:/language/Import/Listing/Preview/DiffFields":{"title":"$:/language/Import/Listing/Preview/DiffFields","text":"Diff (Fields)"},"$:/language/Import/Listing/Rename/Tooltip":{"title":"$:/language/Import/Listing/Rename/Tooltip","text":"Rename tiddler before importing"},"$:/language/Import/Listing/Rename/Prompt":{"title":"$:/language/Import/Listing/Rename/Prompt","text":"Rename to:"},"$:/language/Import/Listing/Rename/ConfirmRename":{"title":"$:/language/Import/Listing/Rename/ConfirmRename","text":"Rename tiddler"},"$:/language/Import/Listing/Rename/CancelRename":{"title":"$:/language/Import/Listing/Rename/CancelRename","text":"Cancel"},"$:/language/Import/Listing/Rename/OverwriteWarning":{"title":"$:/language/Import/Listing/Rename/OverwriteWarning","text":"A tiddler with this title already exists."},"$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible":{"title":"$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible","text":"Blocked incompatible or obsolete plugin."},"$:/language/Import/Upgrader/Plugins/Suppressed/Version":{"title":"$:/language/Import/Upgrader/Plugins/Suppressed/Version","text":"Blocked plugin (due to incoming <<incoming>> not being newer than existing <<existing>>)."},"$:/language/Import/Upgrader/Plugins/Upgraded":{"title":"$:/language/Import/Upgrader/Plugins/Upgraded","text":"Upgraded plugin from <<incoming>> to <<upgraded>>."},"$:/language/Import/Upgrader/State/Suppressed":{"title":"$:/language/Import/Upgrader/State/Suppressed","text":"Blocked temporary state tiddler."},"$:/language/Import/Upgrader/System/Disabled":{"title":"$:/language/Import/Upgrader/System/Disabled","text":"Disabled system tiddler."},"$:/language/Import/Upgrader/System/Suppressed":{"title":"$:/language/Import/Upgrader/System/Suppressed","text":"Blocked system tiddler."},"$:/language/Import/Upgrader/System/Warning":{"title":"$:/language/Import/Upgrader/System/Warning","text":"Core module tiddler."},"$:/language/Import/Upgrader/System/Alert":{"title":"$:/language/Import/Upgrader/System/Alert","text":"You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable."},"$:/language/Import/Upgrader/ThemeTweaks/Created":{"title":"$:/language/Import/Upgrader/ThemeTweaks/Created","text":"Migrated theme tweak from <$text text=<<from>>/>."},"$:/language/Import/Upgrader/Tiddler/Disabled":{"title":"$:/language/Import/Upgrader/Tiddler/Disabled","text":"Disabled tiddler."},"$:/language/Import/Upgrader/Tiddler/Selected":{"title":"$:/language/Import/Upgrader/Tiddler/Selected","text":"Selected tiddler."},"$:/language/Import/Upgrader/Tiddler/Unselected":{"title":"$:/language/Import/Upgrader/Tiddler/Unselected","text":"Unselected tiddler."},"$:/language/AboveStory/ClassicPlugin/Warning":{"title":"$:/language/AboveStory/ClassicPlugin/Warning","text":"It looks like you are trying to load a plugin designed for ~TiddlyWiki Classic. Please note that [[these plugins do not work with TiddlyWiki version 5.x.x|https://tiddlywiki.com/#TiddlyWikiClassic]]. ~TiddlyWiki Classic plugins detected:"},"$:/language/BinaryWarning/Prompt":{"title":"$:/language/BinaryWarning/Prompt","text":"This tiddler contains binary data"},"$:/language/ClassicWarning/Hint":{"title":"$:/language/ClassicWarning/Hint","text":"This tiddler is written in TiddlyWiki Classic wiki text format, which is not fully compatible with TiddlyWiki version 5. See https://tiddlywiki.com/static/Upgrading.html for more details."},"$:/language/ClassicWarning/Upgrade/Caption":{"title":"$:/language/ClassicWarning/Upgrade/Caption","text":"upgrade"},"$:/language/CloseAll/Button":{"title":"$:/language/CloseAll/Button","text":"close all"},"$:/language/ColourPicker/Recent":{"title":"$:/language/ColourPicker/Recent","text":"Recent:"},"$:/language/ConfirmCancelTiddler":{"title":"$:/language/ConfirmCancelTiddler","text":"Do you wish to discard changes to the tiddler \"<$text text=<<title>>/>\"?"},"$:/language/ConfirmDeleteTiddler":{"title":"$:/language/ConfirmDeleteTiddler","text":"Do you wish to delete the tiddler \"<$text text=<<title>>/>\"?"},"$:/language/ConfirmDeleteTiddlers":{"title":"$:/language/ConfirmDeleteTiddlers","text":"Are you sure you wish to delete <<resultCount>> tiddler(s)?"},"$:/language/ConfirmOverwriteTiddler":{"title":"$:/language/ConfirmOverwriteTiddler","text":"Do you wish to overwrite the tiddler \"<$text text=<<title>>/>\"?"},"$:/language/ConfirmEditShadowTiddler":{"title":"$:/language/ConfirmEditShadowTiddler","text":"You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit \"<$text text=<<title>>/>\"?"},"$:/language/ConfirmAction":{"title":"$:/language/ConfirmAction","text":"Do you wish to proceed?"},"$:/language/Count":{"title":"$:/language/Count","text":"count"},"$:/language/DefaultNewTiddlerTitle":{"title":"$:/language/DefaultNewTiddlerTitle","text":"New Tiddler"},"$:/language/Diffs/CountMessage":{"title":"$:/language/Diffs/CountMessage","text":"<<diff-count>> differences"},"$:/language/DropMessage":{"title":"$:/language/DropMessage","text":"Drop now (or use the 'Escape' key to cancel)"},"$:/language/Encryption/Cancel":{"title":"$:/language/Encryption/Cancel","text":"Cancel"},"$:/language/Encryption/ConfirmClearPassword":{"title":"$:/language/Encryption/ConfirmClearPassword","text":"Do you wish to clear the password? This will remove the encryption applied when saving this wiki"},"$:/language/Encryption/PromptSetPassword":{"title":"$:/language/Encryption/PromptSetPassword","text":"Set a new password for this TiddlyWiki"},"$:/language/Encryption/Username":{"title":"$:/language/Encryption/Username","text":"Username"},"$:/language/Encryption/Password":{"title":"$:/language/Encryption/Password","text":"Password"},"$:/language/Encryption/RepeatPassword":{"title":"$:/language/Encryption/RepeatPassword","text":"Repeat password"},"$:/language/Encryption/PasswordNoMatch":{"title":"$:/language/Encryption/PasswordNoMatch","text":"Passwords do not match"},"$:/language/Encryption/SetPassword":{"title":"$:/language/Encryption/SetPassword","text":"Set password"},"$:/language/Error/Caption":{"title":"$:/language/Error/Caption","text":"Error"},"$:/language/Error/DeserializeOperator/MissingOperand":{"title":"$:/language/Error/DeserializeOperator/MissingOperand","text":"Filter Error: Missing operand for 'deserialize' operator"},"$:/language/Error/DeserializeOperator/UnknownDeserializer":{"title":"$:/language/Error/DeserializeOperator/UnknownDeserializer","text":"Filter Error: Unknown deserializer provided as operand for the 'deserialize' operator"},"$:/language/Error/Filter":{"title":"$:/language/Error/Filter","text":"Filter error"},"$:/language/Error/FilterSyntax":{"title":"$:/language/Error/FilterSyntax","text":"Syntax error in filter expression"},"$:/language/Error/FilterRunPrefix":{"title":"$:/language/Error/FilterRunPrefix","text":"Filter Error: Unknown prefix for filter run"},"$:/language/Error/IsFilterOperator":{"title":"$:/language/Error/IsFilterOperator","text":"Filter Error: Unknown parameter for the 'is' filter operator"},"$:/language/Error/FormatFilterOperator":{"title":"$:/language/Error/FormatFilterOperator","text":"Filter Error: Unknown suffix for the 'format' filter operator"},"$:/language/Error/LoadingPluginLibrary":{"title":"$:/language/Error/LoadingPluginLibrary","text":"Error loading plugin library"},"$:/language/Error/NetworkErrorAlert":{"title":"$:/language/Error/NetworkErrorAlert","text":"`<h2>''Network Error''</h2>It looks like the connection to the server has been lost. This may indicate a problem with your network connection. Please attempt to restore network connectivity before continuing.<br><br>''Any unsaved changes will be automatically synchronised when connectivity is restored''.`"},"$:/language/Error/PutEditConflict":{"title":"$:/language/Error/PutEditConflict","text":"File changed on server"},"$:/language/Error/PutForbidden":{"title":"$:/language/Error/PutForbidden","text":"Permission denied"},"$:/language/Error/PutUnauthorized":{"title":"$:/language/Error/PutUnauthorized","text":"Authentication required"},"$:/language/Error/RecursiveTransclusion":{"title":"$:/language/Error/RecursiveTransclusion","text":"Recursive transclusion error in transclude widget"},"$:/language/Error/RetrievingSkinny":{"title":"$:/language/Error/RetrievingSkinny","text":"Error retrieving skinny tiddler list"},"$:/language/Error/SavingToTWEdit":{"title":"$:/language/Error/SavingToTWEdit","text":"Error saving to TWEdit"},"$:/language/Error/WhileSaving":{"title":"$:/language/Error/WhileSaving","text":"Error while saving"},"$:/language/Error/XMLHttpRequest":{"title":"$:/language/Error/XMLHttpRequest","text":"XMLHttpRequest error code"},"$:/language/Error/ZoominTextNode":{"title":"$:/language/Error/ZoominTextNode","text":"Story View Error: It appears you tried to interact with a tiddler that displays in a custom container. This is most likely caused by using `$:/tags/StoryTiddlerTemplateFilter` with a template that contains text or whitespace at the start. Please use the pragma `\\whitespace trim` and ensure the whole contents of the tiddler is wrapped in a single HTML element. The text that caused this issue:"},"$:/language/InternalJavaScriptError/Title":{"title":"$:/language/InternalJavaScriptError/Title","text":"Internal JavaScript Error"},"$:/language/InternalJavaScriptError/Hint":{"title":"$:/language/InternalJavaScriptError/Hint","text":"Well, this is embarrassing. It is recommended that you restart TiddlyWiki by refreshing your browser"},"$:/language/LayoutSwitcher/Description":{"title":"$:/language/LayoutSwitcher/Description","text":"Open the layout switcher"},"$:/language/LazyLoadingWarning":{"title":"$:/language/LazyLoadingWarning","text":"<p>Trying to load external content from ''<$text text={{!!_canonical_uri}}/>''</p><p>If this message doesn't disappear, either the tiddler content type doesn't match the type of the external content, or you may be using a browser that doesn't support external content for wikis loaded as standalone files. See https://tiddlywiki.com/#ExternalText</p>"},"$:/language/LoginToTiddlySpace":{"title":"$:/language/LoginToTiddlySpace","text":"Login to TiddlySpace"},"$:/language/Manager/Controls/FilterByTag/None":{"title":"$:/language/Manager/Controls/FilterByTag/None","text":"(none)"},"$:/language/Manager/Controls/FilterByTag/Prompt":{"title":"$:/language/Manager/Controls/FilterByTag/Prompt","text":"Filter by tag:"},"$:/language/Manager/Controls/Order/Prompt":{"title":"$:/language/Manager/Controls/Order/Prompt","text":"Reverse order"},"$:/language/Manager/Controls/Search/Placeholder":{"title":"$:/language/Manager/Controls/Search/Placeholder","text":"Search"},"$:/language/Manager/Controls/Search/Prompt":{"title":"$:/language/Manager/Controls/Search/Prompt","text":"Search:"},"$:/language/Manager/Controls/Show/Option/Tags":{"title":"$:/language/Manager/Controls/Show/Option/Tags","text":"tags"},"$:/language/Manager/Controls/Show/Option/Tiddlers":{"title":"$:/language/Manager/Controls/Show/Option/Tiddlers","text":"tiddlers"},"$:/language/Manager/Controls/Show/Prompt":{"title":"$:/language/Manager/Controls/Show/Prompt","text":"Show:"},"$:/language/Manager/Controls/Sort/Prompt":{"title":"$:/language/Manager/Controls/Sort/Prompt","text":"Sort by:"},"$:/language/Manager/Item/Colour":{"title":"$:/language/Manager/Item/Colour","text":"Colour"},"$:/language/Manager/Item/Fields":{"title":"$:/language/Manager/Item/Fields","text":"Fields"},"$:/language/Manager/Item/Icon/None":{"title":"$:/language/Manager/Item/Icon/None","text":"(none)"},"$:/language/Manager/Item/Icon":{"title":"$:/language/Manager/Item/Icon","text":"Icon"},"$:/language/Manager/Item/RawText":{"title":"$:/language/Manager/Item/RawText","text":"Raw text"},"$:/language/Manager/Item/Tags":{"title":"$:/language/Manager/Item/Tags","text":"Tags"},"$:/language/Manager/Item/Tools":{"title":"$:/language/Manager/Item/Tools","text":"Tools"},"$:/language/Manager/Item/WikifiedText":{"title":"$:/language/Manager/Item/WikifiedText","text":"Wikified text"},"$:/language/MissingTiddler/Hint":{"title":"$:/language/MissingTiddler/Hint","text":"Missing tiddler \"<$text text=<<currentTiddler>>/>\" -- click {{||$:/core/ui/Buttons/edit}} to create"},"$:/language/No":{"title":"$:/language/No","text":"No"},"$:/language/OfficialPluginLibrary":{"title":"$:/language/OfficialPluginLibrary","text":"Official ~TiddlyWiki Plugin Library"},"$:/language/OfficialPluginLibrary/Hint":{"title":"$:/language/OfficialPluginLibrary/Hint","text":"The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team."},"$:/language/PageTemplate/Description":{"title":"$:/language/PageTemplate/Description","text":"the default ~TiddlyWiki layout"},"$:/language/PageTemplate/Name":{"title":"$:/language/PageTemplate/Name","text":"Standard Layout"},"$:/language/PluginReloadWarning":{"title":"$:/language/PluginReloadWarning","text":"Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect"},"$:/language/RecentChanges/DateFormat":{"title":"$:/language/RecentChanges/DateFormat","text":"DDth MMM YYYY"},"$:/language/Shortcuts/Input/AdvancedSearch/Hint":{"title":"$:/language/Shortcuts/Input/AdvancedSearch/Hint","text":"Open the ~AdvancedSearch panel from within the sidebar search field"},"$:/language/Shortcuts/Input/Accept/Hint":{"title":"$:/language/Shortcuts/Input/Accept/Hint","text":"Accept the selected item"},"$:/language/Shortcuts/Input/AcceptVariant/Hint":{"title":"$:/language/Shortcuts/Input/AcceptVariant/Hint","text":"Accept the selected item (variant)"},"$:/language/Shortcuts/Input/Cancel/Hint":{"title":"$:/language/Shortcuts/Input/Cancel/Hint","text":"Clear the input field"},"$:/language/Shortcuts/Input/Down/Hint":{"title":"$:/language/Shortcuts/Input/Down/Hint","text":"Select the next item"},"$:/language/Shortcuts/Input/Tab-Left/Hint":{"title":"$:/language/Shortcuts/Input/Tab-Left/Hint","text":"Select the previous Tab"},"$:/language/Shortcuts/Input/Tab-Right/Hint":{"title":"$:/language/Shortcuts/Input/Tab-Right/Hint","text":"Select the next Tab"},"$:/language/Shortcuts/Input/Up/Hint":{"title":"$:/language/Shortcuts/Input/Up/Hint","text":"Select the previous item"},"$:/language/Shortcuts/SidebarLayout/Hint":{"title":"$:/language/Shortcuts/SidebarLayout/Hint","text":"Change the sidebar layout"},"$:/language/Switcher/Subtitle/theme":{"title":"$:/language/Switcher/Subtitle/theme","text":"Switch Theme"},"$:/language/Switcher/Subtitle/layout":{"title":"$:/language/Switcher/Subtitle/layout","text":"Switch Layout"},"$:/language/Switcher/Subtitle/language":{"title":"$:/language/Switcher/Subtitle/language","text":"Switch Language"},"$:/language/Switcher/Subtitle/palette":{"title":"$:/language/Switcher/Subtitle/palette","text":"Switch Palette"},"$:/language/SystemTiddler/Tooltip":{"title":"$:/language/SystemTiddler/Tooltip","text":"This is a system tiddler"},"$:/language/SystemTiddlers/Include/Prompt":{"title":"$:/language/SystemTiddlers/Include/Prompt","text":"Include system tiddlers"},"$:/language/TagManager/Colour/Heading":{"title":"$:/language/TagManager/Colour/Heading","text":"Colour"},"$:/language/TagManager/Count/Heading":{"title":"$:/language/TagManager/Count/Heading","text":"Count"},"$:/language/TagManager/Icon/Heading":{"title":"$:/language/TagManager/Icon/Heading","text":"Icon"},"$:/language/TagManager/Icons/None":{"title":"$:/language/TagManager/Icons/None","text":"None"},"$:/language/TagManager/Info/Heading":{"title":"$:/language/TagManager/Info/Heading","text":"Info"},"$:/language/TagManager/Tag/Heading":{"title":"$:/language/TagManager/Tag/Heading","text":"Tag"},"$:/language/Tiddler/DateFormat":{"title":"$:/language/Tiddler/DateFormat","text":"DDth MMM YYYY at hh12:0mmam"},"$:/language/UnsavedChangesWarning":{"title":"$:/language/UnsavedChangesWarning","text":"You have unsaved changes in TiddlyWiki"},"$:/language/Yes":{"title":"$:/language/Yes","text":"Yes"},"$:/language/Modals/Download":{"title":"$:/language/Modals/Download","subtitle":"Download changes","footer":"<$button message=\"tm-close-tiddler\">Close</$button>","help":"https://tiddlywiki.com/static/DownloadingChanges.html","text":"Your browser only supports manual saving.\n\nTo save your modified wiki, right click on the download link below and select \"Download file\" or \"Save file\", and then choose the folder and filename.\n\n//You can marginally speed things up by clicking the link with the control key (Windows) or the options/alt key (Mac OS X). You will not be prompted for the folder or filename, but your browser is likely to give it an unrecognisable name -- you may need to rename the file to include an `.html` extension before you can do anything useful with it.//\n\nOn smartphones that do not allow files to be downloaded you can instead bookmark the link, and then sync your bookmarks to a desktop computer from where the wiki can be saved normally.\n"},"$:/config/NewJournal/Title":{"title":"$:/config/NewJournal/Title","text":"DDth MMM YYYY"},"$:/config/NewJournal/Text":{"title":"$:/config/NewJournal/Text","text":""},"$:/config/NewJournal/Tags":{"title":"$:/config/NewJournal/Tags","text":"Journal\n"},"$:/language/Notifications/Save/Done":{"title":"$:/language/Notifications/Save/Done","text":"Saved wiki"},"$:/language/Notifications/Save/Starting":{"title":"$:/language/Notifications/Save/Starting","text":"Starting to save wiki"},"$:/language/Notifications/CopiedToClipboard/Succeeded":{"title":"$:/language/Notifications/CopiedToClipboard/Succeeded","text":"Copied to clipboard!"},"$:/language/Notifications/CopiedToClipboard/Failed":{"title":"$:/language/Notifications/CopiedToClipboard/Failed","text":"Failed to copy to clipboard!"},"$:/language/Search/DefaultResults/Caption":{"title":"$:/language/Search/DefaultResults/Caption","text":"List"},"$:/language/Search/Filter/Caption":{"title":"$:/language/Search/Filter/Caption","text":"Filter"},"$:/language/Search/Filter/Hint":{"title":"$:/language/Search/Filter/Hint","text":"Search via a [[filter expression|https://tiddlywiki.com/static/Filters.html]]"},"$:/language/Search/Filter/Matches":{"title":"$:/language/Search/Filter/Matches","text":"//<small><<resultCount>> matches</small>//"},"$:/language/Search/Matches":{"title":"$:/language/Search/Matches","text":"//<small><<resultCount>> matches</small>//"},"$:/language/Search/Matches/All":{"title":"$:/language/Search/Matches/All","text":"All matches:"},"$:/language/Search/Matches/NoMatch":{"title":"$:/language/Search/Matches/NoMatch","text":"//No match//"},"$:/language/Search/Matches/NoResult":{"title":"$:/language/Search/Matches/NoResult","text":"//No search result//"},"$:/language/Search/Matches/Title":{"title":"$:/language/Search/Matches/Title","text":"Title matches:"},"$:/language/Search/Search":{"title":"$:/language/Search/Search","text":"Search"},"$:/language/Search/Search/TooShort":{"title":"$:/language/Search/Search/TooShort","text":"Search text too short"},"$:/language/Search/Shadows/Caption":{"title":"$:/language/Search/Shadows/Caption","text":"Shadows"},"$:/language/Search/Shadows/Hint":{"title":"$:/language/Search/Shadows/Hint","text":"Search for shadow tiddlers"},"$:/language/Search/Shadows/Matches":{"title":"$:/language/Search/Shadows/Matches","text":"//<small><<resultCount>> matches</small>//"},"$:/language/Search/Standard/Caption":{"title":"$:/language/Search/Standard/Caption","text":"Standard"},"$:/language/Search/Standard/Hint":{"title":"$:/language/Search/Standard/Hint","text":"Search for standard tiddlers"},"$:/language/Search/Standard/Matches":{"title":"$:/language/Search/Standard/Matches","text":"//<small><<resultCount>> matches</small>//"},"$:/language/Search/System/Caption":{"title":"$:/language/Search/System/Caption","text":"System"},"$:/language/Search/System/Hint":{"title":"$:/language/Search/System/Hint","text":"Search for system tiddlers"},"$:/language/Search/System/Matches":{"title":"$:/language/Search/System/Matches","text":"//<small><<resultCount>> matches</small>//"},"$:/language/SideBar/Caption":{"title":"$:/language/SideBar/Caption","text":"Sidebar"},"$:/language/SideBar/All/Caption":{"title":"$:/language/SideBar/All/Caption","text":"All"},"$:/language/SideBar/Contents/Caption":{"title":"$:/language/SideBar/Contents/Caption","text":"Contents"},"$:/language/SideBar/Drafts/Caption":{"title":"$:/language/SideBar/Drafts/Caption","text":"Drafts"},"$:/language/SideBar/Explorer/Caption":{"title":"$:/language/SideBar/Explorer/Caption","text":"Explorer"},"$:/language/SideBar/Missing/Caption":{"title":"$:/language/SideBar/Missing/Caption","text":"Missing"},"$:/language/SideBar/More/Caption":{"title":"$:/language/SideBar/More/Caption","text":"More"},"$:/language/SideBar/Open/Caption":{"title":"$:/language/SideBar/Open/Caption","text":"Open"},"$:/language/SideBar/Orphans/Caption":{"title":"$:/language/SideBar/Orphans/Caption","text":"Orphans"},"$:/language/SideBar/Recent/Caption":{"title":"$:/language/SideBar/Recent/Caption","text":"Recent"},"$:/language/SideBar/Shadows/Caption":{"title":"$:/language/SideBar/Shadows/Caption","text":"Shadows"},"$:/language/SideBar/System/Caption":{"title":"$:/language/SideBar/System/Caption","text":"System"},"$:/language/SideBar/Tags/Caption":{"title":"$:/language/SideBar/Tags/Caption","text":"Tags"},"$:/language/SideBar/Tags/Untagged/Caption":{"title":"$:/language/SideBar/Tags/Untagged/Caption","text":"untagged"},"$:/language/SideBar/Tools/Caption":{"title":"$:/language/SideBar/Tools/Caption","text":"Tools"},"$:/language/SideBar/Types/Caption":{"title":"$:/language/SideBar/Types/Caption","text":"Types"},"$:/SiteSubtitle":{"title":"$:/SiteSubtitle","text":"a non-linear personal web notebook"},"$:/SiteTitle":{"title":"$:/SiteTitle","text":"My TiddlyWiki"},"$:/language/Snippets/FunctionDefinition":{"title":"$:/language/Snippets/FunctionDefinition","tags":"$:/tags/TextEditor/Snippet","caption":"Function definition","text":"\\function f.name(param1,param2:\"default value\") [<param1>!is[blank]else<param2>]\n\n<<f.name>>\n"},"$:/language/Snippets/ListByTag":{"title":"$:/language/Snippets/ListByTag","tags":"$:/tags/TextEditor/Snippet","caption":"List of tiddlers by tag","text":"<<list-links \"[tag[task]sort[title]]\">>\n"},"$:/language/Snippets/MacroDefinition":{"title":"$:/language/Snippets/MacroDefinition","tags":"$:/tags/TextEditor/Snippet","caption":"Macro definition","text":"\\define macroName(param1:\"default value\",param2)\nText of the macro\n\\end\n"},"$:/language/Snippets/ProcedureDefinition":{"title":"$:/language/Snippets/ProcedureDefinition","tags":"$:/tags/TextEditor/Snippet","caption":"Procedure definition","text":"\\procedure procName(param1:\"default value\",param2)\nYour text comes here.\n\\end\n"},"$:/language/Snippets/Table4x3":{"title":"$:/language/Snippets/Table4x3","tags":"$:/tags/TextEditor/Snippet","caption":"Table with 4 columns by 3 rows","text":"|! |!Alpha |!Beta |!Gamma |!Delta |\n|!One | | | | |\n|!Two | | | | |\n|!Three | | | | |\n"},"$:/language/Snippets/TableOfContents":{"title":"$:/language/Snippets/TableOfContents","tags":"$:/tags/TextEditor/Snippet","caption":"Table of Contents","text":"<div class=\"tc-table-of-contents\">\n\n<<toc-selective-expandable 'TableOfContents'>>\n\n</div>"},"$:/language/ThemeTweaks/ThemeTweaks":{"title":"$:/language/ThemeTweaks/ThemeTweaks","text":"Theme Tweaks"},"$:/language/ThemeTweaks/ThemeTweaks/Hint":{"title":"$:/language/ThemeTweaks/ThemeTweaks/Hint","text":"You can tweak certain aspects of the ''Vanilla'' theme."},"$:/language/ThemeTweaks/Options":{"title":"$:/language/ThemeTweaks/Options","text":"Options"},"$:/language/ThemeTweaks/Options/SidebarLayout":{"title":"$:/language/ThemeTweaks/Options/SidebarLayout","text":"Sidebar layout"},"$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid":{"title":"$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid","text":"Fixed story, fluid sidebar"},"$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed":{"title":"$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed","text":"Fluid story, fixed sidebar"},"$:/language/ThemeTweaks/Options/StickyTitles":{"title":"$:/language/ThemeTweaks/Options/StickyTitles","text":"Sticky titles"},"$:/language/ThemeTweaks/Options/StickyTitles/Hint":{"title":"$:/language/ThemeTweaks/Options/StickyTitles/Hint","text":"Causes tiddler titles to \"stick\" to the top of the browser window"},"$:/language/ThemeTweaks/Options/CodeWrapping":{"title":"$:/language/ThemeTweaks/Options/CodeWrapping","text":"Wrap long lines in code blocks"},"$:/language/ThemeTweaks/Settings":{"title":"$:/language/ThemeTweaks/Settings","text":"Settings"},"$:/language/ThemeTweaks/Settings/FontFamily":{"title":"$:/language/ThemeTweaks/Settings/FontFamily","text":"Font family"},"$:/language/ThemeTweaks/Settings/CodeFontFamily":{"title":"$:/language/ThemeTweaks/Settings/CodeFontFamily","text":"Code font family"},"$:/language/ThemeTweaks/Settings/EditorFontFamily":{"title":"$:/language/ThemeTweaks/Settings/EditorFontFamily","text":"Editor font family"},"$:/language/ThemeTweaks/Settings/BackgroundImage":{"title":"$:/language/ThemeTweaks/Settings/BackgroundImage","text":"Page background image"},"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment":{"title":"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment","text":"Page background image attachment"},"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll":{"title":"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll","text":"Scroll with tiddlers"},"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed":{"title":"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed","text":"Fixed to window"},"$:/language/ThemeTweaks/Settings/BackgroundImageSize":{"title":"$:/language/ThemeTweaks/Settings/BackgroundImageSize","text":"Page background image size"},"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto":{"title":"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto","text":"Auto"},"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover":{"title":"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover","text":"Cover"},"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain":{"title":"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain","text":"Contain"},"$:/language/ThemeTweaks/Metrics":{"title":"$:/language/ThemeTweaks/Metrics","text":"Sizes"},"$:/language/ThemeTweaks/Metrics/FontSize":{"title":"$:/language/ThemeTweaks/Metrics/FontSize","text":"Font size"},"$:/language/ThemeTweaks/Metrics/LineHeight":{"title":"$:/language/ThemeTweaks/Metrics/LineHeight","text":"Line height"},"$:/language/ThemeTweaks/Metrics/BodyFontSize":{"title":"$:/language/ThemeTweaks/Metrics/BodyFontSize","text":"Font size for tiddler body"},"$:/language/ThemeTweaks/Metrics/BodyLineHeight":{"title":"$:/language/ThemeTweaks/Metrics/BodyLineHeight","text":"Line height for tiddler body"},"$:/language/ThemeTweaks/Metrics/StoryLeft":{"title":"$:/language/ThemeTweaks/Metrics/StoryLeft","text":"Story left position"},"$:/language/ThemeTweaks/Metrics/StoryLeft/Hint":{"title":"$:/language/ThemeTweaks/Metrics/StoryLeft/Hint","text":"how far the left margin of the story river<br>(tiddler area) is from the left of the page"},"$:/language/ThemeTweaks/Metrics/StoryTop":{"title":"$:/language/ThemeTweaks/Metrics/StoryTop","text":"Story top position"},"$:/language/ThemeTweaks/Metrics/StoryTop/Hint":{"title":"$:/language/ThemeTweaks/Metrics/StoryTop/Hint","text":"how far the top margin of the story river<br>is from the top of the page"},"$:/language/ThemeTweaks/Metrics/StoryRight":{"title":"$:/language/ThemeTweaks/Metrics/StoryRight","text":"Story right"},"$:/language/ThemeTweaks/Metrics/StoryRight/Hint":{"title":"$:/language/ThemeTweaks/Metrics/StoryRight/Hint","text":"how far the left margin of the sidebar <br>is from the left of the page"},"$:/language/ThemeTweaks/Metrics/StoryWidth":{"title":"$:/language/ThemeTweaks/Metrics/StoryWidth","text":"Story width"},"$:/language/ThemeTweaks/Metrics/StoryWidth/Hint":{"title":"$:/language/ThemeTweaks/Metrics/StoryWidth/Hint","text":"the overall width of the story river"},"$:/language/ThemeTweaks/Metrics/TiddlerWidth":{"title":"$:/language/ThemeTweaks/Metrics/TiddlerWidth","text":"Tiddler width"},"$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint":{"title":"$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint","text":"within the story river"},"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint":{"title":"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint","text":"Sidebar breakpoint"},"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint":{"title":"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint","text":"the minimum page width at which the story<br>river and sidebar will appear side by side"},"$:/language/ThemeTweaks/Metrics/SidebarWidth":{"title":"$:/language/ThemeTweaks/Metrics/SidebarWidth","text":"Sidebar width"},"$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint":{"title":"$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint","text":"the width of the sidebar in fluid-fixed layout"},"$:/language/TiddlerInfo/Advanced/Caption":{"title":"$:/language/TiddlerInfo/Advanced/Caption","text":"Advanced"},"$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint":{"title":"$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint","text":"none"},"$:/language/TiddlerInfo/Advanced/PluginInfo/Heading":{"title":"$:/language/TiddlerInfo/Advanced/PluginInfo/Heading","text":"Plugin Details"},"$:/language/TiddlerInfo/Advanced/PluginInfo/Hint":{"title":"$:/language/TiddlerInfo/Advanced/PluginInfo/Hint","text":"This plugin contains the following shadow tiddlers:"},"$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading":{"title":"$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading","text":"Shadow Status"},"$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint":{"title":"$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint","text":"The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is not a shadow tiddler"},"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint":{"title":"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint","text":"The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is a shadow tiddler"},"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source":{"title":"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source","text":"It is defined in the plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>"},"$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint":{"title":"$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint","text":"It is overridden by an ordinary tiddler"},"$:/language/TiddlerInfo/Fields/Caption":{"title":"$:/language/TiddlerInfo/Fields/Caption","text":"Fields"},"$:/language/TiddlerInfo/List/Caption":{"title":"$:/language/TiddlerInfo/List/Caption","text":"List"},"$:/language/TiddlerInfo/List/Empty":{"title":"$:/language/TiddlerInfo/List/Empty","text":"This tiddler does not have a list"},"$:/language/TiddlerInfo/Listed/Caption":{"title":"$:/language/TiddlerInfo/Listed/Caption","text":"Listed"},"$:/language/TiddlerInfo/Listed/Empty":{"title":"$:/language/TiddlerInfo/Listed/Empty","text":"This tiddler is not listed by any others"},"$:/language/TiddlerInfo/References/Caption":{"title":"$:/language/TiddlerInfo/References/Caption","text":"Backlinks"},"$:/language/TiddlerInfo/References/Empty":{"title":"$:/language/TiddlerInfo/References/Empty","text":"No tiddlers link to this one"},"$:/language/TiddlerInfo/Tagging/Caption":{"title":"$:/language/TiddlerInfo/Tagging/Caption","text":"Tagging"},"$:/language/TiddlerInfo/Tagging/Empty":{"title":"$:/language/TiddlerInfo/Tagging/Empty","text":"No tiddlers are tagged with this one"},"$:/language/TiddlerInfo/Tools/Caption":{"title":"$:/language/TiddlerInfo/Tools/Caption","text":"Tools"},"$:/language/Docs/Types/application/javascript":{"title":"$:/language/Docs/Types/application/javascript","description":"JavaScript code","name":"application/javascript","group":"Developer","group-sort":"2"},"$:/language/Docs/Types/application/json":{"title":"$:/language/Docs/Types/application/json","description":"JSON data","name":"application/json","group":"Developer","group-sort":"2"},"$:/language/Docs/Types/application/x-tiddler-dictionary":{"title":"$:/language/Docs/Types/application/x-tiddler-dictionary","description":"Data dictionary","name":"application/x-tiddler-dictionary","group":"Developer","group-sort":"2"},"$:/language/Docs/Types/image/gif":{"title":"$:/language/Docs/Types/image/gif","description":"GIF image","name":"image/gif","group":"Image","group-sort":"1"},"$:/language/Docs/Types/image/jpeg":{"title":"$:/language/Docs/Types/image/jpeg","description":"JPEG image","name":"image/jpeg","group":"Image","group-sort":"1"},"$:/language/Docs/Types/image/png":{"title":"$:/language/Docs/Types/image/png","description":"PNG image","name":"image/png","group":"Image","group-sort":"1"},"$:/language/Docs/Types/image/svg+xml":{"title":"$:/language/Docs/Types/image/svg+xml","description":"SVG image","name":"image/svg+xml","group":"Image","group-sort":"1"},"$:/language/Docs/Types/text/css":{"title":"$:/language/Docs/Types/text/css","description":"Static stylesheet","name":"text/css","group":"Developer","group-sort":"2"},"$:/language/Docs/Types/text/html":{"title":"$:/language/Docs/Types/text/html","description":"HTML markup","name":"text/html","group":"Text","group-sort":"0"},"$:/language/Docs/Types/text/plain":{"title":"$:/language/Docs/Types/text/plain","description":"Plain text","name":"text/plain","group":"Text","group-sort":"0"},"$:/language/Docs/Types/text/vnd.tiddlywiki":{"title":"$:/language/Docs/Types/text/vnd.tiddlywiki","description":"TiddlyWiki 5","name":"text/vnd.tiddlywiki","group":"Text","group-sort":"0"},"$:/language/Docs/Types/text/vnd.tiddlywiki-multiple":{"title":"$:/language/Docs/Types/text/vnd.tiddlywiki-multiple","description":"Compound tiddler","name":"text/vnd.tiddlywiki-multiple","group":"Developer","group-sort":"2"},"$:/languages/en-GB/icon":{"title":"$:/languages/en-GB/icon","type":"image/svg+xml","text":"<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 60 30\" width=\"1200\" height=\"600\">\n<clipPath id=\"t\">\n\t<path d=\"M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z\"/>\n</clipPath>\n<path d=\"M0,0 v30 h60 v-30 z\" fill=\"#00247d\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" stroke=\"#fff\" stroke-width=\"6\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" clip-path=\"url(#t)\" stroke=\"#cf142b\" stroke-width=\"4\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#fff\" stroke-width=\"10\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#cf142b\" stroke-width=\"6\"/>\n</svg>\n"},"$:/languages/en-GB":{"title":"$:/languages/en-GB","name":"en-GB","description":"English (British)","author":"JeremyRuston","core-version":">=5.0.0\"","text":"Stub pseudo-plugin for the default language"},"$:/core/modules/commander.js":{"title":"$:/core/modules/commander.js","text":"/*\\\ntitle: $:/core/modules/commander.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Commander class is a command interpreter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a sequence of commands\n\tcommandTokens: an array of command string tokens\n\twiki: reference to the wiki store object\n\tstreams: {output:, error:}, each of which has a write(string) method\n\tcallback: a callback invoked as callback(err) where err is null if there was no error\n*/\nvar Commander = function(commandTokens,callback,wiki,streams) {\n\tvar path = require(\"path\");\n\tthis.commandTokens = commandTokens;\n\tthis.nextToken = 0;\n\tthis.callback = callback;\n\tthis.wiki = wiki;\n\tthis.streams = streams;\n\tthis.outputPath = path.resolve($tw.boot.wikiPath,$tw.config.wikiOutputSubDir);\n};\n\n/*\nLog a string if verbose flag is set\n*/\nCommander.prototype.log = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str + \"\\n\");\n\t}\n};\n\n/*\nWrite a string if verbose flag is set\n*/\nCommander.prototype.write = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str);\n\t}\n};\n\n/*\nAdd a string of tokens to the command queue\n*/\nCommander.prototype.addCommandTokens = function(commandTokens) {\n\tvar params = commandTokens.slice(0);\n\tparams.unshift(0);\n\tparams.unshift(this.nextToken);\n\tArray.prototype.splice.apply(this.commandTokens,params);\n};\n\n/*\nExecute the sequence of commands and invoke a callback on completion\n*/\nCommander.prototype.execute = function() {\n\tthis.executeNextCommand();\n};\n\n/*\nExecute the next command in the sequence\n*/\nCommander.prototype.executeNextCommand = function() {\n\tvar self = this;\n\t// Invoke the callback if there are no more commands\n\tif(this.nextToken >= this.commandTokens.length) {\n\t\tthis.callback(null);\n\t} else {\n\t\t// Get and check the command token\n\t\tvar commandName = this.commandTokens[this.nextToken++];\n\t\tif(commandName.substr(0,2) !== \"--\") {\n\t\t\tthis.callback(\"Missing command: \" + commandName);\n\t\t} else {\n\t\t\tcommandName = commandName.substr(2); // Trim off the --\n\t\t\t// Accumulate the parameters to the command\n\t\t\tvar params = [];\n\t\t\twhile(this.nextToken < this.commandTokens.length && \n\t\t\t\tthis.commandTokens[this.nextToken].substr(0,2) !== \"--\") {\n\t\t\t\tparams.push(this.commandTokens[this.nextToken++]);\n\t\t\t}\n\t\t\t// Get the command info\n\t\t\tvar command = $tw.commands[commandName],\n\t\t\t\tc,err;\n\t\t\tif(!command) {\n\t\t\t\tthis.callback(\"Unknown command: \" + commandName);\n\t\t\t} else {\n\t\t\t\tif(this.verbose) {\n\t\t\t\t\tthis.streams.output.write(\"Executing command: \" + commandName + \" \" + params.join(\" \") + \"\\n\");\n\t\t\t\t}\n\t\t\t\t// Parse named parameters if required\n\t\t\t\tif(command.info.namedParameterMode) {\n\t\t\t\t\tparams = this.extractNamedParameters(params,command.info.mandatoryParameters);\n\t\t\t\t\tif(typeof params === \"string\") {\n\t\t\t\t\t\treturn this.callback(params);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(command.info.synchronous) {\n\t\t\t\t\t// Synchronous command\n\t\t\t\t\tc = new command.Command(params,this);\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.executeNextCommand();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Asynchronous command\n\t\t\t\t\tc = new command.Command(params,this,function(err) {\n\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\tself.callback(err);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.executeNextCommand();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nGiven an array of parameter strings `params` in name:value format, and an array of mandatory parameter names in `mandatoryParameters`, returns a hashmap of values or a string if error\n*/\nCommander.prototype.extractNamedParameters = function(params,mandatoryParameters) {\n\tmandatoryParameters = mandatoryParameters || [];\n\tvar errors = [],\n\t\tparamsByName = Object.create(null);\n\t// Extract the parameters\n\t$tw.utils.each(params,function(param) {\n\t\tvar index = param.indexOf(\"=\");\n\t\tif(index < 1) {\n\t\t\terrors.push(\"malformed named parameter: '\" + param + \"'\");\n\t\t}\n\t\tparamsByName[param.slice(0,index)] = $tw.utils.trim(param.slice(index+1));\n\t});\n\t// Check the mandatory parameters are present\n\t$tw.utils.each(mandatoryParameters,function(mandatoryParameter) {\n\t\tif(!$tw.utils.hop(paramsByName,mandatoryParameter)) {\n\t\t\terrors.push(\"missing mandatory parameter: '\" + mandatoryParameter + \"'\");\n\t\t}\n\t});\n\t// Return any errors\n\tif(errors.length > 0) {\n\t\treturn errors.join(\" and\\n\");\n\t} else {\n\t\treturn paramsByName;\n\t}\n};\n\nCommander.initCommands = function(moduleType) {\n\tmoduleType = moduleType || \"command\";\n\t$tw.commands = {};\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tvar c = $tw.commands[module.info.name] = {};\n\t\t// Add the methods defined by the module\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\tc[f] = module[f];\n\t\t\t}\n\t\t}\n\t});\n};\n\nexports.Commander = Commander;\n\n})();\n","type":"application/javascript","module-type":"global"},"$:/core/modules/commands/build.js":{"title":"$:/core/modules/commands/build.js","text":"/*\\\ntitle: $:/core/modules/commands/build.js\ntype: application/javascript\nmodule-type: command\n\nCommand to build a build target\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"build\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\t// Get the build targets defined in the wiki\n\tvar buildTargets = $tw.boot.wikiInfo && $tw.boot.wikiInfo.build;\n\tif(!buildTargets) {\n\t\treturn \"No build targets defined\";\n\t}\n\t// Loop through each of the specified targets\n\tvar targets;\n\tif(this.params.length > 0) {\n\t\ttargets = this.params;\n\t} else {\n\t\ttargets = Object.keys(buildTargets);\n\t}\n\tfor(var targetIndex=0; targetIndex<targets.length; targetIndex++) {\n\t\tvar target = targets[targetIndex],\n\t\t\tcommands = buildTargets[target];\n\t\tif(!commands) {\n\t\t\treturn \"Build target '\" + target + \"' not found\";\n\t\t}\n\t\t// Add the commands to the queue\n\t\tthis.commander.addCommandTokens(commands);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/clearpassword.js":{"title":"$:/core/modules/commands/clearpassword.js","text":"/*\\\ntitle: $:/core/modules/commands/clearpassword.js\ntype: application/javascript\nmodule-type: command\n\nClear password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"clearpassword\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\t$tw.crypto.setPassword(null);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/commands.js":{"title":"$:/core/modules/commands/commands.js","text":"/*\\\ntitle: $:/core/modules/commands/commands.js\ntype: application/javascript\nmodule-type: command\n\nRuns the commands returned from a filter\n\n\\*/\n\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"commands\",\n\tsynchronous: true\n};\n\nvar Command = function(params, commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\t// Parse the filter\n\tvar filter = this.params[0];\n\tif(!filter) {\n\t\treturn \"No filter specified\";\n\t}\n\tvar commands = this.commander.wiki.filterTiddlers(filter)\n\tif(commands.length === 0) {\n\t\treturn \"No tiddlers found for filter '\" + filter + \"'\";\n\t}\n\tthis.commander.addCommandTokens(commands);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/deletetiddlers.js":{"title":"$:/core/modules/commands/deletetiddlers.js","text":"/*\\\ntitle: $:/core/modules/commands/deletetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to delete tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"deletetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filter\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\twiki.deleteTiddler(title);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/editions.js":{"title":"$:/core/modules/commands/editions.js","text":"/*\\\ntitle: $:/core/modules/commands/editions.js\ntype: application/javascript\nmodule-type: command\n\nCommand to list the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"editions\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\t// Output the list\n\tthis.commander.streams.output.write(\"Available editions:\\n\\n\");\n\tvar editionInfo = $tw.utils.getEditionInfo();\n\t$tw.utils.each(editionInfo,function(info,name) {\n\t\tself.commander.streams.output.write(\"    \" + name + \": \" + info.description + \"\\n\");\n\t});\n\tthis.commander.streams.output.write(\"\\n\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/fetch.js":{"title":"$:/core/modules/commands/fetch.js","text":"/*\\\ntitle: $:/core/modules/commands/fetch.js\ntype: application/javascript\nmodule-type: command\n\nCommands to fetch external tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"fetch\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing subcommand and url\";\n\t}\n\tswitch(this.params[0]) {\n\t\tcase \"raw-file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turl: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turl: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"raw-files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t}\n\treturn null;\n};\n\nCommand.prototype.fetchFiles = function(options) {\n\tvar self = this;\n\t// Get the list of URLs\n\tvar urls;\n\tif(options.url) {\n\t\turls = [options.url]\n\t} else if(options.urlFilter) {\n\t\turls = this.commander.wiki.filterTiddlers(options.urlFilter);\n\t} else {\n\t\treturn \"Missing URL\";\n\t}\n\t// Process each URL in turn\n\tvar next = 0;\n\tvar getNextFile = function(err) {\n\t\tif(err) {\n\t\t\treturn options.callback(err);\n\t\t}\n\t\tif(next < urls.length) {\n\t\t\tself.fetchFile(urls[next++],options,getNextFile);\n\t\t} else {\n\t\t\toptions.callback(null);\n\t\t}\n\t};\n\tgetNextFile(null);\n\t// Success\n\treturn null;\n};\n\nCommand.prototype.fetchFile = function(url,options,callback,redirectCount) {\n\tif(redirectCount > 10) {\n\t\treturn callback(\"Error too many redirects retrieving \" + url);\n\t}\n\tvar self = this,\n\t\tlib = url.substr(0,8) === \"https://\" ? require(\"https\") : require(\"http\");\n\tlib.get(url).on(\"response\",function(response) {\n\t    var type = (response.headers[\"content-type\"] || \"\").split(\";\")[0],\n\t    \tdata = [];\n\t    self.commander.write(\"Reading \" + url + \": \");\n\t    response.on(\"data\",function(chunk) {\n\t        data.push(chunk);\n\t        self.commander.write(\".\");\n\t    });\n\t    response.on(\"end\",function() {\n\t        self.commander.write(\"\\n\");\n\t        if(response.statusCode === 200) {\n\t\t        self.processBody(Buffer.concat(data),type,options,url);\n\t\t        callback(null);\n\t        } else {\n\t        \tif(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {\n\t        \t\treturn self.fetchFile(response.headers.location,options,callback,redirectCount + 1);\n\t        \t} else {\n\t\t        \treturn callback(\"Error \" + response.statusCode + \" retrieving \" + url)\n\t        \t}\n\t        }\n\t   \t});\n\t   \tresponse.on(\"error\",function(e) {\n\t\t\tconsole.log(\"Error on GET request: \" + e);\n\t\t\tcallback(e);\n\t   \t});\n\t});\n\treturn null;\n};\n\nCommand.prototype.processBody = function(body,type,options,url) {\n\tvar self = this;\n\t// Collect the tiddlers in a wiki\n\tvar incomingWiki = new $tw.Wiki();\n\tif(options.raw) {\n\t\tvar typeInfo = type ? $tw.config.contentTypeInfo[type] : null,\n\t\t\tencoding = typeInfo ? typeInfo.encoding : \"utf8\";\n\t\tincomingWiki.addTiddler(new $tw.Tiddler({\n\t\t\ttitle: url,\n\t\t\ttype: type,\n\t\t\ttext: body.toString(encoding)\n\t\t}));\n\t} else {\n\t\t// Deserialise the file to extract the tiddlers\n\t\tvar tiddlers = this.commander.wiki.deserializeTiddlers(type || \"text/html\",body.toString(\"utf8\"),{});\n\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\tincomingWiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t});\n\t}\n\t// Filter the tiddlers to select the ones we want\n\tvar filteredTitles = incomingWiki.filterTiddlers(options.importFilter || \"[all[tiddlers]]\");\n\t// Import the selected tiddlers\n\tvar count = 0;\n\tincomingWiki.each(function(tiddler,title) {\n\t\tif(filteredTitles.indexOf(title) !== -1) {\n\t\t\tvar newTiddler;\n\t\t\tif(options.transformFilter) {\n\t\t\t\tvar transformedTitle = (incomingWiki.filterTiddlers(options.transformFilter,null,self.commander.wiki.makeTiddlerIterator([title])) || [\"\"])[0];\n\t\t\t\tif(transformedTitle) {\n\t\t\t\t\tself.commander.log(\"Importing \" + title + \" as \" + transformedTitle)\n\t\t\t\t\tnewTiddler = new $tw.Tiddler(tiddler,{title: transformedTitle});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.commander.log(\"Importing \" + title)\n\t\t\t\tnewTiddler = tiddler;\n\t\t\t}\n\t\t\tself.commander.wiki.importTiddler(newTiddler);\n\t\t\tcount++;\n\t\t}\n\t});\n\tself.commander.log(\"Imported \" + count + \" tiddlers\")\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/help.js":{"title":"$:/core/modules/commands/help.js","text":"/*\\\ntitle: $:/core/modules/commands/help.js\ntype: application/javascript\nmodule-type: command\n\nHelp command\n\n\\*/\n(function(){\n\n/*jshint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"help\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar subhelp = this.params[0] || \"default\",\n\t\thelpBase = \"$:/language/Help/\",\n\t\ttext;\n\tif(!this.commander.wiki.getTiddler(helpBase + subhelp)) {\n\t\tsubhelp = \"notfound\";\n\t}\n\t// Wikify the help as formatted text (ie block elements generate newlines)\n\ttext = this.commander.wiki.renderTiddler(\"text/plain-formatted\",helpBase + subhelp);\n\t// Remove any leading linebreaks\n\ttext = text.replace(/^(\\r?\\n)*/g,\"\");\n\tthis.commander.streams.output.write(text);\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/import.js":{"title":"$:/core/modules/commands/import.js","text":"/*\\\ntitle: $:/core/modules/commands/import.js\ntype: application/javascript\nmodule-type: command\n\nCommand to import tiddlers from a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"import\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 2) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar filename = self.params[0],\n\t\tdeserializer = self.params[1],\n\t\ttitle = self.params[2] || filename,\n\t\tencoding = self.params[3] || \"utf8\",\n\t\ttext = fs.readFileSync(filename,encoding),\n\t\ttiddlers = this.commander.wiki.deserializeTiddlers(null,text,{title: title},{deserializer: deserializer});\n\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t});\n\tthis.commander.log(tiddlers.length + \" tiddler(s) imported\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/init.js":{"title":"$:/core/modules/commands/init.js","text":"/*\\\ntitle: $:/core/modules/commands/init.js\ntype: application/javascript\nmodule-type: command\n\nCommand to initialise an empty wiki folder\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"init\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\t// Check that we don't already have a valid wiki folder\n\tif($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {\n\t\treturn \"Wiki folder is not empty\";\n\t}\n\t// Loop through each of the specified editions\n\tvar editions = this.params.length > 0 ? this.params : [\"empty\"];\n\tfor(var editionIndex=0; editionIndex<editions.length; editionIndex++) {\n\t\tvar editionName = editions[editionIndex];\n\t\t// Check the edition exists\n\t\tvar editionPath = $tw.findLibraryItem(editionName,$tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar));\n\t\tif(!$tw.utils.isDirectory(editionPath)) {\n\t\t\treturn \"Edition '\" + editionName + \"' not found\";\n\t\t}\n\t\t// Copy the edition content\n\t\tvar err = $tw.utils.copyDirectory(editionPath,$tw.boot.wikiPath);\n\t\tif(!err) {\n\t\t\tthis.commander.streams.output.write(\"Copied edition '\" + editionName + \"' to \" + $tw.boot.wikiPath + \"\\n\");\n\t\t} else {\n\t\t\treturn err;\n\t\t}\n\t}\n\t// Tweak the tiddlywiki.info to remove any included wikis\n\tvar packagePath = $tw.boot.wikiPath + \"/tiddlywiki.info\",\n\t\tpackageJson = $tw.utils.parseJSONSafe(fs.readFileSync(packagePath));\n\tdelete packageJson.includeWikis;\n\tfs.writeFileSync(packagePath,JSON.stringify(packageJson,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/listen.js":{"title":"$:/core/modules/commands/listen.js","text":"/*\\\ntitle: $:/core/modules/commands/listen.js\ntype: application/javascript\nmodule-type: command\n\nListen for HTTP requests and serve tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"listen\",\n\tsynchronous: true,\n\tnamedParameterMode: true,\n\tmandatoryParameters: []\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: self.params\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/load.js":{"title":"$:/core/modules/commands/load.js","text":"/*\\\ntitle: $:/core/modules/commands/load.js\ntype: application/javascript\nmodule-type: command\n\nCommand to load tiddlers from a file or directory\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"load\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar tiddlers = $tw.loadTiddlersFromPath(self.params[0]),\n\t\tcount = 0;\n\t$tw.utils.each(tiddlers,function(tiddlerInfo) {\n\t\t$tw.utils.each(tiddlerInfo.tiddlers,function(tiddler) {\n\t\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t\t\tcount++;\n\t\t});\n\t});\n\tif(!count && self.params[1] !== \"noerror\") {\n\t\tself.callback(\"No tiddlers found in file \\\"\" + self.params[0] + \"\\\"\");\n\t} else {\n\t\tself.callback(null);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/makelibrary.js":{"title":"$:/core/modules/commands/makelibrary.js","text":"/*\\\ntitle: $:/core/modules/commands/makelibrary.js\ntype: application/javascript\nmodule-type: command\n\nCommand to pack all of the plugins in the library into a plugin tiddler of type \"library\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"makelibrary\",\n\tsynchronous: true\n};\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar wiki = this.commander.wiki,\n\t\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\n\t\ttiddlers = $tw.utils.getAllPlugins();\n\t// Save the upgrade library tiddler\n\tvar pluginFields = {\n\t\ttitle: upgradeLibraryTitle,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"library\",\n\t\t\"text\": JSON.stringify({tiddlers: tiddlers})\n\t};\n\twiki.addTiddler(new $tw.Tiddler(pluginFields));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/output.js":{"title":"$:/core/modules/commands/output.js","text":"/*\\\ntitle: $:/core/modules/commands/output.js\ntype: application/javascript\nmodule-type: command\n\nCommand to set the default output location (defaults to current working directory)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"output\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing output path\";\n\t}\n\tthis.commander.outputPath = path.resolve(process.cwd(),this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/password.js":{"title":"$:/core/modules/commands/password.js","text":"/*\\\ntitle: $:/core/modules/commands/password.js\ntype: application/javascript\nmodule-type: command\n\nSave password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"password\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing password\";\n\t}\n\t$tw.crypto.setPassword(this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/render.js":{"title":"$:/core/modules/commands/render.js","text":"/*\\\ntitle: $:/core/modules/commands/render.js\ntype: application/javascript\nmodule-type: command\n\nRender individual tiddlers and save the results to the specified files\n\n\\*/\n(function(){\n\n\t/*jslint node: true, browser: true */\n\t/*global $tw: false */\n\t\"use strict\";\n\t\n\tvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\t\n\texports.info = {\n\t\tname: \"render\",\n\t\tsynchronous: true\n\t};\n\t\n\tvar Command = function(params,commander,callback) {\n\t\tthis.params = params;\n\t\tthis.commander = commander;\n\t\tthis.callback = callback;\n\t};\n\t\n\tCommand.prototype.execute = function() {\n\t\tif(this.params.length < 1) {\n\t\t\treturn \"Missing tiddler filter\";\n\t\t}\n\t\tvar self = this,\n\t\t\tfs = require(\"fs\"),\n\t\t\tpath = require(\"path\"),\n\t\t\twiki = this.commander.wiki,\n\t\t\ttiddlerFilter = this.params[0],\n\t\t\tfilenameFilter = this.params[1] || \"[is[tiddler]addsuffix[.html]]\",\n\t\t\ttype = this.params[2] || \"text/html\",\n\t\t\ttemplate = this.params[3],\n\t\t\tvariableList = this.params.slice(4),\n\t\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter),\n\t\t\tvariables =  Object.create(null);\n\t\t\twhile(variableList.length >= 2) {\n\t\t\t\tvariables[variableList[0]] = variableList[1];\n\t\t\t\tvariableList = variableList.slice(2);\n\t\t\t}\n\t\t$tw.utils.each(tiddlers,function(title) {\n\t\t\tvar filenameResults = wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]));\n\t\t\tif(filenameResults.length > 0) {\n\t\t\t\tvar filepath = path.resolve(self.commander.outputPath,filenameResults[0]);\n\t\t\t\tif(self.commander.verbose) {\n\t\t\t\t\tconsole.log(\"Rendering \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t\t\t}\n\t\t\t\tvar parser = wiki.parseTiddler(template || title),\n\t\t\t\t\twidgetNode = wiki.makeWidget(parser,{variables: $tw.utils.extend({},variables,{currentTiddler: title,storyTiddler: title})}),\n\t\t\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\t\t\twidgetNode.render(container,null);\n\t\t\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent;\n\t\t\t\t$tw.utils.createFileDirectories(filepath);\n\t\t\t\tfs.writeFileSync(filepath,text,\"utf8\");\n\t\t\t} else {\n\t\t\t\tconsole.log(\"Not rendering \\\"\" + title + \"\\\" because the filename filter returned an empty result\");\n\t\t\t}\n\t\t});\n\t\treturn null;\n\t};\n\t\n\texports.Command = Command;\n\t\n\t})();\n\t","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/rendertiddler.js":{"title":"$:/core/modules/commands/rendertiddler.js","text":"/*\\\ntitle: $:/core/modules/commands/rendertiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render a tiddler and save it to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"rendertiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tname = this.params[4],\n\t\tvalue = this.params[5],\n\t\tvariables = {};\n\t$tw.utils.createFileDirectories(filename);\n\tif(template) {\n\t\tvariables.currentTiddler = title;\n\t\tvariables.storyTiddler = title;\n\t\ttitle = template;\n\t}\n\tif(name && value) {\n\t\tvariables[name] = value;\n\t}\n\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title,{variables: variables}),\"utf8\",function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/rendertiddlers.js":{"title":"$:/core/modules/commands/rendertiddlers.js","text":"/*\\\ntitle: $:/core/modules/commands/rendertiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"rendertiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttemplate = this.params[1],\n\t\toutputPath = this.commander.outputPath,\n\t\tpathname = path.resolve(outputPath,this.params[2]),\n\t\ttype = this.params[3] || \"text/html\",\n\t\textension = this.params[4] || \".html\",\n\t\tdeleteDirectory = (this.params[5] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template),\n\t\t\twidgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title, storyTiddler: title}}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\texportPath = null;\n\t\tif($tw.utils.hop($tw.macros,\"tv-get-export-path\")) {\n\t\t\tvar macroPath = $tw.macros[\"tv-get-export-path\"].run.apply(self,[title]);\n\t\t\tif(macroPath) {\n\t\t\t\texportPath = path.resolve(outputPath,macroPath + extension);\n\t\t\t}\n\t\t}\n\t\tvar finalPath = exportPath || path.resolve(pathname,$tw.utils.encodeURIComponentExtended(title) + extension);\n\t\t$tw.utils.createFileDirectories(finalPath);\n\t\tfs.writeFileSync(finalPath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/save.js":{"title":"$:/core/modules/commands/save.js","text":"/*\\\ntitle: $:/core/modules/commands/save.js\ntype: application/javascript\nmodule-type: command\n\nSaves individual tiddlers in their raw text or binary format to the specified files\n\n\\*/\n(function(){\n\n\t/*jslint node: true, browser: true */\n\t/*global $tw: false */\n\t\"use strict\";\n\t\n\texports.info = {\n\t\tname: \"save\",\n\t\tsynchronous: true\n\t};\n\t\n\tvar Command = function(params,commander,callback) {\n\t\tthis.params = params;\n\t\tthis.commander = commander;\n\t\tthis.callback = callback;\n\t};\n\t\n\tCommand.prototype.execute = function() {\n\t\tif(this.params.length < 1) {\n\t\t\treturn \"Missing filename filter\";\n\t\t}\n\t\tvar self = this,\n\t\t\tfs = require(\"fs\"),\n\t\t\tpath = require(\"path\"),\n\t\t\tresult = null,\n\t\t\twiki = this.commander.wiki,\n\t\t\ttiddlerFilter = this.params[0],\n\t\t\tfilenameFilter = this.params[1] || \"[is[tiddler]]\",\n\t\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t\t$tw.utils.each(tiddlers,function(title) {\n\t\t\tif(!result) {\n\t\t\t\tvar tiddler = self.commander.wiki.getTiddler(title);\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\n\t\t\t\t\t\tdirectory: path.resolve(self.commander.outputPath),\n\t\t\t\t\t\tpathFilters: [filenameFilter],\n\t\t\t\t\t\twiki: wiki,\n\t\t\t\t\t\tfileInfo: {\n\t\t\t\t\t\t\toverwrite: true\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif(self.commander.verbose) {\n\t\t\t\t\t\tconsole.log(\"Saving \\\"\" + title + \"\\\" to \\\"\" + fileInfo.filepath + \"\\\"\");\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tresult = \"Error saving tiddler \\\"\" + title + \"\\\", to file: \\\"\" + fileInfo.filepath + \"\\\"\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresult = \"Tiddler '\" + title + \"' not found\";\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t};\n\t\n\texports.Command = Command;\n\t\n\t})();\n\t","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/savelibrarytiddlers.js":{"title":"$:/core/modules/commands/savelibrarytiddlers.js","text":"/*\\\ntitle: $:/core/modules/commands/savelibrarytiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the subtiddlers of a bundle tiddler as a series of JSON files\n\n--savelibrarytiddlers <tiddler> <tiddler-filter> <pathname> <skinnylisting>\n\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\n\nThe tiddler filter specifies the plugins to be included.\n\nThe pathname specifies the pathname to the folder in which the JSON files should be saved. The filename is the URL encoded title of the subtiddler.\n\nThe skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savelibrarytiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tcontainerTitle = this.params[0],\n\t\tfilter = this.params[1],\n\t\tbasepath = this.params[2],\n\t\tskinnyListTitle = this.params[3];\n\t// Get the container tiddler as data\n\tvar containerData = self.commander.wiki.getTiddlerDataCached(containerTitle,undefined);\n\tif(!containerData) {\n\t\treturn \"'\" + containerTitle + \"' is not a tiddler bundle\";\n\t}\n\t// Filter the list of plugins\n\tvar pluginList = [];\n\t$tw.utils.each(containerData.tiddlers,function(tiddler,title) {\n\t\tpluginList.push(title);\n\t});\n\tvar filteredPluginList;\n\tif(filter) {\n\t\tfilteredPluginList = self.commander.wiki.filterTiddlers(filter,null,self.commander.wiki.makeTiddlerIterator(pluginList));\n\t} else {\n\t\tfilteredPluginList = pluginList;\n\t}\n\t// Iterate through the plugins\n\tvar skinnyList = [];\n\t$tw.utils.each(filteredPluginList,function(title) {\n\t\tvar tiddler = containerData.tiddlers[title];\n\t\t// Save each JSON file and collect the skinny data\n\t\tvar pathname = path.resolve(self.commander.outputPath,basepath + $tw.utils.encodeURIComponentExtended(title) + \".json\");\n\t\t$tw.utils.createFileDirectories(pathname);\n\t\tfs.writeFileSync(pathname,JSON.stringify(tiddler),\"utf8\");\n\t\t// Collect the skinny list data\n\t\tvar pluginTiddlers = $tw.utils.parseJSONSafe(tiddler.text),\n\t\t\treadmeContent = (pluginTiddlers.tiddlers[title + \"/readme\"] || {}).text,\n\t\t\tdoesRequireReload = !!self.commander.wiki.doesPluginInfoRequireReload(pluginTiddlers),\n\t\t\ticonTiddler = pluginTiddlers.tiddlers[title + \"/icon\"] || {},\n\t\t\ticonType = iconTiddler.type,\n\t\t\ticonText = iconTiddler.text,\n\t\t\ticonContent;\n\t\tif(iconType && iconText) {\n\t\t\ticonContent = $tw.utils.makeDataUri(iconText,iconType);\n\t\t}\n\t\tskinnyList.push($tw.utils.extend({},tiddler,{\n\t\t\ttext: undefined,\n\t\t\treadme: readmeContent,\n\t\t\t\"requires-reload\": doesRequireReload ? \"yes\" : \"no\",\n\t\t\ticon: iconContent\n\t\t}));\n\t});\n\t// Save the catalogue tiddler\n\tif(skinnyListTitle) {\n\t\tself.commander.wiki.setTiddlerData(skinnyListTitle,skinnyList);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/savetiddler.js":{"title":"$:/core/modules/commands/savetiddler.js","text":"/*\\\ntitle: $:/core/modules/commands/savetiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the content of a tiddler to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savetiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddler = this.commander.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar type = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"};\n\t\t$tw.utils.createFileDirectories(filename);\n\t\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\n\t\t\tself.callback(err);\n\t\t});\n\t} else {\n\t\treturn \"Missing tiddler: \" + title;\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/savetiddlers.js":{"title":"$:/core/modules/commands/savetiddlers.js","text":"/*\\\ntitle: $:/core/modules/commands/savetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"savetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tpathname = path.resolve(this.commander.outputPath,this.params[1]),\n\t\tdeleteDirectory = (this.params[2] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.createDirectory(pathname);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilename = path.resolve(pathname,$tw.utils.encodeURIComponentExtended(title));\n\t\tfs.writeFileSync(filename,tiddler.fields.text || \"\",contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/savewikifolder.js":{"title":"$:/core/modules/commands/savewikifolder.js","text":"/*\\\ntitle: $:/core/modules/commands/savewikifolder.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the current wiki as a wiki folder\n\n--savewikifolder <wikifolderpath> [ [<name>=<value>] ]*\n\nThe following options are supported:\n\n* ''filter'': a filter expression defining the tiddlers to be included in the output\n* ''explodePlugins'': set to \"no\" to suppress exploding plugins into their constituent shadow tiddlers (defaults to \"yes\")\n\nSupports backward compatibility with --savewikifolder <wikifolderpath> [<filter>] [ [<name>=<value>] ]*\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savewikifolder\",\n\tsynchronous: true\n};\n\nvar fs,path;\nif($tw.node) {\n\tfs = require(\"fs\");\n\tpath = require(\"path\");\n}\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing wiki folder path\";\n\t}\n\tvar regFilter = /^[a-zA-Z0-9\\.\\-_]+=/g,  // dynamic parameters\n\t\tnamedParames,\n\t\ttiddlerFilter,\n\t\toptions = {};\n\tif (regFilter.test(this.params[1])) {  \n\t\tnamedParames = this.commander.extractNamedParameters(this.params.slice(1));\n\t\ttiddlerFilter = namedParames.filter || \"[all[tiddlers]]\";\n\t} else {\n\t\tnamedParames = this.commander.extractNamedParameters(this.params.slice(2));\n\t\ttiddlerFilter = this.params[1];\n\t}\n\ttiddlerFilter = tiddlerFilter || \"[all[tiddlers]]\";\n\toptions.explodePlugins = namedParames.explodePlugins || \"yes\";\n\tvar wikifoldermaker = new WikiFolderMaker(this.params[0],tiddlerFilter,this.commander,options);\n\treturn wikifoldermaker.save();\n};\n\nfunction WikiFolderMaker(wikiFolderPath,wikiFilter,commander,options) {\n\tthis.wikiFolderPath = wikiFolderPath;\n\tthis.wikiFilter = wikiFilter;\n\tthis.commander = commander;\n\tthis.explodePlugins = options.explodePlugins;\n\tthis.wiki = commander.wiki;\n\tthis.savedPaths = []; // So that we can detect filename clashes\n}\n\nWikiFolderMaker.prototype.log = function(str) {\n\tif(this.commander.verbose) {\n\t\tconsole.log(str);\n\t}\n};\n\nWikiFolderMaker.prototype.tiddlersToIgnore = [\n\t\"$:/boot/boot.css\",\n\t\"$:/boot/boot.js\",\n\t\"$:/boot/bootprefix.js\",\n\t\"$:/core\",\n\t\"$:/library/sjcl.js\",\n\t\"$:/temp/info-plugin\"\n];\n\n/*\nReturns null if successful, or an error string if there was an error\n*/\nWikiFolderMaker.prototype.save = function() {\n\tvar self = this;\n\t// Check that the output directory doesn't exist\n\tif(fs.existsSync(this.wikiFolderPath) && !$tw.utils.isDirectoryEmpty(this.wikiFolderPath)) {\n\t\treturn \"The unpackwiki command requires that the output wiki folder be empty\";\n\t}\n\t// Get the tiddlers from the source wiki\n\tvar tiddlerTitles = this.wiki.filterTiddlers(this.wikiFilter);\n\t// Initialise a new tiddlwiki.info file\n\tvar newWikiInfo = {};\n\t// Process each incoming tiddler in turn\n\t$tw.utils.each(tiddlerTitles,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tif(self.tiddlersToIgnore.indexOf(title) !== -1) {\n\t\t\t\t// Ignore the core plugin and the ephemeral info plugin\n\t\t\t\tself.log(\"Ignoring tiddler: \" + title);\n\t\t\t} else {\n\t\t\t\tvar type = tiddler.fields.type,\n\t\t\t\t\tpluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif(type === \"application/json\" && pluginType) {\n\t\t\t\t\t// Plugin tiddler\n\t\t\t\t\tvar libraryDetails = self.findPluginInLibrary(title);\n\t\t\t\t\tif(libraryDetails) {\n\t\t\t\t\t\t// A plugin from the core library\n\t\t\t\t\t\tself.log(\"Adding built-in plugin: \" + libraryDetails.name);\n\t\t\t\t\t\tnewWikiInfo[libraryDetails.type] = newWikiInfo[libraryDetails.type]  || [];\n\t\t\t\t\t\t$tw.utils.pushTop(newWikiInfo[libraryDetails.type],libraryDetails.name);\n\t\t\t\t\t} else if(self.explodePlugins !== \"no\") {\n\t\t\t\t\t\t// A custom plugin\n\t\t\t\t\t\tself.log(\"Processing custom plugin: \" + title);\n\t\t\t\t\t\tself.saveCustomPlugin(tiddler);\n\t\t\t\t\t} else if(self.explodePlugins === \"no\") {\n\t\t\t\t\t\tself.log(\"Processing custom plugin to tiddlders folder: \" + title);\n\t\t\t\t\t\tself.saveTiddler(\"tiddlers\", tiddler);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Ordinary tiddler\n\t\t\t\t\tself.saveTiddler(\"tiddlers\",tiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Save the tiddlywiki.info file\n\tthis.saveJSONFile(\"tiddlywiki.info\",newWikiInfo);\n\tself.log(\"Writing tiddlywiki.info: \" + JSON.stringify(newWikiInfo,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\n/*\nTest whether the specified tiddler is a plugin in the plugin library\n*/\nWikiFolderMaker.prototype.findPluginInLibrary = function(title) {\n\tvar parts = title.split(\"/\"),\n\t\tpluginPath, type, name;\n\tif(parts[0] === \"$:\") {\n\t\tif(parts[1] === \"languages\" && parts.length === 3) {\n\t\t\tpluginPath = \"languages\" + path.sep + parts[2];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2];\n\t\t} else if(parts[1] === \"plugins\" || parts[1] === \"themes\" && parts.length === 4) {\n\t\t\tpluginPath = parts[1] + path.sep + parts[2] + path.sep + parts[3];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2] + \"/\" + parts[3];\n\t\t}\n\t}\n\tif(pluginPath && type && name) {\n\t\tpluginPath = path.resolve($tw.boot.bootPath,\"..\",pluginPath);\n\t\tif(fs.existsSync(pluginPath)) {\n\t\t\treturn {\n\t\t\t\tpluginPath: pluginPath,\n\t\t\t\ttype: type,\n\t\t\t\tname: name\n\t\t\t};\n\t\t}\n\t}\n\treturn false;\n};\n\nWikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) {\n\tvar self = this,\n\t\tpluginTitle = pluginTiddler.fields.title,\n\t\ttitleParts = pluginTitle.split(\"/\"),\n\t\tdirectory = $tw.utils.generateTiddlerFilepath(titleParts[titleParts.length - 1],{\n\t\t\tdirectory: path.resolve(this.wikiFolderPath,pluginTiddler.fields[\"plugin-type\"] + \"s\")\n\t\t}),\n\t\tpluginInfo = pluginTiddler.getFieldStrings({exclude: [\"text\",\"type\"]});\n\tthis.saveJSONFile(directory + path.sep + \"plugin.info\",pluginInfo);\n\tself.log(\"Writing \" + directory + path.sep + \"plugin.info: \" + JSON.stringify(pluginInfo,null,$tw.config.preferences.jsonSpaces));\n\tvar pluginTiddlers = $tw.utils.parseJSONSafe(pluginTiddler.fields.text).tiddlers; // A hashmap of tiddlers in the plugin\n\t$tw.utils.each(pluginTiddlers,function(tiddler,title) {\n\t\tif(!tiddler.title) {\n\t\t\ttiddler.title = title;\n\t\t }\n\t\tself.saveTiddler(directory,new $tw.Tiddler(tiddler));\n\t});\n};\n\nWikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) {\n\tvar title = tiddler.fields.title, fileInfo, pathFilters, extFilters;\n\tif(this.wiki.tiddlerExists(\"$:/config/FileSystemPaths\")) {\n\t\tpathFilters = this.wiki.getTiddlerText(\"$:/config/FileSystemPaths\",\"\").split(\"\\n\");\n\t}\n\tif(this.wiki.tiddlerExists(\"$:/config/FileSystemExtensions\")) {\n\t\textFilters = this.wiki.getTiddlerText(\"$:/config/FileSystemExtensions\",\"\").split(\"\\n\");\n\t}\n\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\n\t\tdirectory: path.resolve(this.wikiFolderPath,directory),\n\t\tpathFilters: pathFilters,\n\t\textFilters: extFilters,\n\t\twiki: this.wiki,\n\t\tfileInfo: {}\n\t});\n\ttry {\n\t\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\n\t} catch (err) {\n\t\tconsole.log(\"SaveWikiFolder: Error saving file '\" + fileInfo.filepath + \"', tiddler: '\" + tiddler.fields.title);\n\t}\n};\n\nWikiFolderMaker.prototype.saveJSONFile = function(filename,json) {\n\tthis.saveTextFile(filename,JSON.stringify(json,null,$tw.config.preferences.jsonSpaces));\n};\n\nWikiFolderMaker.prototype.saveTextFile = function(filename,data) {\n\tthis.saveFile(filename,\"utf8\",data);\n};\n\nWikiFolderMaker.prototype.saveFile = function(filename,encoding,data) {\n\tvar filepath = path.resolve(this.wikiFolderPath,filename);\n\t$tw.utils.createFileDirectories(filepath);\n\tfs.writeFileSync(filepath,data,encoding);\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/server.js":{"title":"$:/core/modules/commands/server.js","text":"/*\\\ntitle: $:/core/modules/commands/server.js\ntype: application/javascript\nmodule-type: command\n\nDeprecated legacy command for serving tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"server\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: {\n\t\t\tport: this.params[0],\n\t\t\thost: this.params[6],\n\t\t\t\"root-tiddler\": this.params[1],\n\t\t\t\"root-render-type\": this.params[2],\n\t\t\t\"root-serve-type\": this.params[3],\n\t\t\tusername: this.params[4],\n\t\t\tpassword: this.params[5],\n\t\t\t\"path-prefix\": this.params[7],\n\t\t\t\"debug-level\": this.params[8]\n\t\t}\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/setfield.js":{"title":"$:/core/modules/commands/setfield.js","text":"/*\\\ntitle: $:/core/modules/commands/setfield.js\ntype: application/javascript\nmodule-type: command\n\nCommand to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"setfield\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 4) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tfieldname = this.params[1] || \"text\",\n\t\ttemplatetitle = this.params[2],\n\t\trendertype = this.params[3] || \"text/plain\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(templatetitle),\n\t\t\tnewFields = {},\n\t\t\ttiddler = wiki.getTiddler(title);\n\t\tif(parser) {\n\t\t\tvar widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\t\twidgetNode.render(container,null);\n\t\t\tnewFields[fieldname] = rendertype === \"text/html\" ? container.innerHTML : container.textContent;\n\t\t} else {\n\t\t\tnewFields[fieldname] = undefined;\n\t\t}\n\t\twiki.addTiddler(new $tw.Tiddler(tiddler,newFields));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/unpackplugin.js":{"title":"$:/core/modules/commands/unpackplugin.js","text":"/*\\\ntitle: $:/core/modules/commands/unpackplugin.js\ntype: application/javascript\nmodule-type: command\n\nCommand to extract the shadow tiddlers from within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"unpackplugin\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing plugin name\";\n\t}\n\tvar self = this,\n\t\ttitle = this.params[0],\n\t\tpluginData = this.commander.wiki.getTiddlerDataCached(title);\n\tif(!pluginData) {\n\t\treturn \"Plugin '\" + title + \"' not found\";\n\t}\n\t$tw.utils.each(pluginData.tiddlers,function(tiddler) {\n\t\tself.commander.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/verbose.js":{"title":"$:/core/modules/commands/verbose.js","text":"/*\\\ntitle: $:/core/modules/commands/verbose.js\ntype: application/javascript\nmodule-type: command\n\nVerbose command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"verbose\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.verbose = true;\n\t// Output the boot message log\n\tthis.commander.streams.output.write(\"Boot log:\\n  \" + $tw.boot.logMessages.join(\"\\n  \") + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/commands/version.js":{"title":"$:/core/modules/commands/version.js","text":"/*\\\ntitle: $:/core/modules/commands/version.js\ntype: application/javascript\nmodule-type: command\n\nVersion command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"version\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.streams.output.write($tw.version + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/core/modules/config.js":{"title":"$:/core/modules/config.js","text":"/*\\\ntitle: $:/core/modules/config.js\ntype: application/javascript\nmodule-type: config\n\nCore configuration constants\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.preferences = {};\n\nexports.preferences.notificationDuration = 3 * 1000;\nexports.preferences.jsonSpaces = 4;\n\nexports.textPrimitives = {\n\tupperLetter: \"[A-Z\\u00c0-\\u00d6\\u00d8-\\u00de\\u0150\\u0170]\",\n\tlowerLetter: \"[a-z\\u00df-\\u00f6\\u00f8-\\u00ff\\u0151\\u0171]\",\n\tanyLetter:   \"[A-Za-z0-9\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tblockPrefixLetters:\t\"[A-Za-z0-9-_\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\"\n};\n\nexports.textPrimitives.unWikiLink = \"~\";\nexports.textPrimitives.wikiLink = exports.textPrimitives.upperLetter + \"+\" +\n\texports.textPrimitives.lowerLetter + \"+\" +\n\texports.textPrimitives.upperLetter +\n\texports.textPrimitives.anyLetter + \"*\";\n\nexports.htmlEntities = {quot:34, dollar:36, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl:161, cent:162, pound:163, curren:164, yen:165, brvbar:166, sect:167, uml:168, copy:169, ordf:170, laquo:171, not:172, shy:173, reg:174, macr:175, deg:176, plusmn:177, sup2:178, sup3:179, acute:180, micro:181, para:182, middot:183, cedil:184, sup1:185, ordm:186, raquo:187, frac14:188, frac12:189, frac34:190, iquest:191, Agrave:192, Aacute:193, Acirc:194, Atilde:195, Auml:196, Aring:197, AElig:198, Ccedil:199, Egrave:200, Eacute:201, Ecirc:202, Euml:203, Igrave:204, Iacute:205, Icirc:206, Iuml:207, ETH:208, Ntilde:209, Ograve:210, Oacute:211, Ocirc:212, Otilde:213, Ouml:214, times:215, Oslash:216, Ugrave:217, Uacute:218, Ucirc:219, Uuml:220, Yacute:221, THORN:222, szlig:223, agrave:224, aacute:225, acirc:226, atilde:227, auml:228, aring:229, aelig:230, ccedil:231, egrave:232, eacute:233, ecirc:234, euml:235, igrave:236, iacute:237, icirc:238, iuml:239, eth:240, ntilde:241, ograve:242, oacute:243, ocirc:244, otilde:245, ouml:246, divide:247, oslash:248, ugrave:249, uacute:250, ucirc:251, uuml:252, yacute:253, thorn:254, yuml:255, OElig:338, oelig:339, Scaron:352, scaron:353, Yuml:376, fnof:402, circ:710, tilde:732, Alpha:913, Beta:914, Gamma:915, Delta:916, Epsilon:917, Zeta:918, Eta:919, Theta:920, Iota:921, Kappa:922, Lambda:923, Mu:924, Nu:925, Xi:926, Omicron:927, Pi:928, Rho:929, Sigma:931, Tau:932, Upsilon:933, Phi:934, Chi:935, Psi:936, Omega:937, alpha:945, beta:946, gamma:947, delta:948, epsilon:949, zeta:950, eta:951, theta:952, iota:953, kappa:954, lambda:955, mu:956, nu:957, xi:958, omicron:959, pi:960, rho:961, sigmaf:962, sigma:963, tau:964, upsilon:965, phi:966, chi:967, psi:968, omega:969, thetasym:977, upsih:978, piv:982, ensp:8194, emsp:8195, thinsp:8201, zwnj:8204, zwj:8205, lrm:8206, rlm:8207, ndash:8211, mdash:8212, lsquo:8216, rsquo:8217, sbquo:8218, ldquo:8220, rdquo:8221, bdquo:8222, dagger:8224, Dagger:8225, bull:8226, hellip:8230, permil:8240, prime:8242, Prime:8243, lsaquo:8249, rsaquo:8250, oline:8254, frasl:8260, nobreak:8288, NoBreak:8288, euro:8364, image:8465, weierp:8472, real:8476, trade:8482, alefsym:8501, larr:8592, uarr:8593, rarr:8594, darr:8595, harr:8596, crarr:8629, lArr:8656, uArr:8657, rArr:8658, dArr:8659, hArr:8660, forall:8704, part:8706, exist:8707, empty:8709, nabla:8711, isin:8712, notin:8713, ni:8715, prod:8719, sum:8721, minus:8722, lowast:8727, radic:8730, prop:8733, infin:8734, ang:8736, and:8743, or:8744, cap:8745, cup:8746, int:8747, there4:8756, sim:8764, cong:8773, asymp:8776, ne:8800, equiv:8801, le:8804, ge:8805, sub:8834, sup:8835, nsub:8836, sube:8838, supe:8839, oplus:8853, otimes:8855, perp:8869, sdot:8901, lceil:8968, rceil:8969, lfloor:8970, rfloor:8971, lang:9001, rang:9002, loz:9674, spades:9824, clubs:9827, hearts:9829, diams:9830 };\n\nexports.htmlVoidElements = \"area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr\".split(\",\");\n\nexports.htmlBlockElements = \"address,article,aside,audio,blockquote,canvas,dd,details,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,nav,ol,p,pre,section,summary,table,tfoot,ul,video\".split(\",\");\n\nexports.htmlUnsafeElements = \"script\".split(\",\");\n\n})();\n","type":"application/javascript","module-type":"config"},"$:/core/modules/deserializers.js":{"title":"$:/core/modules/deserializers.js","text":"/*\\\ntitle: $:/core/modules/deserializers.js\ntype: application/javascript\nmodule-type: tiddlerdeserializer\n\nFunctions to deserialise tiddlers from a block of text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"application/x-tiddler-html-div\"] = function(text,fields) {\n\treturn [deserializeTiddlerDiv(text,fields)];\n};\n\nexports[\"application/json\"] = function(text,fields) {\n\tvar results = [],\n\t\tincoming = $tw.utils.parseJSONSafe(text,function(err) {\n\t\t\treturn [{\n\t\t\t\ttitle: \"JSON error: \" + err,\n\t\t\t\ttext: \"\"\n\t\t\t}];\n\t\t});\n\tif(!$tw.utils.isArray(incoming)) {\n\t\tincoming = [incoming];\n\t}\n\tfor(var t=0; t<incoming.length; t++) {\n\t\tvar incomingFields = incoming[t],\n\t\t\tfields = {};\n\t\tfor(var f in incomingFields) {\n\t\t\tif(typeof incomingFields[f] === \"string\") {\n\t\t\t\tfields[f] = incomingFields[f];\n\t\t\t}\n\t\t}\n\t\tresults.push(fields);\n\t}\n\treturn results;\n};\n\n/*\nParse an HTML file into tiddlers. There are three possibilities:\n# A TiddlyWiki classic HTML file containing `text/x-tiddlywiki` tiddlers\n# A TiddlyWiki5 HTML file containing `text/vnd.tiddlywiki` tiddlers\n# An ordinary HTML file\n*/\nexports[\"text/html\"] = function(text,fields) {\n\tvar results = [];\n\t// Check if we've got an old-style store area\n\tvar storeAreaMarkerRegExp = /<div id=[\"']?storeArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\tstoreAreaMatch = storeAreaMarkerRegExp.exec(text);\n\tif(storeAreaMatch) {\n\t\t// If so, we've got tiddlers in classic TiddlyWiki format or unencrypted old-style TW5 format\n\t\tresults.push.apply(results,deserializeStoreArea(text,storeAreaMarkerRegExp.lastIndex,!!storeAreaMatch[1],fields));\n\t}\n\t// Check for new-style store areas\n\tvar newStoreAreaMarkerRegExp = /<script class=\"tiddlywiki-tiddler-store\" type=\"([^\"]*)\">/gi,\n\t\tnewStoreAreaMatch = newStoreAreaMarkerRegExp.exec(text),\n\t\thaveHadNewStoreArea = !!newStoreAreaMatch;\n\twhile(newStoreAreaMatch) {\n\t\tresults.push.apply(results,deserializeNewStoreArea(text,newStoreAreaMarkerRegExp.lastIndex,newStoreAreaMatch[1],fields));\n\t\tnewStoreAreaMatch = newStoreAreaMarkerRegExp.exec(text);\n\t}\n\t// Return if we had either an old-style or a new-style store area\n\tif(storeAreaMatch || haveHadNewStoreArea) {\n\t\treturn results;\n\t}\n\t// Otherwise, check whether we've got an encrypted file\n\tvar encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);\n\tif(encryptedStoreArea) {\n\t\t// If so, attempt to decrypt it using the current password\n\t\treturn $tw.utils.decryptStoreArea(encryptedStoreArea);\n\t} else {\n\t\t// It's not a TiddlyWiki so we'll return the entire HTML file as a tiddler\n\t\treturn deserializeHtmlFile(text,fields);\n\t}\n};\n\nfunction deserializeHtmlFile(text,fields) {\n\tvar result = {};\n\t$tw.utils.each(fields,function(value,name) {\n\t\tresult[name] = value;\n\t});\n\tresult.text = text;\n\tresult.type = \"text/html\";\n\treturn [result];\n}\n\nfunction deserializeNewStoreArea(text,storeAreaEnd,type,fields) {\n\tvar endOfScriptRegExp = /<\\/script>/gi;\n\tendOfScriptRegExp.lastIndex = storeAreaEnd;\n\tvar match = endOfScriptRegExp.exec(text);\n\tif(match) {\n\t\tvar scriptContent = text.substring(storeAreaEnd,match.index);\n\t\treturn $tw.wiki.deserializeTiddlers(type,scriptContent);\n\t} else {\n\t\treturn [];\n\t}\n}\n\nfunction deserializeStoreArea(text,storeAreaEnd,isTiddlyWiki5,fields) {\n\tvar results = [],\n\t\tendOfDivRegExp = /(<\\/div>\\s*)/gi,\n\t\tstartPos = storeAreaEnd,\n\t\tdefaultType = isTiddlyWiki5 ? undefined : \"text/x-tiddlywiki\";\n\tendOfDivRegExp.lastIndex = startPos;\n\tvar match = endOfDivRegExp.exec(text);\n\twhile(match) {\n\t\tvar endPos = endOfDivRegExp.lastIndex,\n\t\t\ttiddlerFields = deserializeTiddlerDiv(text.substring(startPos,endPos),fields,{type: defaultType});\n\t\tif(!tiddlerFields) {\n\t\t\tbreak;\n\t\t}\n\t\t$tw.utils.each(tiddlerFields,function(value,name) {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\ttiddlerFields[name] = $tw.utils.htmlDecode(value);\n\t\t\t}\n\t\t});\n\t\tif(tiddlerFields.text !== null) {\n\t\t\tresults.push(tiddlerFields);\n\t\t}\n\t\tstartPos = endPos;\n\t\tmatch = endOfDivRegExp.exec(text);\n\t}\n\treturn results;\n}\n\n/*\nUtility function to parse an old-style tiddler DIV in a *.tid file. It looks like this:\n\n<div title=\"Title\" creator=\"JoeBloggs\" modifier=\"JoeBloggs\" created=\"201102111106\" modified=\"201102111310\" tags=\"myTag [[my long tag]]\">\n<pre>The text of the tiddler (without the expected HTML encoding).\n</pre>\n</div>\n\nNote that the field attributes are HTML encoded, but that the body of the <PRE> tag is not encoded.\n\nWhen these tiddler DIVs are encountered within a TiddlyWiki HTML file then the body is encoded in the usual way.\n*/\nvar deserializeTiddlerDiv = function(text /* [,fields] */) {\n\t// Slot together the default results\n\tvar result = {};\n\tif(arguments.length > 1) {\n\t\tfor(var f=1; f<arguments.length; f++) {\n\t\t\tvar fields = arguments[f];\n\t\t\tfor(var t in fields) {\n\t\t\t\tresult[t] = fields[t];\t\t\n\t\t\t}\n\t\t}\n\t}\n\t// Parse the DIV body\n\tvar startRegExp = /^\\s*<div\\s+([^>]*)>(\\s*<pre>)?/gi,\n\t\tendRegExp,\n\t\tmatch = startRegExp.exec(text);\n\tif(match) {\n\t\t// Old-style DIVs don't have the <pre> tag\n\t\tif(match[2]) {\n\t\t\tendRegExp = /<\\/pre>\\s*<\\/div>\\s*$/gi;\n\t\t} else {\n\t\t\tendRegExp = /<\\/div>\\s*$/gi;\n\t\t}\n\t\tvar endMatch = endRegExp.exec(text);\n\t\tif(endMatch) {\n\t\t\t// Extract the text\n\t\t\tresult.text = text.substring(match.index + match[0].length,endMatch.index);\n\t\t\t// Process the attributes\n\t\t\tvar attrRegExp = /\\s*([^=\\s]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/gi,\n\t\t\t\tattrMatch;\n\t\t\tdo {\n\t\t\t\tattrMatch = attrRegExp.exec(match[1]);\n\t\t\t\tif(attrMatch) {\n\t\t\t\t\tvar name = attrMatch[1];\n\t\t\t\t\tvar value = attrMatch[2] !== undefined ? attrMatch[2] : attrMatch[3];\n\t\t\t\t\tresult[name] = value;\n\t\t\t\t}\n\t\t\t} while(attrMatch);\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn undefined;\n};\n\n})();\n","type":"application/javascript","module-type":"tiddlerdeserializer"},"$:/core/modules/editor/engines/framed.js":{"title":"$:/core/modules/editor/engines/framed.js","text":"/*\\\ntitle: $:/core/modules/editor/engines/framed.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea\n\n\\*/\n(function(){\n\n/*jslint node: true,browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction FramedEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Create our hidden dummy text area for reading styles\n\tthis.dummyTextArea = this.widget.document.createElement(\"textarea\");\n\tif(this.widget.editClass) {\n\t\tthis.dummyTextArea.className = this.widget.editClass;\n\t}\n\tthis.dummyTextArea.setAttribute(\"hidden\",\"true\");\n\tthis.parentNode.insertBefore(this.dummyTextArea,this.nextSibling);\n\tthis.widget.domNodes.push(this.dummyTextArea);\n\t// Create the iframe\n\tthis.iframeNode = this.widget.document.createElement(\"iframe\");\n\tthis.parentNode.insertBefore(this.iframeNode,this.nextSibling);\n\tthis.iframeDoc = this.iframeNode.contentWindow.document;\n\t// (Firefox requires us to put some empty content in the iframe)\n\tvar paletteTitle = this.widget.wiki.getTiddlerText(\"$:/palette\");\n\tvar colorScheme = (this.widget.wiki.getTiddler(paletteTitle) || {fields: {}}).fields[\"color-scheme\"] || \"light\";\n\tthis.iframeDoc.open();\n\tthis.iframeDoc.write(\"<meta name='color-scheme' content='\" + colorScheme + \"'>\");\n\tthis.iframeDoc.close();\n\t// Style the iframe\n\tthis.iframeNode.className = this.dummyTextArea.className;\n\tthis.iframeNode.style.border = \"none\";\n\tthis.iframeNode.style.padding = \"0\";\n\tthis.iframeNode.style.resize = \"none\";\n\tthis.iframeDoc.body.style.margin = \"0\";\n\tthis.iframeDoc.body.style.padding = \"0\";\n\tthis.widget.domNodes.push(this.iframeNode);\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.iframeDoc.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.iframeDoc.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType && this.widget.editTag !== \"textarea\") {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.iframeNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\tif(this.widget.editAutoComplete) {\n\t\tthis.domNode.setAttribute(\"autocomplete\",this.widget.editAutoComplete);\n\t}\n\tif(this.widget.isDisabled === \"yes\") {\n\t\tthis.domNode.setAttribute(\"disabled\",true);\n\t}\n\t// Copy the styles from the dummy textarea\n\tthis.copyStyles();\n\t// Add event listeners\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"click\",handlerObject: this,handlerMethod: \"handleClickEvent\"},\n\t\t{name: \"input\",handlerObject: this,handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"keydown\",handlerObject: this,handlerMethod: \"handleKeydownEvent\"},\n\t\t{name: \"focus\",handlerObject: this,handlerMethod: \"handleFocusEvent\"}\n\t]);\n\t// Add drag and drop event listeners if fileDrop is enabled\n\tif(this.widget.isFileDropEnabled) {\n\t\t$tw.utils.addEventListeners(this.domNode,[\n\t\t\t{name: \"dragenter\",handlerObject: this.widget,handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\",handlerObject: this.widget,handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\",handlerObject: this.widget,handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"dragend\",handlerObject: this.widget,handlerMethod: \"handleDragEndEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this.widget,handlerMethod: \"handleDropEvent\"},\n\t\t\t{name: \"paste\", handlerObject: this.widget,handlerMethod: \"handlePasteEvent\"},\n\t\t\t{name: \"click\",handlerObject: this.widget,handlerMethod: \"handleClickEvent\"}\n\t\t]);\n\t}\n\t// Insert the element into the DOM\n\tthis.iframeDoc.body.appendChild(this.domNode);\n}\n\n/*\nCopy styles from the dummy text area to the textarea in the iframe\n*/\nFramedEngine.prototype.copyStyles = function() {\n\t// Copy all styles\n\t$tw.utils.copyStyles(this.dummyTextArea,this.domNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\tthis.domNode.style.display = \"block\";\n\tthis.domNode.style.width = \"100%\";\n\tthis.domNode.style.margin = \"0\";\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\tthis.domNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n\t// Ensure we don't force text direction to LTR\n\tthis.domNode.style.removeProperty(\"direction\");\n};\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nFramedEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.updateDomNodeText(text);\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nUpdate the DomNode with the new text\n*/\nFramedEngine.prototype.updateDomNodeText = function(text) {\n\ttry {\n\t\tthis.domNode.value = text;\n\t} catch(e) {\n\t\t// Ignore\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nFramedEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nFramedEngine.prototype.fixHeight = function() {\n\t// Make sure styles are updated\n\tthis.copyStyles();\n\t// Adjust height\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tvar newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t\tthis.iframeNode.style.height = newHeight + \"px\";\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t\tthis.iframeNode.style.height = fixedHeight + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nFramedEngine.prototype.focus  = function() {\n\tif(this.domNode.focus) {\n\t\tthis.domNode.focus();\n\t}\n\tif(this.domNode.select) {\n\t\t$tw.utils.setSelectionByPosition(this.domNode,this.widget.editFocusSelectFromStart,this.widget.editFocusSelectFromEnd);\n\t}\n};\n\n/*\nHandle a focus event\n*/\nFramedEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editCancelPopups) {\n\t\t$tw.popup.cancel(0);\n\t}\n};\n\n/*\nHandle a keydown event\n */\nFramedEngine.prototype.handleKeydownEvent = function(event) {\n\tif ($tw.keyboardManager.handleKeydownEvent(event, {onlyPriority: true})) {\n\t\treturn true;\n\t}\n\n\treturn this.widget.handleKeydownEvent(event);\n};\n\n/*\nHandle a click\n*/\nFramedEngine.prototype.handleClickEvent = function(event) {\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nFramedEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\tif(this.widget.editInputActions) {\n\t\tthis.widget.invokeActionString(this.widget.editInputActions,this,event,{actionValue: this.getText()});\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nFramedEngine.prototype.createTextOperation = function() {\n\tvar operation = {\n\t\ttext: this.domNode.value,\n\t\tselStart: this.domNode.selectionStart,\n\t\tselEnd: this.domNode.selectionEnd,\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nFramedEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t\t// Attempt to use a execCommand to modify the value of the control\n\t\tif(this.iframeDoc.queryCommandSupported(\"insertText\") && this.iframeDoc.queryCommandSupported(\"delete\") && !$tw.browser.isFirefox) {\n\t\t\tthis.domNode.focus();\n\t\t\tthis.domNode.setSelectionRange(operation.cutStart,operation.cutEnd);\n\t\t\tif(operation.replacement === \"\") {\n\t\t\t\tthis.iframeDoc.execCommand(\"delete\",false,\"\");\n\t\t\t} else {\n\t\t\t\tthis.iframeDoc.execCommand(\"insertText\",false,operation.replacement);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domNode.value = newText;\n\t\t}\n\t\tthis.domNode.focus();\n\t\tthis.domNode.setSelectionRange(operation.newSelStart,operation.newSelEnd);\n\t}\n\tthis.domNode.focus();\n\treturn newText;\n};\n\nexports.FramedEngine = FramedEngine;\n\n})();\n","type":"application/javascript","module-type":"library"},"$:/core/modules/editor/engines/simple.js":{"title":"$:/core/modules/editor/engines/simple.js","text":"/*\\\ntitle: $:/core/modules/editor/engines/simple.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction SimpleEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.widget.document.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.widget.document.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType && this.widget.editTag !== \"textarea\") {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.domNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\tif(this.widget.editAutoComplete) {\n\t\tthis.domNode.setAttribute(\"autocomplete\",this.widget.editAutoComplete);\n\t}\n\tif(this.widget.isDisabled === \"yes\") {\n\t\tthis.domNode.setAttribute(\"disabled\",true);\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nSimpleEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode || text === \"\") {\n\t\t\tthis.updateDomNodeText(text);\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nUpdate the DomNode with the new text\n*/\nSimpleEngine.prototype.updateDomNodeText = function(text) {\n\ttry {\n\t\tthis.domNode.value = text;\n\t} catch(e) {\n\t\t// Ignore\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nSimpleEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nSimpleEngine.prototype.fixHeight = function() {\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\t$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nSimpleEngine.prototype.focus = function() {\n\tif(this.domNode.focus) {\n\t\tthis.domNode.focus();\n\t}\n\tif(this.domNode.select) {\n\t\t$tw.utils.setSelectionByPosition(this.domNode,this.widget.editFocusSelectFromStart,this.widget.editFocusSelectFromEnd);\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nSimpleEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\tif(this.widget.editInputActions) {\n\t\tthis.widget.invokeActionString(this.widget.editInputActions,this,event,{actionValue: this.getText()});\n\t}\n\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editCancelPopups) {\n\t\t$tw.popup.cancel(0);\n\t}\n\tif(this.widget.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNode,\n\t\t\ttitle: this.widget.editFocusPopup,\n\t\t\twiki: this.widget.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nSimpleEngine.prototype.createTextOperation = function() {\n\treturn null;\n};\n\n/*\nExecute a text operation\n*/\nSimpleEngine.prototype.executeTextOperation = function(operation) {\n};\n\nexports.SimpleEngine = SimpleEngine;\n\n})();\n","type":"application/javascript","module-type":"library"},"$:/core/modules/editor/factory.js":{"title":"$:/core/modules/editor/factory.js","text":"/*\\\ntitle: $:/core/modules/editor/factory.js\ntype: application/javascript\nmodule-type: library\n\nFactory for constructing text editor widgets with specified engines for the toolbar and non-toolbar cases\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_MIN_TEXT_AREA_HEIGHT = \"100px\"; // Minimum height of textareas in pixels\n\n// Configuration tiddlers\nvar HEIGHT_MODE_TITLE = \"$:/config/TextEditor/EditorHeight/Mode\";\nvar ENABLE_TOOLBAR_TITLE = \"$:/config/TextEditor/EnableToolbar\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nfunction editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {\n\n\tvar EditTextWidget = function(parseTreeNode,options) {\n\t\t// Initialise the editor operations if they've not been done already\n\t\tif(!this.editorOperations) {\n\t\t\tEditTextWidget.prototype.editorOperations = {};\n\t\t\t$tw.modules.applyMethods(\"texteditoroperation\",this.editorOperations);\n\t\t}\n\t\tthis.initialise(parseTreeNode,options);\n\t};\n\n\t/*\n\tInherit from the base widget class\n\t*/\n\tEditTextWidget.prototype = new Widget();\n\n\t/*\n\tRender this widget into the DOM\n\t*/\n\tEditTextWidget.prototype.render = function(parent,nextSibling) {\n\t\t// Save the parent dom node\n\t\tthis.parentDomNode = parent;\n\t\t// Compute our attributes\n\t\tthis.computeAttributes();\n\t\t// Execute our logic\n\t\tthis.execute();\n\t\t// Create the wrapper for the toolbar and render its content\n\t\tif(this.editShowToolbar) {\n\t\t\tthis.toolbarNode = this.document.createElement(\"div\");\n\t\t\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\t\t\tparent.insertBefore(this.toolbarNode,nextSibling);\n\t\t\tthis.renderChildren(this.toolbarNode,null);\n\t\t\tthis.domNodes.push(this.toolbarNode);\n\t\t}\n\t\t// Create our element\n\t\tvar editInfo = this.getEditInfo(),\n\t\t\tEngine = this.editShowToolbar ? toolbarEngine : nonToolbarEngine;\n\t\tthis.engine = new Engine({\n\t\t\t\twidget: this,\n\t\t\t\tvalue: editInfo.value,\n\t\t\t\ttype: editInfo.type,\n\t\t\t\tparentNode: parent,\n\t\t\t\tnextSibling: nextSibling\n\t\t\t});\n\t\t// Call the postRender hook\n\t\tif(this.postRender) {\n\t\t\tthis.postRender();\n\t\t}\n\t\t// Fix height\n\t\tthis.engine.fixHeight();\n\t\t// Focus if required\n\t\tif(this.editFocus === \"true\" || this.editFocus === \"yes\") {\n\t\t\tthis.engine.focus();\n\t\t}\n\t\t// Add widget message listeners\n\t\tthis.addEventListeners([\n\t\t\t{type: \"tm-edit-text-operation\", handler: \"handleEditTextOperationMessage\"}\n\t\t]);\n\t};\n\n\t/*\n\tGet the tiddler being edited and current value\n\t*/\n\tEditTextWidget.prototype.getEditInfo = function() {\n\t\t// Get the edit value\n\t\tvar self = this,\n\t\t\tvalue,\n\t\t\ttype = \"text/plain\",\n\t\t\tupdate;\n\t\tif(this.editIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\t\tupdate = function(value) {\n\t\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\t// Get the current tiddler and the field name\n\t\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\t\tif(tiddler) {\n\t\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\t\tif(tiddler.hasField(this.editField)) {\n\t\t\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t\t\t} else {\n\t\t\t\t\tvalue = this.editDefault || \"\";\n\t\t\t\t}\n\t\t\t\tif(this.editField === \"text\") {\n\t\t\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\t\tswitch(this.editField) {\n\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t\ttype = \"text/vnd.tiddlywiki\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"title\":\n\t\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\t\tvalue = this.editDefault;\n\t\t\t\t}\n\t\t\t}\n\t\t\tupdate = function(value) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\t\tupdateFields = {\n\t\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t\t};\n\t\t\t\tupdateFields[self.editField] = value;\n\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t\t};\n\t\t}\n\t\tif(this.editType) {\n\t\t\ttype = this.editType;\n\t\t}\n\t\treturn {value: value || \"\", type: type, update: update};\n\t};\n\n\t/*\n\tHandle an edit text operation message from the toolbar\n\t*/\n\tEditTextWidget.prototype.handleEditTextOperationMessage = function(event) {\n\t\t// Prepare information about the operation\n\t\tvar operation = this.engine.createTextOperation();\n\t\t// Invoke the handler for the selected operation\n\t\tvar handler = this.editorOperations[event.param];\n\t\tif(handler) {\n\t\t\thandler.call(this,event,operation);\n\t\t}\n\t\t// Execute the operation via the engine\n\t\tvar newText = this.engine.executeTextOperation(operation);\n\t\t// Fix the tiddler height and save changes\n\t\tthis.engine.fixHeight();\n\t\tthis.saveChanges(newText);\n\t};\n\n\t/*\n\tCompute the internal state of the widget\n\t*/\n\tEditTextWidget.prototype.execute = function() {\n\t\t// Get our parameters\n\t\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t\tthis.editField = this.getAttribute(\"field\",\"text\");\n\t\tthis.editIndex = this.getAttribute(\"index\");\n\t\tthis.editDefault = this.getAttribute(\"default\");\n\t\tthis.editClass = this.getAttribute(\"class\");\n\t\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t\tthis.editSize = this.getAttribute(\"size\");\n\t\tthis.editRows = this.getAttribute(\"rows\");\n\t\tthis.editAutoHeight = this.wiki.getTiddlerText(HEIGHT_MODE_TITLE,\"auto\");\n\t\tthis.editAutoHeight = this.getAttribute(\"autoHeight\",this.editAutoHeight === \"auto\" ? \"yes\" : \"no\") === \"yes\";\n\t\tthis.editMinHeight = this.getAttribute(\"minHeight\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\n\t\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\t\tthis.editFocus = this.getAttribute(\"focus\");\n\t\tthis.editFocusSelectFromStart = $tw.utils.parseNumber(this.getAttribute(\"focusSelectFromStart\",\"0\"));\n\t\tthis.editFocusSelectFromEnd = $tw.utils.parseNumber(this.getAttribute(\"focusSelectFromEnd\",\"0\"));\n\t\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\t\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"\") === \"yes\";\n\t\tthis.editInputActions = this.getAttribute(\"inputActions\");\n\t\tthis.editRefreshTitle = this.getAttribute(\"refreshTitle\");\n\t\tthis.editAutoComplete = this.getAttribute(\"autocomplete\");\n\t\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t\tthis.isFileDropEnabled = this.getAttribute(\"fileDrop\",\"no\") === \"yes\";\n\t\t// Get the default editor element tag and type\n\t\tvar tag,type;\n\t\tif(this.editField === \"text\") {\n\t\t\ttag = \"textarea\";\n\t\t} else {\n\t\t\ttag = \"input\";\n\t\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\t\ttag = fieldModule.editTag;\n\t\t\t}\n\t\t\tif(fieldModule && fieldModule.editType) {\n\t\t\t\ttype = fieldModule.editType;\n\t\t\t}\n\t\t\ttype = type || \"text\";\n\t\t}\n\t\t// Get the rest of our parameters\n\t\tthis.editTag = this.getAttribute(\"tag\",tag) || \"input\";\n\t\tthis.editType = this.getAttribute(\"type\",type);\n\t\t// Make the child widgets\n\t\tthis.makeChildWidgets();\n\t\t// Determine whether to show the toolbar\n\t\tthis.editShowToolbar = this.wiki.getTiddlerText(ENABLE_TOOLBAR_TITLE,\"yes\");\n\t\tthis.editShowToolbar = (this.editShowToolbar === \"yes\") && !!(this.children && this.children.length > 0) && (!this.document.isTiddlyWikiFakeDom);\n\t};\n\n\t/*\n\tSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n\t*/\n\tEditTextWidget.prototype.refresh = function(changedTiddlers) {\n\t\tvar changedAttributes = this.computeAttributes();\n\t\t// Completely rerender if any of our attributes have changed\n\t\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup ||  changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE] || changedTiddlers[\"$:/palette\"] || changedAttributes.disabled || changedAttributes.fileDrop) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t\t} else if (changedTiddlers[this.editRefreshTitle]) {\n\t\t\tthis.engine.updateDomNodeText(this.getEditInfo().value);\n\t\t} else if(changedTiddlers[this.editTitle]) {\n\t\t\tvar editInfo = this.getEditInfo();\n\t\t\tthis.updateEditor(editInfo.value,editInfo.type);\n\t\t}\n\t\tthis.engine.fixHeight();\n\t\tif(this.editShowToolbar) {\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/*\n\tUpdate the editor with new text. This method is separate from updateEditorDomNode()\n\tso that subclasses can override updateEditor() and still use updateEditorDomNode()\n\t*/\n\tEditTextWidget.prototype.updateEditor = function(text,type) {\n\t\tthis.updateEditorDomNode(text,type);\n\t};\n\n\t/*\n\tUpdate the editor dom node with new text\n\t*/\n\tEditTextWidget.prototype.updateEditorDomNode = function(text,type) {\n\t\tthis.engine.setText(text,type);\n\t};\n\n\t/*\n\tSave changes back to the tiddler store\n\t*/\n\tEditTextWidget.prototype.saveChanges = function(text) {\n\t\tvar editInfo = this.getEditInfo();\n\t\tif(text !== editInfo.value) {\n\t\t\teditInfo.update(text);\n\t\t}\n\t};\n\n\t/*\n\tHandle a dom \"keydown\" event, which we'll bubble up to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.handleKeydownEvent = function(event) {\n\t\t// Check for a keyboard shortcut\n\t\tif(this.toolbarNode) {\n\t\t\tvar shortcutElements = this.toolbarNode.querySelectorAll(\"[data-tw-keyboard-shortcut]\");\n\t\t\tfor(var index=0; index<shortcutElements.length; index++) {\n\t\t\t\tvar el = shortcutElements[index],\n\t\t\t\t\tshortcutData = el.getAttribute(\"data-tw-keyboard-shortcut\"),\n\t\t\t\t\tkeyInfoArray = $tw.keyboardManager.parseKeyDescriptors(shortcutData,{\n\t\t\t\t\t\twiki: this.wiki\n\t\t\t\t\t});\n\t\t\t\tif($tw.keyboardManager.checkKeyDescriptors(event,keyInfoArray)) {\n\t\t\t\t\tvar clickEvent = this.document.createEvent(\"Events\");\n\t\t\t\t    clickEvent.initEvent(\"click\",true,false);\n\t\t\t\t    el.dispatchEvent(clickEvent);\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Propogate the event to the container\n\t\tif(this.propogateKeydownEvent(event)) {\n\t\t\t// Ignore the keydown if it was already handled\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\t// Otherwise, process the keydown normally\n\t\treturn false;\n\t};\n\n\t/*\n\tPropogate keydown events to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.propogateKeydownEvent = function(event) {\n\t\tvar newEvent = this.cloneEvent(event,[\"keyCode\",\"code\",\"which\",\"key\",\"metaKey\",\"ctrlKey\",\"altKey\",\"shiftKey\"]);\n\t\treturn !this.parentDomNode.dispatchEvent(newEvent);\n\t};\n\n\tEditTextWidget.prototype.cloneEvent = function(event,propertiesToCopy) {\n\t\tvar propertiesToCopy = propertiesToCopy || [],\n\t\t\tnewEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent(\"Events\");\n\t\tif(newEvent.initEvent) {\n\t\t\tnewEvent.initEvent(event.type, true, true);\n\t\t}\n\t\t$tw.utils.each(propertiesToCopy,function(prop){\n\t\t\tnewEvent[prop] = event[prop];\n\t\t});\n\t\treturn newEvent;\n\t};\n\n\tEditTextWidget.prototype.dispatchDOMEvent = function(newEvent) {\n\t\tvar dispatchNode = this.engine.iframeNode || this.engine.parentNode;\n\t\treturn dispatchNode.dispatchEvent(newEvent);\n\t};\n\n\t/*\n\tPropogate drag and drop events with File data to our container for the dropzone widgets benefit.\n\tIf there are no Files, let the browser handle it.\n\t*/\n\tEditTextWidget.prototype.handleDropEvent = function(event) {\n\t\tif($tw.utils.dragEventContainsFiles(event)) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\tthis.dispatchDOMEvent(this.cloneEvent(event,[\"dataTransfer\"]));\n\t\t} \n\t};\n\n\tEditTextWidget.prototype.handlePasteEvent = function(event) {\n\t\tif(event.clipboardData && event.clipboardData.files && event.clipboardData.files.length) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\tthis.dispatchDOMEvent(this.cloneEvent(event,[\"clipboardData\"]));\n\t\t}\n\t};\n\n\tEditTextWidget.prototype.handleDragEnterEvent = function(event) {\n\t\tif($tw.utils.dragEventContainsFiles(event)) {\n\t\t\t// Ignore excessive events fired by FF when entering and leaving text nodes in a text area.\n\t\t\tif( event.relatedTarget && (event.relatedTarget.nodeType === 3 || event.target === event.relatedTarget)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\treturn this.dispatchDOMEvent(this.cloneEvent(event,[\"dataTransfer\"]));\n\t\t}\n\t\treturn true;\n\t};\n\n\tEditTextWidget.prototype.handleDragOverEvent = function(event) {\n\t\tif($tw.utils.dragEventContainsFiles(event)) {\n\t\t\t// Call preventDefault() in browsers that default to not allowing drop events on textarea\n\t\t\tif($tw.browser.isFirefox || $tw.browser.isIE) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t\tevent.dataTransfer.dropEffect = \"copy\";\n\t\t\treturn this.dispatchDOMEvent(this.cloneEvent(event,[\"dataTransfer\"]));\n\t\t}\n\t\treturn true;\n\t};\n\n\tEditTextWidget.prototype.handleDragLeaveEvent = function(event) {\n\t\t// Ignore excessive events fired by FF when entering and leaving text nodes in a text area.\n\t\tif(event.relatedTarget && ((event.relatedTarget.nodeType === 3) || (event.target === event.relatedTarget))) {\n\t\t\treturn true;\n\t\t}\n\t\tevent.preventDefault();\n\t\tthis.dispatchDOMEvent(this.cloneEvent(event,[\"dataTransfer\"]));\n\t};\n\n\tEditTextWidget.prototype.handleDragEndEvent = function(event) {\n\t\tthis.dispatchDOMEvent(this.cloneEvent(event));\n\t};\n\n\tEditTextWidget.prototype.handleClickEvent = function(event) {\n\t\treturn !this.dispatchDOMEvent(this.cloneEvent(event));\n\t};\n\n\treturn EditTextWidget;\n}\n\nexports.editTextWidgetFactory = editTextWidgetFactory;\n\n})();\n","type":"application/javascript","module-type":"library"},"$:/core/modules/editor/operations/bitmap/clear.js":{"title":"$:/core/modules/editor/operations/bitmap/clear.js","text":"/*\\\ntitle: $:/core/modules/editor/operations/bitmap/clear.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to clear the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"clear\"] = function(event) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.globalAlpha = 1;\n\tctx.fillStyle = event.paramObject.colour || \"white\";\n\tctx.fillRect(0,0,this.canvasDomNode.width,this.canvasDomNode.height);\n\t// Save changes\n\tthis.strokeEnd();\n};\n\n})();\n","type":"application/javascript","module-type":"bitmapeditoroperation"},"$:/core/modules/editor/operations/bitmap/resize.js":{"title":"$:/core/modules/editor/operations/bitmap/resize.js","text":"/*\\\ntitle: $:/core/modules/editor/operations/bitmap/resize.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to resize the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"resize\"] = function(event) {\n\t// Get the new width\n\tvar newWidth = parseInt(event.paramObject.width || this.canvasDomNode.width,10),\n\t\tnewHeight = parseInt(event.paramObject.height || this.canvasDomNode.height,10);\n\t// Update if necessary\n\tif(newWidth > 0 && newHeight > 0 && !(newWidth === this.currCanvas.width && newHeight === this.currCanvas.height)) {\n\t\tthis.changeCanvasSize(newWidth,newHeight);\n\t}\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n","type":"application/javascript","module-type":"bitmapeditoroperation"},"$:/core/modules/editor/operations/bitmap/rotate-left.js":{"title":"$:/core/modules/editor/operations/bitmap/rotate-left.js","text":"/*\\\ntitle: $:/core/modules/editor/operations/bitmap/rotate-left.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to rotate the image left by 90 degrees\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"rotate-left\"] = function(event) {\n\t// Rotate the canvas left by 90 degrees\n\tthis.rotateCanvasLeft();\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n","type":"application/javascript","module-type":"bitmapeditoroperation"},"$:/core/modules/editor/operations/text/excise.js":{"title":"$:/core/modules/editor/operations/text/excise.js","text":"/*\\\ntitle: $:/core/modules/editor/operations/text/excise.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to excise the selection to a new tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction isMarkdown(mediaType) {\n\treturn mediaType === 'text/markdown' || mediaType === 'text/x-markdown';\n}\n\nexports[\"excise\"] = function(event,operation) {\n\tvar editTiddler = this.wiki.getTiddler(this.editTitle),\n\t\teditTiddlerTitle = this.editTitle,\n\t\twikiLinks = !isMarkdown(editTiddler.fields.type),\n\t\texcisionBaseTitle = $tw.language.getString(\"Buttons/Excise/DefaultTitle\");\n\tif(editTiddler && editTiddler.fields[\"draft.of\"]) {\n\t\teditTiddlerTitle = editTiddler.fields[\"draft.of\"];\n\t}\n\tvar excisionTitle = event.paramObject.title || this.wiki.generateNewTitle(excisionBaseTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\tthis.wiki.getModificationFields(),\n\t\t{\n\t\t\ttitle: excisionTitle,\n\t\t\ttext: operation.selection,\n\t\t\ttags: event.paramObject.tagnew === \"yes\" ?  [editTiddlerTitle] : [],\n\t\t\ttype: editTiddler.fields.type\n\t\t}\n\t));\n\toperation.replacement = excisionTitle;\n\tswitch(event.paramObject.type || \"transclude\") {\n\t\tcase \"transclude\":\n\t\t\toperation.replacement = \"{{\" + operation.replacement+ \"}}\";\n\t\t\tbreak;\n\t\tcase \"link\":\n\t\t\toperation.replacement = wikiLinks ? \"[[\" + operation.replacement+ \"]]\"\n\t\t\t\t: (\"[\" + operation.replacement + \"](<#\" + operation.replacement + \">)\");\n\t\t\tbreak;\n\t\tcase \"macro\":\n\t\t\toperation.replacement = \"<<\" + (event.paramObject.macro || \"translink\") + \" \\\"\\\"\\\"\" + operation.replacement + \"\\\"\\\"\\\">>\";\n\t\t\tbreak;\n\t}\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n","type":"application/javascript","module-type":"texteditoroperation"},"$:/core/modules/editor/operations/text/focus-editor.js":{"title":"$:/core/modules/editor/operations/text/focus-editor.js","text":"/*\\\ntitle: $:/core/modules/editor/operations/text/focus-editor.js\ntype: application/javascript\nmodule-type: texteditoroperation\nSimply focus the Text editor\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"focus-editor\"] = function(event,operation) {\n\toperation = null;\n};\n\n})();","type":"application/javascript","module-type":"texteditoroperation"},"$:/core/modules/editor/operations/text/insert-text.js":{"title":"$:/core/modules/editor/operations/text/insert-text.js","text":"/*\\\ntitle: $:/core/modules/editor/operations/text/insert-text.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation insert text at the caret position. If there is a selection it is replaced.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"insert-text\"] = function(event,operation) {\n\toperation.replacement = event.paramObject.text;\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart + operation.replacement.length;\n\toperation.newSelEnd = operation.newSelStart;\n};\n\n})();\n","type":"application/javascript","module-type":"texteditoroperation"},"$:/core/modules/editor/operations/text/make-link.js":{"title":"$:/core/modules/editor/operations/text/make-link.js","text":"/*\\\ntitle: $:/core/modules/editor/operations/text/make-link.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to make a link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"make-link\"] = function(event,operation) {\n\tif(operation.selection) {\n\t\toperation.replacement = \"[[\" + operation.selection + \"|\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t} else {\n\t\toperation.replacement = \"[[\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t}\n\toperation.newSelStart = operation.selStart + operation.replacement.length;\n\toperation.newSelEnd = operation.newSelStart;\n};\n\n})();\n","type":"application/javascript","module-type":"texteditoroperation"},"$:/core/modules/editor/operations/text/prefix-lines.js":{"title":"$:/core/modules/editor/operations/text/prefix-lines.js","text":"/*\\\ntitle: $:/core/modules/editor/operations/text/prefix-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to add a prefix to the selected lines\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"prefix-lines\"] = function(event,operation) {\n\tvar targetCount = parseInt(event.paramObject.count + \"\",10);\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Compose the required prefix\n\tvar prefix = $tw.utils.repeat(event.paramObject.character,targetCount);\n\t// Process each line\n\tvar lines = operation.text.substring(operation.cutStart,operation.cutEnd).split(/\\r?\\n/mg);\n\t$tw.utils.each(lines,function(line,index) {\n\t\t// Remove and count any existing prefix characters\n\t\tvar count = 0;\n\t\twhile($tw.utils.startsWith(line,event.paramObject.character)) {\n\t\t\tline = line.substring(event.paramObject.character.length);\n\t\t\tcount++;\n\t\t}\n\t\t// Remove any whitespace\n\t\twhile(line.charAt(0) === \" \") {\n\t\t\tline = line.substring(1);\n\t\t}\n\t\t// We're done if we removed the exact required prefix, otherwise add it\n\t\tif(count !== targetCount) {\n\t\t\t// Apply the prefix\n\t\t\tline =  prefix + \" \" + line;\n\t\t}\n\t\t// Save the modified line\n\t\tlines[index] = line;\n\t});\n\t// Stitch the replacement text together and set the selection\n\toperation.replacement = lines.join(\"\\n\");\n\tif(lines.length === 1) {\n\t\toperation.newSelStart = operation.cutStart + operation.replacement.length;\n\t\toperation.newSelEnd = operation.newSelStart;\n\t} else {\n\t\toperation.newSelStart = operation.cutStart;\n\t\toperation.newSelEnd = operation.newSelStart + operation.replacement.length;\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"texteditoroperation"},"$:/core/modules/editor/operations/text/replace-all.js":{"title":"$:/core/modules/editor/operations/text/replace-all.js","text":"/*\\\ntitle: $:/core/modules/editor/operations/text/replace-all.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the entire text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-all\"] = function(event,operation) {\n\toperation.cutStart = 0;\n\toperation.cutEnd = operation.text.length;\n\toperation.replacement = event.paramObject.text;\n\toperation.newSelStart = 0;\n\toperation.newSelEnd = operation.replacement.length;\n};\n\n})();\n","type":"application/javascript","module-type":"texteditoroperation"},"$:/core/modules/editor/operations/text/replace-selection.js":{"title":"$:/core/modules/editor/operations/text/replace-selection.js","text":"/*\\\ntitle: $:/core/modules/editor/operations/text/replace-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the selection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-selection\"] = function(event,operation) {\n\toperation.replacement = event.paramObject.text;\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n","type":"application/javascript","module-type":"texteditoroperation"},"$:/core/modules/editor/operations/text/save-selection.js":{"title":"$:/core/modules/editor/operations/text/save-selection.js","text":"/*\\\ntitle: $:/core/modules/editor/operations/text/save-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to save the current selection in a specified tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"save-selection\"] = function(event,operation) {\n\tvar tiddler = event.paramObject.tiddler,\n\t\tfield = event.paramObject.field || \"text\";\n\tif(tiddler && field) {\n\t\tthis.wiki.setText(tiddler,field,null,operation.text.substring(operation.selStart,operation.selEnd));\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"texteditoroperation"},"$:/core/modules/editor/operations/text/wrap-lines.js":{"title":"$:/core/modules/editor/operations/text/wrap-lines.js","text":"/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selected lines with a prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-lines\"] = function(event,operation) {\n\tvar prefix = event.paramObject.prefix || \"\",\n\t\tsuffix = event.paramObject.suffix || \"\";\n\tif($tw.utils.endsWith(operation.text.substring(0,operation.selStart), prefix + \"\\n\") &&\n\t\t\t$tw.utils.startsWith(operation.text.substring(operation.selEnd), \"\\n\" + suffix)) {\n\t\t// Selected text is already surrounded by prefix and suffix: Remove them\n\t\t// Cut selected text plus prefix and suffix\n\t\toperation.cutStart = operation.selStart - (prefix.length + 1);\n\t\toperation.cutEnd = operation.selEnd + suffix.length + 1;\n\t\t// Also cut the following newline (if there is any)\n\t\tif (operation.text[operation.cutEnd] === \"\\n\") {\n\t\t\toperation.cutEnd++;\n\t\t}\n\t\t// Replace with selection\n\t\toperation.replacement = operation.text.substring(operation.selStart,operation.selEnd);\n\t\t// Select text that was in between prefix and suffix\n\t\toperation.newSelStart = operation.cutStart;\n\t\toperation.newSelEnd = operation.selEnd - (prefix.length + 1);\n\t} else {\n\t\t// Cut just past the preceding line break, or the start of the text\n\t\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t\t// Cut to just past the following line break, or to the end of the text\n\t\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t\t// Add the prefix and suffix\n\t\toperation.replacement = prefix + \"\\n\" +\n\t\t\t\t\toperation.text.substring(operation.cutStart,operation.cutEnd) + \"\\n\" +\n\t\t\t\t\tsuffix + \"\\n\";\n\t\toperation.newSelStart = operation.cutStart + prefix.length + 1;\n\t\toperation.newSelEnd = operation.newSelStart + (operation.cutEnd - operation.cutStart);\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"texteditoroperation"},"$:/core/modules/editor/operations/text/wrap-selection.js":{"title":"$:/core/modules/editor/operations/text/wrap-selection.js","text":"/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selection with the specified prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-selection\"] = function(event,operation) {\n\tvar o = operation,\n\t\tprefix = event.paramObject.prefix,\n\t\tsuffix = event.paramObject.suffix,\n\t\ttrimSelection = event.paramObject.trimSelection || \"no\",\n\t\tselLength = o.selEnd - o.selStart;\n\n\t// This function detects, if trailing spaces are part of the selection __and__ if the user wants to handle them\n\t// Returns \"yes\", \"start\", \"end\", \"no\" (default)\n\t//\tyes .. there are trailing spaces at both ends\n\t//\tstart .. there are trailing spaces at the start\n\t//\tend .. there are trailing spaces at the end\n\t//\tno .. no trailing spaces are taken into account\n\tvar trailingSpaceAt = function(sel) {\n\t\tvar _start,\n\t\t\t_end,\n\t\t\tresult;\n\t\t// trimSelection is a user parameter, which this evaluations takes into account\n\t\tswitch(trimSelection) {\n\t\t\tcase \"end\":\n\t\t\t\tresult = (sel.trimEnd().length !== selLength) ? \"end\" : \"no\";\n\t\t\t\tbreak;\n\t\t\tcase \"yes\":\n\t\t\t\t_start = sel.trimStart().length !== selLength;\n\t\t\t\t_end = sel.trimEnd().length !== selLength;\n\t\t\t\tresult = (_start && _end) ? \"yes\" : (_start) ? \"start\" : (_end) ? \"end\" : \"no\";\n\t\t\t\tbreak;\n\t\t\tcase \"start\":\n\t\t\t\tresult = (sel.trimStart().length !== selLength) ? \"start\" : \"no\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tresult = \"no\";\n\t\t\t\tbreak;\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction togglePrefixSuffix() {\n\t\tif(o.text.substring(o.selStart - prefix.length, o.selStart + suffix.length) === prefix + suffix) {\n\t\t\t// Remove the prefix and suffix\n\t\t\to.cutStart = o.selStart - prefix.length;\n\t\t\to.cutEnd = o.selEnd + suffix.length;\n\t\t\to.replacement = \"\";\n\t\t\to.newSelStart = o.cutStart;\n\t\t\to.newSelEnd = o.newSelStart;\n\t\t} else {\n\t\t\t// Wrap the cursor instead\n\t\t\to.cutStart = o.selStart;\n\t\t\to.cutEnd = o.selEnd;\n\t\t\to.replacement = prefix + suffix;\n\t\t\to.newSelStart = o.selStart + prefix.length;\n\t\t\to.newSelEnd = o.newSelStart;\n\t\t}\n\t}\n\n\t// options: lenPrefix, lenSuffix\n\tfunction removePrefixSuffix(options) {\n\t\toptions = options || {};\n\t\tvar _lenPrefix = options.lenPrefix || 0;\n\t\tvar _lenSuffix = options.lenSuffix || 0;\n\n\t\to.cutStart = o.selStart - _lenPrefix;\n\t\to.cutEnd = o.selEnd + _lenSuffix;\n\t\to.replacement = (_lenPrefix || _lenSuffix) ? o.selection : o.selection.substring(prefix.length, o.selection.length - suffix.length);\n\t\to.newSelStart = o.cutStart;\n\t\to.newSelEnd = o.cutStart + o.replacement.length;\n\t}\n\n\tfunction addPrefixSuffix() {\n\t\t// remove trailing space if requested\n\t\tswitch(trailingSpaceAt(o.selection)) {\n\t\t\tcase \"no\":\n\t\t\t\t// has no trailing spaces\n\t\t\t\to.cutStart = o.selStart;\n\t\t\t\to.cutEnd = o.selEnd;\n\t\t\t\to.replacement = prefix + o.selection + suffix;\n\t\t\t\to.newSelStart = o.selStart;\n\t\t\t\to.newSelEnd = o.selStart + o.replacement.length;\n\t\t\t\tbreak;\n\t\t\tcase \"yes\":\n\t\t\t\t// handle both ends\n\t\t\t\to.cutStart = o.selEnd - (o.selection.trimStart().length);\n\t\t\t\to.cutEnd = o.selection.trimEnd().length + o.selStart;\n\t\t\t\to.replacement = prefix + o.selection.trim() + suffix;\n\t\t\t\to.newSelStart = o.cutStart;\n\t\t\t\to.newSelEnd = o.cutStart + o.replacement.length;\n\t\t\t\tbreak;\n\t\t\tcase \"start\":\n\t\t\t\t// handle leading\n\t\t\t\to.cutStart = o.selEnd - (o.selection.trimStart().length);\n\t\t\t\to.cutEnd = o.selEnd;\n\t\t\t\to.replacement = prefix + o.selection.trimStart() + suffix;\n\t\t\t\to.newSelStart = o.cutStart;\n\t\t\t\to.newSelEnd = o.cutStart + o.replacement.length;\n\t\t\t\tbreak;\n\t\t\tcase \"end\":\n\t\t\t\t// handle trailing\n\t\t\t\to.cutStart = o.selStart;\n\t\t\t\to.cutEnd = o.selection.trimEnd().length + o.selStart;\n\t\t\t\to.replacement = prefix + o.selection.trimEnd() + suffix;\n\t\t\t\to.newSelStart = o.selStart;\n\t\t\t\to.newSelEnd = o.selStart + o.replacement.length;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif(o.selStart === o.selEnd) {\n\t\t// No selection; Create prefix and suffix. Set cursor in between them: \"\"|\"\"\n\t\ttogglePrefixSuffix();\n\t} else if(o.text.substring(o.selStart, o.selStart + prefix.length) === prefix &&\n\t\t\t\to.text.substring(o.selEnd - suffix.length,o.selEnd) === suffix) {\n\t\t// Prefix and suffix are already present, so remove them\n\t\tremovePrefixSuffix();\n\t} else if(o.text.substring(o.selStart - prefix.length, o.selStart) === prefix &&\n\t\t\t\to.text.substring(o.selEnd, o.selEnd + suffix.length) === suffix) {\n\t\t// Prefix and suffix are present BUT not selected -> remove them\n\t\tremovePrefixSuffix({\"lenPrefix\": prefix.length, \"lenSuffix\": suffix.length});\n\t} else {\n\t\t// Add the prefix and suffix\n\t\taddPrefixSuffix();\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"texteditoroperation"},"$:/core/modules/filterrunprefixes/all.js":{"title":"$:/core/modules/filterrunprefixes/all.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/all.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nUnion of sets without de-duplication.\nEquivalent to = filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.all = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.push.apply(results, operationSubFunction(source,widget));\n\t};\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/and.js":{"title":"$:/core/modules/filterrunprefixes/and.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/and.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nIntersection of sets.\nEquivalent to + filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.and = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\tsource = options.wiki.makeTiddlerIterator(results.toArray());\n\t\tresults.clear();\n\t\tresults.pushTop(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/cascade.js":{"title":"$:/core/modules/filterrunprefixes/cascade.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/cascade.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.cascade = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length !== 0) {\n\t\t\tvar filterList = operationSubFunction(source,widget),\n\t\t\t\tfilterFnList = [];\n\t\t\tvar inputResults = results.toArray();\n\t\t\tresults.clear();\n\t\t\t$tw.utils.each(inputResults,function(title) {\n\t\t\t\tvar result = \"\"; // If no filter matches, we return an empty string\n\t\t\t\t$tw.utils.each(filterList,function(filter,index) {\n\t\t\t\t\tif(!filterFnList[index]) {\n\t\t\t\t\t\tfilterFnList[index] = options.wiki.compileFilter(filter);\n\t\t\t\t\t}\n\t\t\t\t\tvar output = filterFnList[index](options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({\n\t\t\t\t\t\t\"currentTiddler\": \"\" + title,\n\t\t\t\t\t\t\"..currentTiddler\": widget.getVariable(\"currentTiddler\",\"\")\n\t\t\t\t\t}));\n\t\t\t\t\tif(output.length !== 0) {\n\t\t\t\t\t\tresult = output[0];\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tresults.push(result);\n\t\t\t});\n\t\t}\n\t}\n};\n\n})();","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/else.js":{"title":"$:/core/modules/filterrunprefixes/else.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/else.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nEquivalent to ~ filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.else = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length === 0) {\n\t\t\t// Main result so far is empty\n\t\t\tresults.pushTop(operationSubFunction(source,widget));\n\t\t}\n\t};\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/except.js":{"title":"$:/core/modules/filterrunprefixes/except.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/except.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nDifference of sets.\nEquivalent to - filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.except = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.remove(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/filter.js":{"title":"$:/core/modules/filterrunprefixes/filter.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/filter.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.filter = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar resultsToRemove = [],\n\t\t\t\tindex = 0;\n\t\t\tresults.each(function(title) {\n\t\t\t\tvar filtered = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({\n\t\t\t\t\t\"currentTiddler\": \"\" + title,\n\t\t\t\t\t\"..currentTiddler\": widget.getVariable(\"currentTiddler\",\"\"),\n\t\t\t\t\t\"index\": \"\" + index,\n\t\t\t\t\t\"revIndex\": \"\" +  (results.length - 1 - index),\n\t\t\t\t\t\"length\": \"\" + results.length\n\t\t\t\t}));\n\t\t\t\tif(filtered.length === 0) {\n\t\t\t\t\tresultsToRemove.push(title);\n\t\t\t\t}\n\t\t\t\t++index;\n\t\t\t});\n\t\t\tresults.remove(resultsToRemove);\n\t\t}\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/intersection.js":{"title":"$:/core/modules/filterrunprefixes/intersection.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/intersection.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.intersection = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length !== 0) {\n\t\t\tvar secondRunResults = operationSubFunction(source,widget);\n\t\t\tvar firstRunResults = results.toArray();\n\t\t\tresults.clear();\n\t\t\t$tw.utils.each(firstRunResults,function(title) {\n\t\t\t\tif(secondRunResults.indexOf(title) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/map.js":{"title":"$:/core/modules/filterrunprefixes/map.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/map.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.map = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar inputTitles = results.toArray(),\n\t\t\t\tindex = 0,\n\t\t\t\tsuffixes = options.suffixes,\n\t\t\t\tflatten = (suffixes[0] && suffixes[0][0] === \"flat\") ? true : false;\n\t\t\tresults.clear();\n\t\t\t$tw.utils.each(inputTitles,function(title) {\n\t\t\t\tvar filtered = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({\n\t\t\t\t\t\"currentTiddler\": \"\" + title,\n\t\t\t\t\t\"..currentTiddler\": widget.getVariable(\"currentTiddler\",\"\"),\n\t\t\t\t\t\"index\": \"\" + index,\n\t\t\t\t\t\"revIndex\": \"\" +  (inputTitles.length - 1 - index),\n\t\t\t\t\t\"length\": \"\" + inputTitles.length\n\t\t\t\t}));\n\t\t\t\tif(filtered.length && flatten) {\n\t\t\t\t\t$tw.utils.each(filtered,function(value) {\n\t\t\t\t\t\tresults.push(value);\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(filtered[0]||\"\");\n\t\t\t\t}\n\t\t\t\t++index;\n\t\t\t});\n\t\t}\n\t}\n};\n\n})();","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/or.js":{"title":"$:/core/modules/filterrunprefixes/or.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/or.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nEquivalent to a filter run with no prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.or = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.pushTop(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/reduce.js":{"title":"$:/core/modules/filterrunprefixes/reduce.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/reduce.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.reduce = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar accumulator = \"\",\n\t\t\t\tindex = 0;\n\t\t\tresults.each(function(title) {\n\t\t\t\tvar list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({\n\t\t\t\t\t\"currentTiddler\": \"\" + title,\n\t\t\t\t\t\"..currentTiddler\": widget.getVariable(\"currentTiddler\"),\n\t\t\t\t\t\"index\": \"\" + index,\n\t\t\t\t\t\"revIndex\": \"\" +  (results.length - 1 - index),\n\t\t\t\t\t\"length\": \"\" + results.length,\n\t\t\t\t\t\"accumulator\": \"\" + accumulator\n\t\t\t\t}));\n\t\t\t\tif(list.length > 0) {\n\t\t\t\t\taccumulator = \"\" + list[0];\n\t\t\t\t}\n\t\t\t\t++index;\n\t\t\t});\n\t\t\tresults.clear();\n\t\t\tresults.push(accumulator);\n\t\t}\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/sort.js":{"title":"$:/core/modules/filterrunprefixes/sort.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/sort.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.sort = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar suffixes = options.suffixes,\n\t\t\t\tsortType = (suffixes[0] && suffixes[0][0]) ? suffixes[0][0] : \"string\",\n\t\t\t\tinvert = suffixes[1] ? (suffixes[1].indexOf(\"reverse\") !== -1) : false,\n\t\t\t\tisCaseSensitive = suffixes[1] ? (suffixes[1].indexOf(\"casesensitive\") !== -1) : false,\n\t\t\t\tinputTitles = results.toArray(),\n\t\t\t\tsortKeys = [],\n\t\t\t\tindexes = new Array(inputTitles.length),\n\t\t\t\tcompareFn;\n\t\t\tresults.each(function(title) {\n\t\t\t\tvar key = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({\n\t\t\t\t\t\"currentTiddler\": \"\" + title,\n\t\t\t\t\t\"..currentTiddler\": widget.getVariable(\"currentTiddler\")\n\t\t\t\t}));\n\t\t\t\tsortKeys.push(key[0] || \"\");\n\t\t\t});\n\t\t\tresults.clear();\n\t\t\t// Prepare an array of indexes to sort\n\t\t\tfor(var t=0; t<inputTitles.length; t++) {\n\t\t\t\tindexes[t] = t;\n\t\t\t}\n\t\t\t// Sort the indexes\n\t\t\tcompareFn = $tw.utils.makeCompareFunction(sortType,{defaultType: \"string\", invert:invert, isCaseSensitive:isCaseSensitive});\n\t\t\tindexes = indexes.sort(function(a,b) {\n\t\t\t\t\treturn compareFn(sortKeys[a],sortKeys[b]);\n\t\t\t});\n\t\t\t// Add to results in correct order\n\t\t\t$tw.utils.each(indexes,function(index) {\n\t\t\t\tresults.push(inputTitles[index]);\n\t\t\t});\n\t\t}\n\t}\n};\n\n})();","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/then.js":{"title":"$:/core/modules/filterrunprefixes/then.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/then.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nReplace results of previous runs unless empty\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.then = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length !== 0) {\n\t\t\t// Only run if previous run(s) produced results\n\t\t\tvar thisRunResult = operationSubFunction(source,widget);\n\t\t\tif(thisRunResult.length !== 0) {\n\t\t\t\t// Replace results only if this run actually produces a result\n\t\t\t\tresults.clear();\n\t\t\t\tresults.pushTop(thisRunResult);\n\t\t\t}\n\t\t}\n\t};\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filters/addprefix.js":{"title":"$:/core/modules/filters/addprefix.js","text":"/*\\\ntitle: $:/core/modules/filters/addprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a prefix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand + title);\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/addsuffix.js":{"title":"$:/core/modules/filters/addsuffix.js","text":"/*\\\ntitle: $:/core/modules/filters/addsuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a suffix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addsuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title + operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/after.js":{"title":"$:/core/modules/filters/after.js","text":"/*\\\ntitle: $:/core/modules/filters/after.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is after the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.after = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index === -1 || index > (results.length - 2)) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index + 1]];\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/all/current.js":{"title":"$:/core/modules/filters/all/current.js","text":"/*\\\ntitle: $:/core/modules/filters/all/current.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar currTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(currTiddlerTitle) {\n\t\treturn [currTiddlerTitle];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"allfilteroperator"},"$:/core/modules/filters/all/missing.js":{"title":"$:/core/modules/filters/all/missing.js","text":"/*\\\ntitle: $:/core/modules/filters/all/missing.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\treturn options.wiki.getMissingTitles();\n};\n\n})();\n","type":"application/javascript","module-type":"allfilteroperator"},"$:/core/modules/filters/all/orphans.js":{"title":"$:/core/modules/filters/all/orphans.js","text":"/*\\\ntitle: $:/core/modules/filters/all/orphans.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[orphans]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphans = function(source,prefix,options) {\n\treturn options.wiki.getOrphanTitles();\n};\n\n})();\n","type":"application/javascript","module-type":"allfilteroperator"},"$:/core/modules/filters/all/shadows.js":{"title":"$:/core/modules/filters/all/shadows.js","text":"/*\\\ntitle: $:/core/modules/filters/all/shadows.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[shadows]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadows = function(source,prefix,options) {\n\treturn options.wiki.allShadowTitles();\n};\n\n})();\n","type":"application/javascript","module-type":"allfilteroperator"},"$:/core/modules/filters/all/tags.js":{"title":"$:/core/modules/filters/all/tags.js","text":"/*\\\ntitle: $:/core/modules/filters/all/tags.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tags]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,prefix,options) {\n\treturn Object.keys(options.wiki.getTagMap());\n};\n\n})();\n","type":"application/javascript","module-type":"allfilteroperator"},"$:/core/modules/filters/all/tiddlers.js":{"title":"$:/core/modules/filters/all/tiddlers.js","text":"/*\\\ntitle: $:/core/modules/filters/all/tiddlers.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddlers = function(source,prefix,options) {\n\treturn options.wiki.allTitles();\n};\n\n})();\n","type":"application/javascript","module-type":"allfilteroperator"},"$:/core/modules/filters/all.js":{"title":"$:/core/modules/filters/all.js","text":"/*\\\ntitle: $:/core/modules/filters/all.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for selecting tiddlers\n\n[all[shadows+tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar allFilterOperators;\n\nfunction getAllFilterOperators() {\n\tif(!allFilterOperators) {\n\t\tallFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"allfilteroperator\",allFilterOperators);\n\t}\n\treturn allFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.all = function(source,operator,options) {\n\t// Check for common optimisations\n\tvar subops = operator.operand.split(\"+\");\n\tif(subops.length === 1 && subops[0] === \"\") {\n\t\treturn source;\n\t} else if(subops.length === 1 && subops[0] === \"tiddlers\") {\n\t\treturn options.wiki.each;\n\t} else if(subops.length === 1 && subops[0] === \"shadows\") {\n\t\treturn options.wiki.eachShadow;\n\t} else if(subops.length === 2 && subops[0] === \"tiddlers\" && subops[1] === \"shadows\") {\n\t\treturn options.wiki.eachTiddlerPlusShadows;\n\t} else if(subops.length === 2 && subops[0] === \"shadows\" && subops[1] === \"tiddlers\") {\n\t\treturn options.wiki.eachShadowPlusTiddlers;\n\t}\n\t// Do it the hard way\n\t// Get our suboperators\n\tvar allFilterOperators = getAllFilterOperators();\n\t// Cycle through the suboperators accumulating their results\n\tvar results = new $tw.utils.LinkedList();\n\tfor(var t=0; t<subops.length; t++) {\n\t\tvar subop = allFilterOperators[subops[t]];\n\t\tif(subop) {\n\t\t\tresults.pushTop(subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results.makeTiddlerIterator(options.wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/backlinks.js":{"title":"$:/core/modules/filters/backlinks.js","text":"/*\\\ntitle: $:/core/modules/filters/backlinks.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backlinks from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.backlinks = function(source,operator,options) {\n\tvar results = new $tw.utils.LinkedList();\n\tsource(function(tiddler,title) {\n\t\tresults.pushTop(options.wiki.getTiddlerBacklinks(title));\n\t});\n\treturn results.makeTiddlerIterator(options.wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/backtranscludes.js":{"title":"$:/core/modules/filters/backtranscludes.js","text":"/*\\\ntitle: $:/core/modules/filters/backtranscludes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backtranscludes from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.backtranscludes = function(source,operator,options) {\n\tvar results = new $tw.utils.LinkedList();\n\tsource(function(tiddler,title) {\n\t\tresults.pushTop(options.wiki.getTiddlerBacktranscludes(title));\n\t});\n\treturn results.makeTiddlerIterator(options.wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/before.js":{"title":"$:/core/modules/filters/before.js","text":"/*\\\ntitle: $:/core/modules/filters/before.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is before the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.before = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index <= 0) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index - 1]];\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/commands.js":{"title":"$:/core/modules/filters/commands.js","text":"/*\\\ntitle: $:/core/modules/filters/commands.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the commands available in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.commands = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.commands,function(commandInfo,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/compare.js":{"title":"$:/core/modules/filters/compare.js","text":"/*\\\ntitle: $:/core/modules/filters/compare.js\ntype: application/javascript\nmodule-type: filteroperator\n\nGeneral purpose comparison operator\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.compare = function(source,operator,options) {\n\tvar suffixes = operator.suffixes || [],\n\t\ttype = (suffixes[0] || [])[0],\n\t\tmode = (suffixes[1] || [])[0],\n\t\ttypeFn = $tw.utils.makeCompareFunction(type,{defaultType: \"number\"}),\n\t\tmodeFn = modes[mode] || modes.eq,\n\t\tinvert = operator.prefix === \"!\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tif(modeFn(typeFn(title,operator.operand)) !== invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nvar modes = {\n\t\"eq\": function(value) {return value === 0;},\n\t\"ne\": function(value) {return value !== 0;},\n\t\"gteq\": function(value) {return value >= 0;},\n\t\"gt\": function(value) {return value > 0;},\n\t\"lteq\": function(value) {return value <= 0;},\n\t\"lt\": function(value) {return value < 0;}\n}\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/contains.js":{"title":"$:/core/modules/filters/contains.js","text":"/*\\\ntitle: $:/core/modules/filters/contains.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for finding values in array fields\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.contains = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = operator.suffix || \"list\";\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/count.js":{"title":"$:/core/modules/filters/count.js","text":"/*\\\ntitle: $:/core/modules/filters/count.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the number of entries in the current list.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.count = function(source,operator,options) {\n\tvar count = 0;\n\tsource(function(tiddler,title) {\n\t\tcount++;\n\t});\n\treturn [count + \"\"];\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/crypto.js":{"title":"$:/core/modules/filters/crypto.js","text":"/*\\\ntitle: $:/core/modules/filters/crypto.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for cryptography, using the Stanford JavaScript library\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.sha256 = function(source,operator,options) {\n\tvar results = [],\n\t\tlength = parseInt(operator.operand,10) || 20;\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.sha256(title,{length: length}));\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/days.js":{"title":"$:/core/modules/filters/days.js","text":"/*\\\ntitle: $:/core/modules/filters/days.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a specified date field within a specified date interval.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.days = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\tdayInterval = (parseInt(operator.operand,10)||0),\n\t\tdayIntervalSign = $tw.utils.sign(dayInterval),\n\t\ttargetTimeStamp = (new Date()).setHours(0,0,0,0) + 1000*60*60*24*dayInterval,\n\t\tisWithinDays = function(dateField) {\n\t\t\tvar sign = $tw.utils.sign(targetTimeStamp - (new Date(dateField)).setHours(0,0,0,0));\n\t\t\treturn sign === 0 || sign === dayIntervalSign;\n\t\t};\n\n\tif(operator.prefix === \"!\") {\n\t\ttargetTimeStamp = targetTimeStamp - 1000*60*60*24*dayIntervalSign;\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(!isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/deserialize.js":{"title":"$:/core/modules/filters/deserialize.js","text":"/*\\\ntitle: $:/core/modules/filters/deserialize.js\ntype: application/javascript\nmodule-type: filteroperator\nFilter operator for deserializing string data into JSON representing tiddlers\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"deserialize\"] = function(source,operator,options) {\n\tvar results = [],\n\t\tdeserializer;\n\tif(operator.operand) {\n\t\t// Get the deserializer identified by the operand\n\t\tdeserializer = $tw.Wiki.tiddlerDeserializerModules[operator.operand];\n\t\tif(deserializer) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tvar tiddlers;\n\t\t\t\ttry {\n\t\t\t\t\ttiddlers = deserializer(title);\n\t\t\t\t} catch(e) {\n\t\t\t\t\t// Return an empty array if we could not extract any tiddlers\n\t\t\t\t\ttiddlers = [];\n\t\t\t\t}\n\t\t\t\tresults.push(JSON.stringify(tiddlers));\n\t\t\t});\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/DeserializeOperator/UnknownDeserializer\")];\n\t\t}\n\t} else {\n\t\treturn [$tw.language.getString(\"Error/DeserializeOperator/MissingOperand\")];\n\t}\n\treturn results;\n}\n\n})();","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/deserializers.js":{"title":"$:/core/modules/filters/deserializers.js","text":"/*\\\ntitle: $:/core/modules/filters/deserializers.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the deserializers in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.deserializers = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.Wiki.tiddlerDeserializerModules,function(deserializer,type) {\n\t\tresults.push(type);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/duplicateslugs.js":{"title":"$:/core/modules/filters/duplicateslugs.js","text":"/*\\\ntitle: $:/core/modules/filters/duplicateslugs.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter function for [duplicateslugs[]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.duplicateslugs = function(source,operator,options) {\n\tvar slugs = Object.create(null), // Hashmap by slug of title, replaced with \"true\" if the duplicate title has already been output\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tvar slug = options.wiki.slugify(title);\n\t\tif(slug in slugs) {\n\t\t\tif(slugs[slug] !== true) {\n\t\t\t\tresults.push(slugs[slug]);\n\t\t\t\tslugs[slug] = true;\n\t\t\t}\n\t\t\tresults.push(title);\n\t\t} else {\n\t\t\tslugs[slug] = title;\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/each.js":{"title":"$:/core/modules/filters/each.js","text":"/*\\\ntitle: $:/core/modules/filters/each.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique value of the specified field.\nWith suffix \"list\", selects all tiddlers that are values in a specified list field.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.each = function(source,operator,options) {\n\tvar results =[] ,\n\tvalue,values = {},\n\tfield = operator.operand || \"title\";\n\tif(operator.suffix === \"value\" && field === \"title\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(values,title)) {\n\t\t\t\tvalues[title] = true;\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else if(operator.suffix !== \"list-item\") {\n\t\tif(field === \"title\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && !$tw.utils.hop(values,title)) {\n\t\t\t\t\tvalues[title] = true;\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvalue = tiddler.getFieldString(field);\n\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\t$tw.utils.each(\n\t\t\t\t\toptions.wiki.getTiddlerList(title,field),\n\t\t\t\t\tfunction(value) {\n\t\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\t\tresults.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/eachday.js":{"title":"$:/core/modules/filters/eachday.js","text":"/*\\\ntitle: $:/core/modules/filters/eachday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique day covered by the specified date field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.eachday = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = [],\n\t\tfieldName = operator.operand || \"modified\";\n\t// Function to convert a date/time to a date integer\n\tvar toDate = function(value) {\n\t\tvalue = (new Date(value)).setHours(0,0,0,0);\n\t\treturn value+0;\n\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\tvar value = toDate($tw.utils.parseDate(tiddler.fields[fieldName]));\n\t\t\tif(values.indexOf(value) === -1) {\n\t\t\t\tvalues.push(value);\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/editiondescription.js":{"title":"$:/core/modules/filters/editiondescription.js","text":"/*\\\ntitle: $:/core/modules/filters/editiondescription.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the descriptions of the specified edition names\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editiondescription = function(source,operator,options) {\n\tvar results = [];\n\tif($tw.node) {\n\t\tvar editionInfo = $tw.utils.getEditionInfo();\n\t\tif(editionInfo) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif($tw.utils.hop(editionInfo,title)) {\n\t\t\t\t\tresults.push(editionInfo[title].description || \"\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/editions.js":{"title":"$:/core/modules/filters/editions.js","text":"/*\\\ntitle: $:/core/modules/filters/editions.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the available editions in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editions = function(source,operator,options) {\n\tvar results = [];\n\tif($tw.node) {\n\t\tvar editionInfo = $tw.utils.getEditionInfo();\n\t\tif(editionInfo) {\n\t\t\t$tw.utils.each(editionInfo,function(info,name) {\n\t\t\t\tresults.push(name);\n\t\t\t});\n\t\t}\n\t\tresults.sort();\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/else.js":{"title":"$:/core/modules/filters/else.js","text":"/*\\\ntitle: $:/core/modules/filters/else.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing an empty input list with a constant, passing a non-empty input list straight through\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.else = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tif(results.length === 0) {\n\t\treturn [operator.operand];\n\t} else {\n\t\treturn results;\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/decodeuricomponent.js":{"title":"$:/core/modules/filters/decodeuricomponent.js","text":"/*\\\ntitle: $:/core/modules/filters/decodeuricomponent.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for applying decodeURIComponent() to each item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter functions\n*/\n\nexports.decodebase64 = function(source,operator,options) {\n\tvar results = [];\n\tvar binary = operator.suffixes && operator.suffixes[0].indexOf(\"binary\") !== -1;\n\tvar urlsafe = operator.suffixes && operator.suffixes[0].indexOf(\"urlsafe\") !== -1;\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.base64Decode(title,binary,urlsafe));\n\t});\n\treturn results;\n};\n\nexports.encodebase64 = function(source,operator,options) {\n\tvar results = [];\n\tvar binary = operator.suffixes && operator.suffixes[0].indexOf(\"binary\") !== -1;\n\tvar urlsafe = operator.suffixes && operator.suffixes[0].indexOf(\"urlsafe\") !== -1;\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.base64Encode(title,binary,urlsafe));\n\t});\n\treturn results;\n};\n\nexports.decodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.decodeURIComponentSafe(title));\n\t});\n\treturn results;\n};\n\nexports.encodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.encodeURIComponentExtended(title));\n\t});\n\treturn results;\n};\n\nexports.decodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.decodeURISafe(title));\n\t});\n\treturn results;\n};\n\nexports.encodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURI(title));\n\t});\n\treturn results;\n};\n\nexports.decodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlDecode(title));\n\t});\n\treturn results;\n};\n\nexports.encodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlEncode(title));\n\t});\n\treturn results;\n};\n\nexports.stringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.stringify(title,(operator.suffix === \"rawunicode\")));\n\t});\n\treturn results;\n};\n\nexports.jsonstringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.jsonStringify(title,(operator.suffix === \"rawunicode\")));\n\t});\n\treturn results;\n};\n\nexports.escaperegexp = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.escapeRegExp(title));\n\t});\n\treturn results;\n};\n\nexports.escapecss = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t// escape any character with a special meaning in CSS using CSS.escape()\n\t\tresults.push($tw.utils.escapeCSS(title));\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/enlist.js":{"title":"$:/core/modules/filters/enlist.js","text":"/*\\\ntitle: $:/core/modules/filters/enlist.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand parsed as a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.enlist = function(source,operator,options) {\n\tvar allowDuplicates = false;\n\tswitch(operator.suffix) {\n\t\tcase \"raw\":\n\t\t\tallowDuplicates = true;\n\t\t\tbreak;\n\t\tcase \"dedupe\":\n\t\t\tallowDuplicates = false;\n\t\t\tbreak;\n\t}\n\tvar list = $tw.utils.parseStringArray(operator.operand,allowDuplicates);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/field.js":{"title":"$:/core/modules/filters/field.js","text":"/*\\\ntitle: $:/core/modules/filters/field.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.field = function(source,operator,options) {\n\tvar results = [],indexedResults,\n\t\tfieldname = operator.suffix || operator.operator || \"title\";\n\tif(operator.prefix === \"!\") {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text !== operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !!operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tif(source.byField && operator.operand) {\n\t\t\t\tindexedResults = source.byField(fieldname,operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults\n\t\t\t\t}\n\t\t\t}\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text === operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/fields.js":{"title":"$:/core/modules/filters/fields.js","text":"/*\\\ntitle: $:/core/modules/filters/fields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.fields = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName,\n\t\tsuffixes = (operator.suffixes || [])[0] || [],\n\t\toperand = $tw.utils.parseStringArray(operator.operand);\n\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(suffixes.indexOf(\"include\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? $tw.utils.pushTop(results,fieldName) : \"\";\n\t\t\t\t}\n\t\t\t} else if (suffixes.indexOf(\"exclude\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? \"\" : $tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else if\n\t\t\telse {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else\n\t\t} // if (tiddler)\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/filter.js":{"title":"$:/core/modules/filters/filter.js","text":"/*\\\ntitle: $:/core/modules/filters/filter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning those input titles that pass a subfilter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.filter = function(source,operator,options) {\n\tvar filterFn = options.wiki.compileFilter(operator.operand),\n\t\tresults = [],\n\t\ttarget = operator.prefix !== \"!\";\n\tsource(function(tiddler,title) {\n\t\tvar list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),options.widget.makeFakeWidgetWithVariables({\n\t\t\t\"currentTiddler\": \"\" + title,\n\t\t\t\"..currentTiddler\": options.widget.getVariable(\"currentTiddler\",\"\")\n\t\t}));\n\t\tif((list.length > 0) === target) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/format/date.js":{"title":"$:/core/modules/filters/format/date.js","text":"/*\\\ntitle: $:/core/modules/filters/format/date.js\ntype: application/javascript\nmodule-type: formatfilteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.date = function(source,operand,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = $tw.utils.parseDate(title);\n\t\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\t\tresults.push($tw.utils.formatDateString(value,operand || \"YYYY MM DD 0hh:0mm\"));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();","type":"application/javascript","module-type":"formatfilteroperator"},"$:/core/modules/filters/format/json.js":{"title":"$:/core/modules/filters/format/json.js","text":"/*\\\ntitle: $:/core/modules/filters/format/json.js\ntype: application/javascript\nmodule-type: formatfilteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.json = function(source,operand,options) {\n\tvar results = [],\n\t\tspaces = null;\n\tif(operand) {\n\t\tspaces = /^\\d+$/.test(operand) ? parseInt(operand,10) : operand;\n\t}\n\tsource(function(tiddler,title) {\n\t\tvar data = $tw.utils.parseJSONSafe(title);\n\t\ttry {\n\t\t\tdata = JSON.parse(title);\n\t\t} catch(e) {\n\t\t\tdata = undefined;\n\t\t}\n\t\tif(data !== undefined) {\n\t\t\tresults.push(JSON.stringify(data,null,spaces));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();","type":"application/javascript","module-type":"formatfilteroperator"},"$:/core/modules/filters/format/relativedate.js":{"title":"$:/core/modules/filters/format/relativedate.js","text":"/*\\\ntitle: $:/core/modules/filters/format/relativedate.js\ntype: application/javascript\nmodule-type: formatfilteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.relativedate = function(source,operand,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = $tw.utils.parseDate(title);\n\t\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\t\tresults.push($tw.utils.getRelativeDate((new Date()) - (new Date(value))).description);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();","type":"application/javascript","module-type":"formatfilteroperator"},"$:/core/modules/filters/format/timestamp.js":{"title":"$:/core/modules/filters/format/timestamp.js","text":"/*\\\ntitle: $:/core/modules/filters/format/timestamp.js\ntype: application/javascript\nmodule-type: formatfilteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.timestamp = function(source,operand,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif (title.match(/^-?\\d+$/)) {\n\t\t\tvar value = new Date(Number(title));\n\t\t\tresults.push($tw.utils.formatDateString(value,operand || \"[UTC]YYYY0MM0DD0hh0mm0ss0XXX\"));\n\t\t}\n\t});\n\treturn results;\n};\n})();","type":"application/javascript","module-type":"formatfilteroperator"},"$:/core/modules/filters/format/titlelist.js":{"title":"$:/core/modules/filters/format/titlelist.js","text":"/*\\\ntitle: $:/core/modules/filters/format/titlelist.js\ntype: application/javascript\nmodule-type: formatfilteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.titlelist = function(source,operand,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title && title.length) {\n\t\t\tresults.push($tw.utils.stringifyList([title]));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"formatfilteroperator"},"$:/core/modules/filters/format.js":{"title":"$:/core/modules/filters/format.js","text":"/*\\\ntitle: $:/core/modules/filters/format.js\ntype: application/javascript\nmodule-type: filteroperator\nFilter operator for formatting strings\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar formatFilterOperators;\n\nfunction getFormatFilterOperators() {\n\tif(!formatFilterOperators) {\n\t\tformatFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"formatfilteroperator\",formatFilterOperators);\n\t}\n\treturn formatFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.format = function(source,operator,options) {\n\t// Dispatch to the correct formatfilteroperator\n\tvar formatFilterOperators = getFormatFilterOperators();\n\tif(operator.suffix) {\n\t\tvar formatFilterOperator = formatFilterOperators[operator.suffix];\n\t\tif(formatFilterOperator) {\n\t\t\treturn formatFilterOperator(source,operator.operand,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/FormatFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all unchanged if the suffix is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/function.js":{"title":"$:/core/modules/filters/function.js","text":"/*\\\ntitle: $:/core/modules/filters/function.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning those input titles that are returned from a function\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.function = function(source,operator,options) {\n\tvar functionName = operator.operands[0],\n\t\tparams = [];\n\t$tw.utils.each(operator.operands.slice(1),function(param) {\n\t\tparams.push({value: param});\n\t});\n\tvar variableInfo = options.widget && options.widget.getVariableInfo && options.widget.getVariableInfo(functionName,{params: params, source: source});\n\tif(variableInfo && variableInfo.srcVariable && variableInfo.srcVariable.isFunctionDefinition) {\n\t\treturn variableInfo.resultList ? variableInfo.resultList : [variableInfo.text];\n\t}\n\t// Return the input list if the function wasn't found\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/get.js":{"title":"$:/core/modules/filters/get.js","text":"/*\\\ntitle: $:/core/modules/filters/get.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing tiddler titles by the value of the field specified in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.get = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value = tiddler.getFieldString(operator.operand);\n\t\t\tif(value) {\n\t\t\t\tresults.push(value);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/getindex.js":{"title":"$:/core/modules/filters/getindex.js","text":"/*\\\ntitle: $:/core/modules/filters/getindex.js\ntype: application/javascript\nmodule-type: filteroperator\n\nreturns the value at a given index of datatiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getindex = function(source,operator,options) {\n\tvar data,title,results = [];\n\tif(operator.operand){\n\t\tsource(function(tiddler,title) {\n\t\t\ttitle = tiddler ? tiddler.fields.title : title;\n\t\t\tdata = options.wiki.extractTiddlerDataItem(tiddler,operator.operand);\n\t\t\tif(data) {\n\t\t\t\tresults.push(data);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/getvariable.js":{"title":"$:/core/modules/filters/getvariable.js","text":"/*\\\ntitle: $:/core/modules/filters/getvariable.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing input values by the value of the variable with the same name, or blank if the variable is missing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getvariable = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.widget.getVariable(title) || \"\");\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/has.js":{"title":"$:/core/modules/filters/has.js","text":"/*\\\ntitle: $:/core/modules/filters/has.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a tiddler has the specified field or index\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.has = function(source,operator,options) {\n\tvar results = [],\n\t\tinvert = operator.prefix === \"!\";\n\n\tif(operator.suffix === \"field\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse if(operator.suffix === \"index\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,operator.operand) || (tiddler.fields[operator.operand].length === 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && (tiddler.fields[operator.operand].length !== 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/haschanged.js":{"title":"$:/core/modules/filters/haschanged.js","text":"/*\\\ntitle: $:/core/modules/filters/haschanged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returns tiddlers from the list that have a non-zero changecount.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.haschanged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) === 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) > 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/indexes.js":{"title":"$:/core/modules/filters/indexes.js","text":"/*\\\ntitle: $:/core/modules/filters/indexes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the indexes of a data tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.indexes = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = options.wiki.getTiddlerDataCached(title);\n\t\tif(data) {\n\t\t\t$tw.utils.pushTop(results,Object.keys(data));\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/insertafter.js":{"title":"$:/core/modules/filters/insertafter.js","text":"/*\\\ntitle: $:/core/modules/filters/insertafter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nInsert an item after another item in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.insertafter = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar target = operator.operands[1] || (options.widget && options.widget.getVariable(operator.suffix || \"currentTiddler\"));\n\tif(target !== operator.operand) {\n\t\t// Remove the entry from the list if it is present\n\t\tvar pos = results.indexOf(operator.operand);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,1);\n\t\t}\n\t\t// Insert the entry after the target marker\n\t\tpos = results.indexOf(target);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos+1,0,operator.operand);\n\t\t} else {\n\t\t\tvar suffix = operator.operands.length > 1 ? operator.suffix : \"\";\n\t\t\tif(suffix === \"start\") {\n\t\t\t\tresults.splice(0,0,operator.operand);\n\t\t\t} else {\n\t\t\t\tresults.push(operator.operand);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/insertbefore.js":{"title":"$:/core/modules/filters/insertbefore.js","text":"/*\\\ntitle: $:/core/modules/filters/insertbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nInsert an item before another item in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.insertbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar target = operator.operands[1] || (options.widget && options.widget.getVariable(operator.suffix || \"currentTiddler\"));\n\tif(target !== operator.operand) {\n\t\t// Remove the entry from the list if it is present\n\t\tvar pos = results.indexOf(operator.operand);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,1);\n\t\t}\n\t\t// Insert the entry before the target marker\n\t\tpos = results.indexOf(target);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,0,operator.operand);\n\t\t} else {\n\t\t\tvar suffix = operator.operands.length > 1 ? operator.suffix : \"\";\n\t\t\tif(suffix == \"start\") {\n\t\t\t\tresults.splice(0,0,operator.operand);\n\t\t\t} else {\n\t\t\t\tresults.push(operator.operand);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/is/binary.js":{"title":"$:/core/modules/filters/is/binary.js","text":"/*\\\ntitle: $:/core/modules/filters/is/binary.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[binary]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.binary = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"isfilteroperator"},"$:/core/modules/filters/is/blank.js":{"title":"$:/core/modules/filters/is/blank.js","text":"/*\\\ntitle: $:/core/modules/filters/is/blank.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[blank]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.blank = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"isfilteroperator"},"$:/core/modules/filters/is/current.js":{"title":"$:/core/modules/filters/is/current.js","text":"/*\\\ntitle: $:/core/modules/filters/is/current.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar results = [],\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title !== currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title === currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"isfilteroperator"},"$:/core/modules/filters/is/draft.js":{"title":"$:/core/modules/filters/is/draft.js","text":"/*\\\ntitle: $:/core/modules/filters/is/draft.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[draft]] analagous to [has[draft.of]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.draft = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !tiddler.isDraft()) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.isDraft()) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"isfilteroperator"},"$:/core/modules/filters/is/image.js":{"title":"$:/core/modules/filters/is/image.js","text":"/*\\\ntitle: $:/core/modules/filters/is/image.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[image]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.image = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"isfilteroperator"},"$:/core/modules/filters/is/missing.js":{"title":"$:/core/modules/filters/is/missing.js","text":"/*\\\ntitle: $:/core/modules/filters/is/missing.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"isfilteroperator"},"$:/core/modules/filters/is/orphan.js":{"title":"$:/core/modules/filters/is/orphan.js","text":"/*\\\ntitle: $:/core/modules/filters/is/orphan.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[orphan]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphan = function(source,prefix,options) {\n\tvar results = [],\n\t\torphanTitles = options.wiki.getOrphanTitles();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) !== -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"isfilteroperator"},"$:/core/modules/filters/is/shadow.js":{"title":"$:/core/modules/filters/is/shadow.js","text":"/*\\\ntitle: $:/core/modules/filters/is/shadow.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[shadow]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadow = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"isfilteroperator"},"$:/core/modules/filters/is/system.js":{"title":"$:/core/modules/filters/is/system.js","text":"/*\\\ntitle: $:/core/modules/filters/is/system.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[system]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.system = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"isfilteroperator"},"$:/core/modules/filters/is/tag.js":{"title":"$:/core/modules/filters/is/tag.js","text":"/*\\\ntitle: $:/core/modules/filters/is/tag.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tag]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,prefix,options) {\n\tvar results = [],\n\t\ttagMap = options.wiki.getTagMap();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"isfilteroperator"},"$:/core/modules/filters/is/tiddler.js":{"title":"$:/core/modules/filters/is/tiddler.js","text":"/*\\\ntitle: $:/core/modules/filters/is/tiddler.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tiddler]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddler = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"isfilteroperator"},"$:/core/modules/filters/is/variable.js":{"title":"$:/core/modules/filters/is/variable.js","text":"/*\\\ntitle: $:/core/modules/filters/is/variable.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[variable]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variable = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.widget.getVariable(title) === undefined) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.widget.getVariable(title) !== undefined) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"isfilteroperator"},"$:/core/modules/filters/is.js":{"title":"$:/core/modules/filters/is.js","text":"/*\\\ntitle: $:/core/modules/filters/is.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking tiddler properties\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar isFilterOperators;\n\nfunction getIsFilterOperators() {\n\tif(!isFilterOperators) {\n\t\tisFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"isfilteroperator\",isFilterOperators);\n\t}\n\treturn isFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.is = function(source,operator,options) {\n\t// Dispatch to the correct isfilteroperator\n\tvar isFilterOperators = getIsFilterOperators();\n\tif(operator.operand) {\n\t\tvar isFilterOperator = isFilterOperators[operator.operand];\n\t\tif(isFilterOperator) {\n\t\t\treturn isFilterOperator(source,operator.prefix,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/IsFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all tiddlers if the operand is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/json-ops.js":{"title":"$:/core/modules/filters/json-ops.js","text":"/*\\\ntitle: $:/core/modules/filters/json-ops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for JSON operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"jsonget\"] = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = $tw.utils.parseJSONSafe(title,title);\n\t\tif(data) {\n\t\t\tvar items = getDataItemValueAsStrings(data,operator.operands);\n\t\t\tif(items !== undefined) {\n\t\t\t\tresults.push.apply(results,items);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\nexports[\"jsonextract\"] = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = $tw.utils.parseJSONSafe(title,title);\n\t\tif(data) {\n\t\t\tvar item = getDataItem(data,operator.operands);\n\t\t\tif(item !== undefined) {\n\t\t\t\tresults.push(JSON.stringify(item));\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\nexports[\"jsonindexes\"] = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = $tw.utils.parseJSONSafe(title,title);\n\t\tif(data) {\n\t\t\tvar items = getDataItemKeysAsStrings(data,operator.operands);\n\t\t\tif(items !== undefined) {\n\t\t\t\tresults.push.apply(results,items);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\nexports[\"jsontype\"] = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = $tw.utils.parseJSONSafe(title,title);\n\t\tif(data) {\n\t\t\tvar item = getDataItemType(data,operator.operands);\n\t\t\tif(item !== undefined) {\n\t\t\t\tresults.push(item);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\nexports[\"jsonset\"] = function(source,operator,options) {\n\tvar suffixes = operator.suffixes || [],\n\t\ttype = suffixes[0] && suffixes[0][0],\n\t\tindexes = operator.operands.slice(0,-1),\n\t\tvalue = operator.operands[operator.operands.length - 1],\n\t\tresults = [];\n\tif(operator.operands.length === 1 && operator.operands[0] === \"\") {\n\t\tvalue = undefined; // Prevents the value from being assigned\n\t}\n\tswitch(type) {\n\t\tcase \"string\":\n\t\t\t// Use value unchanged\n\t\t\tbreak;\n\t\tcase \"boolean\":\n\t\t\tvalue = (value === \"true\" ? true : (value === \"false\" ? false : undefined));\n\t\t\tbreak;\n\t\tcase \"number\":\n\t\t\tvalue = $tw.utils.parseNumber(value);\n\t\t\tbreak;\n\t\tcase \"array\":\n\t\t\tindexes = operator.operands;\n\t\t\tvalue = [];\n\t\t\tbreak;\n\t\tcase \"object\":\n\t\t\tindexes = operator.operands;\n\t\t\tvalue = {};\n\t\t\tbreak;\n\t\tcase \"null\":\n\t\t\tindexes = operator.operands;\n\t\t\tvalue = null;\n\t\t\tbreak;\n\t\tcase \"json\":\n\t\t\tvalue = $tw.utils.parseJSONSafe(value,function() {return undefined;});\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t// Use value unchanged\n\t\t\tbreak;\n\t}\n\tsource(function(tiddler,title) {\n\t\tvar data = $tw.utils.parseJSONSafe(title,title);\n\t\tif(data) {\n\t\t\tdata = setDataItem(data,indexes,value);\n\t\t\tresults.push(JSON.stringify(data));\n\t\t}\n\t});\n\treturn results;\n};\n\n/*\nGiven a JSON data structure and an array of index strings, return an array of the string representation of the values at the end of the index chain, or \"undefined\" if any of the index strings are invalid\n*/\nfunction getDataItemValueAsStrings(data,indexes) {\n\t// Get the item\n\tvar item = getDataItem(data,indexes);\n\t// Return the item as a string list\n\treturn convertDataItemValueToStrings(item);\n}\n\n/*\nGiven a JSON data structure and an array of index strings, return an array of the string representation of the keys of the item at the end of the index chain, or \"undefined\" if any of the index strings are invalid\n*/\nfunction getDataItemKeysAsStrings(data,indexes) {\n\t// Get the item\n\tvar item = getDataItem(data,indexes);\n\t// Return the item keys as a string\n\treturn convertDataItemKeysToStrings(item);\n}\n\n/*\nReturn an array of the string representation of the values of a data item, or \"undefined\" if the item is undefined\n*/\nfunction convertDataItemValueToStrings(item) {\n\t// Return the item as a string\n\tif(item === undefined) {\n\t\treturn undefined;\n\t} else if(item === null) {\n\t\treturn [\"null\"]\n\t} else if(typeof item === \"object\") {\n\t\tvar results = [],i,t;\n\t\tif($tw.utils.isArray(item)) {\n\t\t\t// Return all the items in arrays recursively\n\t\t\tfor(i=0; i<item.length; i++) {\n\t\t\t\tt = convertDataItemValueToStrings(item[i])\n\t\t\t\tif(t !== undefined) {\n\t\t\t\t\tresults.push.apply(results,t);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Return all the values in objects recursively\n\t\t\t$tw.utils.each(Object.keys(item).sort(),function(key) {\n\t\t\t\tt = convertDataItemValueToStrings(item[key]);\n\t\t\t\tif(t !== undefined) {\n\t\t\t\t\tresults.push.apply(results,t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn results;\n\t}\n\treturn [item.toString()];\n}\n\n/*\nReturn an array of the string representation of the keys of a data item, or \"undefined\" if the item is undefined\n*/\nfunction convertDataItemKeysToStrings(item) {\n\t// Return the item as a string\n\tif(item === undefined) {\n\t\treturn item;\n\t} else if(typeof item === \"object\") {\n\t\tif(item === null) {\n\t\t\treturn [];\n\t\t}\n\t\tvar results = [];\n\t\tif($tw.utils.isArray(item)) {\n\t\t\tfor(var i=0; i<item.length; i++) {\n\t\t\t\tresults.push(i.toString());\n\t\t\t}\n\t\t\treturn results;\n\t\t} else {\n\t\t\t$tw.utils.each(Object.keys(item).sort(),function(key) {\n\t\t\t\tresults.push(key);\n\t\t\t});\n\t\t\treturn results;\n\t\t}\n\t}\n\treturn [];\n}\n\nfunction getDataItemType(data,indexes) {\n\t// Get the item\n\tvar item = getDataItem(data,indexes);\n\t// Return the item type\n\tif(item === undefined) {\n\t\treturn item;\n\t} else if(item === null) {\n\t\treturn \"null\";\n\t} else if($tw.utils.isArray(item)) {\n\t\treturn \"array\";\n\t} else if(typeof item === \"object\") {\n\t\treturn \"object\";\n\t} else {\n\t\treturn typeof item;\n\t}\n}\n\nfunction getItemAtIndex(item,index) {\n\tif($tw.utils.hop(item,index)) {\n\t\treturn item[index];\n\t} else if($tw.utils.isArray(item)) {\n\t\tindex = $tw.utils.parseInt(index);\n\t\tif(index < 0) { index = index + item.length };\n\t\treturn item[index]; // Will be undefined if index was out-of-bounds\n\t} else {\n\t\treturn undefined;\n\t}\n}\n\n/*\nGiven a JSON data structure and an array of index strings, return the value at the end of the index chain, or \"undefined\" if any of the index strings are invalid\n*/\nfunction getDataItem(data,indexes) {\n\tif(indexes.length === 0 || (indexes.length === 1 && indexes[0] === \"\")) {\n\t\treturn data;\n\t}\n\t// Get the item\n\tvar item = data;\n\tfor(var i=0; i<indexes.length; i++) {\n\t\tif(item !== undefined) {\n\t\t\tif(item !== null && [\"number\",\"string\",\"boolean\"].indexOf(typeof item) === -1) {\n\t\t\t\titem = getItemAtIndex(item,indexes[i]);\n\t\t\t} else {\n\t\t\t\titem = undefined;\n\t\t\t}\n\t\t}\n\t}\n\treturn item;\n}\n\n/*\nGiven a JSON data structure, an array of index strings and a value, return the data structure with the value added at the end of the index chain. If any of the index strings are invalid then the JSON data structure is returned unmodified. If the root item is targetted then a different data object will be returned\n*/\nfunction setDataItem(data,indexes,value) {\n\t// Ignore attempts to assign undefined\n\tif(value === undefined) {\n\t\treturn data;\n\t}\n\t// Check for the root item\n\tif(indexes.length === 0 || (indexes.length === 1 && indexes[0] === \"\")) {\n\t\treturn value;\n\t}\n\t// Traverse the JSON data structure using the index chain\n\tvar current = data;\n\tfor(var i = 0; i < indexes.length - 1; i++) {\n\t\tcurrent = getItemAtIndex(current,indexes[i]);\n\t\tif(current === undefined) {\n\t\t\t// Return the original JSON data structure if any of the index strings are invalid\n\t\t\treturn data;\n\t\t}\n\t}\n\t// Add the value to the end of the index chain\n\tvar lastIndex = indexes[indexes.length - 1];\n\tif($tw.utils.isArray(current)) {\n\t\tlastIndex = $tw.utils.parseInt(lastIndex);\n\t\tif(lastIndex < 0) { lastIndex = lastIndex + current.length };\n\t}\n\t// Only set indexes on objects and arrays\n\tif(typeof current === \"object\") {\n\t\tcurrent[lastIndex] = value;\n\t}\n\treturn data;\n}\n\n})();\n\t","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/limit.js":{"title":"$:/core/modules/filters/limit.js","text":"/*\\\ntitle: $:/core/modules/filters/limit.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for chopping the results to a specified maximum number of entries\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.limit = function(source,operator,options) {\n\tvar results = [];\n\t// Convert to an array\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Slice the array if necessary\n\tvar limit = Math.min(results.length,parseInt(operator.operand,10));\n\tif(operator.prefix === \"!\") {\n\t\tresults = results.slice(-limit);\n\t} else {\n\t\tresults = results.slice(0,limit);\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/links.js":{"title":"$:/core/modules/filters/links.js","text":"/*\\\ntitle: $:/core/modules/filters/links.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the links from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.links = function(source,operator,options) {\n\tvar results = new $tw.utils.LinkedList();\n\tsource(function(tiddler,title) {\n\t\tresults.pushTop(options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results.makeTiddlerIterator(options.wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/list.js":{"title":"$:/core/modules/filters/list.js","text":"/*\\\ntitle: $:/core/modules/filters/list.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddlers whose title is listed in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.list = function(source,operator,options) {\n\tvar results = [],\n\t\ttr = $tw.utils.parseTextReference(operator.operand),\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\"),\n\t\tlist = options.wiki.getTiddlerList(tr.title || currTiddlerTitle,tr.field,tr.index);\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults = list;\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/listed.js":{"title":"$:/core/modules/filters/listed.js","text":"/*\\\ntitle: $:/core/modules/filters/listed.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that have the selected tiddlers in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.listed = function(source,operator,options) {\n\tvar field = operator.operand || \"list\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.findListingsOfTiddler(title,field));\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/listops.js":{"title":"$:/core/modules/filters/listops.js","text":"/*\\\ntitle: $:/core/modules/filters/listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for manipulating the current selection list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.order = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.operand.toLowerCase() === \"reverse\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.unshift(title);\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nReverse list\n*/\nexports.reverse = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.unshift(title);\n\t});\n\treturn results;\n};\n\n/*\nFirst entry/entries in list\n*/\nexports.first = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,count);\n};\n\n/*\nLast entry/entries in list\n*/\nexports.last = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tif(count === 0) return results;\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(-count);\n};\n\n/*\nAll but the first entry/entries of the list\n*/\nexports.rest = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count);\n};\nexports.butfirst = exports.rest;\nexports.bf = exports.rest;\n\n/*\nAll but the last entry/entries of the list\n*/\nexports.butlast = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = count === 0 ? results.length : -count;\n\treturn results.slice(0,index);\n};\nexports.bl = exports.butlast;\n\n/*\nThe nth member of the list\n*/\nexports.nth = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count - 1,count);\n};\n\n/*\nThe zero based nth member of the list\n*/\nexports.zth = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,0),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count,count + 1);\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/lookup.js":{"title":"$:/core/modules/filters/lookup.js","text":"/*\\\ntitle: $:/core/modules/filters/lookup.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that looks up values via a title prefix\n\n[lookup:<defaultvalue>:<field OR index>[<prefix>],[<field-name OR index-name>]]\n\nPrepends the prefix to the selected items and returns the specified \nfield or index value. If the 2nd suffix does not exist, it defaults to field.\nIf the second operand is missing it defaults to \"text\" for fields, and \"0\" for indexes\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.lookup = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = operator.suffixes || [],\n\t\tdefaultSuffix = suffixes[0] ? (suffixes[0][0] || \"\") : \"\",\n\t\tindexSuffix = (suffixes[1] && suffixes[1][0] === \"index\") ? true : false,\n\t\ttarget;\n\tif(operator.operands.length == 2) {\n\t\ttarget = operator.operands[1]\n\t} else {\n\t\ttarget = indexSuffix ? \"0\": \"text\";\n\t}\n\tif(indexSuffix) {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar data = options.wiki.extractTiddlerDataItem(operator.operands[0]+title,target,defaultSuffix);\n\t\t\tresults.push(data);\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar value = defaultSuffix;\n\t\t\tvar targetTiddler = options.wiki.getTiddler(operator.operands[0]+title);\n\t\t\tif(targetTiddler && targetTiddler.getFieldString(target)) {\n\t\t\t\tvalue = targetTiddler.getFieldString(target);\n\t\t\t}\n\t\t\tresults.push(value);\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/match.js":{"title":"$:/core/modules/filters/match.js","text":"/*\\\ntitle: $:/core/modules/filters/match.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title matches a string\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.match = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() !== (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() === (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title !== operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title === operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/math.js":{"title":"$:/core/modules/filters/math.js","text":"/*\\\ntitle: $:/core/modules/filters/math.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for math. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\nNote that strings are converted to numbers automatically. Trailing non-digits are ignored.\n\n* \"\" converts to 0\n* \"12kk\" converts to 12\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.negate = makeNumericBinaryOperator(\n\tfunction(a) {return -a}\n);\n\nexports.abs = makeNumericBinaryOperator(\n\tfunction(a) {return Math.abs(a)}\n);\n\nexports.ceil = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(a)}\n);\n\nexports.floor = makeNumericBinaryOperator(\n\tfunction(a) {return Math.floor(a)}\n);\n\nexports.round = makeNumericBinaryOperator(\n\tfunction(a) {return Math.round(a)}\n);\n\nexports.trunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.trunc(a)}\n);\n\nexports.untrunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(Math.abs(a)) * Math.sign(a)}\n);\n\nexports.sign = makeNumericBinaryOperator(\n\tfunction(a) {return Math.sign(a)}\n);\n\nexports.add = makeNumericBinaryOperator(\n\tfunction(a,b) {return a + b;}\n);\n\nexports.subtract = makeNumericBinaryOperator(\n\tfunction(a,b) {return a - b;}\n);\n\nexports.multiply = makeNumericBinaryOperator(\n\tfunction(a,b) {return a * b;}\n);\n\nexports.divide = makeNumericBinaryOperator(\n\tfunction(a,b) {return a / b;}\n);\n\nexports.remainder = makeNumericBinaryOperator(\n\tfunction(a,b) {return a % b;}\n);\n\nexports.max = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.max(a,b);}\n);\n\nexports.min = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.min(a,b);}\n);\n\nexports.fixed = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toFixed.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.precision = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toPrecision.call(a,Math.min(Math.max(b,1),100));}\n);\n\nexports.exponential = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toExponential.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.power = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.pow(a,b);}\n);\n\nexports.log = makeNumericBinaryOperator(\n\tfunction(a,b) {\n\t\tif(b) {\n\t\t\treturn Math.log(a)/Math.log(b);\n\t\t} else {\n\t\t\treturn Math.log(a);\n\t\t}\n\t}\n);\n\nexports.sum = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0 // Initial value\n);\n\nexports.product = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator * value},\n\t1 // Initial value\n);\n\nexports.maxall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.max(accumulator,value)},\n\t-Infinity // Initial value\n);\n\nexports.minall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.min(accumulator,value)},\n\tInfinity // Initial value\n);\n\nexports.median = makeNumericArrayOperator(\n\tfunction(values) {\n\t\tvar len = values.length, median;\n\t\tvalues.sort();\n\t\tif(len % 2) { \n\t\t\t// Odd, return the middle number\n\t\t\tmedian = values[(len - 1) / 2];\n\t\t} else {\n\t\t\t// Even, return average of two middle numbers\n\t\t\tmedian = (values[len / 2 - 1] + values[len / 2]) / 2;\n\t\t}\n\t\treturn [median];\n\t}\n);\n\nexports.average = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0, // Initial value\n\tfunction(finalValue,numberOfValues) {\n\t\treturn finalValue/numberOfValues;\n\t}\n);\n\nexports.variance = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0,\n\tfunction(finalValue,numberOfValues,originalValues) {\n\t\treturn getVarianceFromArray(originalValues,finalValue/numberOfValues);\n\t}\n);\n\nexports[\"standard-deviation\"] = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0,\n\tfunction(finalValue,numberOfValues,originalValues) {\n\t\tvar variance = getVarianceFromArray(originalValues,finalValue/numberOfValues);\n\t\treturn Math.sqrt(variance);\n\t}\n);\n\n//trigonometry\nexports.cos = makeNumericBinaryOperator(\n\tfunction(a) {return Math.cos(a)}\n);\n\nexports.sin = makeNumericBinaryOperator(\n\tfunction(a) {return Math.sin(a)}\n);\n\nexports.tan = makeNumericBinaryOperator(\n\tfunction(a) {return Math.tan(a)}\n);\n\nexports.acos = makeNumericBinaryOperator(\n\tfunction(a) {return Math.acos(a)}\n);\n\nexports.asin = makeNumericBinaryOperator(\n\tfunction(a) {return Math.asin(a)}\n);\n\nexports.atan = makeNumericBinaryOperator(\n\tfunction(a) {return Math.atan(a)}\n);\n\nexports.atan2 = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.atan2(a,b)}\n);\n\n//Calculate the variance of a population of numbers in an array given its mean\nfunction getVarianceFromArray(values,mean) {\n\tvar deviationTotal = values.reduce(function(accumulator,value) {\n\t\treturn accumulator + Math.pow(value - mean, 2);\n\t},0);\n\treturn deviationTotal/values.length;\n};\n\nfunction makeNumericBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [],\n\t\t\tnumOperand = $tw.utils.parseNumber(operator.operand);\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push($tw.utils.stringifyNumber(fnCalc($tw.utils.parseNumber(title),numOperand)));\n\t\t});\n\t\treturn result;\n\t};\n};\n\nfunction makeNumericReducingOperator(fnCalc,initialValue,fnFinal) {\n\tinitialValue = initialValue || 0;\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push($tw.utils.parseNumber(title));\n\t\t});\n\t\tvar value = result.reduce(function(accumulator,currentValue) {\n\t\t\t\treturn fnCalc(accumulator,currentValue);\n\t\t\t},initialValue);\n\t\tif(fnFinal) {\n\t\t\tvalue = fnFinal(value,result.length,result);\n\t\t}\n\t\treturn [$tw.utils.stringifyNumber(value)];\n\t};\n};\n\nfunction makeNumericArrayOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push($tw.utils.parseNumber(title));\n\t\t});\n\t\tresults = fnCalc(results);\n\t\t$tw.utils.each(results,function(value,index) {\n\t\t\tresults[index] = $tw.utils.stringifyNumber(value);\n\t\t});\n\t\treturn results;\n\t};\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/minlength.js":{"title":"$:/core/modules/filters/minlength.js","text":"/*\\\ntitle: $:/core/modules/filters/minlength.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for filtering out titles that don't meet the minimum length in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.minlength = function(source,operator,options) {\n\tvar results = [],\n\t\tminLength = parseInt(operator.operand || \"\",10) || 0;\n\tsource(function(tiddler,title) {\n\t\tif(title.length >= minLength) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/moduleproperty.js":{"title":"$:/core/modules/filters/moduleproperty.js","text":"/*\\\ntitle: $:/core/modules/filters/moduleproperty.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter [[module-name]moduleproperty[name]] retrieve a module property\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.moduleproperty = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = require(title)[operator.operand || \"\"];\n\t\tif(value !== undefined) {\n\t\t\tresults.push(value);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/modules.js":{"title":"$:/core/modules/filters/modules.js","text":"/*\\\ntitle: $:/core/modules/filters/modules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the modules of a given type in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.modules = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.operands.length >= 2) {\n\t\t// Return the modules that have the module property specified in the first operand with the value in the second operand\n\t\tsource(function(tiddler,title) {\n\t\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\t\tif(require(moduleName)[operator.operands[0]] === operator.operands[1]) {\n\t\t\t\t\tresults.push(moduleName);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\t// Return all the module names without filtering\n\t\tsource(function(tiddler,title) {\n\t\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\t\tresults.push(moduleName);\n\t\t\t});\n\t\t});\n\t}\n\tresults.sort();\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/moduletypes.js":{"title":"$:/core/modules/filters/moduletypes.js","text":"/*\\\ntitle: $:/core/modules/filters/moduletypes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the module types in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.moduletypes = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.modules.types,function(moduleInfo,type) {\n\t\tresults.push(type);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/next.js":{"title":"$:/core/modules/filters/next.js","text":"/*\\\ntitle: $:/core/modules/filters/next.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs next in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.next = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch++;\n\t\tif(match > 0 && match < list.length) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/plugintiddlers.js":{"title":"$:/core/modules/filters/plugintiddlers.js","text":"/*\\\ntitle: $:/core/modules/filters/plugintiddlers.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the shadow tiddlers within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.plugintiddlers = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerDataCached(title,{tiddlers:[]});\n\t\tif(pluginInfo && pluginInfo.tiddlers) {\n\t\t\t$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {\n\t\t\t\tresults.push(title);\n\t\t\t});\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/prefix.js":{"title":"$:/core/modules/filters/prefix.js","text":"/*\\\ntitle: $:/core/modules/filters/prefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title starts with a prefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.prefix = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tvar operand = operator.operand.toLowerCase();\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase().substr(0,operand.length) !== operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase().substr(0,operand.length) === operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.substr(0,operator.operand.length) !== operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/previous.js":{"title":"$:/core/modules/filters/previous.js","text":"/*\\\ntitle: $:/core/modules/filters/previous.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs immediately prior in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.previous = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch--;\n\t\tif(match >= 0) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/range.js":{"title":"$:/core/modules/filters/range.js","text":"/*\\\ntitle: $:/core/modules/filters/range.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for generating a numeric range.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.range = function(source,operator,options) {\n\tvar results = [];\n\t// For backwards compatibility, if there is only one operand, try to split it using one of the delimiters\n\tvar parts = operator.operands || [];\n\tif(parts.length === 1) {\n\t\tparts = operator.operand.split(/[,:;]/g);\n\t}\n\t// Process the parts\n\tvar beg, end, inc, i, fixed = 0;\n\tfor (i=0; i<parts.length; i++) {\n\t\t// Validate real number\n\t\tif(!/^\\s*[+-]?((\\d+(\\.\\d*)?)|(\\.\\d+))\\s*$/.test(parts[i])) {\n\t\t\treturn [\"range: bad number \\\"\" + parts[i] + \"\\\"\"];\n\t\t}\n\t\t// Count digits; the most precise number determines decimal places in output.\n\t\tvar frac = /\\.\\d+/.exec(parts[i]);\n\t\tif(frac) {\n\t\t\tfixed = Math.max(fixed,frac[0].length-1);\n\t\t}\n\t\tparts[i] = parseFloat(parts[i]);\n\t}\n\tswitch(parts.length) {\n\t\tcase 1:\n\t\t\tend = parts[0];\n\t\t\tif (end >= 1) {\n\t\t\t\tbeg = 1;\n\t\t\t}\n\t\t\telse if (end <= -1) {\n\t\t\t\tbeg = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = Math.abs(parts[2]);\n\t\t\tbreak;\n\t}\n\tif(inc === 0) {\n\t\treturn [\"range: increment 0 causes infinite loop\"];\n\t}\n\t// May need to count backwards\n\tvar direction = ((end < beg) ? -1 : 1);\n\tinc *= direction;\n\t// Estimate number of resulting elements\n\tif((end - beg) / inc > 10000) {\n\t\treturn [\"range: too many steps (over 10K)\"];\n\t}\n\t// Avoid rounding error on last step\n\tend += direction * 0.5 * Math.pow(0.1,fixed);\n\tvar safety = 10010;\n\t// Enumerate the range\n\tif (end<beg) {\n\t\tfor(i=beg; i>end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor(i=beg; i<end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif(safety<0) {\n\t\treturn [\"range: unexpectedly large output\"];\n\t}\n\t// Reverse?\n\tif(operator.prefix === \"!\") {\n\t\tresults.reverse();\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/reduce.js":{"title":"$:/core/modules/filters/reduce.js","text":"/*\\\ntitle: $:/core/modules/filters/reduce.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator evaluates a subfilter for each item, making the running total available in the variable `accumulator`, and the current index available in the variable `index`\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.reduce = function(source,operator,options) {\n\t// Accumulate the list\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Run the filter over each item\n\tvar filterFn = options.wiki.compileFilter(operator.operand),\n\t\taccumulator = operator.operands[1] || \"\";\n\tfor(var index=0; index<results.length; index++) {\n\t\tvar title = results[index],\n\t\t\tlist = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),options.widget.makeFakeWidgetWithVariables({\n\t\t\t\t\"currentTiddler\": \"\" + title,\n\t\t\t\t\"..currentTiddler\": options.widget.getVariable(\"currentTiddler\"),\n\t\t\t\t\"accumulator\": \"\" + accumulator,\n\t\t\t\t\"index\": \"\" + index,\n\t\t\t\t\"revIndex\": \"\" + (results.length - 1 - index),\n\t\t\t\t\"length\": \"\" + results.length\n\t\t\t}));\n\t\tif(list.length > 0) {\n\t\t\taccumulator = \"\" +  list[0];\n\t\t}\n\t}\n\tif(results.length > 0) {\n\t\treturn [accumulator];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/regexp.js":{"title":"$:/core/modules/filters/regexp.js","text":"/*\\\ntitle: $:/core/modules/filters/regexp.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for regexp matching\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.regexp = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = operator.suffix || \"title\",\n\t\tregexpString, regexp, flags = \"\", match,\n\t\tgetFieldString = function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\treturn tiddler.getFieldString(fieldname);\n\t\t\t} else if(fieldname === \"title\") {\n\t\t\t\treturn title;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t// Process flags and construct regexp\n\tregexpString = operator.operand;\n\tmatch = /^\\(\\?([gim]+)\\)/.exec(regexpString);\n\tif(match) {\n\t\tflags = match[1];\n\t\tregexpString = regexpString.substr(match[0].length);\n\t} else {\n\t\tmatch = /\\(\\?([gim]+)\\)$/.exec(regexpString);\n\t\tif(match) {\n\t\t\tflags = match[1];\n\t\t\tregexpString = regexpString.substr(0,regexpString.length - match[0].length);\n\t\t}\n\t}\n\ttry {\n\t\tregexp = new RegExp(regexpString,flags);\n\t} catch(e) {\n\t\treturn [\"\" + e];\n\t}\n\t// Process the incoming tiddlers\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/removeprefix.js":{"title":"$:/core/modules/filters/removeprefix.js","text":"/*\\\ntitle: $:/core/modules/filters/removeprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a prefix from each title in the list. Titles that do not start with the prefix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removeprefix = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tvar operand = operator.operand.toLowerCase();\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.toLowerCase().substr(0,operand.length) === operand) {\n\t\t\t\tresults.push(title.substr(operand.length));\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title.substr(operator.operand.length));\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/removesuffix.js":{"title":"$:/core/modules/filters/removesuffix.js","text":"/*\\\ntitle: $:/core/modules/filters/removesuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a suffix from each title in the list. Titles that do not end with the suffix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removesuffix = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif (!operator.operand) {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t} else if(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tvar operand = operator.operand.toLowerCase();\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title && title.toLowerCase().substr(-operand.length) === operand) {\n\t\t\t\tresults.push(title.substr(0,title.length - operand.length));\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title && title.substr(-operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title.substr(0,title.length - operator.operand.length));\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/sameday.js":{"title":"$:/core/modules/filters/sameday.js","text":"/*\\\ntitle: $:/core/modules/filters/sameday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a modified date field on the same day as the provided value.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sameday = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\ttargetDate = (new Date($tw.utils.parseDate(operator.operand))).setHours(0,0,0,0);\n\t// Function to convert a date/time to a date integer\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(tiddler.getFieldDay(fieldName) === targetDate) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/search.js":{"title":"$:/core/modules/filters/search.js","text":"/*\\\ntitle: $:/core/modules/filters/search.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for searching for the text in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.search = function(source,operator,options) {\n\tvar invert = operator.prefix === \"!\";\n\tif(operator.suffixes) {\n\t\tvar hasFlag = function(flag) {\n\t\t\t\treturn (operator.suffixes[1] || []).indexOf(flag) !== -1;\n\t\t\t},\n\t\t\texcludeFields = false,\n\t\t\tfieldList = operator.suffixes[0] || [],\n\t\t\tfirstField = fieldList[0] || \"\", \n\t\t\tfirstChar = firstField.charAt(0),\n\t\t\tfields;\n\t\tif(firstChar === \"-\") {\n\t\t\tfields = [firstField.slice(1)].concat(fieldList.slice(1));\n\t\t\texcludeFields = true;\n\t\t} else if(fieldList[0] === \"*\"){\n\t\t\tfields = [];\n\t\t\texcludeFields = true;\n\t\t} else {\n\t\t\tfields = fieldList.slice(0);\n\t\t}\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert,\n\t\t\tfield: fields,\n\t\t\texcludeField: excludeFields,\n\t\t\tsome: hasFlag(\"some\"),\n\t\t\tcaseSensitive: hasFlag(\"casesensitive\"),\n\t\t\tliteral: hasFlag(\"literal\"),\n\t\t\twhitespace: hasFlag(\"whitespace\"),\n\t\t\tanchored: hasFlag(\"anchored\"),\n\t\t\tregexp: hasFlag(\"regexp\"),\n\t\t\twords: hasFlag(\"words\")\n\t\t});\n\t} else {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert\n\t\t});\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/shadowsource.js":{"title":"$:/core/modules/filters/shadowsource.js","text":"/*\\\ntitle: $:/core/modules/filters/shadowsource.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the source plugins for shadow tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadowsource = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar source = options.wiki.getShadowSource(title);\n\t\tif(source) {\n\t\t\t$tw.utils.pushTop(results,source);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/slugify.js":{"title":"$:/core/modules/filters/slugify.js","text":"/*\\\ntitle: $:/core/modules/filters/slugify.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for slugifying a tiddler title\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.slugify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.slugify(title));\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/sort.js":{"title":"$:/core/modules/filters/sort.js","text":"/*\\\ntitle: $:/core/modules/filters/sort.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,false);\n\treturn results;\n};\n\nexports.nsort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,true);\n\treturn results;\n};\n\nexports.sortan = function(source, operator, options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results, operator.operand || \"title\", operator.prefix === \"!\",false,false,true);\n\treturn results;\n};\n\nexports.sortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,false);\n\treturn results;\n};\n\nexports.nsortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,true);\n\treturn results;\n};\n\nvar prepare_results = function (source) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/sortsub.js":{"title":"$:/core/modules/filters/sortsub.js","text":"/*\\\ntitle: $:/core/modules/filters/sortsub.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting by a subfilter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sortsub = function(source,operator,options) {\n\t// Compile the subfilter\n\tvar filterFn = options.wiki.compileFilter(operator.operand);\n\t// Collect the input titles and the corresponding sort keys\n\tvar inputTitles = [],\n\t\tsortKeys = [];\n\tsource(function(tiddler,title) {\n\t\tinputTitles.push(title);\n\t\tvar r = filterFn.call(options.wiki,function(iterator) {\n\t\t\titerator(options.wiki.getTiddler(title),title);\n\t\t},options.widget.makeFakeWidgetWithVariables({\n\t\t\t\"currentTiddler\": \"\" + title,\n\t\t\t\"..currentTiddler\": options.widget.getVariable(\"currentTiddler\")\n\t\t}));\n\t\tsortKeys.push(r[0] || \"\");\n\t});\n\t// Rather than sorting the titles array, we'll sort the indexes so that we can consult both arrays\n\tvar indexes = new Array(inputTitles.length);\n\tfor(var t=0; t<inputTitles.length; t++) {\n\t\tindexes[t] = t;\n\t}\n\t// Sort the indexes\n\tvar compareFn = $tw.utils.makeCompareFunction(operator.suffix,{defaultType: \"string\",invert: operator.prefix === \"!\"});\n\tindexes = indexes.sort(function(a,b) {\n\t\treturn compareFn(sortKeys[a],sortKeys[b]);\n\t});\n\t// Make the results array in order\n\tvar results = [];\n\t$tw.utils.each(indexes,function(index) {\n\t\tresults.push(inputTitles[index]);\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/splitbefore.js":{"title":"$:/core/modules/filters/splitbefore.js","text":"/*\\\ntitle: $:/core/modules/filters/splitbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that splits each result on the first occurance of the specified separator and returns the unique values.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.splitbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar parts = title.split(operator.operand);\n\t\tif(parts.length === 1) {\n\t\t\t$tw.utils.pushTop(results,parts[0]);\n\t\t} else {\n\t\t\t$tw.utils.pushTop(results,parts[0] + operator.operand);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/storyviews.js":{"title":"$:/core/modules/filters/storyviews.js","text":"/*\\\ntitle: $:/core/modules/filters/storyviews.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the story views in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.storyviews = function(source,operator,options) {\n\tvar results = [],\n\t\tstoryviews = {};\n\t$tw.modules.applyMethods(\"storyview\",storyviews);\n\t$tw.utils.each(storyviews,function(info,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/strings.js":{"title":"$:/core/modules/filters/strings.js","text":"/*\\\ntitle: $:/core/modules/filters/strings.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for strings. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.length = makeStringBinaryOperator(\n\tfunction(a) {return [\"\" + (\"\" + a).length];}\n);\n\nexports.uppercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toUpperCase()];}\n);\n\nexports.lowercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toLowerCase()];}\n);\n\nexports.sentencecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toSentenceCase(a)];}\n);\n\nexports.titlecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toTitleCase(a)];}\n);\n\nexports.trim = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\toperand = (operator.operand || \"\"),\n\t\tfnCalc;\n\tif(suffix === \"prefix\") {\n\t\tfnCalc = function(a,b) {return [$tw.utils.trimPrefix(a,b)];}\n\t} else if(suffix === \"suffix\") {\n\t\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix(a,b)];}\n\t} else {\n\t\tif(operand === \"\") {\n\t\t\tfnCalc = function(a) {return [$tw.utils.trim(a)];}\n\t\t} else {\n\t\t\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix($tw.utils.trimPrefix(a,b),b)];}\n\t\t}\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,fnCalc(title,operand));\n\t});\n\treturn result;\n};\n\nexports.split = makeStringBinaryOperator(\n\tfunction(a,b) {return (\"\" + a).split(b);}\n);\n\nexports[\"enlist-input\"] = makeStringBinaryOperator(\n\tfunction(a,o,s) {return $tw.utils.parseStringArray(\"\" + a,(s === \"raw\"));}\n);\n\nexports.join = makeStringReducingOperator(\n\tfunction(accumulator,value,operand) {\n\t\tif(accumulator === null) {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn accumulator + operand + value;\n\t\t}\n\t},null\n);\n\nvar dmp = require(\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\");\n\nexports.levenshtein = makeStringBinaryOperator(\n\tfunction(a,b) {\n\t\tvar dmpObject = new dmp.diff_match_patch(),\n\t\t\tdiffs = dmpObject.diff_main(a,b);\n\t\treturn [dmpObject.diff_levenshtein(diffs) + \"\"];\n\t}\n);\n\n// these two functions are adapted from https://github.com/google/diff-match-patch/wiki/Line-or-Word-Diffs\nfunction diffLineWordMode(text1,text2,mode) {\n\tvar dmpObject = new dmp.diff_match_patch();\n\tvar a = diffPartsToChars(text1,text2,mode);\n\tvar lineText1 = a.chars1;\n\tvar lineText2 = a.chars2;\n\tvar lineArray = a.lineArray;\n\tvar diffs = dmpObject.diff_main(lineText1,lineText2,false);\n\tdmpObject.diff_charsToLines_(diffs,lineArray);\n\treturn diffs;\n}\n\nfunction diffPartsToChars(text1,text2,mode) {\n\tvar lineArray = [];\n\tvar lineHash = {};\n\tlineArray[0] = '';\n\n    function diff_linesToPartsMunge_(text,mode) {\n        var chars = '';\n        var lineStart = 0;\n        var lineEnd = -1;\n        var lineArrayLength = lineArray.length,\n            regexpResult;\n        var searchRegexp = /\\W+/g;\n        while(lineEnd < text.length - 1) {\n\t        if(mode === \"words\") {\n                regexpResult = searchRegexp.exec(text);\n                lineEnd = searchRegexp.lastIndex;\n                if(regexpResult === null) {\n                lineEnd = text.length;\n                }\n                lineEnd = --lineEnd;\n            } else {\n                lineEnd = text.indexOf('\\n', lineStart);\n                if(lineEnd == -1) {\n                    lineEnd = text.length - 1;\n                }\n            }\n            var line = text.substring(lineStart, lineEnd + 1);\n\n            if(lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : (lineHash[line] !== undefined)) {\n\t\t\t\tchars += String.fromCharCode(lineHash[line]);\n            } else {\n                if(lineArrayLength == maxLines) {\n                  line = text.substring(lineStart);\n                  lineEnd = text.length;\n                }\n                chars += String.fromCharCode(lineArrayLength);\n                lineHash[line] = lineArrayLength;\n                lineArray[lineArrayLength++] = line;\n            }\n            lineStart = lineEnd + 1;\n        }\n        return chars;\n    }\n    var maxLines = 40000;\n    var chars1 = diff_linesToPartsMunge_(text1,mode);\n    maxLines = 65535;\n    var chars2 = diff_linesToPartsMunge_(text2,mode);\n    return {chars1: chars1, chars2: chars2, lineArray: lineArray};\n};\n\nexports.makepatches = function(source,operator,options) {\n\tvar dmpObject = new dmp.diff_match_patch(),\n\t\tsuffix = operator.suffix || \"\",\n\t\tresult = [];\n\t\t\n\t\tsource(function(tiddler,title) {\n\t\t\tvar diffs, patches;\n\t\t\tif(suffix === \"lines\" || suffix === \"words\") {\n\t\t\t\tdiffs = diffLineWordMode(title,operator.operand,suffix);\n\t\t\t\tpatches = dmpObject.patch_make(title,diffs);\n\t\t\t} else {\n\t\t\t\tpatches = dmpObject.patch_make(title,operator.operand);\n\t\t\t}\n\t\t\tArray.prototype.push.apply(result,[dmpObject.patch_toText(patches)]);\n\t\t});\n\n\treturn result;\n};\n\nexports.applypatches = makeStringBinaryOperator(\n\tfunction(a,b) {\n\t\tvar dmpObject = new dmp.diff_match_patch(),\n\t\t\tpatches;\n\t\ttry {\n\t\t\tpatches = dmpObject.patch_fromText(b);\n\t\t} catch(e) {\n\t\t}\n\t\tif(patches) {\n\t\t\treturn [dmpObject.patch_apply(patches,a)[0]];\n\t\t} else {\n\t\t\treturn [a];\n\t\t}\n\t}\n);\n\nfunction makeStringBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tArray.prototype.push.apply(result,fnCalc(title,operator.operand || \"\",operator.suffix || \"\"));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeStringReducingOperator(fnCalc,initialValue) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\tif(result.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\treturn [result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,currentValue,operator.operand || \"\");\n\t\t},initialValue) || \"\"];\n\t};\n}\n\nexports.splitregexp = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\tflags = (suffix.indexOf(\"m\") !== -1 ? \"m\" : \"\") + (suffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tregExp;\n\ttry {\n\t\tregExp = new RegExp(operator.operand || \"\",flags);\n\t} catch(ex) {\n\t\treturn [\"RegExp error: \" + ex];\n\t}\n\tsource(function(tiddler,title) {\n\t\tvar parts = title.split(regExp).map(function(part){\n\t\t\treturn part || \"\";\t// make sure it's a string\n\t\t});\n\t\tArray.prototype.push.apply(result,parts);\n\t});\n\treturn result;\n};\n\nexports[\"search-replace\"] = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = operator.suffixes || [],\n\t\tflagSuffix = (suffixes[0] ? (suffixes[0][0] || \"\") : \"\"),\n\t\tflags = (flagSuffix.indexOf(\"g\") !== -1 ? \"g\" : \"\") + (flagSuffix.indexOf(\"i\") !== -1 ? \"i\" : \"\") + (flagSuffix.indexOf(\"m\") !== -1 ? \"m\" : \"\"),\n\t\tisRegExp = (suffixes[1] && suffixes[1][0] === \"regexp\") ? true : false,\n\t\t//Escape regexp characters if the operand is not a regular expression\n\t\tsearchTerm = isRegExp ? operator.operand : $tw.utils.escapeRegExp(operator.operand),\n\t\t//Escape $ character in replacement string if not in regular expression mode\n\t\treplacement = isRegExp ? operator.operands[1] : (operator.operands[1]||\"\").replace(/\\$/g,\"$$$$\"),\n\t\tregExp;\n\ttry {\n\t\tregExp = new RegExp(searchTerm,flags);\n\t} catch(ex) {\n\t\treturn [\"RegExp error: \" + ex];\n\t}\n\n\tsource(function(tiddler,title) {\n\t\tif(title && (operator.operands.length > 1)) {\n\t\t\tresults.push(\n\t\t\t\ttitle.replace(regExp,replacement)\n\t\t\t);\n\t\t\tregExp.lastIndex = 0;\n\t\t} else {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nexports.pad = function(source,operator,options) {\n\tvar results = [],\n\t\ttargetLength = operator.operand ? parseInt(operator.operand) : 0,\n\t\tfill = operator.operands[1] || \"0\";\n\n\tsource(function(tiddler,title) {\n\t\tif(title && title.length) {\n\t\t\tif(title.length >= targetLength) {\n\t\t\t\tresults.push(title);\n\t\t\t} else {\n\t\t\t\tvar padString = \"\",\n\t\t\t\t\tpadStringLength = targetLength - title.length;\n\t\t\t\twhile(padStringLength > padString.length) {\n\t\t\t\t\tpadString += fill;\n\t\t\t\t}\n\t\t\t\t//make sure we do not exceed the specified length\n\t\t\t\tpadString = padString.slice(0,padStringLength);\n\t\t\t\tif(operator.suffix && (operator.suffix === \"suffix\")) {\n\t\t\t\t\ttitle = title + padString;\n\t\t\t\t} else {\n\t\t\t\t\ttitle = padString + title;\n\t\t\t\t}\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n}\n\nexports.charcode = function(source,operator,options) {\n\tvar chars = [];\n\t$tw.utils.each(operator.operands,function(operand) {\n\t\tif(operand !== \"\") {\n\t\t\tchars.push(String.fromCharCode($tw.utils.parseInt(operand)));\n\t\t}\n\t});\n\treturn [chars.join(\"\")];\n};\n\n})();","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/subfilter.js":{"title":"$:/core/modules/filters/subfilter.js","text":"/*\\\ntitle: $:/core/modules/filters/subfilter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand evaluated as a filter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subfilter = function(source,operator,options) {\n\tvar list = options.wiki.filterTiddlers(operator.operand,options.widget,source);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/substitute.js":{"title":"$:/core/modules/filters/substitute.js","text":"/*\\\ntitle: $:/core/modules/filters/substitute.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for substituting variables and embedded filter expressions with their corresponding values\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.substitute = function(source,operator,options) {\n\tvar results = [],\n\t\toperands = [];\n\t$tw.utils.each(operator.operands,function(operand,index){\n\t\toperands.push({\n\t\t\tname: (index + 1).toString(),\n\t\t\tvalue: operand\n\t\t});\n\t});\n\tsource(function(tiddler,title) {\n\t\tif(title) {\n\t\t\tresults.push(options.wiki.getSubstitutedText(title,options.widget,{substitutions:operands}));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n ","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/subtiddlerfields.js":{"title":"$:/core/modules/filters/subtiddlerfields.js","text":"/*\\\ntitle: $:/core/modules/filters/subtiddlerfields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected subtiddlers of the plugin named in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subtiddlerfields = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar subtiddler = options.wiki.getSubTiddler(operator.operand,title);\n\t\tif(subtiddler) {\n\t\t\tfor(var fieldName in subtiddler.fields) {\n\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/suffix.js":{"title":"$:/core/modules/filters/suffix.js","text":"/*\\\ntitle: $:/core/modules/filters/suffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title ends with a suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.suffix = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif (!operator.operand) {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t} else if(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tvar operand = operator.operand.toLowerCase();\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase().substr(-operand.length) !== operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase().substr(-operand.length) === operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.substr(-operator.operand.length) !== operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/tag.js":{"title":"$:/core/modules/filters/tag.js","text":"/*\\\ntitle: $:/core/modules/filters/tag.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking for the presence of a tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,operator,options) {\n\tvar results = [],indexedResults;\n\tif((operator.suffix || \"\").toLowerCase() === \"strict\" && !operator.operand) {\n\t\t// New semantics:\n\t\t// Always return copy of input if operator.operand is missing\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t} else {\n\t\t// Old semantics:\n\t\tvar tiddlers;\n\t\tif(operator.prefix === \"!\") {\n\t\t\t// Returns a copy of the input if operator.operand is missing\n\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddlers.indexOf(title) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// Returns empty results if operator.operand is missing\n\t\t\tif(source.byTag) {\n\t\t\t\tindexedResults = source.byTag(operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\t\tsource(function(tiddler,title) {\n\t\t\t\t\tif(tiddlers.indexOf(title) !== -1) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tresults = options.wiki.sortByList(results,operator.operand);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/tagging.js":{"title":"$:/core/modules/filters/tagging.js","text":"/*\\\ntitle: $:/core/modules/filters/tagging.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that are tagged with the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tagging = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlersWithTag(title));\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/tags.js":{"title":"$:/core/modules/filters/tags.js","text":"/*\\\ntitle: $:/core/modules/filters/tags.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the tags of the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,operator,options) {\n\tvar tags = {};\n\tsource(function(tiddler,title) {\n\t\tvar t, length;\n\t\tif(tiddler && tiddler.fields.tags) {\n\t\t\tfor(t=0, length=tiddler.fields.tags.length; t<length; t++) {\n\t\t\t\ttags[tiddler.fields.tags[t]] = true;\n\t\t\t}\n\t\t}\n\t});\n\treturn Object.keys(tags);\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/then.js":{"title":"$:/core/modules/filters/then.js","text":"/*\\\ntitle: $:/core/modules/filters/then.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing any titles with a constant\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.then = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/title.js":{"title":"$:/core/modules/filters/title.js","text":"/*\\\ntitle: $:/core/modules/filters/title.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing title fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.title = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields.title !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults.push(operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/transcludes.js":{"title":"$:/core/modules/filters/transcludes.js","text":"/*\\\ntitle: $:/core/modules/filters/transcludes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the transcludes from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.transcludes = function(source,operator,options) {\n\tvar results = new $tw.utils.LinkedList();\n\tsource(function(tiddler,title) {\n\t\tresults.pushTop(options.wiki.getTiddlerTranscludes(title));\n\t});\n\treturn results.makeTiddlerIterator(options.wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/unknown.js":{"title":"$:/core/modules/filters/unknown.js","text":"/*\\\ntitle: $:/core/modules/filters/unknown.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for handling unknown filter operators.\n\nNot intended to be used directly by end users, hence the square brackets around the name.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fieldFilterOperatorFn = require(\"$:/core/modules/filters/field.js\").field;\n\n/*\nExport our filter function\n*/\nexports[\"[unknown]\"] = function(source,operator,options) {\n\t// Check for a user defined filter operator\n\tif(operator.operator.indexOf(\".\") !== -1) {\n\t\tvar params = [];\n\t\t$tw.utils.each(operator.operands,function(param) {\n\t\t\tparams.push({value: param});\n\t\t});\t\n\t\tvar variableInfo = options.widget && options.widget.getVariableInfo && options.widget.getVariableInfo(operator.operator,{params: params, source: source});\n\t\tif(variableInfo && variableInfo.srcVariable) {\n\t\t\tvar list = variableInfo.resultList ? variableInfo.resultList : [variableInfo.text];\n\t\t\tif(operator.prefix === \"!\") {\n\t\t\t\tvar results = [];\n\t\t\t\tsource(function(tiddler,title) {\n\t\t\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn results;\n\t\t\t} else {\n\t\t\t\treturn list;\n\t\t\t}\n\t\t}\n\t}\n\t// Otherwise, use the \"field\" operator\n\treturn fieldFilterOperatorFn(source,operator,options);\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/untagged.js":{"title":"$:/core/modules/filters/untagged.js","text":"/*\\\ntitle: $:/core/modules/filters/untagged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the selected tiddlers that are untagged\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.untagged = function(source,operator,options) {\n\tvar results = [],\n\t\texpected = (operator.prefix === \"!\");\n\tsource(function(tiddler,title) {\n\t\tif(((tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) === expected) || (!tiddler && !expected)) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/variables.js":{"title":"$:/core/modules/filters/variables.js","text":"/*\\\ntitle: $:/core/modules/filters/variables.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the active variables\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variables = function(source,operator,options) {\n\tvar names = [],\n\t\twidget = options.widget;\n\twhile(widget && !widget.hasOwnProperty(\"variables\")) {\n\t\twidget = widget.parentWidget;\n\t}\n\tif(widget && widget.variables) {\n\t\tfor(var variable in widget.variables) {\n\t\t\tnames.push(variable);\n\t\t}\n\t}\n\treturn names.sort();\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/wikiparserrules.js":{"title":"$:/core/modules/filters/wikiparserrules.js","text":"/*\\\ntitle: $:/core/modules/filters/wikiparserrules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the wiki parser rules in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.wikiparserrules = function(source,operator,options) {\n\tvar results = [],\n\t\toperand = operator.operand;\n\t$tw.utils.each($tw.modules.types.wikirule,function(mod) {\n\t\tvar exp = mod.exports;\n\t\tif(!operand || exp.types[operand]) {\n\t\t\tresults.push(exp.name);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/x-listops.js":{"title":"$:/core/modules/filters/x-listops.js","text":"/*\\\ntitle: $:/core/modules/filters/x-listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nExtended filter operators to manipulate the current list.\n\n\\*/\n(function () {\n\n\t/*jslint node: true, browser: true */\n\t/*global $tw: false */\n\t\"use strict\";\n\n\t/*\n\tFetch titles from the current list\n\t*/\n\tvar prepare_results = function (source) {\n\tvar results = [];\n\t\tsource(function (tiddler, title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list before the item named in the operand\n\t*/\n\texports.putbefore = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -1) :\n\t\t\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list after the item named in the operand\n\t*/\n\texports.putafter = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -1) :\n\t\t\tresults.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n\t};\n\n\t/*\n\tReplaces the item named in the operand with a number of items from the tail of the current list\n\t*/\n\texports.replace = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -count) :\n\t\t\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list to the head of the list\n\t*/\n\texports.putfirst = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn results.slice(-count).concat(results.slice(0, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the head of the current list to the tail of the list\n\t*/\n\texports.putlast = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn results.slice(count).concat(results.slice(0, count));\n\t};\n\n\t/*\n\tMoves the item named in the operand a number of places forward or backward in the list\n\t*/\n\texports.move = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1),\n\t\t\tmarker = results.splice(index, 1),\n\t\t\toffset =  (index + count) > 0 ? index + count : 0;\n\t\treturn results.slice(0, offset).concat(marker).concat(results.slice(offset));\n\t};\n\n\t/*\n\tReturns the items from the current list that are after the item named in the operand\n\t*/\n\texports.allafter = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand);\n\t\treturn (index === -1) ? [] :\n\t\t\t(operator.suffix) ? results.slice(index) :\n\t\t\tresults.slice(index + 1);\n\t};\n\n\t/*\n\tReturns the items from the current list that are before the item named in the operand\n\t*/\n\texports.allbefore = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand);\n\t\treturn (index === -1) ? [] :\n\t\t\t(operator.suffix) ? results.slice(0, index + 1) :\n\t\t\tresults.slice(0, index);\n\t};\n\n\t/*\n\tAppends the items listed in the operand array to the tail of the current list\n\t*/\n\texports.append = function (source, operator) {\n\t\tvar append = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = parseInt(operator.suffix) || append.length;\n\t\treturn (append.length === 0) ? results :\n\t\t\t(operator.prefix) ? results.concat(append.slice(-count)) :\n\t\t\tresults.concat(append.slice(0, count));\n\t};\n\n\t/*\n\tPrepends the items listed in the operand array to the head of the current list\n\t*/\n\texports.prepend = function (source, operator) {\n\t\tvar prepend = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,prepend.length);\n\t\treturn (prepend.length === 0) ? results :\n\t\t\t(operator.prefix) ? prepend.slice(-count).concat(results) :\n\t\t\tprepend.slice(0, count).concat(results);\n\t};\n\n\t/*\n\tReturns all items from the current list except the items listed in the operand array\n\t*/\n\texports.remove = function (source, operator) {\n\t\tvar array = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = parseInt(operator.suffix) || array.length,\n\t\t\tp,\n\t\t\tlen,\n\t\t\tindex;\n\t\tlen = array.length - 1;\n\t\tfor (p = 0; p < count; ++p) {\n\t\t\tif (operator.prefix) {\n\t\t\t\tindex = results.indexOf(array[len - p]);\n\t\t\t} else {\n\t\t\t\tindex = results.indexOf(array[p]);\n\t\t\t}\n\t\t\tif (index !== -1) {\n\t\t\t\tresults.splice(index, 1);\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t};\n\n\t/*\n\tReturns all items from the current list sorted in the order of the items in the operand array\n\t*/\n\texports.sortby = function (source, operator) {\n\t\tvar results = prepare_results(source);\n\t\tif (!results || results.length < 2) {\n\t\t\treturn results;\n\t\t}\n\t\tvar lookup = $tw.utils.parseStringArray(operator.operand, \"true\");\n\t\tresults.sort(function (a, b) {\n\t\t\treturn lookup.indexOf(a) - lookup.indexOf(b);\n\t\t});\n\t\treturn results;\n\t};\n\n\t/*\n\tRemoves all duplicate items from the current list\n\t*/\n\texports.unique = function (source, operator) {\n\t\tvar results = prepare_results(source);\n\t\tvar set = results.reduce(function (a, b) {\n\t\t\tif (a.indexOf(b) < 0) {\n\t\t\t\ta.push(b);\n\t\t\t}\n\t\t\treturn a;\n\t\t}, []);\n\t\treturn set;\n\t};\n\n\tvar cycleValueInArray = function(results,operands,stepSize) {\n\t\tvar resultsIndex,\n\t\t\tstep = stepSize || 1,\n\t\t\ti = 0,\n\t\t\topLength = operands.length,\n\t\t\tnextOperandIndex;\n\t\tfor(i; i < opLength; i++) {\n\t\t\tresultsIndex = results.indexOf(operands[i]);\n\t\t\tif(resultsIndex !== -1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif(resultsIndex !== -1) {\n\t\t\ti = i + step;\n\t\t\tnextOperandIndex = (i < opLength ? i : i % opLength);\n\t\t\tif(operands.length > 1) {\n\t\t\t\tresults.splice(resultsIndex,1,operands[nextOperandIndex]);\n\t\t\t} else {\n\t\t\t\tresults.splice(resultsIndex,1);\n\t\t\t}\n\t\t} else {\n\t\t\tresults.push(operands[0]);\n\t\t}\n\t\treturn results;\n\t}\n\n\t/*\n\tToggles an item in the current list.\n\t*/\n\texports.toggle = function(source,operator) {\n\t\treturn cycleValueInArray(prepare_results(source),operator.operands);\n\t}\n\n\texports.cycle = function(source,operator) {\n\t\tvar results = prepare_results(source),\n\t\t\toperands = (operator.operand.length ? $tw.utils.parseStringArray(operator.operand, \"true\") : [\"\"]),\n\t\t\tstep = $tw.utils.getInt(operator.operands[1]||\"\",1);\n\t\tif(step < 0) {\n\t\t\toperands.reverse();\n\t\t\tstep = Math.abs(step);\n\t\t}\n\t\treturn cycleValueInArray(results,operands,step);\n\t}\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters.js":{"title":"$:/core/modules/filters.js","text":"/*\\\ntitle: $:/core/modules/filters.js\ntype: application/javascript\nmodule-type: wikimethod\n\nAdds tiddler filtering methods to the $tw.Wiki object.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widgetClass = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/* Maximum permitted filter recursion depth */\nvar MAX_FILTER_DEPTH = 300;\n\n/*\nParses an operation (i.e. a run) within a filter string\n\toperators: Array of array of operator nodes into which results should be inserted\n\tfilterString: filter string\n\tp: start position within the string\nReturns the new start position, after the parsed operation\n*/\nfunction parseFilterOperation(operators,filterString,p) {\n\tvar nextBracketPos, operator;\n\t// Skip the starting square bracket\n\tif(filterString.charAt(p++) !== \"[\") {\n\t\tthrow \"Missing [ in filter expression\";\n\t}\n\t// Process each operator in turn\n\tdo {\n\t\toperator = {};\n\t\t// Check for an operator prefix\n\t\tif(filterString.charAt(p) === \"!\") {\n\t\t\toperator.prefix = filterString.charAt(p++);\n\t\t}\n\t\t// Get the operator name\n\t\tnextBracketPos = filterString.substring(p).search(/[\\[\\{<\\/]/);\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing [ in filter expression\";\n\t\t}\n\t\tnextBracketPos += p;\n\t\tvar bracket = filterString.charAt(nextBracketPos);\n\t\toperator.operator = filterString.substring(p,nextBracketPos);\n\t\t// Any suffix?\n\t\tvar colon = operator.operator.indexOf(':');\n\t\tif(colon > -1) {\n\t\t\t// The raw suffix for older filters\n\t\t\toperator.suffix = operator.operator.substring(colon + 1);\n\t\t\toperator.operator = operator.operator.substring(0,colon) || \"field\";\n\t\t\t// The processed suffix for newer filters\n\t\t\toperator.suffixes = [];\n\t\t\t$tw.utils.each(operator.suffix.split(\":\"),function(subsuffix) {\n\t\t\t\toperator.suffixes.push([]);\n\t\t\t\t$tw.utils.each(subsuffix.split(\",\"),function(entry) {\n\t\t\t\t\tentry = $tw.utils.trim(entry);\n\t\t\t\t\tif(entry) {\n\t\t\t\t\t\toperator.suffixes[operator.suffixes.length - 1].push(entry); \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\t// Empty operator means: title\n\t\telse if(operator.operator === \"\") {\n\t\t\toperator.operator = \"title\";\n\t\t}\n\t\toperator.operands = [];\n\t\tvar parseOperand = function(bracketType) {\n\t\t\tvar operand = {};\n\t\t\tswitch (bracketType) {\n\t\t\t\tcase \"{\": // Curly brackets\n\t\t\t\t\toperand.indirect = true;\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"[\": // Square brackets\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<\": // Angle brackets\n\t\t\t\t\toperand.variable = true;\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"/\": // regexp brackets\n\t\t\t\t\tvar rex = /^((?:[^\\\\\\/]|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\t\tif(rexMatch) {\n\t\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n\t// DEPRECATION WARNING\n\tconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(nextBracketPos === -1) {\n\t\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t\t}\n\t\t\tif(operator.regexp) {\n\t\t\t\toperand.text = \"\";\n\t\t\t} else {\n\t\t\t\toperand.text = filterString.substring(p,nextBracketPos);\n\t\t\t}\n\t\t\toperator.operands.push(operand);\n\t\t\tp = nextBracketPos + 1;\n\t\t}\n\n\t\tp = nextBracketPos + 1;\n\t\tparseOperand(bracket);\n\n\t\t// Check for multiple operands\n\t\twhile(filterString.charAt(p) === \",\") {\n\t\t\tp++;\n\t\t\tif(/^[\\[\\{<\\/]/.test(filterString.substring(p))) {\n\t\t\t\tnextBracketPos = p;\n\t\t\t\tp++;\n\t\t\t\tparseOperand(filterString.charAt(nextBracketPos));\n\t\t\t} else {\n\t\t\t\tthrow \"Missing [ in filter expression\";\n\t\t\t}\n\t\t}\n\n\t\t// Push this operator\n\t\toperators.push(operator);\n\t} while(filterString.charAt(p) !== \"]\");\n\t// Skip the ending square bracket\n\tif(filterString.charAt(p++) !== \"]\") {\n\t\tthrow \"Missing ] in filter expression\";\n\t}\n\t// Return the parsing position\n\treturn p;\n}\n\n/*\nParse a filter string\n*/\nexports.parseFilter = function(filterString) {\n\tfilterString = filterString || \"\";\n\tvar results = [], // Array of arrays of operator nodes {operator:,operand:}\n\t\tp = 0, // Current position in the filter string\n\t\tmatch;\n\tvar whitespaceRegExp = /(\\s+)/mg,\n\t\toperandRegExp = /((?:\\+|\\-|~|=|\\:(\\w+)(?:\\:([\\w\\:, ]*))?)?)(?:(\\[)|(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\s\\[\\]]+))/mg;\n\twhile(p < filterString.length) {\n\t\t// Skip any whitespace\n\t\twhitespaceRegExp.lastIndex = p;\n\t\tmatch = whitespaceRegExp.exec(filterString);\n\t\tif(match && match.index === p) {\n\t\t\tp = p + match[0].length;\n\t\t}\n\t\t// Match the start of the operation\n\t\tif(p < filterString.length) {\n\t\t\toperandRegExp.lastIndex = p;\n\t\t\tmatch = operandRegExp.exec(filterString);\n\t\t\tif(!match || match.index !== p) {\n\t\t\t\tthrow $tw.language.getString(\"Error/FilterSyntax\");\n\t\t\t}\n\t\t\tvar operation = {\n\t\t\t\tprefix: \"\",\n\t\t\t\toperators: []\n\t\t\t};\n\t\t\tif(match[1]) {\n\t\t\t\toperation.prefix = match[1];\n\t\t\t\tp = p + operation.prefix.length;\n\t\t\t\tif(match[2]) {\n\t\t\t\t\toperation.namedPrefix = match[2];\n\t\t\t\t}\n\t\t\t\tif(match[3]) {\n\t\t\t\t\toperation.suffixes = [];\n\t\t\t\t\t $tw.utils.each(match[3].split(\":\"),function(subsuffix) {\n\t\t\t\t\t\toperation.suffixes.push([]);\n\t\t\t\t\t\t$tw.utils.each(subsuffix.split(\",\"),function(entry) {\n\t\t\t\t\t\t\tentry = $tw.utils.trim(entry);\n\t\t\t\t\t\t\tif(entry) {\n\t\t\t\t\t\t\t\toperation.suffixes[operation.suffixes.length -1].push(entry);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t });\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(match[4]) { // Opening square bracket\n\t\t\t\tp = parseFilterOperation(operation.operators,filterString,p);\n\t\t\t} else {\n\t\t\t\tp = match.index + match[0].length;\n\t\t\t}\n\t\t\tif(match[5] || match[6] || match[7]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operands: [{text: match[5] || match[6] || match[7]}]}\n\t\t\t\t);\n\t\t\t}\n\t\t\tresults.push(operation);\n\t\t}\n\t}\n\treturn results;\n};\n\nexports.getFilterOperators = function() {\n\tif(!this.filterOperators) {\n\t\t$tw.Wiki.prototype.filterOperators = {};\n\t\t$tw.modules.applyMethods(\"filteroperator\",this.filterOperators);\n\t}\n\treturn this.filterOperators;\n};\n\nexports.getFilterRunPrefixes = function() {\n\tif(!this.filterRunPrefixes) {\n\t\t$tw.Wiki.prototype.filterRunPrefixes = {};\n\t\t$tw.modules.applyMethods(\"filterrunprefix\",this.filterRunPrefixes);\n\t}\n\treturn this.filterRunPrefixes;\n}\n\nexports.filterTiddlers = function(filterString,widget,source) {\n\tvar fn = this.compileFilter(filterString);\n\treturn fn.call(this,source,widget);\n};\n\n/*\nCompile a filter into a function with the signature fn(source,widget) where:\nsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\nwidget: an optional widget node for retrieving the current tiddler etc.\n*/\nexports.compileFilter = function(filterString) {\n\tif(!this.filterCache) {\n\t\tthis.filterCache = Object.create(null);\n\t\tthis.filterCacheCount = 0;\n\t}\n\tif(this.filterCache[filterString] !== undefined) {\n\t\treturn this.filterCache[filterString];\n\t}\n\tvar filterParseTree;\n\ttry {\n\t\tfilterParseTree = this.parseFilter(filterString);\n\t} catch(e) {\n\t\t// We do not cache this result, so it adjusts along with localization changes\n\t\treturn function(source,widget) {\n\t\t\treturn [$tw.language.getString(\"Error/Filter\") + \": \" + e];\n\t\t};\n\t}\n\t// Get the hashmap of filter operator functions\n\tvar filterOperators = this.getFilterOperators();\n\t// Assemble array of functions, one for each operation\n\tvar operationFunctions = [];\n\t// Step through the operations\n\tvar self = this;\n\t$tw.utils.each(filterParseTree,function(operation) {\n\t\t// Create a function for the chain of operators in the operation\n\t\tvar operationSubFunction = function(source,widget) {\n\t\t\tvar accumulator = source,\n\t\t\t\tresults = [],\n\t\t\t\tcurrTiddlerTitle = widget && widget.getVariable(\"currentTiddler\");\n\t\t\t$tw.utils.each(operation.operators,function(operator) {\n\t\t\t\tvar operands = [],\n\t\t\t\t\toperatorFunction;\n\t\t\t\tif(!operator.operator) {\n\t\t\t\t\t// Use the \"title\" operator if no operator is specified\n\t\t\t\t\toperatorFunction = filterOperators.title;\n\t\t\t\t} else if(!filterOperators[operator.operator]) {\n\t\t\t\t\t// Unknown operators treated as \"[unknown]\" - at run time we can distinguish between a custom operator and falling back to the default \"field\" operator\n\t\t\t\t\toperatorFunction = filterOperators[\"[unknown]\"];\n\t\t\t\t} else {\n\t\t\t\t\t// Use the operator function\n\t\t\t\t\toperatorFunction = filterOperators[operator.operator];\n\t\t\t\t}\n\t\t\t\t$tw.utils.each(operator.operands,function(operand) {\n\t\t\t\t\tif(operand.indirect) {\n\t\t\t\t\t\toperand.value = self.getTextReference(operand.text,\"\",currTiddlerTitle);\n\t\t\t\t\t} else if(operand.variable) {\n\t\t\t\t\t\tvar varTree = $tw.utils.parseFilterVariable(operand.text);\n\t\t\t\t\t\toperand.value = widgetClass.evaluateVariable(widget,varTree.name,{params: varTree.params, source: source})[0] || \"\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\toperand.value = operand.text;\n\t\t\t\t\t}\n\t\t\t\t\toperands.push(operand.value);\n\t\t\t\t});\n\n\t\t\t\t// Invoke the appropriate filteroperator module\n\t\t\t\tresults = operatorFunction(accumulator,{\n\t\t\t\t\t\t\toperator: operator.operator,\n\t\t\t\t\t\t\toperand: operands.length > 0 ? operands[0] : undefined,\n\t\t\t\t\t\t\toperands: operands,\n\t\t\t\t\t\t\tprefix: operator.prefix,\n\t\t\t\t\t\t\tsuffix: operator.suffix,\n\t\t\t\t\t\t\tsuffixes: operator.suffixes,\n\t\t\t\t\t\t\tregexp: operator.regexp\n\t\t\t\t\t\t},{\n\t\t\t\t\t\t\twiki: self,\n\t\t\t\t\t\t\twidget: widget\n\t\t\t\t\t\t});\n\t\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\t\taccumulator = self.makeTiddlerIterator(results);\n\t\t\t\t} else {\n\t\t\t\t\taccumulator = results;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\treturn results;\n\t\t\t} else {\n\t\t\t\tvar resultArray = [];\n\t\t\t\tresults(function(tiddler,title) {\n\t\t\t\t\tresultArray.push(title);\n\t\t\t\t});\n\t\t\t\treturn resultArray;\n\t\t\t}\n\t\t};\n\t\tvar filterRunPrefixes = self.getFilterRunPrefixes();\n\t\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tvar options = {wiki: self, suffixes: operation.suffixes || []};\n\t\t\tswitch(operation.prefix || \"\") {\n\t\t\t\tcase \"\": // No prefix means that the operation is unioned into the result\n\t\t\t\t\treturn filterRunPrefixes[\"or\"](operationSubFunction, options);\n\t\t\t\tcase \"=\": // The results of the operation are pushed into the result without deduplication\n\t\t\t\t\treturn filterRunPrefixes[\"all\"](operationSubFunction, options);\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn filterRunPrefixes[\"except\"](operationSubFunction, options);\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn filterRunPrefixes[\"and\"](operationSubFunction, options);\n\t\t\t\tcase \"~\": // This operation is unioned into the result only if the main result so far is empty\n\t\t\t\t\treturn filterRunPrefixes[\"else\"](operationSubFunction, options);\n\t\t\t\tdefault: \n\t\t\t\t\tif(operation.namedPrefix && filterRunPrefixes[operation.namedPrefix]) {\n\t\t\t\t\t\treturn filterRunPrefixes[operation.namedPrefix](operationSubFunction, options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t\tresults.clear();\n\t\t\t\t\t\t\tresults.push($tw.language.getString(\"Error/FilterRunPrefix\"));\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t}\n\t\t})());\n\t});\n\t// Return a function that applies the operations to a source iterator of tiddler titles\n\tvar fnMeasured = $tw.perf.measure(\"filter: \" + filterString,function filterFunction(source,widget) {\n\t\tif(!source) {\n\t\t\tsource = self.each;\n\t\t} else if(typeof source === \"object\") { // Array or hashmap\n\t\t\tsource = self.makeTiddlerIterator(source);\n\t\t}\n\t\tif(!widget) {\n\t\t\twidget = $tw.rootWidget;\n\t\t}\n\t\tvar results = new $tw.utils.LinkedList();\n\t\tself.filterRecursionCount = (self.filterRecursionCount || 0) + 1;\n\t\tif(self.filterRecursionCount < MAX_FILTER_DEPTH) {\n\t\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\t\toperationFunction(results,source,widget);\n\t\t\t});\n\t\t} else {\n\t\t\tresults.push(\"/**-- Excessive filter recursion --**/\");\n\t\t}\n\t\tself.filterRecursionCount = self.filterRecursionCount - 1;\n\t\treturn results.toArray();\n\t});\n\tif(this.filterCacheCount >= 2000) {\n\t\t// To prevent memory leak, we maintain an upper limit for cache size.\n\t\t// Reset if exceeded. This should give us 95% of the benefit\n\t\t// that no cache limit would give us.\n\t\tthis.filterCache = Object.create(null);\n\t\tthis.filterCacheCount = 0;\n\t}\n\tthis.filterCache[filterString] = fnMeasured;\n\tthis.filterCacheCount++;\n\treturn fnMeasured;\n};\n\n})();\n","type":"application/javascript","module-type":"wikimethod"},"$:/core/modules/indexers/back-indexer.js":{"title":"$:/core/modules/indexers/back-indexer.js","text":"/*\\\ntitle: $:/core/modules/indexers/back-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nBy parsing the tiddler text, indexes the tiddlers' back links, back transclusions, block level back links.\n\n\\*/\nfunction BackIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nBackIndexer.prototype.init = function() {\n\tthis.subIndexers = {\n\t\tlink: new BackSubIndexer(this,\"extractLinks\"),\n\t\ttransclude: new BackSubIndexer(this,\"extractTranscludes\"),\n\t};\n};\n\nBackIndexer.prototype.rebuild = function() {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.rebuild();\n\t});\n};\n\nBackIndexer.prototype.update = function(updateDescriptor) {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.update(updateDescriptor);\n\t});\n};\nfunction BackSubIndexer(indexer,extractor) {\n\tthis.wiki = indexer.wiki;\n\tthis.indexer = indexer;\n\tthis.extractor = extractor;\n\t/**\n\t * {\n\t *   [target title, e.g. tiddler title being linked to]:\n\t *     {\n\t * \t\t   [source title, e.g. tiddler title that has link syntax in its text]: true\n\t * \t   }\n\t * }\n\t */\n\tthis.index = null;\n}\n\nBackSubIndexer.prototype.init = function() {\n\t// lazy init until first lookup\n\tthis.index = null;\n}\n\nBackSubIndexer.prototype._init = function() {\n\tthis.index = Object.create(null);\n\tvar self = this;\n\tthis.wiki.forEachTiddler(function(sourceTitle,tiddler) {\n\t\tvar newTargets = self._getTarget(tiddler);\n\t\t$tw.utils.each(newTargets, function(target) {\n\t\t\tif(!self.index[target]) {\n\t\t\t\tself.index[target] = Object.create(null);\n\t\t\t}\n\t\t\tself.index[target][sourceTitle] = true;\n\t\t});\n\t});\n}\n\nBackSubIndexer.prototype.rebuild = function() {\n\tthis.index = null;\n}\n\n/*\n* Get things that is being referenced in the text, e.g. tiddler names in the link syntax.\n*/\nBackSubIndexer.prototype._getTarget = function(tiddler) {\n\tif(this.wiki.isBinaryTiddler(tiddler.fields.text)) {\n\t\treturn [];\n\t}\n\tvar parser = this.wiki.parseText(tiddler.fields.type, tiddler.fields.text, {});\n\tif(parser) {\n\t\treturn this.wiki[this.extractor](parser.tree, tiddler.fields.title);\n\t}\n\treturn [];\n}\n\nBackSubIndexer.prototype.update = function(updateDescriptor) {\n\t// lazy init/update until first lookup\n\tif(!this.index) {\n\t\treturn;\n\t}\n\tvar newTargets = [],\n\t    oldTargets = [],\n\t    self = this;\n\tif(updateDescriptor.old.exists) {\n\t\toldTargets = this._getTarget(updateDescriptor.old.tiddler);\n\t}\n\tif(updateDescriptor.new.exists) {\n\t\tnewTargets = this._getTarget(updateDescriptor.new.tiddler);\n\t}\n\n\t$tw.utils.each(oldTargets,function(target) {\n\t\tif(self.index[target]) {\n\t\t\tdelete self.index[target][updateDescriptor.old.tiddler.fields.title];\n\t\t}\n\t});\n\t$tw.utils.each(newTargets,function(target) {\n\t\tif(!self.index[target]) {\n\t\t\tself.index[target] = Object.create(null);\n\t\t}\n\t\tself.index[target][updateDescriptor.new.tiddler.fields.title] = true;\n\t});\n}\n\nBackSubIndexer.prototype.lookup = function(title) {\n\tif(!this.index) {\n\t\tthis._init();\n\t}\n\tif(this.index[title]) {\n\t\treturn Object.keys(this.index[title]);\n\t} else {\n\t\treturn [];\n\t}\n}\n\nexports.BackIndexer = BackIndexer;\n","type":"application/javascript","module-type":"indexer"},"$:/core/modules/indexers/field-indexer.js":{"title":"$:/core/modules/indexers/field-indexer.js","text":"/*\\\ntitle: $:/core/modules/indexers/field-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nvar DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH = 128;\n\nfunction FieldIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nFieldIndexer.prototype.init = function() {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH;\n\tthis.addIndexMethods();\n}\n\n// Provided for testing\nFieldIndexer.prototype.setMaxIndexedValueLength = function(length) {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = length;\n};\n\nFieldIndexer.prototype.addIndexMethods = function() {\n\tvar self = this;\n\t// get all tiddlers, including those overwrite shadow tiddlers\n\tthis.wiki.each.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn self.wiki.tiddlerExists(title)\n\t\t});\n\t};\n\t// get shadow tiddlers, including shadow tiddlers that is overwritten\n\tthis.wiki.eachShadow.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn self.wiki.isShadowTiddler(title)\n\t\t});\n\t};\n\tthis.wiki.eachTiddlerPlusShadows.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n\tthis.wiki.eachShadowPlusTiddlers.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n};\n\n/*\nTear down and then rebuild the index as if all tiddlers have changed\n*/\nFieldIndexer.prototype.rebuild = function() {\n\t// Invalidate the index so that it will be rebuilt when it is next used\n\tthis.index = null;\n};\n\n/*\nBuild the index for a particular field\n*/\nFieldIndexer.prototype.buildIndexForField = function(name) {\n\tvar self = this;\n\t// Hashmap by field name of hashmap by field value of array of tiddler titles\n\tthis.index = this.index || Object.create(null);\n\tthis.index[name] = Object.create(null);\n\tvar baseIndex = this.index[name];\n\t// Update the index for each tiddler\n\tthis.wiki.eachTiddlerPlusShadows(function(tiddler,title) {\n\t\tif(name in tiddler.fields) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\t// Skip any values above the maximum length\n\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\tbaseIndex[value] = baseIndex[value] || [];\n\t\t\t\tbaseIndex[value].push(title);\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nUpdate the index in the light of a tiddler value changing; note that the title must be identical. (Renames are handled as a separate delete and create)\nupdateDescriptor: {old: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>},new: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>}}\n*/\nFieldIndexer.prototype.update = function(updateDescriptor) {\n\tvar self = this;\n\t// Don't do anything if the index hasn't been built yet\n\tif(this.index === null) {\n\t\treturn;\n\t}\n\t// Remove the old tiddler from the index\n\tif(updateDescriptor.old.tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor.old.tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor.old.tiddler.getFieldString(name),\n\t\t\t\t\ttiddlerList = indexEntry[value];\n\t\t\t\tif(tiddlerList) {\n\t\t\t\t\tvar index = tiddlerList.indexOf(updateDescriptor.old.tiddler.fields.title);\n\t\t\t\t\tif(index !== -1) {\n\t\t\t\t\t\ttiddlerList.splice(index,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t// Add the new tiddler to the index\n\tif(updateDescriptor[\"new\"].tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor[\"new\"].tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor[\"new\"].tiddler.getFieldString(name);\n\t\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\t\tindexEntry[value] = indexEntry[value] || [];\n\t\t\t\t\tindexEntry[value].push(updateDescriptor[\"new\"].tiddler.fields.title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n// Lookup the given field returning a list of tiddler titles\nFieldIndexer.prototype.lookup = function(name,value) {\n\t// Fail the lookup if the value is too long\n\tif(value.length >= this.maxIndexedValueLength) {\n\t\treturn null;\n\t}\n\t// Update the index if it has yet to be built\n\tif(this.index === null || !this.index[name]) {\n\t\tthis.buildIndexForField(name);\n\t}\n\treturn this.index[name][value] || [];\n};\n\nexports.FieldIndexer = FieldIndexer;\n\n})();\n","type":"application/javascript","module-type":"indexer"},"$:/core/modules/indexers/tag-indexer.js":{"title":"$:/core/modules/indexers/tag-indexer.js","text":"/*\\\ntitle: $:/core/modules/indexers/tag-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nfunction TagIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nTagIndexer.prototype.init = function() {\n\tthis.subIndexers = [\n\t\tnew TagSubIndexer(this,\"each\"),\n\t\tnew TagSubIndexer(this,\"eachShadow\"),\n\t\tnew TagSubIndexer(this,\"eachTiddlerPlusShadows\"),\n\t\tnew TagSubIndexer(this,\"eachShadowPlusTiddlers\")\n\t];\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.addIndexMethod();\n\t});\n};\n\nTagIndexer.prototype.rebuild = function() {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.rebuild();\n\t});\n};\n\nTagIndexer.prototype.update = function(updateDescriptor) {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.update(updateDescriptor);\n\t});\n};\n\nfunction TagSubIndexer(indexer,iteratorMethod) {\n\tthis.indexer = indexer;\n\tthis.iteratorMethod = iteratorMethod;\n\tthis.index = null; // Hashmap of tag title to {isSorted: bool, titles: [array]} or null if not yet initialised\n}\n\nTagSubIndexer.prototype.addIndexMethod = function() {\n\tvar self = this;\n\tthis.indexer.wiki[this.iteratorMethod].byTag = function(tag) {\n\t\treturn self.lookup(tag).slice(0);\n\t};\n};\n\nTagSubIndexer.prototype.rebuild = function() {\n\tvar self = this;\n\t// Hashmap by tag of array of {isSorted:, titles:[]}\n\tthis.index = Object.create(null);\n\t// Add all the tags\n\tthis.indexer.wiki[this.iteratorMethod](function(tiddler,title) {\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\tif(!self.index[tag]) {\n\t\t\t\tself.index[tag] = {isSorted: false, titles: [title]};\n\t\t\t} else {\n\t\t\t\tself.index[tag].titles.push(title);\n\t\t\t}\n\t\t});\n\t});\n};\n\nTagSubIndexer.prototype.update = function(updateDescriptor) {\n\tthis.index = null;\n};\n\nTagSubIndexer.prototype.lookup = function(tag) {\n\t// Update the index if it has yet to be built\n\tif(this.index === null) {\n\t\tthis.rebuild();\n\t}\n\tvar indexRecord = this.index[tag];\n\tif(indexRecord) {\n\t\tif(!indexRecord.isSorted) {\n\t\t\tif(this.indexer.wiki.sortByList) {\n\t\t\t\tindexRecord.titles = this.indexer.wiki.sortByList(indexRecord.titles,tag);\n\t\t\t}\n\t\t\tindexRecord.isSorted = true;\n\t\t}\n\t\treturn indexRecord.titles;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n\nexports.TagIndexer = TagIndexer;\n\n})();\n","type":"application/javascript","module-type":"indexer"},"$:/core/modules/info/platform.js":{"title":"$:/core/modules/info/platform.js","text":"/*\\\ntitle: $:/core/modules/info/platform.js\ntype: application/javascript\nmodule-type: info\n\nInitialise basic platform $:/info/ tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.getInfoTiddlerFields = function(updateInfoTiddlersCallback) {\n\tvar mapBoolean = function(value) {return value ? \"yes\" : \"no\";},\n\t\tinfoTiddlerFields = [];\n\t// Basics\n\tinfoTiddlerFields.push({title: \"$:/info/browser\", text: mapBoolean(!!$tw.browser)});\n\tinfoTiddlerFields.push({title: \"$:/info/node\", text: mapBoolean(!!$tw.node)});\n\tinfoTiddlerFields.push({title: \"$:/info/startup-timestamp\", text: $tw.utils.stringifyDate(new Date())});\n\tif($tw.browser) {\n\t\t// Document location\n\t\tvar setLocationProperty = function(name,value) {\n\t\t\t\tinfoTiddlerFields.push({title: \"$:/info/url/\" + name, text: value});\n\t\t\t},\n\t\t\tlocation = document.location;\n\t\tsetLocationProperty(\"full\", (location.toString()).split(\"#\")[0]);\n\t\tsetLocationProperty(\"host\", location.host);\n\t\tsetLocationProperty(\"hostname\", location.hostname);\n\t\tsetLocationProperty(\"protocol\", location.protocol);\n\t\tsetLocationProperty(\"port\", location.port);\n\t\tsetLocationProperty(\"pathname\", location.pathname);\n\t\tsetLocationProperty(\"search\", location.search);\n\t\tsetLocationProperty(\"origin\", location.origin);\n\t\t// Screen size\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/width\", text: window.screen.width.toString()});\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/height\", text: window.screen.height.toString()});\n \t\t// Dark mode through event listener on MediaQueryList\n \t\tvar mqList = window.matchMedia(\"(prefers-color-scheme: dark)\"),\n \t\t\tgetDarkModeTiddler = function() {return {title: \"$:/info/darkmode\", text: mqList.matches ? \"yes\" : \"no\"};};\n \t\tinfoTiddlerFields.push(getDarkModeTiddler());\n \t\tmqList.addListener(function(event) {\n \t\t\tupdateInfoTiddlersCallback([getDarkModeTiddler()]);\n \t\t});\n\t\t// Language\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/language\", text: navigator.language || \"\"});\n\t}\n\treturn infoTiddlerFields;\n};\n\n})();\n","type":"application/javascript","module-type":"info"},"$:/core/modules/keyboard.js":{"title":"$:/core/modules/keyboard.js","text":"/*\\\ntitle: $:/core/modules/keyboard.js\ntype: application/javascript\nmodule-type: global\n\nKeyboard handling utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar namedKeys = {\n\t\"cancel\": 3,\n\t\"help\": 6,\n\t\"backspace\": 8,\n\t\"tab\": 9,\n\t\"clear\": 12,\n\t\"return\": 13,\n\t\"enter\": 13,\n\t\"pause\": 19,\n\t\"escape\": 27,\n\t\"space\": 32,\n\t\"page_up\": 33,\n\t\"page_down\": 34,\n\t\"end\": 35,\n\t\"home\": 36,\n\t\"left\": 37,\n\t\"up\": 38,\n\t\"right\": 39,\n\t\"down\": 40,\n\t\"printscreen\": 44,\n\t\"insert\": 45,\n\t\"delete\": 46,\n\t\"0\": 48,\n\t\"1\": 49,\n\t\"2\": 50,\n\t\"3\": 51,\n\t\"4\": 52,\n\t\"5\": 53,\n\t\"6\": 54,\n\t\"7\": 55,\n\t\"8\": 56,\n\t\"9\": 57,\n\t\"firefoxsemicolon\": 59,\n\t\"firefoxequals\": 61,\n\t\"a\": 65,\n\t\"b\": 66,\n\t\"c\": 67,\n\t\"d\": 68,\n\t\"e\": 69,\n\t\"f\": 70,\n\t\"g\": 71,\n\t\"h\": 72,\n\t\"i\": 73,\n\t\"j\": 74,\n\t\"k\": 75,\n\t\"l\": 76,\n\t\"m\": 77,\n\t\"n\": 78,\n\t\"o\": 79,\n\t\"p\": 80,\n\t\"q\": 81,\n\t\"r\": 82,\n\t\"s\": 83,\n\t\"t\": 84,\n\t\"u\": 85,\n\t\"v\": 86,\n\t\"w\": 87,\n\t\"x\": 88,\n\t\"y\": 89,\n\t\"z\": 90,\n\t\"numpad0\": 96,\n\t\"numpad1\": 97,\n\t\"numpad2\": 98,\n\t\"numpad3\": 99,\n\t\"numpad4\": 100,\n\t\"numpad5\": 101,\n\t\"numpad6\": 102,\n\t\"numpad7\": 103,\n\t\"numpad8\": 104,\n\t\"numpad9\": 105,\n\t\"multiply\": 106,\n\t\"add\": 107,\n\t\"separator\": 108,\n\t\"subtract\": 109,\n\t\"decimal\": 110,\n\t\"divide\": 111,\n\t\"f1\": 112,\n\t\"f2\": 113,\n\t\"f3\": 114,\n\t\"f4\": 115,\n\t\"f5\": 116,\n\t\"f6\": 117,\n\t\"f7\": 118,\n\t\"f8\": 119,\n\t\"f9\": 120,\n\t\"f10\": 121,\n\t\"f11\": 122,\n\t\"f12\": 123,\n\t\"f13\": 124,\n\t\"f14\": 125,\n\t\"f15\": 126,\n\t\"f16\": 127,\n\t\"f17\": 128,\n\t\"f18\": 129,\n\t\"f19\": 130,\n\t\"f20\": 131,\n\t\"f21\": 132,\n\t\"f22\": 133,\n\t\"f23\": 134,\n\t\"f24\": 135,\n\t\"firefoxminus\": 173,\n\t\"semicolon\": 186,\n\t\"equals\": 187,\n\t\"comma\": 188,\n\t\"dash\": 189,\n\t\"period\": 190,\n\t\"slash\": 191,\n\t\"backquote\": 192,\n\t\"openbracket\": 219,\n\t\"backslash\": 220,\n\t\"closebracket\": 221,\n\t\"quote\": 222\n};\n\nfunction KeyboardManager(options) {\n\tvar self = this;\n\toptions = options || \"\";\n\t// Save the named key hashmap\n\tthis.namedKeys = namedKeys;\n\t// Create a reverse mapping of code to keyname\n\tthis.keyNames = [];\n\t$tw.utils.each(namedKeys,function(keyCode,name) {\n\t\tself.keyNames[keyCode] = name.substr(0,1).toUpperCase() + name.substr(1);\n\t});\n\t// Save the platform-specific name of the \"meta\" key\n\tthis.metaKeyName = $tw.platform.isMac ? \"cmd-\" : \"win-\";\n\tthis.shortcutKeysList = [], // Stores the shortcut-key descriptors\n\tthis.shortcutActionList = [], // Stores the corresponding action strings\n\tthis.shortcutParsedList = []; // Stores the parsed key descriptors\n\tthis.shortcutPriorityList = []; // Stores the parsed shortcut priority\n\tthis.lookupNames = [\"shortcuts\"];\n\tthis.lookupNames.push($tw.platform.isMac ? \"shortcuts-mac\" : \"shortcuts-not-mac\")\n\tthis.lookupNames.push($tw.platform.isWindows ? \"shortcuts-windows\" : \"shortcuts-not-windows\");\n\tthis.lookupNames.push($tw.platform.isLinux ? \"shortcuts-linux\" : \"shortcuts-not-linux\");\n\tthis.updateShortcutLists(this.getShortcutTiddlerList());\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tself.handleShortcutChanges(changes);\n\t});\n}\n\n/*\nReturn an array of keycodes for the modifier keys ctrl, shift, alt, meta\n*/\nKeyboardManager.prototype.getModifierKeys = function() {\n\treturn [\n\t\t16, // Shift\n\t\t17, // Ctrl\n\t\t18, // Alt\n\t\t20, // CAPS LOCK\n\t\t91, // Meta (left)\n\t\t93, // Meta (right)\n\t\t224 // Meta (Firefox)\n\t]\n};\n\n/*\nParses a key descriptor into the structure:\n{\n\tkeyCode: numeric keycode\n\tshiftKey: boolean\n\taltKey: boolean\n\tctrlKey: boolean\n\tmetaKey: boolean\n}\nKey descriptors have the following format:\n\tctrl+enter\n\tctrl+shift+alt+A\n*/\nKeyboardManager.prototype.parseKeyDescriptor = function(keyDescriptor,options) {\n\tvar components = keyDescriptor.split(/\\+|\\-/),\n\t\tinfo = {\n\t\t\tkeyCode: 0,\n\t\t\tshiftKey: false,\n\t\t\taltKey: false,\n\t\t\tctrlKey: false,\n\t\t\tmetaKey: false\n\t\t};\n\tfor(var t=0; t<components.length; t++) {\n\t\tvar s = components[t].toLowerCase(),\n\t\t\tc = s.charCodeAt(0);\n\t\t// Look for modifier keys\n\t\tif(s === \"ctrl\") {\n\t\t\tinfo.ctrlKey = true;\n\t\t} else if(s === \"shift\") {\n\t\t\tinfo.shiftKey = true;\n\t\t} else if(s === \"alt\") {\n\t\t\tinfo.altKey = true;\n\t\t} else if(s === \"meta\" || s === \"cmd\" || s === \"win\") {\n\t\t\tinfo.metaKey = true;\n\t\t}\n\t\t// Replace named keys with their code\n\t\tif(this.namedKeys[s]) {\n\t\t\tinfo.keyCode = this.namedKeys[s];\n\t\t}\n\t}\n\tif(options.keyDescriptor) {\n\t\tinfo.keyDescriptor = options.keyDescriptor;\n\t}\n\tif(info.keyCode) {\n\t\treturn info;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nParse a list of key descriptors into an array of keyInfo objects. The key descriptors can be passed as an array of strings or a space separated string\n*/\nKeyboardManager.prototype.parseKeyDescriptors = function(keyDescriptors,options) {\n\tvar self = this;\n\toptions = options || {};\n\toptions.stack = options.stack || [];\n\tvar wiki = options.wiki || $tw.wiki;\n\tif(typeof keyDescriptors === \"string\" && keyDescriptors === \"\") {\n\t\treturn [];\n\t}\n\tif(!$tw.utils.isArray(keyDescriptors)) {\n\t\tkeyDescriptors = keyDescriptors.split(\" \");\n\t}\n\tvar result = [];\n\t$tw.utils.each(keyDescriptors,function(keyDescriptor) {\n\t\t// Look for a named shortcut\n\t\tif(keyDescriptor.substr(0,2) === \"((\" && keyDescriptor.substr(-2,2) === \"))\") {\n\t\t\tif(options.stack.indexOf(keyDescriptor) === -1) {\n\t\t\t\toptions.stack.push(keyDescriptor);\n\t\t\t\tvar name = keyDescriptor.substring(2,keyDescriptor.length - 2),\n\t\t\t\t\tlookupName = function(configName) {\n\t\t\t\t\t\tvar keyDescriptors = wiki.getTiddlerText(\"$:/config/\" + configName + \"/\" + name);\n\t\t\t\t\t\tif(keyDescriptors) {\n\t\t\t\t\t\t\toptions.keyDescriptor = keyDescriptor;\n\t\t\t\t\t\t\tresult.push.apply(result,self.parseKeyDescriptors(keyDescriptors,options));\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t$tw.utils.each(self.lookupNames,function(platformDescriptor) {\n\t\t\t\t\tlookupName(platformDescriptor);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tresult.push(self.parseKeyDescriptor(keyDescriptor,options));\n\t\t}\n\t});\n\treturn result;\n};\n\nKeyboardManager.prototype.getPrintableShortcuts = function(keyInfoArray) {\n\tvar self = this,\n\t\tresult = [];\n\t$tw.utils.each(keyInfoArray,function(keyInfo) {\n\t\tif(keyInfo) {\n\t\t\tresult.push((keyInfo.ctrlKey ? \"ctrl-\" : \"\") + \n\t\t\t\t   (keyInfo.shiftKey ? \"shift-\" : \"\") + \n\t\t\t\t   (keyInfo.altKey ? \"alt-\" : \"\") + \n\t\t\t\t   (keyInfo.metaKey ? self.metaKeyName : \"\") + \n\t\t\t\t   (self.keyNames[keyInfo.keyCode]));\n\t\t}\n\t});\n\treturn result;\n}\n\nKeyboardManager.prototype.checkKeyDescriptor = function(event,keyInfo) {\n\treturn keyInfo &&\n\t\t\tevent.keyCode === keyInfo.keyCode && \n\t\t\tevent.shiftKey === keyInfo.shiftKey && \n\t\t\tevent.altKey === keyInfo.altKey && \n\t\t\tevent.ctrlKey === keyInfo.ctrlKey && \n\t\t\tevent.metaKey === keyInfo.metaKey;\n};\n\nKeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) {\n\treturn (this.getMatchingKeyDescriptor(event,keyInfoArray) !== null);\n};\n\nKeyboardManager.prototype.getMatchingKeyDescriptor = function(event,keyInfoArray) {\n\tfor(var t=0; t<keyInfoArray.length; t++) {\n\t\tif(this.checkKeyDescriptor(event,keyInfoArray[t])) {\n\t\t\treturn keyInfoArray[t];\n\t\t}\n\t}\n\treturn null;\n};\n\nKeyboardManager.prototype.getEventModifierKeyDescriptor = function(event) {\n\treturn event.ctrlKey && !event.shiftKey\t&& !event.altKey && !event.metaKey ? \"ctrl\" : \n\t\tevent.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey ? \"shift\" : \n\t\tevent.ctrlKey && event.shiftKey && !event.altKey && !event.metaKey ? \"ctrl-shift\" : \n\t\tevent.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey ? \"alt\" : \n\t\tevent.altKey && event.shiftKey && !event.ctrlKey && !event.metaKey ? \"alt-shift\" : \n\t\tevent.altKey && event.ctrlKey && !event.shiftKey && !event.metaKey ? \"ctrl-alt\" : \n\t\tevent.altKey && event.shiftKey && event.ctrlKey && !event.metaKey ? \"ctrl-alt-shift\" : \n\t\tevent.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey ? \"meta\" : \n\t\tevent.metaKey && event.ctrlKey && !event.shiftKey && !event.altKey ? \"meta-ctrl\" :\n\t\tevent.metaKey && event.ctrlKey && event.shiftKey && !event.altKey ? \"meta-ctrl-shift\" :\n\t\tevent.metaKey && event.ctrlKey && event.shiftKey && event.altKey ? \"meta-ctrl-alt-shift\" : \"normal\";\n};\n\nKeyboardManager.prototype.getShortcutTiddlerList = function() {\n\treturn $tw.wiki.getTiddlersWithTag(\"$:/tags/KeyboardShortcut\");\n};\n\nKeyboardManager.prototype.updateShortcutLists = function(tiddlerList) {\n\tthis.shortcutTiddlers = tiddlerList;\n\tfor(var i=0; i<tiddlerList.length; i++) {\n\t\tvar title = tiddlerList[i],\n\t\t\ttiddlerFields = $tw.wiki.getTiddler(title).fields;\n\t\tthis.shortcutKeysList[i] = tiddlerFields.key !== undefined ? tiddlerFields.key : undefined;\n\t\tthis.shortcutActionList[i] = tiddlerFields.text;\n\t\tthis.shortcutParsedList[i] = this.shortcutKeysList[i] !== undefined ? this.parseKeyDescriptors(this.shortcutKeysList[i]) : undefined;\n\t\tthis.shortcutPriorityList[i] = tiddlerFields.priority === \"yes\" ? true : false;\n\t}\n};\n\n/*\nevent: the keyboard event object\noptions:\n\tonlyPriority: true if only priority global shortcuts should be invoked\n*/\nKeyboardManager.prototype.handleKeydownEvent = function(event, options) {\n\toptions = options || {};\n\tvar key, action;\n\tfor(var i=0; i<this.shortcutTiddlers.length; i++) {\n\t\tif(options.onlyPriority && this.shortcutPriorityList[i] !== true) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif(this.shortcutParsedList[i] !== undefined && this.checkKeyDescriptors(event,this.shortcutParsedList[i])) {\n\t\t\tkey = this.shortcutParsedList[i];\n\t\t\taction = this.shortcutActionList[i];\n\t\t}\n\t}\n\tif(key !== undefined) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\t$tw.rootWidget.invokeActionString(action,$tw.rootWidget,event);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.detectNewShortcuts = function(changedTiddlers) {\n\tvar shortcutConfigTiddlers = [],\n\t\thandled = false;\n\t$tw.utils.each(this.lookupNames,function(platformDescriptor) {\n\t\tvar descriptorString = \"$:/config/\" + platformDescriptor + \"/\";\n\t\tObject.keys(changedTiddlers).forEach(function(configTiddler) {\n\t\t\tvar configString = configTiddler.substr(0, configTiddler.lastIndexOf(\"/\") + 1);\n\t\t\tif(configString === descriptorString) {\n\t\t\t\tshortcutConfigTiddlers.push(configTiddler);\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t});\n\t});\n\tif(handled) {\n\t\treturn $tw.utils.hopArray(changedTiddlers,shortcutConfigTiddlers);\n\t} else {\n\t\treturn false;\n\t}\n};\n\nKeyboardManager.prototype.handleShortcutChanges = function(changedTiddlers) {\n\tvar newList = this.getShortcutTiddlerList();\n\tvar hasChanged = $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers) ? true :\n\t\t($tw.utils.hopArray(changedTiddlers,newList) ? true :\n\t\t(this.detectNewShortcuts(changedTiddlers))\n\t);\n\t// Re-cache shortcuts if something changed\n\tif(hasChanged) {\n\t\tthis.updateShortcutLists(newList);\n\t}\n};\n\nexports.KeyboardManager = KeyboardManager;\n\n})();\n","type":"application/javascript","module-type":"global"},"$:/core/modules/language.js":{"title":"$:/core/modules/language.js","text":"/*\\\ntitle: $:/core/modules/language.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Language() manages translateable strings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate an instance of the language manager. Options include:\nwiki: wiki from which to retrieve translation tiddlers\n*/\nfunction Language(options) {\n\toptions = options || \"\";\n\tthis.wiki = options.wiki || $tw.wiki;\n}\n\n/*\nReturn a wikified translateable string. The title is automatically prefixed with \"$:/language/\"\nOptions include:\nvariables: optional hashmap of variables to supply to the language wikification\n*/\nLanguage.prototype.getString = function(title,options) {\n\toptions = options || {};\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.renderTiddler(\"text/plain\",title,{variables: options.variables});\n};\n\n/*\nReturn a raw, unwikified translateable string. The title is automatically prefixed with \"$:/language/\"\n*/\nLanguage.prototype.getRawString = function(title) {\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.getTiddlerText(title);\n};\n\nexports.Language = Language;\n\n})();\n","type":"application/javascript","module-type":"global"},"$:/core/modules/macros/changecount.js":{"title":"$:/core/modules/macros/changecount.js","text":"/*\\\ntitle: $:/core/modules/macros/changecount.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the changecount for the current tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"changecount\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn this.wiki.getChangeCount(this.getVariable(\"currentTiddler\")) + \"\";\n};\n\n})();\n","type":"application/javascript","module-type":"macro"},"$:/core/modules/macros/contrastcolour.js":{"title":"$:/core/modules/macros/contrastcolour.js","text":"/*\\\ntitle: $:/core/modules/macros/contrastcolour.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to choose which of two colours has the highest contrast with a base colour\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"contrastcolour\";\n\nexports.params = [\n\t{name: \"target\"},\n\t{name: \"fallbackTarget\"},\n\t{name: \"colourA\"},\n\t{name: \"colourB\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(target,fallbackTarget,colourA,colourB) {\n\tvar rgbTarget = $tw.utils.parseCSSColor(target) || $tw.utils.parseCSSColor(fallbackTarget);\n\tif(!rgbTarget) {\n\t\treturn colourA;\n\t}\n\tvar rgbColourA = $tw.utils.parseCSSColor(colourA),\n\t\trgbColourB = $tw.utils.parseCSSColor(colourB);\n\tif(rgbColourA && !rgbColourB) {\n\t\treturn rgbColourA;\n\t}\n\tif(rgbColourB && !rgbColourA) {\n\t\treturn rgbColourB;\n\t}\n\tif(!rgbColourA && !rgbColourB) {\n\t\t// If neither colour is readable, return a crude inverse of the target\n\t\treturn [255 - rgbTarget[0],255 - rgbTarget[1],255 - rgbTarget[2],rgbTarget[3]];\n\t}\n\t// Colour brightness formula derived from http://www.w3.org/WAI/ER/WD-AERT/#color-contrast\n\tvar brightnessTarget = rgbTarget[0] * 0.299 + rgbTarget[1] * 0.587 + rgbTarget[2] * 0.114,\n\t\tbrightnessA = rgbColourA[0] * 0.299 + rgbColourA[1] * 0.587 + rgbColourA[2] * 0.114,\n\t\tbrightnessB = rgbColourB[0] * 0.299 + rgbColourB[1] * 0.587 + rgbColourB[2] * 0.114;\n\treturn Math.abs(brightnessTarget - brightnessA) > Math.abs(brightnessTarget - brightnessB) ? colourA : colourB;\n};\n\n})();\n","type":"application/javascript","module-type":"macro"},"$:/core/modules/macros/csvtiddlers.js":{"title":"$:/core/modules/macros/csvtiddlers.js","text":"/*\\\ntitle: $:/core/modules/macros/csvtiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to CSV\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"csvtiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"format\"},\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,format) {\n\tvar self = this,\n\t\ttiddlers = this.wiki.filterTiddlers(filter),\n\t\ttiddler,\n\t\tfields = [],\n\t\tt,f;\n\t// Collect all the fields\n\tfor(t=0;t<tiddlers.length; t++) {\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tif(tiddler) {\n\t\t\tfor(f in tiddler.fields) {\n\t\t\t\tif(fields.indexOf(f) === -1) {\n\t\t\t\t\tfields.push(f);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Sort the fields and bring the standard ones to the front\n\tfields.sort();\n\t\"title text modified modifier created creator\".split(\" \").reverse().forEach(function(value,index) {\n\t\tvar p = fields.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tfields.splice(p,1);\n\t\t\tfields.unshift(value)\n\t\t}\n\t});\n\t// Output the column headings\n\tvar output = [], row = [];\n\tfields.forEach(function(value) {\n\t\trow.push(quoteAndEscape(value))\n\t});\n\toutput.push(row.join(\",\"));\n\t// Output each tiddler\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\trow = [];\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\t\tif(tiddler) {\n\t\t\t\tfor(f=0; f<fields.length; f++) {\n\t\t\t\t\trow.push(quoteAndEscape(tiddler ? tiddler.getFieldString(fields[f]) || \"\" : \"\"));\n\t\t\t\t}\t\n\t\t\t}\n\t\toutput.push(row.join(\",\"));\n\t}\n\treturn output.join(\"\\n\");\n};\n\nfunction quoteAndEscape(value) {\n\treturn \"\\\"\" + value.replace(/\"/mg,\"\\\"\\\"\") + \"\\\"\";\n}\n\n})();\n","type":"application/javascript","module-type":"macro"},"$:/core/modules/macros/displayshortcuts.js":{"title":"$:/core/modules/macros/displayshortcuts.js","text":"/*\\\ntitle: $:/core/modules/macros/displayshortcuts.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to display a list of keyboard shortcuts in human readable form. Notably, it resolves named shortcuts like `((bold))` to the underlying keystrokes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"displayshortcuts\";\n\nexports.params = [\n\t{name: \"shortcuts\"},\n\t{name: \"prefix\"},\n\t{name: \"separator\"},\n\t{name: \"suffix\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(shortcuts,prefix,separator,suffix) {\n\tvar shortcutArray = $tw.keyboardManager.getPrintableShortcuts($tw.keyboardManager.parseKeyDescriptors(shortcuts,{\n\t\twiki: this.wiki\n\t}));\n\tif(shortcutArray.length > 0) {\n\t\tshortcutArray.sort(function(a,b) {\n\t\t    return a.toLowerCase().localeCompare(b.toLowerCase());\n\t\t})\n\t\treturn prefix + shortcutArray.join(separator) + suffix;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"macro"},"$:/core/modules/macros/jsontiddler.js":{"title":"$:/core/modules/macros/jsontiddler.js","text":"/*\\\ntitle: $:/core/modules/macros/jsontiddler.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output a single tiddler to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddler\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\ttitle = title || this.getVariable(\"currentTiddler\");\n\tvar tiddler = !!title && this.wiki.getTiddler(title),\n\t\tfields = new Object();\n\tif(tiddler) {\n\t\tfor(var field in tiddler.fields) {\n\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t}\n\t}\n\treturn JSON.stringify(fields,null,$tw.config.preferences.jsonSpaces);\n};\n\n})();\n","type":"application/javascript","module-type":"macro"},"$:/core/modules/macros/jsontiddlers.js":{"title":"$:/core/modules/macros/jsontiddlers.js","text":"/*\\\ntitle: $:/core/modules/macros/jsontiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"spaces\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,spaces) {\n\treturn this.wiki.getTiddlersAsJson(filter,$tw.utils.parseInt(spaces));\n};\n\n})();\n","type":"application/javascript","module-type":"macro"},"$:/core/modules/macros/makedatauri.js":{"title":"$:/core/modules/macros/makedatauri.js","text":"/*\\\ntitle: $:/core/modules/macros/makedatauri.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to convert a string of text to a data URI\n\n<<makedatauri text:\"Text to be converted\" type:\"text/vnd.tiddlywiki\">>\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"makedatauri\";\n\nexports.params = [\n\t{name: \"text\"},\n\t{name: \"type\"},\n\t{name: \"_canonical_uri\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(text,type,_canonical_uri) {\n\treturn $tw.utils.makeDataUri(text,type,_canonical_uri);\n};\n\n})();\n","type":"application/javascript","module-type":"macro"},"$:/core/modules/macros/now.js":{"title":"$:/core/modules/macros/now.js","text":"/*\\\ntitle: $:/core/modules/macros/now.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return a formatted version of the current time\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"now\";\n\nexports.params = [\n\t{name: \"format\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(format) {\n\treturn $tw.utils.formatDateString(new Date(),format || \"0hh:0mm, DDth MMM YYYY\");\n};\n\n})();\n","type":"application/javascript","module-type":"macro"},"$:/core/modules/macros/qualify.js":{"title":"$:/core/modules/macros/qualify.js","text":"/*\\\ntitle: $:/core/modules/macros/qualify.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to qualify a state tiddler title according\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"qualify\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title + \"-\" + this.getStateQualifier();\n};\n\n})();\n","type":"application/javascript","module-type":"macro"},"$:/core/modules/macros/resolvepath.js":{"title":"$:/core/modules/macros/resolvepath.js","text":"/*\\\ntitle: $:/core/modules/macros/resolvepath.js\ntype: application/javascript\nmodule-type: macro\n\nResolves a relative path for an absolute rootpath.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"resolvepath\";\n\nexports.params = [\n\t{name: \"source\"},\n\t{name: \"root\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(source, root) {\n\treturn $tw.utils.resolvePath(source, root);\n};\n\n})();\n","type":"application/javascript","module-type":"macro"},"$:/core/modules/macros/unusedtitle.js":{"title":"$:/core/modules/macros/unusedtitle.js","text":"/*\\\ntitle: $:/core/modules/macros/unusedtitle.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return a new title that is unused in the wiki. It can be given a name as a base.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"unusedtitle\";\n\nexports.params = [\n\t{name: \"baseName\"},\n\t{name: \"separator\"},\n\t{name: \"template\"},\n\t{name: \"startCount\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(baseName,separator,template,startCount) {\n\tseparator = separator || \" \";\n\tstartCount = startCount || 0;\n\tif(!baseName) {\n\t\tbaseName = $tw.language.getString(\"DefaultNewTiddlerTitle\");\n\t}\n\t// $tw.wiki.generateNewTitle = function(baseTitle,options)\n\t// options.prefix must be a string!\n\treturn this.wiki.generateNewTitle(baseName, {\"prefix\": separator, \"template\": template, \"startCount\": startCount});\n};\n\n})();\n","type":"application/javascript","module-type":"macro"},"$:/core/modules/macros/version.js":{"title":"$:/core/modules/macros/version.js","text":"/*\\\ntitle: $:/core/modules/macros/version.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the TiddlyWiki core version number\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"version\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn $tw.version;\n};\n\n})();\n","type":"application/javascript","module-type":"macro"},"$:/core/modules/parsers/audioparser.js":{"title":"$:/core/modules/parsers/audioparser.js","text":"/*\\\ntitle: $:/core/modules/parsers/audioparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe audio parser parses an audio tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar AudioParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"audio\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n\tthis.source = text;\n\tthis.type = type;\n};\n\nexports[\"audio/ogg\"] = AudioParser;\nexports[\"audio/mpeg\"] = AudioParser;\nexports[\"audio/mp3\"] = AudioParser;\nexports[\"audio/mp4\"] = AudioParser;\n\n})();\n\n","type":"application/javascript","module-type":"parser"},"$:/core/modules/parsers/binaryparser.js":{"title":"$:/core/modules/parsers/binaryparser.js","text":"/*\\\ntitle: $:/core/modules/parsers/binaryparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe binary parser parses a binary tiddler into a warning message and download link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar BinaryParser = function(type,text,options) {\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\t\"$tiddler\": {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on binary tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!title\"}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\t\"$tiddler\": {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to external or internal data URI\n\tif(options._canonical_uri) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: options._canonical_uri\n\t\t};\n\t} else if(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\tthis.tree = [element];\n\tthis.source = text;\n\tthis.type = type;\n};\n\nexports[\"application/octet-stream\"] = BinaryParser;\n\n})();\n\n","type":"application/javascript","module-type":"parser"},"$:/core/modules/parsers/csvparser.js":{"title":"$:/core/modules/parsers/csvparser.js","text":"/*\\\ntitle: $:/core/modules/parsers/csvparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe CSV text parser processes CSV files into a table wrapped in a scrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CsvParser = function(type,text,options) {\n\t// Special handler for tab-delimited files\n\tif (type === 'text/tab-delimited-values' && !options.separator) {\n\t\toptions.separator = \"\\t\";\n\t}\n\t\n\t// Table framework\n\tthis.tree = [{\n\t\t\"type\": \"scrollable\", \"children\": [{\n\t\t\t\"type\": \"element\", \"tag\": \"table\", \"children\": [{\n\t\t\t\t\"type\": \"element\", \"tag\": \"tbody\", \"children\": []\n\t\t\t}], \"attributes\": {\n\t\t\t\t\"class\": {\"type\": \"string\", \"value\": \"tc-csv-table\"}\n\t\t\t}\n\t\t}]\n\t}];\n\t// Split the text into lines\n\tvar lines = $tw.utils.parseCsvString(text, options),\n\t\ttag = \"th\";\n\tvar maxColumns = 0;\n\t$tw.utils.each(lines, function(columns) {\n\t\tmaxColumns = Math.max(columns.length, maxColumns);\n\t});\n\t\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar columns = lines[line];\n\t\tvar row = {\n\t\t\t\"type\": \"element\", \"tag\": \"tr\", \"children\": []\n\t\t};\n\t\tfor(var column=0; column<maxColumns; column++) {\n\t\t\trow.children.push({\n\t\t\t\t\"type\": \"element\", \"tag\": tag, \"children\": [{\n\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\"text\": columns[column] || ''\n\t\t\t\t}]\n\t\t\t});\n\t\t}\n\t\ttag = \"td\";\n\t\tthis.tree[0].children[0].children[0].children.push(row);\n\t}\n\tthis.source = text;\n\tthis.type = type;\n};\n\nexports[\"text/csv\"] = CsvParser;\nexports[\"text/tab-delimited-values\"] = CsvParser;\n\n})();\n\n","type":"application/javascript","module-type":"parser"},"$:/core/modules/parsers/htmlparser.js":{"title":"$:/core/modules/parsers/htmlparser.js","text":"/*\\\ntitle: $:/core/modules/parsers/htmlparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe HTML parser displays text as raw HTML\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HtmlParser = function(type,text,options) {\n\tvar src;\n\tif(options._canonical_uri) {\n\t\tsrc = options._canonical_uri;\n\t} else if(text) {\n\t\tsrc = \"data:text/html;charset=utf-8,\" + encodeURIComponent(text);\n\t}\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"iframe\",\n\t\tattributes: {\n\t\t\tsrc: {type: \"string\", value: src}\n\t\t}\n\t}];\n\tif($tw.wiki.getTiddlerText(\"$:/config/HtmlParser/DisableSandbox\",\"no\") !== \"yes\") {\n\t\tthis.tree[0].attributes.sandbox = {type: \"string\", value: $tw.wiki.getTiddlerText(\"$:/config/HtmlParser/SandboxTokens\",\"\")};\n\t}\n\tthis.source = text;\n\tthis.type = type;\n};\n\nexports[\"text/html\"] = HtmlParser;\n\n})();\n\n","type":"application/javascript","module-type":"parser"},"$:/core/modules/parsers/imageparser.js":{"title":"$:/core/modules/parsers/imageparser.js","text":"/*\\\ntitle: $:/core/modules/parsers/imageparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe image parser parses an image into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"img\",\n\t\t\tattributes: {}\n\t\t};\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\tif(type === \"image/svg+xml\" || type === \".svg\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:image/svg+xml,\" + encodeURIComponent(text)};\n\t\t} else {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t\t}\n\t}\n\tthis.tree = [element];\n\tthis.source = text;\n\tthis.type = type;\n};\n\nexports[\"image/svg+xml\"] = ImageParser;\nexports[\"image/jpg\"] = ImageParser;\nexports[\"image/jpeg\"] = ImageParser;\nexports[\"image/png\"] = ImageParser;\nexports[\"image/gif\"] = ImageParser;\nexports[\"image/webp\"] = ImageParser;\nexports[\"image/heic\"] = ImageParser;\nexports[\"image/heif\"] = ImageParser;\nexports[\"image/x-icon\"] = ImageParser;\nexports[\"image/vnd.microsoft.icon\"] = ImageParser;\n\n})();\n\n","type":"application/javascript","module-type":"parser"},"$:/core/modules/utils/parseutils.js":{"title":"$:/core/modules/utils/parseutils.js","text":"/*\\\ntitle: $:/core/modules/utils/parseutils.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions concerned with parsing text into tokens.\n\nMost functions have the following pattern:\n\n* The parameters are:\n** `source`: the source string being parsed\n** `pos`: the current parse position within the string\n** Any further parameters are used to identify the token that is being parsed\n* The return value is:\n** null if the token was not found at the specified position\n** an object representing the token with the following standard fields:\n*** `type`: string indicating the type of the token\n*** `start`: start position of the token in the source string\n*** `end`: end position of the token in the source string\n*** Any further fields required to describe the token\n\nThe exception is `skipWhiteSpace`, which just returns the position after the whitespace.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for a whitespace token. Returns null if not found, otherwise returns {type: \"whitespace\", start:, end:,}\n*/\nexports.parseWhiteSpace = function(source,pos) {\n\tvar p = pos,c;\n\twhile(true) {\n\t\tc = source.charAt(p);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tp++;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(p === pos) {\n\t\treturn null;\n\t} else {\n\t\treturn {\n\t\t\ttype: \"whitespace\",\n\t\t\tstart: pos,\n\t\t\tend: p\n\t\t}\n\t}\n};\n\n/*\nConvenience wrapper for parseWhiteSpace. Returns the position after the whitespace\n*/\nexports.skipWhiteSpace = function(source,pos) {\n\tvar c;\n\twhile(true) {\n\t\tc = source.charAt(pos);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tpos++;\n\t\t} else {\n\t\t\treturn pos;\n\t\t}\n\t}\n};\n\n/*\nLook for a given string token. Returns null if not found, otherwise returns {type: \"token\", value:, start:, end:,}\n*/\nexports.parseTokenString = function(source,pos,token) {\n\tvar match = source.indexOf(token,pos) === pos;\n\tif(match) {\n\t\treturn {\n\t\t\ttype: \"token\",\n\t\t\tvalue: token,\n\t\t\tstart: pos,\n\t\t\tend: pos + token.length\n\t\t};\n\t}\n\treturn null;\n};\n\n/*\nLook for a token matching a regex. Returns null if not found, otherwise returns {type: \"regexp\", match:, start:, end:,}\n*/\nexports.parseTokenRegExp = function(source,pos,reToken) {\n\tvar node = {\n\t\ttype: \"regexp\",\n\t\tstart: pos\n\t};\n\treToken.lastIndex = pos;\n\tnode.match = reToken.exec(source);\n\tif(node.match && node.match.index === pos) {\n\t\tnode.end = pos + node.match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a string literal. Returns null if not found, otherwise returns {type: \"string\", value:, start:, end:,}\n*/\nexports.parseStringLiteral = function(source,pos) {\n\tvar node = {\n\t\ttype: \"string\",\n\t\tstart: pos\n\t};\n\tvar reString = /(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\")|(?:'([^']*)')/g;\n\treString.lastIndex = pos;\n\tvar match = reString.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.value = match[1] !== undefined ? match[1] :(\n\t\t\tmatch[2] !== undefined ? match[2] : match[3]\n\t\t\t\t\t);\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nReturns an array of {name:} with an optional \"default\" property. Options include:\nrequireParenthesis: require the parameter definition to be wrapped in parenthesis\n*/\nexports.parseParameterDefinition = function(paramString,options) {\n\toptions = options || {};\n\tif(options.requireParenthesis) {\n\t\tvar parenMatch = /^\\s*\\((.*)\\)\\s*$/g.exec(paramString);\n\t\tif(!parenMatch) {\n\t\t\treturn [];\n\t\t}\n\t\tparamString = parenMatch[1];\n\t}\n\tvar params = [],\n\t\treParam = /\\s*([^:),\\s]+)(?:\\s*:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|([^,\"'\\s]+)))?/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Save the parameter details\n\t\tvar paramInfo = {name: paramMatch[1]},\n\t\t\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5];\n\t\tif(defaultValue !== undefined) {\n\t\t\tparamInfo[\"default\"] = defaultValue;\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Look for the next parameter\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn params;\n};\n\nexports.parseMacroParameters = function(node,source,pos) {\n\t// Process parameters\n\tvar parameter = $tw.utils.parseMacroParameter(source,pos);\n\twhile(parameter) {\n\t\tnode.params.push(parameter);\n\t\tpos = parameter.end;\n\t\t// Get the next parameter\n\t\tparameter = $tw.utils.parseMacroParameter(source,pos);\n\t}\n\tnode.end = pos;\n\treturn node;\n}\n\n/*\nLook for a macro invocation parameter. Returns null if not found, or {type: \"macro-parameter\", name:, value:, start:, end:}\n*/\nexports.parseMacroParameter = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macro-parameter\",\n\t\tstart: pos\n\t};\n\t// Define our regexp\n\tvar reMacroParameter = /(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|((?:(?:>(?!>))|[^\\s>\"'])+)))/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the parameter\n\tvar token = $tw.utils.parseTokenRegExp(source,pos,reMacroParameter);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the parameter details\n\tnode.value = token.match[2] !== undefined ? token.match[2] : (\n\t\t\t\t\ttoken.match[3] !== undefined ? token.match[3] : (\n\t\t\t\t\t\ttoken.match[4] !== undefined ? token.match[4] : (\n\t\t\t\t\t\t\ttoken.match[5] !== undefined ? token.match[5] : (\n\t\t\t\t\t\t\t\ttoken.match[6] !== undefined ? token.match[6] : (\n\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\tif(token.match[1]) {\n\t\tnode.name = token.match[1];\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for a macro invocation. Returns null if not found, or {type: \"transclude\", attributes:, start:, end:}\n*/\nexports.parseMacroInvocationAsTransclusion = function(source,pos) {\n\tvar node = $tw.utils.parseMacroInvocation(source,pos);\n\tif(node) {\n\t\tvar positionalName = 0,\n\t\t\ttransclusion = {\n\t\t\t\ttype: \"transclude\",\n\t\t\t\tstart: node.start,\n\t\t\t\tend: node.end\n\t\t\t};\n\t\t$tw.utils.addAttributeToParseTreeNode(transclusion,\"$variable\",node.name);\n\t\t$tw.utils.each(node.params,function(param) {\n\t\t\tvar name = param.name;\n\t\t\tif(name) {\n\t\t\t\tif(name.charAt(0) === \"$\") {\n\t\t\t\t\tname = \"$\" + name;\n\t\t\t\t}\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(transclusion,{name: name,type: \"string\", value: param.value, start: param.start, end: param.end});\n\t\t\t} else {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(transclusion,{name: (positionalName++) + \"\",type: \"string\", value: param.value, start: param.start, end: param.end});\n\t\t\t}\n\t\t});\n\t\treturn transclusion;\n\t}\n\treturn node;\n};\n\n/*\nLook for a macro invocation. Returns null if not found, or {type: \"macrocall\", name:, params:, start:, end:}\n*/\nexports.parseMacroInvocation = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macrocall\",\n\t\tstart: pos,\n\t\tparams: []\n\t};\n\t// Define our regexps\n\tvar reMacroName = /([^\\s>\"'=]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double less than sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"<<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the macro name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reMacroName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\tnode = $tw.utils.parseMacroParameters(node,source,pos);\n\tpos = node.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">>\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\nexports.parseFilterVariable = function(source) {\n\tvar node = {\n\t\t\tname: \"\",\n\t\t\tparams: [],\n\t\t},\n\t\tpos = 0,\n\t\treName = /([^\\s\"']+)/g;\n\t// If there is no whitespace or it is an empty string then there are no macro parameters\n\tif(/^\\S*$/.test(source)) {\n\t\tnode.name = source;\n\t\treturn node;\n\t}\n\t// Get the variable name\n\tvar nameMatch = $tw.utils.parseTokenRegExp(source,pos,reName);\n\tif(nameMatch) {\n\t\tnode.name = nameMatch.match[1];\n\t\tpos = nameMatch.end;\n\t\tnode = $tw.utils.parseMacroParameters(node,source,pos);\n\t\tdelete node.end;\n\t}\n\treturn node;\n};\n\n/*\nLook for an HTML attribute definition. Returns null if not found, otherwise returns {type: \"attribute\", name:, type: \"filtered|string|indirect|macro\", value|filter|textReference:, start:, end:,}\n*/\nexports.parseAttribute = function(source,pos) {\n\tvar node = {\n\t\tstart: pos\n\t};\n\t// Define our regexps\n\tvar reAttributeName = /([^\\/\\s>\"'`=]+)/g,\n\t\treUnquotedAttribute = /([^\\/\\s<>\"'`=]+)/g,\n\t\treFilteredValue = /\\{\\{\\{([\\S\\s]+?)\\}\\}\\}/g,\n\t\treIndirectValue = /\\{\\{([^\\}]+)\\}\\}/g,\n\t\treSubstitutedValue = /(?:```([\\s\\S]*?)```|`([^`]|[\\S\\s]*?)`)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the attribute name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reAttributeName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for an equals sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"=\");\n\tif(token) {\n\t\tpos = token.end;\n\t\t// Skip whitespace\n\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t// Look for a string literal\n\t\tvar stringLiteral = $tw.utils.parseStringLiteral(source,pos);\n\t\tif(stringLiteral) {\n\t\t\tpos = stringLiteral.end;\n\t\t\tnode.type = \"string\";\n\t\t\tnode.value = stringLiteral.value;\n\t\t} else {\n\t\t\t// Look for a filtered value\n\t\t\tvar filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);\n\t\t\tif(filteredValue) {\n\t\t\t\tpos = filteredValue.end;\n\t\t\t\tnode.type = \"filtered\";\n\t\t\t\tnode.filter = filteredValue.match[1];\n\t\t\t} else {\n\t\t\t\t// Look for an indirect value\n\t\t\t\tvar indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);\n\t\t\t\tif(indirectValue) {\n\t\t\t\t\tpos = indirectValue.end;\n\t\t\t\t\tnode.type = \"indirect\";\n\t\t\t\t\tnode.textReference = indirectValue.match[1];\n\t\t\t\t} else {\n\t\t\t\t\t// Look for a unquoted value\n\t\t\t\t\tvar unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);\n\t\t\t\t\tif(unquotedValue) {\n\t\t\t\t\t\tpos = unquotedValue.end;\n\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\tnode.value = unquotedValue.match[1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Look for a macro invocation value\n\t\t\t\t\t\tvar macroInvocation = $tw.utils.parseMacroInvocation(source,pos);\n\t\t\t\t\t\tif(macroInvocation) {\n\t\t\t\t\t\t\tpos = macroInvocation.end;\n\t\t\t\t\t\t\tnode.type = \"macro\";\n\t\t\t\t\t\t\tnode.value = macroInvocation;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar substitutedValue = $tw.utils.parseTokenRegExp(source,pos,reSubstitutedValue);\n\t\t\t\t\t\t\tif(substitutedValue) {\n\t\t\t\t\t\t\t\tpos = substitutedValue.end;\n\t\t\t\t\t\t\t\tnode.type = \"substituted\";\n\t\t\t\t\t\t\t\tnode.rawValue = substitutedValue.match[1] || substitutedValue.match[2];\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\t\t\tnode.value = \"true\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tnode.type = \"string\";\n\t\tnode.value = \"true\";\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/parsers/pdfparser.js":{"title":"$:/core/modules/parsers/pdfparser.js","text":"/*\\\ntitle: $:/core/modules/parsers/pdfparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe PDF parser embeds a PDF viewer\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"iframe\",\n\t\t\tattributes: {}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:application/pdf;base64,\" + text};\n\t}\n\tthis.tree = [element];\n\tthis.source = text;\n\tthis.type = type;\n};\n\nexports[\"application/pdf\"] = ImageParser;\n\n})();\n\n","type":"application/javascript","module-type":"parser"},"$:/core/modules/parsers/textparser.js":{"title":"$:/core/modules/parsers/textparser.js","text":"/*\\\ntitle: $:/core/modules/parsers/textparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe plain text parser processes blocks of source text into a degenerate parse tree consisting of a single text node\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TextParser = function(type,text,options) {\n\tthis.tree = [{\n\t\ttype: \"genesis\",\n\t\tattributes: {\n\t\t\t$type: {name: \"$type\", type: \"string\", value: \"$codeblock\"},\n\t\t\tcode: {name: \"code\", type: \"string\", value: text},\n\t\t\tlanguage: {name: \"language\", type: \"string\", value: type},\n\t\t\t$remappable: {name: \"$remappable\", type:\"string\", value: \"no\"}\n\t\t}\n\t}];\n\tthis.source = text;\n\tthis.type = type;\n};\n\nexports[\"text/plain\"] = TextParser;\nexports[\"text/x-tiddlywiki\"] = TextParser;\nexports[\"application/javascript\"] = TextParser;\nexports[\"application/json\"] = TextParser;\nexports[\"text/css\"] = TextParser;\nexports[\"application/x-tiddler-dictionary\"] = TextParser;\n\n})();\n","type":"application/javascript","module-type":"parser"},"$:/core/modules/parsers/videoparser.js":{"title":"$:/core/modules/parsers/videoparser.js","text":"/*\\\ntitle: $:/core/modules/parsers/videoparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe video parser parses a video tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar VideoParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"video\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n\tthis.source = text;\n\tthis.type = type;\n};\n\nexports[\"video/ogg\"] = VideoParser;\nexports[\"video/webm\"] = VideoParser;\nexports[\"video/mp4\"] = VideoParser;\nexports[\"video/quicktime\"] = VideoParser;\n\n})();\n","type":"application/javascript","module-type":"parser"},"$:/core/modules/parsers/wikiparser/rules/codeblock.js":{"title":"$:/core/modules/parsers/wikiparser/rules/codeblock.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for code blocks. For example:\n\n```\n\t```\n\tThis text will not be //wikified//\n\t```\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match and get language if defined\n\tthis.matchRegExp = /```([\\w-]*)\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\\r?\\n```$)/mg;\n\tvar languageStart = this.parser.pos + 3,\n\t\tlanguageEnd = languageStart + this.match[1].length;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext,\n\t\tcodeStart = this.parser.pos;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Return the $codeblock widget\n\treturn [{\n\t\t\ttype: \"codeblock\",\n\t\t\tattributes: {\n\t\t\t\t\tcode: {type: \"string\", value: text, start: codeStart, end: this.parser.pos},\n\t\t\t\t\tlanguage: {type: \"string\", value: this.match[1], start: languageStart, end: languageEnd}\n\t\t\t}\n\t}];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/codeinline.js":{"title":"$:/core/modules/parsers/wikiparser/rules/codeinline.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for code runs. For example:\n\n```\n\tThis is a `code run`.\n\tThis is another ``code run``\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(``?)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar reEnd = new RegExp(this.match[1], \"mg\");\n\t// Look for the end marker\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext,\n\t\tstart = this.parser.pos;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"code\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: text,\n\t\t\tstart: start,\n\t\t\tend: this.parser.pos\n\t\t}]\n\t}];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/commentblock.js":{"title":"$:/core/modules/parsers/wikiparser/rules/commentblock.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n\\define macroX()\n<!-- This is a comment -->\nxxxx\n\\end\n<!-- This is a comment -->\n\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentblock\";\nexports.types = {block:true, pragma:true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = this.match.index + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/commentinline.js":{"title":"$:/core/modules/parsers/wikiparser/rules/commentinline.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = this.match.index + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/conditional.js":{"title":"$:/core/modules/parsers/wikiparser/rules/conditional.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/conditional.js\ntype: application/javascript\nmodule-type: wikirule\n\nConditional shortcut syntax\n\n```\nThis is a <%if [{something}] %>Elephant<%elseif [{else}] %>Pelican<%else%>Crocodile<%endif%>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"conditional\";\nexports.types = {inline: true, block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\<\\%\\s*if\\s+/mg;\n\tthis.terminateIfRegExp = /\\%\\>/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Look for the next <%if shortcut\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\t// If not found then return no match\n\tif(!this.match) {\n\t\treturn undefined;\n\t}\n\t// Check for the next %>\n\tthis.terminateIfRegExp.lastIndex = this.match.index;\n\tthis.terminateIfMatch = this.terminateIfRegExp.exec(this.parser.source);\n\t// If not found then return no match\n\tif(!this.terminateIfMatch) {\n\t\treturn undefined;\n\t}\n\t// Return the position at which the construction was found\n\treturn this.match.index;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the filter condition\n\tvar filterCondition = this.parser.source.substring(this.match.index + this.match[0].length,this.terminateIfMatch.index);\n\t// Advance the parser position to past the %>\n\tthis.parser.pos = this.terminateIfMatch.index + this.terminateIfMatch[0].length;\n\t// Parse the if clause\n\treturn this.parseIfClause(filterCondition);\n};\n\nexports.parseIfClause = function(filterCondition) {\n\t// Create the list widget\n\tvar listWidget = {\n\t\ttype: \"list\",\n\t\ttag: \"$list\",\n\t\tisBlock: this.is.block,\n\t\tchildren: [\n\t\t\t{\n\t\t\t\ttype: \"list-template\",\n\t\t\t\ttag: \"$list-template\"\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: \"list-empty\",\n\t\t\t\ttag: \"$list-empty\"\n\t\t\t}\n\t\t]\n\t};\n\t$tw.utils.addAttributeToParseTreeNode(listWidget,\"filter\",filterCondition);\n\t$tw.utils.addAttributeToParseTreeNode(listWidget,\"variable\",\"condition\");\n\t$tw.utils.addAttributeToParseTreeNode(listWidget,\"limit\",\"1\");\n\t// Check for an immediately following double linebreak\n\tvar hasLineBreak = !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t// Parse the body looking for else or endif\n\tvar reEndString = \"\\\\<\\\\%\\\\s*(endif)\\\\s*\\\\%\\\\>|\\\\<\\\\%\\\\s*(else)\\\\s*\\\\%\\\\>|\\\\<\\\\%\\\\s*(elseif)\\\\s+([\\\\s\\\\S]+?)\\\\%\\\\>\",\n\t\tex;\n\tif(hasLineBreak) {\n\t\tex = this.parser.parseBlocksTerminatedExtended(reEndString);\n\t} else {\n\t\tvar reEnd = new RegExp(reEndString,\"mg\");\n\t\tex = this.parser.parseInlineRunTerminatedExtended(reEnd,{eatTerminator: true});\n\t}\n\t// Put the body into the list template\n\tlistWidget.children[0].children = ex.tree;\n\t// Check for an else or elseif\n\tif(ex.match) {\n\t\tif(ex.match[1] === \"endif\") {\n\t\t\t// Nothing to do if we just found an endif\n\t\t} else if(ex.match[2] === \"else\") {\n\t\t\t// Check for an immediately following double linebreak\n\t\t\thasLineBreak = !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t\t\t// If we found an else then we need to parse the body looking for the endif\n\t\t\tvar reEndString = \"\\\\<\\\\%\\\\s*(endif)\\\\s*\\\\%\\\\>\",\n\t\t\tex;\n\t\t\tif(hasLineBreak) {\n\t\t\t\tex = this.parser.parseBlocksTerminatedExtended(reEndString);\n\t\t\t} else {\n\t\t\t\tvar reEnd = new RegExp(reEndString,\"mg\");\n\t\t\t\tex = this.parser.parseInlineRunTerminatedExtended(reEnd,{eatTerminator: true});\n\t\t\t}\n\t\t\t// Put the parsed content inside the list empty template\n\t\t\tlistWidget.children[1].children = ex.tree;\n\t\t} else if(ex.match[3] === \"elseif\") {\n\t\t\t// Parse the elseif clause by reusing this parser, passing the new filter condition\n\t\t\tlistWidget.children[1].children = this.parseIfClause(ex.match[4]);\n\t\t}\n\t}\n\t// Return the parse tree node\n\treturn [listWidget];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/dash.js":{"title":"$:/core/modules/parsers/wikiparser/rules/dash.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/dash.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for dashes. For example:\n\n```\nThis is an en-dash: --\n\nThis is an em-dash: ---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"dash\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{2,3}(?!-)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar dash = this.match[0].length === 2 ? \"&ndash;\" : \"&mdash;\";\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: dash\n\t}];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js":{"title":"$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - bold. For example:\n\n```\n\tThis is ''bold'' text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except bold \n\\rules only bold \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"bold\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /''/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/''/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strong\",\n\t\tchildren: tree\n\t}];\n};\n\n})();","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js":{"title":"$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - italic. For example:\n\n```\n\tThis is //italic// text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except italic\n\\rules only italic\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"italic\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\/\\//mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\/\\//mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"em\",\n\t\tchildren: tree\n\t}];\n};\n\n})();","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js":{"title":"$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - strikethrough. For example:\n\n```\n\tThis is ~~strikethrough~~ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except strikethrough \n\\rules only strikethrough \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"strikethrough\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~~/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/~~/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strike\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js":{"title":"$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - subscript. For example:\n\n```\n\tThis is ,,subscript,, text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except subscript \n\\rules only subscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"subscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /,,/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/,,/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sub\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js":{"title":"$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - superscript. For example:\n\n```\n\tThis is ^^superscript^^ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except superscript \n\\rules only superscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"superscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\^\\^/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\^\\^/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sup\",\n\t\tchildren: tree\n\t}];\n};\n\n})();","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js":{"title":"$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - underscore. For example:\n\n```\n\tThis is __underscore__ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except underscore \n\\rules only underscore\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"underscore\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /__/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/__/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"u\",\n\t\tchildren: tree\n\t}];\n};\n\n})();","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/entity.js":{"title":"$:/core/modules/parsers/wikiparser/rules/entity.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/entity.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML entities. For example:\n\n```\n\tThis is a copyright symbol: &copy;\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"entity\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(&#?[a-zA-Z0-9]{2,8};)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar entityString = this.match[1];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Return the entity\n\treturn [{type: \"entity\", entity: this.match[0]}];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/extlink.js":{"title":"$:/core/modules/parsers/wikiparser/rules/extlink.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/extlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\nAn external link: https://www.tiddlywiki.com/\n\nA suppressed external link: ~http://www.tiddlyspace.com/\n```\n\nExternal links can be suppressed by preceding them with `~`.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"extlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n    var start = this.parser.pos;\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(this.match[0].substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: this.match[0].substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: this.match[0]},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: this.match[0], start: start, end: this.parser.pos\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js":{"title":"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tvar filterStart = this.parser.pos + 3;\n\tvar filterEnd = filterStart + this.match[1].length;\n\tvar toolTipStart = filterEnd + 1;\n\tvar toolTipEnd = toolTipStart + (this.match[2] ? this.match[2].length : 0);\n\tvar templateStart = toolTipEnd + 2;\n\tvar templateEnd = templateStart + (this.match[3] ? this.match[3].length : 0);\n\tvar styleStart = templateEnd + 2;\n\tvar styleEnd = styleStart + (this.match[4] ? this.match[4].length : 0);\n\tvar classesStart = styleEnd + 1;\n\tvar classesEnd = classesStart + (this.match[5] ? this.match[5].length : 0);\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter, start: filterStart, end: filterEnd},\n\t\t},\n\t\tisBlock: true\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip, start: toolTipStart, end: toolTipEnd};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template, start: templateStart, end: templateEnd};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style, start: styleStart, end: styleEnd};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \"), start: classesStart, end: classesEnd};\n\t}\n\treturn [node];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js":{"title":"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?/mg;\n};\n\nexports.parse = function() {\n\tvar filterStart = this.parser.pos + 3;\n\tvar filterEnd = filterStart + this.match[1].length;\n\tvar toolTipStart = filterEnd + 1;\n\tvar toolTipEnd = toolTipStart + (this.match[2] ? this.match[2].length : 0);\n\tvar templateStart = toolTipEnd + 2;\n\tvar templateEnd = templateStart + (this.match[3] ? this.match[3].length : 0);\n\tvar styleStart = templateEnd + 2;\n\tvar styleEnd = styleStart + (this.match[4] ? this.match[4].length : 0);\n\tvar classesStart = styleEnd + 1;\n\tvar classesEnd = classesStart + (this.match[5] ? this.match[5].length : 0);\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter, start: filterStart, end: filterEnd},\n\t\t}\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip, start: toolTipStart, end: toolTipEnd};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template, start: templateStart, end: templateEnd};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style, start: styleStart, end: styleEnd};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \"), start: classesStart, end: classesEnd};\n\t}\n\treturn [node];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/fnprocdef.js":{"title":"$:/core/modules/parsers/wikiparser/rules/fnprocdef.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/fnprocdef.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for function, procedure and widget definitions\n\n```\n\\function name(param:defaultvalue,param2:defaultvalue)\ndefinition text\n\\end\n\n\\procedure name(param:defaultvalue,param2:defaultvalue)\ndefinition text\n\\end\n\n\\widget $mywidget(param:defaultvalue,param2:defaultvalue)\ndefinition text\n\\end\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"fnprocdef\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\\\(function|procedure|widget)\\s+([^(\\s]+)\\((\\s*([^)]*))?\\)(\\s*\\r?\\n)?/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the macro name and parameters\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the parameters\n\tvar params = [];\n\tif(this.match[3]) {\n\t\tparams = $tw.utils.parseParameterDefinition(this.match[4]);\n\t}\n\t// Is the remainder of the line blank after the parameter close paren?\n\tvar reEnd;\n\tif(this.match[5]) {\n\t\t// If so, it is a multiline definition and the end of the body is marked with \\end\n\t\treEnd = new RegExp(\"((:?^|\\\\r?\\\\n)[^\\\\S\\\\n\\\\r]*\\\\\\\\end[^\\\\S\\\\n\\\\r]*(?:\" + $tw.utils.escapeRegExp(this.match[2]) + \")?(?:$|\\\\r?\\\\n))\",\"mg\");\n\t} else {\n\t\t// Otherwise, the end of the definition is marked by the end of the line\n\t\treEnd = /($|\\r?\\n)/mg;\n\t\t// Move past any whitespace\n\t\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\n\t}\n\t// Find the end of the definition\n\treEnd.lastIndex = this.parser.pos;\n\tvar text,\n\t\tendMatch = reEnd.exec(this.parser.source);\n\tif(endMatch) {\n\t\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\n\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t} else {\n\t\t// We didn't find the end of the definition, so we'll make it blank\n\t\ttext = \"\";\n\t}\n\t// Save the macro definition\n\tvar parseTreeNodes = [{\n\t\ttype: \"set\",\n\t\tattributes: {},\n\t\tchildren: [],\n\t\tparams: params\n\t}];\n\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\"name\",this.match[2]);\n\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\"value\",text);\n\tif(this.match[1] === \"function\") {\n\t\tparseTreeNodes[0].isFunctionDefinition = true;\n\t} else if(this.match[1] === \"procedure\") {\n\t\tparseTreeNodes[0].isProcedureDefinition = true;\n\t} else if(this.match[1] === \"widget\") {\n\t\tparseTreeNodes[0].isWidgetDefinition = true;\n\t}\n\tif(this.parser.configTrimWhiteSpace) {\n\t\tparseTreeNodes[0].configTrimWhiteSpace = true;\n\t}\n\treturn parseTreeNodes;\n};\n\n})();\n\t","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js":{"title":"$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for marking areas with hard line breaks. For example:\n\n```\n\"\"\"\nThis is some text\nThat is set like\nIt is a Poem\nWhen it is\nClearly\nNot\n\"\"\"\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"hardlinebreaks\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\"\"\"(?:\\r?\\n)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\"\"\")|(\\r?\\n)/mg,\n\t\ttree = [],\n\t\tmatch;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tdo {\n\t\t// Parse the run up to the terminator\n\t\ttree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));\n\t\t// Redo the terminator match\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tmatch = reEnd.exec(this.parser.source);\n\t\tif(match) {\n\t\t\tvar start = this.parser.pos;\n\t\t\tthis.parser.pos = reEnd.lastIndex;\n\t\t\t// Add a line break if the terminator was a line break\n\t\t\tif(match[2]) {\n\t\t\t\ttree.push({type: \"element\", tag: \"br\", start: start, end: this.parser.pos});\n\t\t\t}\n\t\t}\n\t} while(match && !match[1]);\n\t// Return the nodes\n\treturn tree;\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/heading.js":{"title":"$:/core/modules/parsers/wikiparser/rules/heading.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/heading.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for headings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"heading\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(!{1,6})/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar headingLevel = this.match[1].length;\n\t// Move past the !s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the heading itself\n\tvar classStart = this.parser.pos;\n\tvar classes = this.parser.parseClasses();\n\tvar classEnd = this.parser.pos;\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// Return the heading\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"h\" + headingLevel,\n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: classes.join(\" \"), start: classStart, end: classEnd}\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/horizrule.js":{"title":"$:/core/modules/parsers/wikiparser/rules/horizrule.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/horizrule.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for rules. For example:\n\n```\n---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"horizrule\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{3,}\\r?(?:\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{type: \"element\", tag: \"hr\"}];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/html.js":{"title":"$:/core/modules/parsers/wikiparser/rules/html.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/html.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for HTML elements and widgets. For example:\n\n{{{\n<aside>\nThis is an HTML5 aside element\n</aside>\n\n<$slider target=\"MyTiddler\">\nThis is a widget invocation\n</$slider>\n\n}}}\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"html\";\nexports.types = {inline: true, block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextTag = this.findNextTag(this.parser.source,startPos,{\n\t\trequireLineBreak: this.is.block\n\t});\n\treturn this.nextTag ? this.nextTag.start : undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Retrieve the most recent match so that recursive calls don't overwrite it\n\tvar tag = this.nextTag;\n\tif (!tag.isSelfClosing) {\n\t\ttag.openTagStart = tag.start;\n\t\ttag.openTagEnd = tag.end;\n\t}\n\tthis.nextTag = null;\n\t// Advance the parser position to past the tag\n\tthis.parser.pos = tag.end;\n\t// Check for an immediately following double linebreak\n\tvar hasLineBreak = !tag.isSelfClosing && !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t// Set whether we're in block mode\n\ttag.isBlock = this.is.block || hasLineBreak;\n\t// Parse the body if we need to\n\tif(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) {\n\t\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\";\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\tvar reEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\n\t\t}\n\t\ttag.end = this.parser.pos;\n\t\ttag.closeTagEnd = tag.end;\n\t\tif (tag.closeTagEnd === tag.openTagEnd || this.parser.source[tag.closeTagEnd - 1] !== '>') {\n\t\t\ttag.closeTagStart = tag.end;\n\t\t} else {\n\t\t\ttag.closeTagStart = tag.closeTagEnd - 2;\n\t\t\tvar closeTagMinPos = tag.children.length > 0 ? tag.children[tag.children.length-1].end : tag.openTagEnd;\n\t\t\tif (!Number.isSafeInteger(closeTagMinPos)) closeTagMinPos = tag.openTagEnd;\n\t\t\twhile (tag.closeTagStart >= closeTagMinPos) {\n\t\t\t\tvar char = this.parser.source[tag.closeTagStart];\n\t\t\t\tif (char === '>') {\n\t\t\t\t\ttag.closeTagStart = -1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (char === '<') break;\n\t\t\t\ttag.closeTagStart -= 1;\n\t\t\t}\n\t\t\tif (tag.closeTagStart < closeTagMinPos) {\n\t\t\t\ttag.closeTagStart = tag.end;\n\t\t\t}\n\t\t}\n\t}\n\t// Return the tag\n\treturn [tag];\n};\n\n/*\nLook for an HTML tag. Returns null if not found, otherwise returns {type: \"element\", name:, attributes: {}, orderedAttributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseTag = function(source,pos,options) {\n\toptions = options || {};\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\tstart: pos,\n\t\t\tattributes: {},\n\t\t\torderedAttributes: []\n\t\t};\n\t// Define our regexps\n\tvar reTagName = /([a-zA-Z0-9\\-\\$\\.]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a less than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\"<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the tag name\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,reTagName);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tnode.tag = token.match[1];\n\tif(node.tag.charAt(0) === \"$\") {\n\t\tnode.type = node.tag.substr(1);\n\t}\n\tpos = token.end;\n\t// Check that the tag is terminated by a space, / or >\n\tif(!$tw.utils.parseWhiteSpace(source,pos) && !(source.charAt(pos) === \"/\") && !(source.charAt(pos) === \">\") ) {\n\t\treturn null;\n\t}\n\t// Process attributes\n\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\twhile(attribute) {\n\t\tnode.orderedAttributes.push(attribute);\n\t\tnode.attributes[attribute.name] = attribute;\n\t\tpos = attribute.end;\n\t\t// Get the next attribute\n\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a closing slash\n\ttoken = $tw.utils.parseTokenString(source,pos,\"/\");\n\tif(token) {\n\t\tpos = token.end;\n\t\tnode.isSelfClosing = true;\n\t}\n\t// Look for a greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Check for a required line break\n\tif(options.requireLineBreak) {\n\t\ttoken = $tw.utils.parseTokenRegExp(source,pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t\tif(!token) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\nexports.findNextTag = function(source,pos,options) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /<([a-zA-Z\\-\\$\\.]+)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseTag(source,match.index,options);\n\t\t// Return success\n\t\tif(tag && this.isLegalTag(tag)) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\nexports.isLegalTag = function(tag) {\n\t// Widgets are always OK\n\tif(tag.type !== \"element\") {\n\t\treturn true;\n\t// If it's an HTML tag that starts with a dash then it's not legal\n\t} else if(tag.tag.charAt(0) === \"-\") {\n\t\treturn false;\n\t} else {\n\t\t// Otherwise it's OK\n\t\treturn true;\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/image.js":{"title":"$:/core/modules/parsers/wikiparser/rules/image.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/image.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for embedding images. For example:\n\n```\n[img[https://tiddlywiki.com/fractalveg.jpg]]\n[img width=23 height=24 [https://tiddlywiki.com/fractalveg.jpg]]\n[img width={{!!width}} height={{!!height}} [https://tiddlywiki.com/fractalveg.jpg]]\n[img[Description of image|https://tiddlywiki.com/fractalveg.jpg]]\n[img[TiddlerTitle]]\n[img[Description of image|TiddlerTitle]]\n```\n\nGenerates the `<$image>` widget.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"image\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextImage = this.findNextImage(this.parser.source,startPos);\n\treturn this.nextImage ? this.nextImage.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextImage.end;\n\tvar node = {\n\t\ttype: \"image\",\n\t\tattributes: this.nextImage.attributes\n\t};\n\treturn [node];\n};\n\n/*\nFind the next image from the current position\n*/\nexports.findNextImage = function(source,pos) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /(\\[img)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseImage(source,match.index);\n\t\t// Return success\n\t\tif(tag) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an image at the specified position. Returns null if not found, otherwise returns {type: \"image\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseImage = function(source,pos) {\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"image\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[img`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[img\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Process attributes\n\tif(source.charAt(pos) !== \"[\") {\n\t\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\t\twhile(attribute) {\n\t\t\tnode.attributes[attribute.name] = attribute;\n\t\t\tpos = attribute.end;\n\t\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t\tif(source.charAt(pos) !== \"[\") {\n\t\t\t\t// Get the next attribute\n\t\t\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t\t\t} else {\n\t\t\t\tattribute = null;\n\t\t\t}\n\t\t}\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[` after the attributes\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the source up to the terminating `]]`\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,/(?:([^|\\]]*?)\\|)?([^\\]]+?)\\]\\]/g);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\tif(token.match[1]) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: token.match[1].trim(),start: token.start,end:token.start + token.match[1].length - 1};\n\t}\n\tnode.attributes.source = {type: \"string\", value: (token.match[2] || \"\").trim(), start: token.start + (token.match[1] ? token.match[1].length : 0), end: token.end - 2};\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/import.js":{"title":"$:/core/modules/parsers/wikiparser/rules/import.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/import.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for importing variable definitions\n\n```\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"import\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\\\import[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the filter terminated by a line break\n\tvar reMatch = /(.*)(?:$|\\r?\\n)/mg;\n\treMatch.lastIndex = this.parser.pos;\n\tvar filterStart = this.parser.source;\n\tvar match = reMatch.exec(this.parser.source);\n\tthis.parser.pos = reMatch.lastIndex;\n\t// Parse tree nodes to return\n\treturn [{\n\t\ttype: \"importvariables\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: match[1], start: filterStart, end: this.parser.pos}\n\t\t},\n\t\tchildren: []\n\t}];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/list.js":{"title":"$:/core/modules/parsers/wikiparser/rules/list.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/list.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for lists. For example:\n\n```\n* This is an unordered list\n* It has two items\n\n# This is a numbered list\n## With a subitem\n# And a third item\n\n; This is a term that is being defined\n: This is the definition of that term\n```\n\nNote that lists can be nested arbitrarily:\n\n```\n#** One\n#* Two\n#** Three\n#**** Four\n#**# Five\n#**## Six\n## Seven\n### Eight\n## Nine\n```\n\nA CSS class can be applied to a list item as follows:\n\n```\n* List item one\n*.active List item two has the class `active`\n* List item three\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"list\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /([\\*#;:>]+)/mg;\n};\n\nvar listTypes = {\n\t\"*\": {listTag: \"ul\", itemTag: \"li\"},\n\t\"#\": {listTag: \"ol\", itemTag: \"li\"},\n\t\";\": {listTag: \"dl\", itemTag: \"dt\"},\n\t\":\": {listTag: \"dl\", itemTag: \"dd\"},\n\t\">\": {listTag: \"blockquote\", itemTag: \"div\"}\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Array of parse tree nodes for the previous row of the list\n\tvar listStack = [];\n\t// Cycle through the items in the list\n\twhile(true) {\n\t\t// Match the list marker\n\t\tvar reMatch = /([\\*#;:>]+)/mg;\n\t\treMatch.lastIndex = this.parser.pos;\n\t\tvar start = this.parser.pos;\n\t\tvar match = reMatch.exec(this.parser.source);\n\t\tif(!match || match.index !== this.parser.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check whether the list type of the top level matches\n\t\tvar listInfo = listTypes[match[0].charAt(0)];\n\t\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\n\t\t\tbreak;\n\t\t}\n\t\t// Move past the list marker\n\t\tthis.parser.pos = match.index + match[0].length;\n\t\t// Walk through the list markers for the current row\n\t\tfor(var t=0; t<match[0].length; t++) {\n\t\t\tlistInfo = listTypes[match[0].charAt(t)];\n\t\t\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\n\t\t\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\n\t\t\t\tlistStack.splice(t,listStack.length - t);\n\t\t\t}\n\t\t\t// Construct the list element or reuse the previous one at this level\n\t\t\tif(listStack.length <= t) {\n\t\t\t\tvar listElement = {\n\t\t\t\t\ttype: \"element\",\n\t\t\t\t\ttag: listInfo.listTag,\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"element\",\n\t\t\t\t\t\t\ttag: listInfo.itemTag,\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tstart: start,\n\t\t\t\t\t\t\tend: this.parser.pos,\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\tstart: start,\n\t\t\t\t\tend: this.parser.pos,\n\t\t\t\t};\n\t\t\t\t// Link this list element into the last child item of the parent list item\n\t\t\t\tif(t) {\n\t\t\t\t\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\n\t\t\t\t\tprevListItem.children.push(listElement);\n\t\t\t\t}\n\t\t\t\t// Save this element in the stack\n\t\t\t\tlistStack[t] = listElement;\n\t\t\t} else if(t === (match[0].length - 1)) {\n\t\t\t\tlistStack[t].children.push({\n\t\t\t\t\ttype: \"element\",\n\t\t\t\t\ttag: listInfo.itemTag,\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tstart: start,\n\t\t\t\t\tend: this.parser.pos,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif(listStack.length > match[0].length) {\n\t\t\tlistStack.splice(match[0].length,listStack.length - match[0].length);\n\t\t}\n\t\t// Process the body of the list item into the last list item\n\t\tvar classStart = this.parser.pos;\n\t\tvar lastListChildren = listStack[listStack.length-1].children,\n\t\t\tlastListItem = lastListChildren[lastListChildren.length-1],\n\t\t\tclasses = this.parser.parseClasses();\n\t\tvar classEnd = this.parser.pos;\n\t\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\t\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t\tlastListItem.children.push.apply(lastListItem.children,tree);\n\t\tlastListItem.end = this.parser.pos;\n\t\tlistStack[listStack.length-1].end = this.parser.pos;\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t\tlastListItem.attributes.class.start = classStart;\n\t\t\tlastListItem.attributes.class.end = classEnd;\n\t\t}\n\t\t// Consume any whitespace following the list item\n\t\tthis.parser.skipWhitespace();\n\t}\n\t// Return the root element of the list\n\treturn [listStack[0]];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/macrocallblock.js":{"title":"$:/core/modules/parsers/wikiparser/rules/macrocallblock.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for block macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\tvar nextStart = startPos;\n\t// Try parsing at all possible macrocall openers until we match\n\twhile((nextStart = this.parser.source.indexOf(\"<<\",nextStart)) >= 0) {\n\t\tvar nextCall = $tw.utils.parseMacroInvocationAsTransclusion(this.parser.source,nextStart);\n\t\tif(nextCall) {\n\t\t\tvar c = this.parser.source.charAt(nextCall.end);\n\t\t\t// Ensure EOL after parsed macro\n\t\t\t// If we didn't need to support IE, we'd just use /(?:\\r?\\n|$)/ym\n\t\t\tif ((c === \"\") || (c === \"\\n\") || ((c === \"\\r\") && this.parser.source.charAt(nextCall.end+1) === \"\\n\")) {\n\t\t\t\tthis.nextCall = nextCall;\n\t\t\t\treturn nextStart;\n\t\t\t}\n\t\t}\n\t\tnextStart += 2;\n\t}\n\treturn undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar call = this.nextCall;\n\tcall.isBlock = true;\n\tthis.nextCall = null;\n\tthis.parser.pos = call.end;\n\treturn [call];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/macrocallinline.js":{"title":"$:/core/modules/parsers/wikiparser/rules/macrocallinline.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\tvar nextStart = startPos;\n\t// Try parsing at all possible macrocall openers until we match\n\twhile((nextStart = this.parser.source.indexOf(\"<<\",nextStart)) >= 0) {\n\t\tthis.nextCall = $tw.utils.parseMacroInvocationAsTransclusion(this.parser.source,nextStart);\n\t\tif(this.nextCall) {\n\t\t\treturn nextStart;\n\t\t}\n\t\tnextStart += 2;\n\t}\n\treturn undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar call = this.nextCall;\n\tthis.nextCall = null;\n\tthis.parser.pos = call.end;\n\treturn [call];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/macrodef.js":{"title":"$:/core/modules/parsers/wikiparser/rules/macrodef.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrodef.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for macro definitions\n\n```\n\\define name(param:defaultvalue,param2:defaultvalue)\ndefinition text, including $param$ markers\n\\end\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrodef\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\\\define\\s+([^(\\s]+)\\(\\s*([^)]*)\\)(\\s*\\r?\\n)?/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the macro name and parameters\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the parameters\n\tvar paramString = this.match[2],\n\t\tparams = [];\n\tif(paramString !== \"\") {\n\t\tvar reParam = /\\s*([A-Za-z0-9\\-_]+)(?:\\s*:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))?/mg,\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\twhile(paramMatch) {\n\t\t\t// Save the parameter details\n\t\t\tvar paramInfo = {name: paramMatch[1]},\n\t\t\t\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6];\n\t\t\tif(defaultValue) {\n\t\t\t\tparamInfo[\"default\"] = defaultValue;\n\t\t\t}\n\t\t\tparams.push(paramInfo);\n\t\t\t// Look for the next parameter\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\t}\n\t}\n\t// Is the remainder of the \\define line blank after the parameter close paren?\n\tvar reEnd;\n\tif(this.match[3]) {\n\t\t// If so, it is a multiline definition and the end of the body is marked with \\end\n\t\treEnd = new RegExp(\"((?:^|\\\\r?\\\\n)[^\\\\S\\\\n\\\\r]*\\\\\\\\end[^\\\\S\\\\n\\\\r]*(?:\" + $tw.utils.escapeRegExp(this.match[1]) + \")?(?:$|\\\\r?\\\\n))\",\"mg\");\n\t} else {\n\t\t// Otherwise, the end of the definition is marked by the end of the line\n\t\treEnd = /($|\\r?\\n)/mg;\n\t\t// Move past any whitespace\n\t\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\n\t}\n\t// Find the end of the definition\n\treEnd.lastIndex = this.parser.pos;\n\tvar text,\n\t\tendMatch = reEnd.exec(this.parser.source);\n\tif(endMatch) {\n\t\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\n\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t} else {\n\t\t// We didn't find the end of the definition, so we'll make it blank\n\t\ttext = \"\";\n\t}\n\t// Save the macro definition\n\tvar parseTreeNodes = [{\n\t\ttype: \"set\",\n\t\tattributes: {},\n\t\tchildren: [],\n\t\tparams: params,\n\t\tisMacroDefinition: true\n\t}];\n\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\"name\",this.match[1]);\n\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\"value\",text);\n\treturn parseTreeNodes;\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/parameters.js":{"title":"$:/core/modules/parsers/wikiparser/rules/parameters.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/parameters.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for parameter definitions\n\n```\n\\parameters(param:defaultvalue,param2:defaultvalue)\ndefinition text\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"parameters\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\\\parameters\\s*\\(([^)]*)\\)(\\s*\\r?\\n)?/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the macro name and parameters\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the parameters\n\tvar params = $tw.utils.parseParameterDefinition(this.match[1]);\n\tvar attributes = Object.create(null),\n\t\torderedAttributes = [];\n\t$tw.utils.each(params,function(param) {\n\t\tvar name = param.name;\n\t\t// Parameter names starting with dollar must be escaped to double dollars for the parameters widget\n\t\tif(name.charAt(0) === \"$\") {\n\t\t\tname = \"$\" + name;\n\t\t}\n\t\tvar attribute = {name: name, type: \"string\", value: param[\"default\"] || \"\"};\n\t\tattributes[name] = attribute;\n\t\torderedAttributes.push(attribute);\n\t});\n\t// Save the macro definition\n\treturn [{\n\t\ttype: \"parameters\",\n\t\tattributes: attributes,\n\t\torderedAttributes: orderedAttributes\n\t}];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/parsermode.js":{"title":"$:/core/modules/parsers/wikiparser/rules/parsermode.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/parsermode.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for parser mode specifications\n\n```\n\\parsermode block\n\\parsermode inline\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"parsermode\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\\\parsermode[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\tparserMode = undefined;\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\tparserMode = match[1];\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\tif(parserMode !== undefined) {\n\t\tif(parserMode === \"block\") {\n\t\t\tthis.parser.parseAsInline = false;\n\t\t} else if(parserMode === \"inline\") {\n\t\t\tthis.parser.parseAsInline = true;\n\t\t}\n\t}\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/prettyextlink.js":{"title":"$:/core/modules/parsers/wikiparser/rules/prettyextlink.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettyextlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\n[ext[https://tiddlywiki.com/fractalveg.jpg]]\n[ext[Tooltip|https://tiddlywiki.com/fractalveg.jpg]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettyextlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextLink = this.findNextLink(this.parser.source,startPos);\n\treturn this.nextLink ? this.nextLink.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextLink.end;\n\treturn [this.nextLink];\n};\n\n/*\nFind the next link from the current position\n*/\nexports.findNextLink = function(source,pos) {\n\t// A regexp for finding candidate links\n\tvar reLookahead = /(\\[ext\\[)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a link\n\t\tvar link = this.parseLink(source,match.index);\n\t\t// Return success\n\t\tif(link) {\n\t\t\treturn link;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an link at the specified position. Returns null if not found, otherwise returns {type: \"element\", tag: \"a\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseLink = function(source,pos) {\n\tvar token,\n\t\ttextNode = {\n\t\t\ttype: \"text\"\n\t\t},\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tstart: pos,\n\t\t\tattributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t},\n\t\t\tchildren: [textNode]\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[ext[`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[ext[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Look ahead for the terminating `]]`\n\tvar closePos = source.indexOf(\"]]\",pos);\n\tif(closePos === -1) {\n\t\treturn null;\n\t}\n\t// Look for a `|` separating the tooltip\n\tvar splitPos = source.indexOf(\"|\",pos);\n\tif(splitPos === -1 || splitPos > closePos) {\n\t\tsplitPos = null;\n\t}\n\t// Pull out the tooltip and URL\n\tvar tooltip, URL, urlStart;\n\ttextNode.start = pos;\n\tif(splitPos) {\n\t\turlStart = splitPos + 1;\n\t\tURL = source.substring(splitPos + 1,closePos).trim();\n\t\ttextNode.text = source.substring(pos,splitPos).trim();\n\t\ttextNode.end = splitPos;\n\t} else {\n\t\turlStart = pos;\n\t\tURL = source.substring(pos,closePos).trim();\n\t\ttextNode.text = URL;\n\t\ttextNode.end = closePos;\n\t}\n\tnode.attributes.href = {type: \"string\", value: URL, start: urlStart, end: closePos};\n\tnode.attributes.target = {type: \"string\", value: \"_blank\"};\n\tnode.attributes.rel = {type: \"string\", value: \"noopener noreferrer\"};\n\t// Update the end position\n\tnode.end = closePos + 2;\n\treturn node;\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/prettylink.js":{"title":"$:/core/modules/parsers/wikiparser/rules/prettylink.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettylink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for pretty links. For example:\n\n```\n[[Introduction]]\n\n[[Link description|TiddlerTitle]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettylink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\[\\[(.*?)(?:\\|(.*?))?\\]\\]/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tvar start = this.parser.pos + 2;\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Process the link\n\tvar text = this.match[1],\n\t\tlink = this.match[2] || text,\n\t\ttextEndPos = this.parser.source.indexOf(\"|\", start);\n\tif (textEndPos < 0 || textEndPos > this.matchRegExp.lastIndex) {\n\t\ttextEndPos = this.matchRegExp.lastIndex - 2;\n\t}\n\tvar linkStart = this.match[2] ? (start + this.match[1].length + 1) : start;\n\tvar linkEnd = linkStart + link.length;\n\tif($tw.utils.isLinkExternal(link)) {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: link, start: linkStart, end: linkEnd},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text, start: start, end: textEndPos\n\t\t\t}]\n\t\t}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: link, start: linkStart, end: linkEnd}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text, start: start, end: textEndPos\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/quoteblock.js":{"title":"$:/core/modules/parsers/wikiparser/rules/quoteblock.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/quoteblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for quote blocks.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"quoteblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(<<<+)/mg;\n};\n\nexports.parse = function() {\n\tvar classes = [\"tc-quote\"];\n\t// Get all the details of the match\n\tvar reEndString = \"^\\\\s*\" + this.match[1] + \"(?!<)\";\n\t// Move past the <s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the optional cite itself\n\tvar classStart = this.parser.pos;\n\tclasses.push.apply(classes, this.parser.parseClasses());\n\tvar classEnd = this.parser.pos;\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar citeStart = this.parser.pos;\n\tvar cite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\tvar citeEnd = this.parser.pos;\n\t// before handling the cite, parse the body of the quote\n\tvar tree = this.parser.parseBlocks(reEndString);\n\t// If we got a cite, put it before the text\n\tif(cite.length > 0) {\n\t\ttree.unshift({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite,\n\t\t\tstart: citeStart,\n\t\t\tend: citeEnd\n\t\t});\n\t}\n\t// Parse any optional cite\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tciteStart = this.parser.pos;\n\tcite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\tciteEnd = this.parser.pos;\n\t// If we got a cite, push it\n\tif(cite.length > 0) {\n\t\ttree.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite,\n\t\t\tstart: citeStart,\n\t\t\tend: citeEnd\n\t\t});\n\t}\n\t// Return the blockquote element\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"blockquote\",\n\t\tattributes: {\n\t\t\tclass: { type: \"string\", value: classes.join(\" \"), start: classStart, end: classEnd },\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/rules.js":{"title":"$:/core/modules/parsers/wikiparser/rules/rules.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/rules.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for rules specifications\n\n```\n\\rules except ruleone ruletwo rulethree\n\\rules only ruleone ruletwo rulethree\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"rules\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\\\rules[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\tif(tokens.length > 0) {\n\t\tthis.parser.amendRules(tokens[0],tokens.slice(1));\n\t}\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/styleblock.js":{"title":"$:/core/modules/parsers/wikiparser/rules/styleblock.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for assigning styles and classes to paragraphs and other blocks. For example:\n\n```\n@@.myClass\n@@background-color:red;\nThis paragraph will have the CSS class `myClass`.\n\n* The `<ul>` around this list will also have the class `myClass`\n* List item 2\n\n@@\n```\n\nNote that classes and styles can be mixed subject to the rule that styles must precede classes. For example\n\n```\n@@.myFirstClass.mySecondClass\n@@width:100px;.myThirdClass\nThis is a paragraph\n@@\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(?:\\.([^\\r\\n\\s]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEndString = \"^@@(?:\\\\r?\\\\n)?\";\n\tvar classes = [], styles = [];\n\tdo {\n\t\t// Get the class and style\n\t\tif(this.match[1]) {\n\t\t\tstyles.push(this.match[1]);\n\t\t}\n\t\tif(this.match[2]) {\n\t\t\tclasses.push(this.match[2].split(\".\").join(\" \"));\n\t\t}\n\t\t// Move past the match\n\t\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\t// Look for another line of classes and styles\n\t\tthis.match = this.matchRegExp.exec(this.parser.source);\n\t} while(this.match && this.match.index === this.parser.pos);\n\t// Parse the body\n\tvar tree = this.parser.parseBlocks(reEndString);\n\tfor(var t=0; t<tree.length; t++) {\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(tree[t],classes.join(\" \"));\n\t\t}\n\t\tif(styles.length > 0) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(tree[t],\"style\",styles.join(\"\"));\n\t\t}\n\t}\n\treturn tree;\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/styleinline.js":{"title":"$:/core/modules/parsers/wikiparser/rules/styleinline.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for assigning styles and classes to inline runs. For example:\n\n```\n@@.myClass This is some text with a class@@\n@@background-color:red;This is some text with a background colour@@\n@@width:100px;.myClass This is some text with a class and a width@@\n```\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(\\.(?:[^\\r\\n\\s]+)\\s+)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /@@/g;\n\t// Get the styles and class\n\tvar stylesString = this.match[1],\n\t\tclassString = this.match[2] ? this.match[2].split(\".\").join(\" \") : undefined;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the run up to the terminator\n\tvar tree = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\n\t// Return the classed span\n\tvar node = {\n\t\ttype: \"element\",\n\t\ttag: \"span\",\n\t\tchildren: tree\n\t};\n\tif(classString) {\n\t\t$tw.utils.addClassToParseTreeNode(node,classString);\n\t}\n\tif(stylesString) {\n\t\t$tw.utils.addAttributeToParseTreeNode(node,\"style\",stylesString);\n\t}\n\tif(!classString && !stylesString) {\n\t\t$tw.utils.addClassToParseTreeNode(node,\"tc-inline-style\");\n\t}\n\treturn [node];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/syslink.js":{"title":"$:/core/modules/parsers/wikiparser/rules/syslink.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/syslink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for system tiddler links.\nCan be suppressed preceding them with `~`.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"syslink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp(\n\t\t\"~?\\\\$:\\\\/[\" +\n\t\t$tw.config.textPrimitives.anyLetter.substr(1,$tw.config.textPrimitives.anyLetter.length - 2) +\n\t\t\"\\/._-]+\",\n\t\t\"mg\"\n\t);\n};\n\nexports.parse = function() {\n\tvar match = this.match[0];\n\t// Move past the match\n\tvar start = this.parser.pos;\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(match.substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: match.substr(1), start: start+1, end: this.parser.pos}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: match}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: match,\n\t\t\t\tstart: start,\n\t\t\t\tend: this.parser.pos\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/table.js":{"title":"$:/core/modules/parsers/wikiparser/rules/table.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/table.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for tables.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"table\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\|(?:[^\\n]*)\\|(?:[fhck]?)\\r?(?:\\n|$)/mg;\n};\n\nvar processRow = function(prevColumns) {\n\tvar cellRegExp = /(?:\\|([^\\n\\|]*)\\|)|(\\|[fhck]?\\r?(?:\\n|$))/mg,\n\t\tcellTermRegExp = /((?:\\x20*)\\|)/mg,\n\t\ttree = [],\n\t\tcol = 0,\n\t\tcolSpanCount = 1,\n\t\tprevCell,\n\t\tvAlign;\n\t// Match a single cell\n\tcellRegExp.lastIndex = this.parser.pos;\n\tvar cellMatch = cellRegExp.exec(this.parser.source);\n\twhile(cellMatch && cellMatch.index === this.parser.pos) {\n\t\tif(cellMatch[1] === \"~\") {\n\t\t\t// Rowspan\n\t\t\tvar last = prevColumns[col];\n\t\t\tif(last) {\n\t\t\t\tlast.rowSpanCount++;\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"rowspan\",last.rowSpanCount);\n\t\t\t\tvAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,\"valign\",\"center\");\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"valign\",vAlign);\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \">\") {\n\t\t\t// Colspan\n\t\t\tcolSpanCount++;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \"<\" && prevCell) {\n\t\t\tcolSpanCount = 1 + $tw.utils.getAttributeValueFromParseTreeNode(prevCell,\"colspan\",1);\n\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\tcolSpanCount = 1;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[2]) {\n\t\t\t// End of row\n\t\t\tif(prevCell && colSpanCount > 1) {\n\t\t\t\tif(prevCell.attributes && prevCell.attributes && prevCell.attributes.colspan) {\n\t\t\t\t\t\tcolSpanCount += prevCell.attributes.colspan.value;\n\t\t\t\t} else {\n\t\t\t\t\tcolSpanCount -= 1;\n\t\t\t\t}\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\t}\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t\tbreak;\n\t\t} else {\n\t\t\t// For ordinary cells, step beyond the opening `|`\n\t\t\tthis.parser.pos++;\n\t\t\t// Look for a space at the start of the cell\n\t\t\tvar spaceLeft = false;\n\t\t\tvAlign = null;\n\t\t\tif(this.parser.source.substr(this.parser.pos).search(/^\\^([^\\^]|\\^\\^)/) === 0) {\n\t\t\t\tvAlign = \"top\";\n\t\t\t} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {\n\t\t\t\tvAlign = \"bottom\";\n\t\t\t}\n\t\t\tif(vAlign) {\n\t\t\t\tthis.parser.pos++;\n\t\t\t}\n\t\t\tvar chr = this.parser.source.substr(this.parser.pos,1);\n\t\t\twhile(chr === \" \") {\n\t\t\t\tspaceLeft = true;\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tchr = this.parser.source.substr(this.parser.pos,1);\n\t\t\t}\n\t\t\t// Check whether this is a heading cell\n\t\t\tvar cell;\n\t\t\tvar start = this.parser.pos;\n\t\t\tif(chr === \"!\") {\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tcell = {type: \"element\", tag: \"th\", start: start, children: []};\n\t\t\t} else {\n\t\t\t\tcell = {type: \"element\", tag: \"td\", start: start, children: []};\n\t\t\t}\n\t\t\ttree.push(cell);\n\t\t\t// Record information about this cell\n\t\t\tprevCell = cell;\n\t\t\tprevColumns[col] = {rowSpanCount:1,element:cell};\n\t\t\t// Check for a colspan\n\t\t\tif(colSpanCount > 1) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"colspan\",colSpanCount);\n\t\t\t\tcolSpanCount = 1;\n\t\t\t}\n\t\t\t// Parse the cell\n\t\t\tcell.children = this.parser.parseInlineRun(cellTermRegExp,{eatTerminator: true});\n\t\t\t// Set the alignment for the cell\n\t\t\tif(vAlign) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"valign\",vAlign);\n\t\t\t}\n\t\t\tif(this.parser.source.substr(this.parser.pos - 2,1) === \" \") { // spaceRight\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",spaceLeft ? \"center\" : \"left\");\n\t\t\t} else if(spaceLeft) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",\"right\");\n\t\t\t}\n\t\t\t// Move back to the closing `|`\n\t\t\tthis.parser.pos--;\n\t\t\tcell.end = this.parser.pos;\n\t\t}\n\t\tcol++;\n\t\tcellRegExp.lastIndex = this.parser.pos;\n\t\tcellMatch = cellRegExp.exec(this.parser.source);\n\t}\n\treturn tree;\n};\n\nexports.parse = function() {\n\tvar rowContainerTypes = {\"c\":\"caption\", \"h\":\"thead\", \"\":\"tbody\", \"f\":\"tfoot\"},\n\t\ttable = {type: \"element\", tag: \"table\", children: []},\n\t\trowRegExp = /^\\|([^\\n]*)\\|([fhck]?)\\r?(?:\\n|$)/mg,\n\t\trowTermRegExp = /(\\|(?:[fhck]?)\\r?(?:\\n|$))/mg,\n\t\tprevColumns = [],\n\t\tcurrRowType,\n\t\trowContainer,\n\t\trowCount = 0;\n\t// Match the row\n\trowRegExp.lastIndex = this.parser.pos;\n\tvar rowMatch = rowRegExp.exec(this.parser.source);\n\twhile(rowMatch && rowMatch.index === this.parser.pos) {\n\t\tvar rowType = rowMatch[2];\n\t\t// Check if it is a class assignment\n\t\tif(rowType === \"k\") {\n\t\t\t$tw.utils.addClassToParseTreeNode(table,rowMatch[1]);\n\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t} else {\n\t\t\t// Otherwise, create a new row if this one is of a different type\n\t\t\tif(rowType !== currRowType) {\n\t\t\t\trowContainer = {type: \"element\", tag: rowContainerTypes[rowType], children: [], start: this.parser.pos, end: this.parser.pos};\n\t\t\t\ttable.children.push(rowContainer);\n\t\t\t\tcurrRowType = rowType;\n\t\t\t}\n\t\t\t// Is this a caption row?\n\t\t\tif(currRowType === \"c\") {\n\t\t\t\t// If so, move past the opening `|` of the row\n\t\t\t\tthis.parser.pos++;\n\t\t\t\t// Move the caption to the first row if it isn't already\n\t\t\t\tif(table.children.length !== 1) {\n\t\t\t\t\ttable.children.pop(); // Take rowContainer out of the children array\n\t\t\t\t\ttable.children.splice(0,0,rowContainer); // Insert it at the bottom\n\t\t\t\t}\n\t\t\t\t// Set the alignment - TODO: figure out why TW did this\n//\t\t\t\trowContainer.attributes.align = rowCount === 0 ? \"top\" : \"bottom\";\n\t\t\t\t// Parse the caption\n\t\t\t\trowContainer.children = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\n\t\t\t} else {\n\t\t\t\t// Create the row\n\t\t\t\tvar theRow = {type: \"element\", tag: \"tr\", children: [], start: rowMatch.index};\n\t\t\t\t$tw.utils.addClassToParseTreeNode(theRow,rowCount%2 ? \"oddRow\" : \"evenRow\");\n\t\t\t\trowContainer.children.push(theRow);\n\t\t\t\t// Process the row\n\t\t\t\ttheRow.children = processRow.call(this,prevColumns);\n\t\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t\t\ttheRow.end = this.parser.pos;\n\t\t\t\t// Increment the row count\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t\trowContainer.end = this.parser.pos;\n\t\t}\n\t\trowMatch = rowRegExp.exec(this.parser.source);\n\t}\n\treturn [table];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/transcludeblock.js":{"title":"$:/core/modules/parsers/wikiparser/rules/transcludeblock.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?(?:\\|([^\\{\\}]+))?\\}\\}(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]),\n\t\tparams = this.match[3] ? this.match[3].split(\"|\") : [];\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {},\n\t\t\tisBlock: true\n\t\t};\n\t$tw.utils.each(params,function(paramValue,index) {\n\t\tvar name = \"\" + index;\n\t\ttranscludeNode.attributes[name] = {\n\t\t\tname: name,\n\t\t\ttype: \"string\",\n\t\t\tvalue: paramValue\n\t\t}\n\t});\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {name: \"tiddler\", type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tisBlock: true,\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes[\"$tiddler\"] = {name: \"$tiddler\", type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes[\"$tiddler\"] = {name: \"$tiddler\", type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes[\"$field\"] = {name: \"$field\", type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes[\"$index\"] = {name: \"$index\", type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/transcludeinline.js":{"title":"$:/core/modules/parsers/wikiparser/rules/transcludeinline.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?(?:\\|([^\\{\\}]+))?\\}\\}/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]),\n\t\tparams = this.match[3] ? this.match[3].split(\"|\") : [];\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {}\n\t\t};\n\t$tw.utils.each(params,function(paramValue,index) {\n\t\tvar name = \"\" + index;\n\t\ttranscludeNode.attributes[name] = {\n\t\t\tname: name,\n\t\t\ttype: \"string\",\n\t\t\tvalue: paramValue\n\t\t}\n\t});\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {name: \"tiddler\", type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes[\"$tiddler\"] = {name: \"$tiddler\", type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes[\"$tiddler\"] = {name: \"$tiddler\", type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes[\"$field\"] = {name: \"$field\", type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes[\"$index\"] = {name: \"$index\", type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/typedblock.js":{"title":"$:/core/modules/parsers/wikiparser/rules/typedblock.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/typedblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for typed blocks. For example:\n\n```\n$$$.js\nThis will be rendered as JavaScript\n$$$\n\n$$$.svg\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"150\" height=\"100\">\n  <circle cx=\"100\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />\n</svg>\n$$$\n\n$$$text/vnd.tiddlywiki>text/html\nThis will be rendered as an //HTML representation// of WikiText\n$$$\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.name = \"typedblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\$\\$\\$([^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /\\r?\\n\\$\\$\\$\\r?(?:\\n|$)/mg;\n\t// Save the type\n\tvar parseType = this.match[1],\n\t\trenderType = this.match[2];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar start = this.parser.pos;\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Parse the block according to the specified type\n\tvar parser = this.parser.wiki.parseText(parseType,text,{defaultType: \"text/plain\"});\n\t// If there's no render type, just return the parse tree\n\tif(!renderType) {\n\t\treturn parser.tree;\n\t} else {\n\t\t// Otherwise, render to the rendertype and return in a <PRE> tag\n\t\tvar widgetNode = this.parser.wiki.makeWidget(parser),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\ttext = renderType === \"text/html\" ? container.innerHTML : container.textContent;\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"pre\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: text,\n\t\t\t\tstart: start,\n\t\t\t\tend: this.parser.pos\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/whitespace.js":{"title":"$:/core/modules/parsers/wikiparser/rules/whitespace.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/whitespace.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for whitespace specifications\n\n```\n\\whitespace trim\n\\whitespace notrim\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"whitespace\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\\\whitespace[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\t$tw.utils.each(tokens,function(token) {\n\t\tswitch(token) {\n\t\t\tcase \"trim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = true;\n\t\t\t\tbreak;\n\t\t\tcase \"notrim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = false;\n\t\t\t\tbreak;\n\t\t}\n\t});\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/wikilink.js":{"title":"$:/core/modules/parsers/wikiparser/rules/wikilink.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for wiki links. For example:\n\n```\nAWikiLink\nAnotherLink\n~SuppressedLink\n```\n\nPrecede a camel case word with `~` to prevent it from being recognised as a link.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"wikilink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + \"?\" + $tw.config.textPrimitives.wikiLink,\"mg\");\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the details of the match\n\tvar linkText = this.match[0];\n\t// Move past the macro call\n\tvar start = this.parser.pos;\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// If the link starts with the unwikilink character then just output it as plain text\n\tif(linkText.substr(0,1) === $tw.config.textPrimitives.unWikiLink) {\n\t\treturn [{type: \"text\", text: linkText.substr(1)}];\n\t}\n\t// If the link has been preceded with a blocked letter then don't treat it as a link\n\tif(this.match.index > 0) {\n\t\tvar preRegExp = new RegExp($tw.config.textPrimitives.blockPrefixLetters,\"mg\");\n\t\tpreRegExp.lastIndex = this.match.index-1;\n\t\tvar preMatch = preRegExp.exec(this.parser.source);\n\t\tif(preMatch && preMatch.index === this.match.index-1) {\n\t\t\treturn [{type: \"text\", text: linkText}];\n\t\t}\n\t}\n\treturn [{\n\t\ttype: \"link\",\n\t\tattributes: {\n\t\t\tto: {type: \"string\", value: linkText}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: linkText,\n\t\t\tstart: start,\n\t\t\tend: this.parser.pos\n\t\t}]\n\t}];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/wikilinkprefix.js":{"title":"$:/core/modules/parsers/wikiparser/rules/wikilinkprefix.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilinkprefix.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for suppressed wiki links. For example:\n\n```\n~SuppressedLink\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"wikilinkprefix\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + $tw.config.textPrimitives.wikiLink,\"mg\");\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the details of the match\n\tvar linkText = this.match[0];\n\t// Move past the wikilink\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Return the link without unwikilink character as plain text\n\treturn [{type: \"text\", text: linkText.substr(1)}];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/wikiparser.js":{"title":"$:/core/modules/parsers/wikiparser/wikiparser.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/wikiparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe wiki text parser processes blocks of source text into a parse tree.\n\nThe parse tree is made up of nested arrays of these JavaScript objects:\n\n\t{type: \"element\", tag: <string>, attributes: {}, children: []} - an HTML element\n\t{type: \"text\", text: <string>} - a text node\n\t{type: \"entity\", value: <string>} - an entity\n\t{type: \"raw\", html: <string>} - raw HTML\n\nAttributes are stored as hashmaps of the following objects:\n\n\t{type: \"string\", value: <string>} - literal string\n\t{type: \"indirect\", textReference: <textReference>} - indirect through a text reference\n\t{type: \"macro\", macro: <TBD>} - indirect through a macro invocation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\ntype: content type of text\ntext: text to be parsed\noptions: see below:\n\tparseAsInline: true to parse text as inline instead of block\n\twiki: reference to wiki to use\n\t_canonical_uri: optional URI of content if text is missing or empty\n\tconfigTrimWhiteSpace: true to trim whitespace\n*/\nvar WikiParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\tvar self = this;\n\t// Check for an externally linked tiddler\n\tif($tw.browser && (text || \"\") === \"\" && options._canonical_uri) {\n\t\tthis.loadRemoteTiddler(options._canonical_uri);\n\t\ttext = $tw.language.getRawString(\"LazyLoadingWarning\");\n\t}\n\t// Save the parse text\n\tthis.type = type || \"text/vnd.tiddlywiki\";\n\tthis.source = text || \"\";\n\tthis.sourceLength = this.source.length;\n\t// Flag for ignoring whitespace\n\tthis.configTrimWhiteSpace = options.configTrimWhiteSpace !== undefined ? options.configTrimWhiteSpace : false;\n\t// Parser mode\n\tthis.parseAsInline = options.parseAsInline;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Start with empty output\n\tthis.tree = [];\n\t// Assemble the rule classes we're going to use\n\tvar pragmaRuleClasses, blockRuleClasses, inlineRuleClasses;\n\tif(options.rules) {\n\t\tpragmaRuleClasses = options.rules.pragma;\n\t\tblockRuleClasses = options.rules.block;\n\t\tinlineRuleClasses = options.rules.inline;\n\t} else {\n\t\t// Setup the rule classes if we don't have them already\n\t\tif(!this.pragmaRuleClasses) {\n\t\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t\t\tthis.setupRules(WikiParser.prototype.pragmaRuleClasses,\"$:/config/WikiParserRules/Pragmas/\");\n\t\t}\n\t\tpragmaRuleClasses = this.pragmaRuleClasses;\n\t\tif(!this.blockRuleClasses) {\n\t\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t\t\tthis.setupRules(WikiParser.prototype.blockRuleClasses,\"$:/config/WikiParserRules/Block/\");\n\t\t}\n\t\tblockRuleClasses = this.blockRuleClasses;\n\t\tif(!this.inlineRuleClasses) {\n\t\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t\t\tthis.setupRules(WikiParser.prototype.inlineRuleClasses,\"$:/config/WikiParserRules/Inline/\");\n\t\t}\n\t\tinlineRuleClasses = this.inlineRuleClasses;\n\t}\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tvar topBranch = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(this.parseAsInline) {\n\t\ttopBranch.push.apply(topBranch,this.parseInlineRun());\n\t} else {\n\t\ttopBranch.push.apply(topBranch,this.parseBlocks());\n\t}\n\t// Build rules' name map\n\tthis.usingRuleMap = {};\n\t$tw.utils.each(this.pragmaRules, function (ruleInfo) { self.usingRuleMap[ruleInfo.rule.name] = Object.getPrototypeOf(ruleInfo.rule); });\n\t$tw.utils.each(this.blockRules, function (ruleInfo) { self.usingRuleMap[ruleInfo.rule.name] = Object.getPrototypeOf(ruleInfo.rule); });\n\t$tw.utils.each(this.inlineRules, function (ruleInfo) { self.usingRuleMap[ruleInfo.rule.name] = Object.getPrototypeOf(ruleInfo.rule); });\n\t// Return the parse tree\n};\n\n/*\n*/\nWikiParser.prototype.loadRemoteTiddler = function(url) {\n\tvar self = this;\n\t$tw.utils.httpRequest({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tcallback: function(err,data) {\n\t\t\tif(!err) {\n\t\t\t\tvar tiddlers = self.wiki.deserializeTiddlers(\".tid\",data,self.wiki.getCreationFields());\n\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\ttiddler[\"_canonical_uri\"] = url;\n\t\t\t\t});\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tself.wiki.addTiddlers(tiddlers);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\n*/\nWikiParser.prototype.setupRules = function(proto,configPrefix) {\n\tvar self = this;\n\tif(!$tw.safeMode) {\n\t\t$tw.utils.each(proto,function(object,name) {\n\t\t\tif(self.wiki.getTiddlerText(configPrefix + name,\"enable\") !== \"enable\") {\n\t\t\t\tdelete proto[name];\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nInstantiate an array of parse rules\n*/\nWikiParser.prototype.instantiateRules = function(classes,type,startPos) {\n\tvar rulesInfo = [],\n\t\tself = this;\n\t$tw.utils.each(classes,function(RuleClass) {\n\t\t// Instantiate the rule\n\t\tvar rule = new RuleClass(self);\n\t\trule.is = {};\n\t\trule.is[type] = true;\n\t\trule.init(self);\n\t\tvar matchIndex = rule.findNextMatch(startPos);\n\t\tif(matchIndex !== undefined) {\n\t\t\trulesInfo.push({\n\t\t\t\trule: rule,\n\t\t\t\tmatchIndex: matchIndex\n\t\t\t});\n\t\t}\n\t});\n\treturn rulesInfo;\n};\n\n/*\nSkip any whitespace at the current position. Options are:\n\ttreatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\n*/\nWikiParser.prototype.skipWhitespace = function(options) {\n\toptions = options || {};\n\tvar whitespaceRegExp = options.treatNewlinesAsNonWhitespace ? /([^\\S\\n]+)/mg : /(\\s+)/mg;\n\twhitespaceRegExp.lastIndex = this.pos;\n\tvar whitespaceMatch = whitespaceRegExp.exec(this.source);\n\tif(whitespaceMatch && whitespaceMatch.index === this.pos) {\n\t\tthis.pos = whitespaceRegExp.lastIndex;\n\t}\n};\n\n/*\nGet the next match out of an array of parse rule instances\n*/\nWikiParser.prototype.findNextMatch = function(rules,startPos) {\n\t// Find the best matching rule by finding the closest match position\n\tvar matchingRule,\n\t\tmatchingRulePos = this.sourceLength;\n\t// Step through each rule\n\tfor(var t=0; t<rules.length; t++) {\n\t\tvar ruleInfo = rules[t];\n\t\t// Ask the rule to get the next match if we've moved past the current one\n\t\tif(ruleInfo.matchIndex !== undefined  && ruleInfo.matchIndex < startPos) {\n\t\t\truleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos);\n\t\t}\n\t\t// Adopt this match if it's closer than the current best match\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex <= matchingRulePos) {\n\t\t\tmatchingRule = ruleInfo;\n\t\t\tmatchingRulePos = ruleInfo.matchIndex;\n\t\t}\n\t}\n\treturn matchingRule;\n};\n\n/*\nParse any pragmas at the beginning of a block of parse text\n*/\nWikiParser.prototype.parsePragmas = function() {\n\tvar currentTreeBranch = this.tree;\n\twhile(true) {\n\t\tvar savedPos = this.pos;\n\t\t// Skip whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check for the end of the text\n\t\tif(this.pos >= this.sourceLength) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check if we've arrived at a pragma rule match\n\t\tvar nextMatch = this.findNextMatch(this.pragmaRules,this.pos);\n\t\t// If not, just exit\n\t\tif(!nextMatch || nextMatch.matchIndex !== this.pos) {\n\t\t\tthis.pos = savedPos;\n\t\t\tbreak;\n\t\t}\n\t\t// Process the pragma rule\n\t\tvar start = this.pos;\n\t\tvar subTree = nextMatch.rule.parse();\n\t\tif(subTree.length > 0) {\n\t\t\t// Set the start and end positions of the pragma rule if\n\t\t\tif (subTree[0].start === undefined) subTree[0].start = start;\n\t\t\tif (subTree[subTree.length - 1].end === undefined) subTree[subTree.length - 1].end = this.pos;\n\t\t\t$tw.utils.each(subTree, function (node) { node.rule = nextMatch.rule.name; });\n\t\t\t// Quick hack; we only cope with a single parse tree node being returned, which is true at the moment\n\t\t\tcurrentTreeBranch.push.apply(currentTreeBranch,subTree);\n\t\t\tsubTree[0].children = [];\n\t\t\tcurrentTreeBranch = subTree[0].children;\n\t\t}\n\t\t// Skip whitespace after the pragma\n\t\tthis.skipWhitespace();\n\t}\n\treturn currentTreeBranch;\n};\n\n/*\nParse a block from the current position\n\tterminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\n*/\nWikiParser.prototype.parseBlock = function(terminatorRegExpString) {\n\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(terminatorRegExpString + \"|\\\\r?\\\\n\\\\r?\\\\n\",\"mg\") : /(\\r?\\n\\r?\\n)/mg;\n\tthis.skipWhitespace();\n\tif(this.pos >= this.sourceLength) {\n\t\treturn [];\n\t}\n\t// Look for a block rule that applies at the current position\n\tvar nextMatch = this.findNextMatch(this.blockRules,this.pos);\n\tif(nextMatch && nextMatch.matchIndex === this.pos) {\n\t\tvar start = this.pos;\n\t\tvar subTree = nextMatch.rule.parse();\n\t\t// Set the start and end positions of the first and last blocks if they're not already set\n\t\tif (subTree.length > 0) {\n\t\t\tif (subTree[0].start === undefined) subTree[0].start = start;\n\t\t\tif (subTree[subTree.length - 1].end === undefined) subTree[subTree.length - 1].end = this.pos;\n\t\t}\n\t\t$tw.utils.each(subTree, function (node) { node.rule = nextMatch.rule.name; });\n\t\treturn subTree;\n\t}\n\t// Treat it as a paragraph if we didn't find a block rule\n\tvar start = this.pos;\n\tvar children = this.parseInlineRun(terminatorRegExp);\n\tvar end = this.pos;\n\treturn [{type: \"element\", tag: \"p\", children: children, start: start, end: end }];\n};\n\n/*\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\n\tterminatorRegExpString: terminating regular expression\n*/\nWikiParser.prototype.parseBlocks = function(terminatorRegExpString) {\n\tif(terminatorRegExpString) {\n\t\treturn this.parseBlocksTerminated(terminatorRegExpString);\n\t} else {\n\t\treturn this.parseBlocksUnterminated();\n\t}\n};\n\n/*\nParse a block from the current position to the end of the text\n*/\nWikiParser.prototype.parseBlocksUnterminated = function() {\n\tvar tree = [];\n\twhile(this.pos < this.sourceLength) {\n\t\ttree.push.apply(tree,this.parseBlock());\n\t}\n\treturn tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered. Wrapper for parseBlocksTerminatedExtended that just returns the parse tree\n*/\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\n\tvar ex = this.parseBlocksTerminatedExtended(terminatorRegExpString);\n\treturn ex.tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered\n*/\nWikiParser.prototype.parseBlocksTerminatedExtended = function(terminatorRegExpString) {\n\tvar terminatorRegExp = new RegExp(terminatorRegExpString,\"mg\"),\n\t\tresult = {\n\t\t\ttree: []\n\t\t};\n\t// Skip any whitespace\n\tthis.skipWhitespace();\n\t//  Check if we've got the end marker\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar match = terminatorRegExp.exec(this.source);\n\t// Parse the text into blocks\n\twhile(this.pos < this.sourceLength && !(match && match.index === this.pos)) {\n\t\tvar blocks = this.parseBlock(terminatorRegExpString);\n\t\tresult.tree.push.apply(result.tree,blocks);\n\t\t// Skip any whitespace\n\t\tthis.skipWhitespace();\n\t\t//  Check if we've got the end marker\n\t\tterminatorRegExp.lastIndex = this.pos;\n\t\tmatch = terminatorRegExp.exec(this.source);\n\t}\n\tif(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t\tresult.match = match;\n\t}\n\treturn result;\n};\n\n/*\nParse a run of text at the current position\n\tterminatorRegExp: a regexp at which to stop the run\n\toptions: see below\nOptions available:\n\teatTerminator: move the parse position past any encountered terminator (default false)\n*/\nWikiParser.prototype.parseInlineRun = function(terminatorRegExp,options) {\n\tif(terminatorRegExp) {\n\t\treturn this.parseInlineRunTerminated(terminatorRegExp,options);\n\t} else {\n\t\treturn this.parseInlineRunUnterminated(options);\n\t}\n};\n\nWikiParser.prototype.parseInlineRunUnterminated = function(options) {\n\tvar tree = [];\n\t// Find the next occurrence of an inline rule\n\tvar nextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around the matches until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && nextMatch) {\n\t\t// Process the text preceding the run rule\n\t\tif(nextMatch.matchIndex > this.pos) {\n\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,nextMatch.matchIndex),this.pos,nextMatch.matchIndex);\n\t\t\tthis.pos = nextMatch.matchIndex;\n\t\t}\n\t\t// Process the run rule\n\t\tvar start = this.pos;\n\t\tvar subTree = nextMatch.rule.parse();\n\t\t// Set the start and end positions of the first and last child if they're not already set\n\t\tif (subTree.length > 0) {\n\t\t\t// Set the start and end positions of the first and last child if they're not already set\n\t\t\tif (subTree[0].start === undefined) subTree[0].start = start;\n\t\t\tif (subTree[subTree.length - 1].end === undefined) subTree[subTree.length - 1].end = this.pos;\n\t\t}\n\t\t$tw.utils.each(subTree, function (node) { node.rule = nextMatch.rule.name; });\n\t\ttree.push.apply(tree,subTree);\n\t\t// Look for the next run rule\n\t\tnextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos),this.pos,this.sourceLength);\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\n\tvar ex = this.parseInlineRunTerminatedExtended(terminatorRegExp,options);\n\treturn ex.tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminatedExtended = function(terminatorRegExp,options) {\n\toptions = options || {};\n\tvar tree = [];\n\t// Find the next occurrence of the terminator\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar terminatorMatch = terminatorRegExp.exec(this.source);\n\t// Find the next occurrence of a inlinerule\n\tvar inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && (terminatorMatch || inlineRuleMatch)) {\n\t\t// Return if we've found the terminator, and it precedes any inline rule match\n\t\tif(terminatorMatch) {\n\t\t\tif(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {\n\t\t\t\tif(terminatorMatch.index > this.pos) {\n\t\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,terminatorMatch.index),this.pos,terminatorMatch.index);\n\t\t\t\t}\n\t\t\t\tthis.pos = terminatorMatch.index;\n\t\t\t\tif(options.eatTerminator) {\n\t\t\t\t\tthis.pos += terminatorMatch[0].length;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tmatch: terminatorMatch,\n\t\t\t\t\ttree: tree\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\t// Process any inline rule, along with the text preceding it\n\t\tif(inlineRuleMatch) {\n\t\t\t// Preceding text\n\t\t\tif(inlineRuleMatch.matchIndex > this.pos) {\n\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,inlineRuleMatch.matchIndex),this.pos,inlineRuleMatch.matchIndex);\n\t\t\t\tthis.pos = inlineRuleMatch.matchIndex;\n\t\t\t}\n\t\t\t// Process the inline rule\n\t\t\tvar start = this.pos;\n\t\t\tvar subTree = inlineRuleMatch.rule.parse();\n\t\t\t// Set the start and end positions of the first and last child if they're not already set\n\t\t\tif (subTree.length > 0) {\n\t\t\t\tif (subTree[0].start === undefined) subTree[0].start = start;\n\t\t\t\tif (subTree[subTree.length - 1].end === undefined) subTree[subTree.length - 1].end = this.pos;\n\t\t\t}\n\t\t\t$tw.utils.each(subTree, function (node) { node.rule = inlineRuleMatch.rule.name; });\n\t\t\ttree.push.apply(tree,subTree);\n\t\t\t// Look for the next inline rule\n\t\t\tinlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t\t\t// Look for the next terminator match\n\t\t\tterminatorRegExp.lastIndex = this.pos;\n\t\t\tterminatorMatch = terminatorRegExp.exec(this.source);\n\t\t}\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos),this.pos,this.sourceLength);\n\t}\n\tthis.pos = this.sourceLength;\n\treturn {\n\t\ttree: tree\n\t};\n};\n\n/*\nPush a text widget onto an array, respecting the configTrimWhiteSpace setting\n*/\nWikiParser.prototype.pushTextWidget = function(array,text,start,end) {\n\tif(this.configTrimWhiteSpace) {\n\t\ttext = $tw.utils.trim(text);\n\t}\n\tif(text) {\n\t\tarray.push({type: \"text\", text: text, start: start, end: end});\n\t}\n};\n\n/*\nParse zero or more class specifiers `.classname`\n*/\nWikiParser.prototype.parseClasses = function() {\n\tvar classRegExp = /\\.([^\\s\\.]+)/mg,\n\t\tclassNames = [];\n\tclassRegExp.lastIndex = this.pos;\n\tvar match = classRegExp.exec(this.source);\n\twhile(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t\tclassNames.push(match[1]);\n\t\tmatch = classRegExp.exec(this.source);\n\t}\n\treturn classNames;\n};\n\n/*\nAmend the rules used by this instance of the parser\n\ttype: `only` keeps just the named rules, `except` keeps all but the named rules\n\tnames: array of rule names\n*/\nWikiParser.prototype.amendRules = function(type,names) {\n\tnames = names || [];\n\t// Define the filter function\n\tvar target;\n\tif(type === \"only\") {\n\t\ttarget = true;\n\t} else if(type === \"except\") {\n\t\ttarget = false;\n\t} else {\n\t\treturn;\n\t}\n\t// Define a function to process each of our rule arrays\n\tvar processRuleArray = function(ruleArray) {\n\t\tfor(var t=ruleArray.length-1; t>=0; t--) {\n\t\t\tif((names.indexOf(ruleArray[t].rule.name) === -1) === target) {\n\t\t\t\truleArray.splice(t,1);\n\t\t\t}\n\t\t}\n\t};\n\t// Process each rule array\n\tprocessRuleArray(this.pragmaRules);\n\tprocessRuleArray(this.blockRules);\n\tprocessRuleArray(this.inlineRules);\n};\n\nexports[\"text/vnd.tiddlywiki\"] = WikiParser;\n\n})();\n","type":"application/javascript","module-type":"parser"},"$:/core/modules/parsers/wikiparser/rules/wikirulebase.js":{"title":"$:/core/modules/parsers/wikiparser/rules/wikirulebase.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikirulebase.js\ntype: application/javascript\nmodule-type: global\n\nBase class for wiki parser rules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nThis constructor is always overridden with a blank constructor, and so shouldn't be used\n*/\nvar WikiRuleBase = function() {\n};\n\n/*\nTo be overridden by individual rules\n*/\nWikiRuleBase.prototype.init = function(parser) {\n\tthis.parser = parser;\n};\n\n/*\nDefault implementation of findNextMatch uses RegExp matching\n*/\nWikiRuleBase.prototype.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\treturn this.match ? this.match.index : undefined;\n};\n\nexports.WikiRuleBase = WikiRuleBase;\n\n})();\n","type":"application/javascript","module-type":"global"},"$:/core/modules/pluginswitcher.js":{"title":"$:/core/modules/pluginswitcher.js","text":"/*\\\ntitle: $:/core/modules/pluginswitcher.js\ntype: application/javascript\nmodule-type: global\n\nManages switching plugins for themes and languages.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\noptions:\nwiki: wiki store to be used\npluginType: type of plugin to be switched\ncontrollerTitle: title of tiddler used to control switching of this resource\ndefaultPlugins: array of default plugins to be used if nominated plugin isn't found\nonSwitch: callback when plugin is switched (single parameter is array of plugin titles)\n*/\nfunction PluginSwitcher(options) {\n\tthis.wiki = options.wiki;\n\tthis.pluginType = options.pluginType;\n\tthis.controllerTitle = options.controllerTitle;\n\tthis.defaultPlugins = options.defaultPlugins || [];\n\tthis.onSwitch = options.onSwitch;\n\t// Switch to the current plugin\n\tthis.switchPlugins();\n\t// Listen for changes to the selected plugin\n\tvar self = this;\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,self.controllerTitle)) {\n\t\t\tself.switchPlugins();\n\t\t}\n\t});\n}\n\nPluginSwitcher.prototype.switchPlugins = function() {\n\t// Get the name of the current theme\n\tvar selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);\n\t// If it doesn't exist, then fallback to one of the default themes\n\tvar index = 0;\n\twhile(!this.wiki.getTiddler(selectedPluginTitle) && index < this.defaultPlugins.length) {\n\t\tselectedPluginTitle = this.defaultPlugins[index++];\n\t}\n\t// Accumulate the titles of the plugins that we need to load\n\tvar plugins = [],\n\t\tself = this,\n\t\taccumulatePlugin = function(title) {\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tif(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {\n\t\t\t\tplugins.push(title);\n\t\t\t\tvar pluginInfo = $tw.utils.parseJSONSafe(self.wiki.getTiddlerText(title)),\n\t\t\t\t\tdependents = $tw.utils.parseStringArray(tiddler.fields.dependents || \"\");\n\t\t\t\t$tw.utils.each(dependents,function(title) {\n\t\t\t\t\taccumulatePlugin(title);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\taccumulatePlugin(selectedPluginTitle);\n\t// Read the plugin info for the incoming plugins\n\tvar changes = $tw.wiki.readPluginInfo(plugins);\n\t// Unregister any existing theme tiddlers\n\tvar unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);\n\t// Register any new theme tiddlers\n\tvar registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);\n\t// Unpack the current theme tiddlers\n\t$tw.wiki.unpackPluginTiddlers();\n\t// Call the switch handler\n\tif(this.onSwitch) {\n\t\tthis.onSwitch(plugins);\n\t}\n};\n\nexports.PluginSwitcher = PluginSwitcher;\n\n})();\n","type":"application/javascript","module-type":"global"},"$:/core/modules/saver-handler.js":{"title":"$:/core/modules/saver-handler.js","text":"/*\\\ntitle: $:/core/modules/saver-handler.js\ntype: application/javascript\nmodule-type: global\n\nThe saver handler tracks changes to the store and handles saving the entire wiki via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the saver handler with the following options:\nwiki: wiki to be synced\ndirtyTracking: true if dirty tracking should be performed\n*/\nfunction SaverHandler(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.dirtyTracking = options.dirtyTracking;\n\tthis.preloadDirty = options.preloadDirty || [];\n\tthis.pendingAutoSave = false;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"saver-handler\");\n\t// Initialise our savers\n\tif($tw.browser) {\n\t\tthis.initSavers();\n\t}\n\t// Only do dirty tracking if required\n\tif($tw.browser && this.dirtyTracking) {\n\t\t// Compile the dirty tiddler filter\n\t\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t\t// Count of changes that have not yet been saved\n\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(self.preloadDirty,function(title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t});\n\t\tthis.numChanges = filteredChanges.length;\n\t\t// Listen out for changes to tiddlers\n\t\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t\t// Filter the changes so that we only count changes to tiddlers that we care about\n\t\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t\t});\n\t\t\t// Adjust the number of changes\n\t\t\tself.numChanges += filteredChanges.length;\n\t\t\tself.updateDirtyStatus();\n\t\t\t// Do any autosave if one is pending and there's no more change events\n\t\t\tif(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tself.pendingAutoSave = false;\n\t\t\t}\n\t\t});\n\t\t// Listen for the autosave event\n\t\t$tw.rootWidget.addEventListener(\"tm-auto-save-wiki\",function(event) {\n\t\t\t// Do the autosave unless there are outstanding tiddler change events\n\t\t\tif(self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise put ourselves in the \"pending autosave\" state and wait for the change event before we do the autosave\n\t\t\t\tself.pendingAutoSave = true;\n\t\t\t}\n\t\t});\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t}\n\t// Install the save action handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget.addEventListener(\"tm-save-wiki\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\twiki: event.widget.wiki,\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-download-file\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\twiki: event.widget.wiki,\n\t\t\t\tmethod: \"download\",\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t}\n}\n\nSaverHandler.prototype.titleSyncFilter = \"$:/config/SaverFilter\";\nSaverHandler.prototype.titleAutoSave = \"$:/config/AutoSave\";\nSaverHandler.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\n\n/*\nSelect the appropriate saver modules and set them up\n*/\nSaverHandler.prototype.initSavers = function(moduleType) {\n\tmoduleType = moduleType || \"saver\";\n\t// Instantiate the available savers\n\tthis.savers = [];\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tif(module.canSave(self)) {\n\t\t\tself.savers.push(module.create(self.wiki));\n\t\t}\n\t});\n\t// Sort the savers into priority order\n\tthis.savers.sort(function(a,b) {\n\t\tif(a.info.priority < b.info.priority) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(a.info.priority > b.info.priority) {\n\t\t\t\treturn +1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nSave the wiki contents. Options are:\n\tmethod: \"save\", \"autosave\" or \"download\"\n\ttemplate: the tiddler containing the template to save\n\tdownloadType: the content type for the saved file\n\twiki: optional wiki, overriding the default wiki specified in the constructor\n*/\nSaverHandler.prototype.saveWiki = function(options) {\n\toptions = options || {};\n\tvar self = this,\n\t\twiki = options.wiki || this.wiki,\n\t\tmethod = options.method || \"save\";\n\t// Ignore autosave if disabled\n\tif(method === \"autosave\" && ($tw.config.disableAutoSave || wiki.getTiddlerText(this.titleAutoSave,\"yes\") !== \"yes\")) {\n\t\treturn false;\n\t}\n\tvar\tvariables = options.variables || {},\n\t\ttemplate = (options.template || \n\t\t           wiki.getTiddlerText(\"$:/config/SaveWikiButton/Template\",\"$:/core/save/all\")).trim(),\n\t\tdownloadType = options.downloadType || \"text/plain\",\n\t\ttext = wiki.renderTiddler(downloadType,template,options),\n\t\tcallback = function(err) {\n\t\t\tif(err) {\n\t\t\t\talert($tw.language.getString(\"Error/WhileSaving\") + \":\\n\\n\" + err);\n\t\t\t} else {\n\t\t\t\t// Clear the task queue if we're saving (rather than downloading)\n\t\t\t\tif(method !== \"download\") {\n\t\t\t\t\tself.numChanges = 0;\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t}\n\t\t\t\t$tw.notifier.display(self.titleSavedNotification);\n\t\t\t\tif(options.callback) {\n\t\t\t\t\toptions.callback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Call the highest priority saver that supports this method\n\tfor(var t=this.savers.length-1; t>=0; t--) {\n\t\tvar saver = this.savers[t];\n\t\tif(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {\n\t\t\tthis.logger.log(\"Saving wiki with method\",method,\"through saver\",saver.info.name);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSaverHandler.prototype.isDirty = function() {\n\treturn this.numChanges > 0;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSaverHandler.prototype.updateDirtyStatus = function() {\n\tvar self = this;\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t\t$tw.utils.each($tw.windows,function(win) {\n\t\t\t$tw.utils.toggleClass(win.document.body,\"tc-dirty\",self.isDirty());\n\t\t});\n\t}\n};\n\nexports.SaverHandler = SaverHandler;\n\n})();\n","type":"application/javascript","module-type":"global"},"$:/core/modules/savers/andtidwiki.js":{"title":"$:/core/modules/savers/andtidwiki.js","text":"/*\\\ntitle: $:/core/modules/savers/andtidwiki.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the AndTidWiki Android app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar AndTidWiki = function(wiki) {\n};\n\nAndTidWiki.prototype.save = function(text,method,callback,options) {\n\tvar filename = options && options.variables ? options.variables.filename : null;\n\tif (method === \"download\") {\n\t\t// Support download\n\t\tif (window.twi.saveDownload) {\n\t\t\ttry {\n\t\t\t\twindow.twi.saveDownload(text,filename);\n\t\t\t} catch(err) {\n\t\t\t\tif (err.message === \"Method not found\") {\n\t\t\t\t\twindow.twi.saveDownload(text);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tvar link = document.createElement(\"a\");\n\t\t\tlink.setAttribute(\"href\",\"data:text/plain,\" + encodeURIComponent(text));\n\t\t\tif (filename) {\n\t\t\t    link.setAttribute(\"download\",filename);\n\t\t\t}\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t}\n\t} else if (window.twi.saveWiki) {\n\t\t// Direct save in Tiddloid\n\t\twindow.twi.saveWiki(text);\n\t} else {\n\t\t// Get the pathname of this document\n\t\tvar pathname = $tw.utils.decodeURIComponentSafe(document.location.toString().split(\"#\")[0]);\n\t\t// Strip the file://\n\t\tif(pathname.indexOf(\"file://\") === 0) {\n\t\t\tpathname = pathname.substr(7);\n\t\t}\n\t\t// Strip any query or location part\n\t\tvar p = pathname.indexOf(\"?\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\tp = pathname.indexOf(\"#\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\t// Save the file\n\t\twindow.twi.saveFile(pathname,text);\n\t}\n\t// Call the callback\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nAndTidWiki.prototype.info = {\n\tname: \"andtidwiki\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.twi && !!window.twi.saveFile;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new AndTidWiki(wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"saver"},"$:/core/modules/savers/custom.js":{"title":"$:/core/modules/savers/custom.js","text":"/*\\\ntitle: $:/core/modules/savers/custom.js\ntype: application/javascript\nmodule-type: saver\n\nLooks for `window.$tw.customSaver` first on the current window, then\non the parent window (of an iframe). If present, the saver must define\n\tsave: function(text,method,callback) { ... }\nand the saver may define\n\tpriority: number\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar findSaver = function(window) {\n\ttry {\n\t\treturn window && window.$tw && window.$tw.customSaver;\n\t} catch (err) {\n\t\t// Catching the exception is the most reliable way to detect cross-origin iframe errors.\n\t\t// For example, instead of saying that `window.parent.$tw` is undefined, Firefox will throw\n\t\t//   Uncaught DOMException: Permission denied to access property \"$tw\" on cross-origin object\n\t\tconsole.log({ msg: \"custom saver is disabled\", reason: err });\n\t\treturn null;\n\t}\n}\nvar saver = findSaver(window) || findSaver(window.parent) || {};\n\nvar CustomSaver = function(wiki) {\n};\n\nCustomSaver.prototype.save = function(text,method,callback) {\n\treturn saver.save(text, method, callback);\n};\n\n/*\nInformation about this saver\n*/\nCustomSaver.prototype.info = {\n\tname: \"custom\",\n\tpriority: saver.priority || 4000,\n\tcapabilities: [\"save\",\"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!(saver.save);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new CustomSaver(wiki);\n};\n})();\n","type":"application/javascript","module-type":"saver"},"$:/core/modules/savers/download.js":{"title":"$:/core/modules/savers/download.js","text":"/*\\\ntitle: $:/core/modules/savers/download.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar DownloadSaver = function(wiki) {\n};\n\nDownloadSaver.prototype.save = function(text,method,callback,options) {\n\toptions = options || {};\n\t// Get the current filename\n\tvar filename = options.variables.filename;\n\tif(!filename) {\n\t\tvar p = document.location.pathname.lastIndexOf(\"/\");\n\t\tif(p !== -1) {\n\t\t\t// We decode the pathname because document.location is URL encoded by the browser\n\t\t\tfilename = $tw.utils.decodeURIComponentSafe(document.location.pathname.substr(p+1));\n\t\t}\n\t}\n\tif(!filename) {\n\t\tfilename = \"tiddlywiki.html\";\n\t}\n\t// Set up the link\n\tvar link = document.createElement(\"a\");\n\tif(Blob !== undefined) {\n\t\tvar blob = new Blob([text], {type: \"text/html\"});\n\t\tlink.setAttribute(\"href\", URL.createObjectURL(blob));\n\t} else {\n\t\tlink.setAttribute(\"href\",\"data:text/html,\" + encodeURIComponent(text));\n\t}\n\tlink.setAttribute(\"download\",filename);\n\tdocument.body.appendChild(link);\n\tlink.click();\n\tdocument.body.removeChild(link);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nDownloadSaver.prototype.info = {\n\tname: \"download\",\n\tpriority: 100\n};\n\nObject.defineProperty(DownloadSaver.prototype.info, \"capabilities\", {\n\tget: function() {\n\t\tvar capabilities = [\"save\", \"download\"];\n\t\tif(($tw.wiki.getTextReference(\"$:/config/DownloadSaver/AutoSave\") || \"\").toLowerCase() === \"yes\") {\n\t\t\tcapabilities.push(\"autosave\");\n\t\t}\n\t\treturn capabilities;\n\t}\n});\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn document.createElement(\"a\").download !== undefined;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new DownloadSaver(wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"saver"},"$:/core/modules/savers/fsosaver.js":{"title":"$:/core/modules/savers/fsosaver.js","text":"/*\\\ntitle: $:/core/modules/savers/fsosaver.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via MS FileSystemObject ActiveXObject\n\nNote: Since TiddlyWiki's markup contains the MOTW, the FileSystemObject normally won't be available. \nHowever, if the wiki is loaded as an .HTA file (Windows HTML Applications) then the FSO can be used.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar FSOSaver = function(wiki) {\n};\n\nFSOSaver.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = unescape(document.location.pathname);\n\t// Test for a Windows path of the form /x:\\blah...\n\tif(/^\\/[A-Z]\\:\\\\[^\\\\]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t} else if(document.location.hostname !== \"\" && /^\\/\\\\[^\\\\]+\\\\[^\\\\]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t\t// reconstruct UNC path\n\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t} else {\n\t\treturn false;\n\t}\n\t// Save the file (as UTF-16)\n\tvar fso = new ActiveXObject(\"Scripting.FileSystemObject\");\n\tvar file = fso.OpenTextFile(pathname,2,-1,-1);\n\tfile.Write(text);\n\tfile.Close();\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nFSOSaver.prototype.info = {\n\tname: \"FSOSaver\",\n\tpriority: 120,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\ttry {\n\t\treturn (window.location.protocol === \"file:\") && !!(new ActiveXObject(\"Scripting.FileSystemObject\"));\n\t} catch(e) { return false; }\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new FSOSaver(wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"saver"},"$:/core/modules/savers/gitea.js":{"title":"$:/core/modules/savers/gitea.js","text":"/*\\\ntitle: $:/core/modules/savers/gitea.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the gitea\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GiteaSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGiteaSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/Gitea/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"Gitea\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/Gitea/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/Gitea/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/Gitea/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/Gitea/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/Gitea/ServerURL\") || \"https://gitea\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"token \" + password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar use_put = true;\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = $tw.utils.parseJSONSafe(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(sha === \"\"){\n\t\t\t\t\tuse_put = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: endpoint + \"/repos/\" + repo + \"/branches/\" + branch,\n\t\t\t\ttype: \"GET\",\n\t\t\t\theaders: headers,\n\t\t\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\t\t\tif(xhr.status === 404) {\n\t\t\t\t\t\tcallback(\"Please ensure the branch in the Gitea repo exists\");\n\t\t\t\t\t}else{\n\t\t\t\t\t\tdata[\"branch\"] = branch;\n\t\t\t\t\t\tself.upload(uri + filename, use_put?\"PUT\":\"POST\", headers, data, callback);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\nGiteaSaver.prototype.upload = function(uri,method,headers,data,callback) {\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: method,\n\t\theaders: headers,\n\t\tdata: JSON.stringify(data),\n\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar putResponseData = $tw.utils.parseJSONSafe(putResponseDataJson);\n\t\t\tcallback(null);\n\t\t}\n\t});\n};\n\n/*\nInformation about this saver\n*/\nGiteaSaver.prototype.info = {\n\tname: \"Gitea\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GiteaSaver(wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"saver"},"$:/core/modules/savers/github.js":{"title":"$:/core/modules/savers/github.js","text":"/*\\\ntitle: $:/core/modules/savers/github.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitHub v3 REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitHubSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitHubSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitHub/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"github\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitHub/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitHub/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitHub/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitHub/Branch\") || \"main\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitHub/ServerURL\") || \"https://api.github.com\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/vnd.github.v3+json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"Basic \" + $tw.utils.base64Encode(username + \":\" + password),\n\t\t\t\"If-None-Match\": \"\"\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = $tw.utils.parseJSONSafe(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a PUT request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + filename,\n\t\t\t\ttype: \"PUT\",\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = $tw.utils.parseJSONSafe(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitHubSaver.prototype.info = {\n\tname: \"github\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitHubSaver(wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"saver"},"$:/core/modules/savers/gitlab.js":{"title":"$:/core/modules/savers/gitlab.js","text":"/*\\\ntitle: $:/core/modules/savers/gitlab.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitLab REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: true */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitLabSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitLabSaver.prototype.save = function(text,method,callback) {\n\t/* See https://docs.gitlab.com/ee/api/repository_files.html */\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitLab/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"gitlab\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitLab/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitLab/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitLab/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitLab/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitLab/ServerURL\") || \"https://gitlab.com/api/v4\",\n\t\theaders = {\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Private-Token\": password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/projects/\" + encodeURIComponent(repo) + \"/repository/\";\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri + \"tree/?path=\" + encodeURIComponent(path.replace(/^\\/+|\\/$/g, '')) + \"&branch=\" + encodeURIComponent(branch.replace(/^\\/+|\\/$/g, '')),\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar requestType = \"POST\";\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = $tw.utils.parseJSONSafe(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\trequestType = \"PUT\";\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tcommit_message: $tw.language.getString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: text,\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + \"files/\" + encodeURIComponent(path.replace(/^\\/+/, '') + filename),\n\t\t\t\ttype: requestType,\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = $tw.utils.parseJSONSafe(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitLabSaver.prototype.info = {\n\tname: \"gitlab\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitLabSaver(wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"saver"},"$:/core/modules/savers/manualdownload.js":{"title":"$:/core/modules/savers/manualdownload.js","text":"/*\\\ntitle: $:/core/modules/savers/manualdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Title of the tiddler containing the download message\nvar downloadInstructionsTitle = \"$:/language/Modals/Download\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar ManualDownloadSaver = function(wiki) {\n};\n\nManualDownloadSaver.prototype.save = function(text,method,callback) {\n\t$tw.modal.display(downloadInstructionsTitle,{\n\t\tdownloadLink: \"data:text/html,\" + encodeURIComponent(text)\n\t});\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nManualDownloadSaver.prototype.info = {\n\tname: \"manualdownload\",\n\tpriority: 0,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new ManualDownloadSaver(wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"saver"},"$:/core/modules/savers/msdownload.js":{"title":"$:/core/modules/savers/msdownload.js","text":"/*\\\ntitle: $:/core/modules/savers/msdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via window.navigator.msSaveBlob()\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar MsDownloadSaver = function(wiki) {\n};\n\nMsDownloadSaver.prototype.save = function(text,method,callback) {\n\t// Get the current filename\n\tvar filename = \"tiddlywiki.html\",\n\t\tp = document.location.pathname.lastIndexOf(\"/\");\n\tif(p !== -1) {\n\t\tfilename = document.location.pathname.substr(p+1);\n\t}\n\t// Set up the link\n\tvar blob = new Blob([text], {type: \"text/html\"});\n\twindow.navigator.msSaveBlob(blob,filename);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nMsDownloadSaver.prototype.info = {\n\tname: \"msdownload\",\n\tpriority: 110,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.navigator.msSaveBlob;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new MsDownloadSaver(wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"saver"},"$:/core/modules/savers/put.js":{"title":"$:/core/modules/savers/put.js","text":"/*\\\ntitle: $:/core/modules/savers/put.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by performing a PUT request to the server\n\nWorks with any server which accepts a PUT request\nto the current URL, such as a WebDAV server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRetrieve ETag if available\n*/\nvar retrieveETag = function(self) {\n\tvar headers = {\n\t\tAccept: \"*/*\"\n\t};\n\t$tw.utils.httpRequest({\n\t\turl: self.uri(),\n\t\ttype: \"HEAD\",\n\t\theaders: headers,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar etag = xhr.getResponseHeader(\"ETag\");\n\t\t\tif(!etag) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tself.etag = etag.replace(/^W\\//,\"\");\n\t\t}\n\t});\n};\n\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar PutSaver = function(wiki) {\n\tthis.wiki = wiki;\n\tvar self = this;\n\tvar uri = this.uri();\n\t// Async server probe. Until probe finishes, save will fail fast\n\t// See also https://github.com/TiddlyWiki/TiddlyWiki5/issues/2276\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"OPTIONS\",\n\t\tcallback: function(err,data,xhr) {\n\t\t\t// Check DAV header http://www.webdav.org/specs/rfc2518.html#rfc.section.9.1\n\t\t\tif(!err) {\n\t\t\t\tself.serverAcceptsPuts = xhr.status >= 200 && xhr.status < 300 && !!xhr.getResponseHeader(\"dav\");\n\t\t\t}\n\t\t}\n\t});\n\tretrieveETag(this);\n};\n\nPutSaver.prototype.uri = function() {\n\treturn document.location.toString().split(\"#\")[0];\n};\n\n// TODO: in case of edit conflict\n// Prompt: Do you want to save over this? Y/N\n// Merging would be ideal, and may be possible using future generic merge flow\nPutSaver.prototype.save = function(text,method,callback) {\n\tif(!this.serverAcceptsPuts) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tvar headers = {\n\t\t\"Content-Type\": \"text/html;charset=UTF-8\"\n\t};\n\tif(this.etag) {\n\t\theaders[\"If-Match\"] = this.etag;\n\t}\n\t$tw.notifier.display(\"$:/language/Notifications/Save/Starting\");\n\t$tw.utils.httpRequest({\n\t\turl: this.uri(),\n\t\ttype: \"PUT\",\n\t\theaders: headers,\n\t\tdata: text,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\tvar status = xhr.status,\n\t\t\t\t\terrorMsg = err;\n\t\t\t\tif(status === 412) { // file changed on server\n\t\t\t\t\terrorMsg = $tw.language.getString(\"Error/PutEditConflict\");\n\t\t\t\t} else if(status === 401) { // authentication required\n\t\t\t\t\terrorMsg = $tw.language.getString(\"Error/PutUnauthorized\");\n\t\t\t\t} else if(status === 403) { // permission denied\n\t\t\t\t\terrorMsg = $tw.language.getString(\"Error/PutForbidden\");\n\t\t\t\t}\n\t\t\t\tif (xhr.responseText) {\n\t\t\t\t\t// treat any server response like a plain text error explanation\n\t\t\t\t\terrorMsg = errorMsg + \"\\n\\n\" + xhr.responseText;\n\t\t\t\t}\n\t\t\t\tcallback(errorMsg); // fail\n\t\t\t} else {\n\t\t\t\tself.etag = xhr.getResponseHeader(\"ETag\");\n\t\t\t\tif(self.etag == null) {\n\t\t\t\t\tretrieveETag(self);\n\t\t\t\t}\n\t\t\t\tcallback(null); // success\n\t\t\t}\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nPutSaver.prototype.info = {\n\tname: \"put\",\n\tpriority: 2000,\n\tcapabilities: [\"save\",\"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn /^https?:/.test(location.protocol);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new PutSaver(wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"saver"},"$:/core/modules/savers/tiddlyfox.js":{"title":"$:/core/modules/savers/tiddlyfox.js","text":"/*\\\ntitle: $:/core/modules/savers/tiddlyfox.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TiddlyFox file extension\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TiddlyFoxSaver = function(wiki) {\n};\n\nTiddlyFoxSaver.prototype.save = function(text,method,callback) {\n\tvar messageBox = document.getElementById(\"tiddlyfox-message-box\");\n\tif(messageBox) {\n\t\t// Get the pathname of this document\n\t\tvar pathname = document.location.toString().split(\"#\")[0];\n\t\t// Replace file://localhost/ with file:///\n\t\tif(pathname.indexOf(\"file://localhost/\") === 0) {\n\t\t\tpathname = \"file://\" + pathname.substr(16);\n\t\t}\n\t\t// Windows path file:///x:/blah/blah --> x:\\blah\\blah\n\t\tif(/^file\\:\\/\\/\\/[A-Z]\\:\\//i.test(pathname)) {\n\t\t\t// Remove the leading slash and convert slashes to backslashes\n\t\t\tpathname = pathname.substr(8).replace(/\\//g,\"\\\\\");\n\t\t// Firefox Windows network path file://///server/share/blah/blah --> //server/share/blah/blah\n\t\t} else if(pathname.indexOf(\"file://///\") === 0) {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(10)).replace(/\\//g,\"\\\\\");\n\t\t// Mac/Unix local path file:///path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:///\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(7));\n\t\t// Mac/Unix local path file:/path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:/\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(5));\n\t\t// Otherwise Windows networth path file://server/share/path/path --> \\\\server\\share\\path\\path\n\t\t} else {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(7)).replace(new RegExp(\"/\",\"g\"),\"\\\\\");\n\t\t}\n\t\t// Create the message element and put it in the message box\n\t\tvar message = document.createElement(\"div\");\n\t\tmessage.setAttribute(\"data-tiddlyfox-path\",$tw.utils.decodeURIComponentSafe(pathname));\n\t\tmessage.setAttribute(\"data-tiddlyfox-content\",text);\n\t\tmessageBox.appendChild(message);\n\t\t// Add an event handler for when the file has been saved\n\t\tmessage.addEventListener(\"tiddlyfox-have-saved-file\",function(event) {\n\t\t\tcallback(null);\n\t\t}, false);\n\t\t// Create and dispatch the custom event to the extension\n\t\tvar event = document.createEvent(\"Events\");\n\t\tevent.initEvent(\"tiddlyfox-save-file\",true,false);\n\t\tmessage.dispatchEvent(event);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyFoxSaver.prototype.info = {\n\tname: \"tiddlyfox\",\n\tpriority: 1500,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyFoxSaver(wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"saver"},"$:/core/modules/savers/tiddlyie.js":{"title":"$:/core/modules/savers/tiddlyie.js","text":"/*\\\ntitle: $:/core/modules/savers/tiddlyie.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via Internet Explorer BHO extenion (TiddlyIE)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar TiddlyIESaver = function(wiki) {\n};\n\nTiddlyIESaver.prototype.save = function(text,method,callback) {\n\t// Check existence of TiddlyIE BHO extension (note: only works after document is complete)\n\tif(typeof(window.TiddlyIE) != \"undefined\") {\n\t\t// Get the pathname of this document\n\t\tvar pathname = unescape(document.location.pathname);\n\t\t// Test for a Windows path of the form /x:/blah...\n\t\tif(/^\\/[A-Z]\\:\\/[^\\/]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+ (is this better?: ^/[a-z]:/[^/]+(/[^/]+)*\\.[^/]+ )\n\t\t\t// Remove the leading slash\n\t\t\tpathname = pathname.substr(1);\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t} else if(document.hostname !== \"\" && /^\\/[^\\/]+\\/[^\\/]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t\t// reconstruct UNC path\n\t\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t\t} else return false;\n\t\t// Prompt the user to save the file\n\t\twindow.TiddlyIE.save(pathname, text);\n\t\t// Callback that we succeeded\n\t\tcallback(null);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyIESaver.prototype.info = {\n\tname: \"tiddlyiesaver\",\n\tpriority: 1500,\n\tcapabilities: [\"save\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyIESaver(wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"saver"},"$:/core/modules/savers/twedit.js":{"title":"$:/core/modules/savers/twedit.js","text":"/*\\\ntitle: $:/core/modules/savers/twedit.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TWEdit iOS app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TWEditSaver = function(wiki) {\n};\n\nTWEditSaver.prototype.save = function(text,method,callback) {\n\t// Bail if we're not running under TWEdit\n\tif(typeof DeviceInfo !== \"object\") {\n\t\treturn false;\n\t}\n\t// Get the pathname of this document\n\tvar pathname = $tw.utils.decodeURIComponentSafe(document.location.pathname);\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Remove the leading \"/Documents\" from path\n\tvar prefix = \"/Documents\";\n\tif(pathname.indexOf(prefix) === 0) {\n\t\tpathname = pathname.substr(prefix.length);\n\t}\n\t// Error handler\n\tvar errorHandler = function(event) {\n\t\t// Error\n\t\tcallback($tw.language.getString(\"Error/SavingToTWEdit\") + \": \" + event.target.error.code);\n\t};\n\t// Get the file system\n\twindow.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {\n\t\t// Now we've got the filesystem, get the fileEntry\n\t\tfileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {\n\t\t\t// Now we've got the fileEntry, create the writer\n\t\t\tfileEntry.createWriter(function(writer) {\n\t\t\t\twriter.onerror = errorHandler;\n\t\t\t\twriter.onwrite = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\twriter.position = 0;\n\t\t\t\twriter.write(text);\n\t\t\t},errorHandler);\n\t\t}, errorHandler);\n\t}, errorHandler);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nTWEditSaver.prototype.info = {\n\tname: \"twedit\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TWEditSaver(wiki);\n};\n\n/////////////////////////// Hack\n// HACK: This ensures that TWEdit recognises us as a TiddlyWiki document\nif($tw.browser) {\n\twindow.version = {title: \"TiddlyWiki\"};\n}\n\n})();\n","type":"application/javascript","module-type":"saver"},"$:/core/modules/savers/upload.js":{"title":"$:/core/modules/savers/upload.js","text":"/*\\\ntitle: $:/core/modules/savers/upload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via upload to a server.\n\nDesigned to be compatible with BidiX's UploadPlugin at http://tiddlywiki.bidix.info/#UploadPlugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar UploadSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nUploadSaver.prototype.save = function(text,method,callback) {\n\t// Get the various parameters we need\n\tvar backupDir = this.wiki.getTextReference(\"$:/UploadBackupDir\") || \".\",\n\t\tusername = this.wiki.getTextReference(\"$:/UploadName\"),\n\t\tpassword = $tw.utils.getPassword(\"upload\"),\n\t\tuploadDir = this.wiki.getTextReference(\"$:/UploadDir\") || \".\",\n\t\tuploadFilename = this.wiki.getTextReference(\"$:/UploadFilename\") || \"index.html\",\n\t\tuploadWithUrlOnly = this.wiki.getTextReference(\"$:/UploadWithUrlOnly\") || \"no\",\n\t\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif (uploadWithUrlOnly === \"yes\") {\n\t\t// The url is good enough. No need for a username and password.\n\t\t// Assume the server uses some other kind of auth mechanism.\n\t\tif(!url || url.toString().trim() === \"\") {\n\t\t\treturn false;\n\t\t}\n\t}\n\telse {\n\t\t// Require username and password to be present.\n\t\t// Assume the server uses the standard UploadPlugin username/password.\n\t\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Construct the url if not provided\n\tif(!url) {\n\t\turl = \"http://\" + username + \".tiddlyspot.com/store.cgi\";\n\t}\n\t// Assemble the header\n\tvar boundary = \"---------------------------\" + \"AaB03x\";\n\tvar uploadFormName = \"UploadPlugin\";\n\tvar head = [];\n\thead.push(\"--\" + boundary + \"\\r\\nContent-disposition: form-data; name=\\\"UploadPlugin\\\"\\r\\n\");\n\thead.push(\"backupDir=\" + backupDir + \";user=\" + username + \";password=\" + password + \";uploaddir=\" + uploadDir + \";;\"); \n\thead.push(\"\\r\\n\" + \"--\" + boundary);\n\thead.push(\"Content-disposition: form-data; name=\\\"userfile\\\"; filename=\\\"\" + uploadFilename + \"\\\"\");\n\thead.push(\"Content-Type: text/html;charset=UTF-8\");\n\thead.push(\"Content-Length: \" + text.length + \"\\r\\n\");\n\thead.push(\"\");\n\t// Assemble the tail and the data itself\n\tvar tail = \"\\r\\n--\" + boundary + \"--\\r\\n\",\n\t\tdata = head.join(\"\\r\\n\") + text + tail;\n\t// Do the HTTP post\n\t$tw.notifier.display(\"$:/language/Notifications/Save/Starting\");\n\tvar http = new XMLHttpRequest();\n\thttp.open(\"POST\",url,true,username,password);\n\thttp.setRequestHeader(\"Content-Type\",\"multipart/form-data; charset=UTF-8; boundary=\" + boundary);\n\thttp.onreadystatechange = function() {\n\t\tif(http.readyState == 4 && http.status == 200) {\n\t\t\tif(http.responseText.substr(0,4) === \"0 - \") {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tcallback(http.responseText);\n\t\t\t}\n\t\t}\n\t};\n\ttry {\n\t\thttp.send(data);\n\t} catch(ex) {\n\t\treturn callback($tw.language.getString(\"Error/Caption\") + \":\" + ex);\n\t}\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nUploadSaver.prototype.info = {\n\tname: \"upload\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new UploadSaver(wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"saver"},"$:/core/modules/server/authenticators/basic.js":{"title":"$:/core/modules/server/authenticators/basic.js","text":"/*\\\ntitle: $:/core/modules/server/authenticators/basic.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for WWW basic authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\");\n}\n\nfunction BasicAuthenticator(server) {\n\tthis.server = server;\n\tthis.credentialsData = [];\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nBasicAuthenticator.prototype.init = function() {\n\t// Read the credentials data\n\tthis.credentialsFilepath = this.server.get(\"credentials\");\n\tif(this.credentialsFilepath) {\n\t\tvar resolveCredentialsFilepath = path.resolve(this.server.boot.wikiPath,this.credentialsFilepath);\n\t\tif(fs.existsSync(resolveCredentialsFilepath) && !fs.statSync(resolveCredentialsFilepath).isDirectory()) {\n\t\t\tvar credentialsText = fs.readFileSync(resolveCredentialsFilepath,\"utf8\"),\n\t\t\t\tcredentialsData = $tw.utils.parseCsvStringWithHeader(credentialsText);\n\t\t\tif(typeof credentialsData === \"string\") {\n\t\t\t\treturn \"Error: \" + credentialsData + \" reading credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t\t} else {\n\t\t\t\tthis.credentialsData = credentialsData;\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"Error: Unable to load user credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t}\n\t}\n\t// Add the hardcoded username and password if specified\n\tif(this.server.get(\"username\") && this.server.get(\"password\")) {\n\t\tthis.credentialsData = this.credentialsData || [];\n\t\tthis.credentialsData.push({\n\t\t\tusername: this.server.get(\"username\"),\n\t\t\tpassword: this.server.get(\"password\")\n\t\t});\n\t}\n\treturn this.credentialsData.length > 0;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nBasicAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Extract the incoming username and password from the request\n\tvar header = request.headers.authorization || \"\";\n\tif(!header && state.allowAnon) {\n\t\t// If there's no header and anonymous access is allowed then we don't set authenticatedUsername\n\t\treturn true;\n\t}\n\tvar token = header.split(/\\s+/).pop() || \"\",\n\t\tauth = $tw.utils.base64Decode(token),\n\t\tparts = auth.split(/:/),\n\t\tincomingUsername = parts[0],\n\t\tincomingPassword = parts[1];\n\t// Check that at least one of the credentials matches\n\tvar matchingCredentials = this.credentialsData.find(function(credential) {\n\t\treturn credential.username === incomingUsername && credential.password === incomingPassword;\n\t});\n\tif(matchingCredentials) {\n\t\t// If so, add the authenticated username to the request state\n\t\tstate.authenticatedUsername = incomingUsername;\n\t\treturn true;\n\t} else {\n\t\t// If not, return an authentication challenge\n\t\tresponse.writeHead(401,\"Authentication required\",{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\n\t\treturn false;\n\t}\n};\n\nexports.AuthenticatorClass = BasicAuthenticator;\n\n})();\n","type":"application/javascript","module-type":"authenticator"},"$:/core/modules/server/authenticators/header.js":{"title":"$:/core/modules/server/authenticators/header.js","text":"/*\\\ntitle: $:/core/modules/server/authenticators/header.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for trusted header authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction HeaderAuthenticator(server) {\n\tthis.server = server;\n\tthis.header = server.get(\"authenticated-user-header\") ? server.get(\"authenticated-user-header\").toLowerCase() : undefined;\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nHeaderAuthenticator.prototype.init = function() {\n\treturn !!this.header;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nHeaderAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Otherwise, authenticate as the username in the specified header\n\tvar username = request.headers[this.header];\n\tif(!username && !state.allowAnon) {\n\t\tresponse.writeHead(401,\"Authorization header required to login to '\" + state.server.servername + \"'\");\n\t\tresponse.end();\n\t\treturn false;\n\t} else {\n\t\t// authenticatedUsername will be undefined for anonymous users\n\t\tif(username) {\n\t\t\tstate.authenticatedUsername = $tw.utils.decodeURIComponentSafe(username);\n\t\t}\n\t\treturn true;\n\t}\n};\n\nexports.AuthenticatorClass = HeaderAuthenticator;\n\n})();\n","type":"application/javascript","module-type":"authenticator"},"$:/core/modules/server/routes/delete-tiddler.js":{"title":"$:/core/modules/server/routes/delete-tiddler.js","text":"/*\\\ntitle: $:/core/modules/server/routes/delete-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nDELETE /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"DELETE\";\n\nexports.path = /^\\/bags\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = $tw.utils.decodeURIComponentSafe(state.params[0]);\n\tstate.wiki.deleteTiddler(title);\n\tresponse.writeHead(204, \"OK\", {\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n","type":"application/javascript","module-type":"route"},"$:/core/modules/server/routes/get-favicon.js":{"title":"$:/core/modules/server/routes/get-favicon.js","text":"/*\\\ntitle: $:/core/modules/server/routes/get-favicon.js\ntype: application/javascript\nmodule-type: route\n\nGET /favicon.ico\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/favicon.ico$/;\n\nexports.handler = function(request,response,state) {\n\tvar buffer = state.wiki.getTiddlerText(\"$:/favicon.ico\",\"\");\n\tstate.sendResponse(200,{\"Content-Type\": \"image/x-icon\"},buffer,\"base64\");\n};\n\n}());\n","type":"application/javascript","module-type":"route"},"$:/core/modules/server/routes/get-file.js":{"title":"$:/core/modules/server/routes/get-file.js","text":"/*\\\ntitle: $:/core/modules/server/routes/get-file.js\ntype: application/javascript\nmodule-type: route\n\nGET /files/:filepath\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/files\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar path = require(\"path\"),\n\t\tfs = require(\"fs\"),\n\t\tutil = require(\"util\"),\n\t\tsuppliedFilename = $tw.utils.decodeURIComponentSafe(state.params[0]),\n\t\tbaseFilename = path.resolve(state.boot.wikiPath,\"files\"),\n\t\tfilename = path.resolve(baseFilename,suppliedFilename),\n\t\textension = path.extname(filename);\n\t// Check that the filename is inside the wiki files folder\n\tif(path.relative(baseFilename,filename).indexOf(\"..\") !== 0) {\n\t\t// Send the file\n\t\tfs.readFile(filename,function(err,content) {\n\t\t\tvar status,content,type = \"text/plain\";\n\t\t\tif(err) {\n\t\t\t\tconsole.log(\"Error accessing file \" + filename + \": \" + err.toString());\n\t\t\t\tstatus = 404;\n\t\t\t\tcontent = \"File '\" + suppliedFilename + \"' not found\";\n\t\t\t} else {\n\t\t\t\tstatus = 200;\n\t\t\t\tcontent = content;\n\t\t\t\ttype = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : \"application/octet-stream\");\n\t\t\t}\n\t\t\tstate.sendResponse(status,{\"Content-Type\": type},content);\n\t\t});\n\t} else {\n\t\tstate.sendResponse(404,{\"Content-Type\": \"text/plain\"},\"File '\" + suppliedFilename + \"' not found\");\n\t}\n};\n\n}());\n","type":"application/javascript","module-type":"route"},"$:/core/modules/server/routes/get-index.js":{"title":"$:/core/modules/server/routes/get-index.js","text":"/*\\\ntitle: $:/core/modules/server/routes/get-index.js\ntype: application/javascript\nmodule-type: route\n\nGET /\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/$/;\n\nexports.handler = function(request,response,state) {\n\tvar text = state.wiki.renderTiddler(state.server.get(\"root-render-type\"),state.server.get(\"root-tiddler\")),\n\t\tresponseHeaders = {\n\t\t\"Content-Type\": state.server.get(\"root-serve-type\")\n\t};\n\tstate.sendResponse(200,responseHeaders,text);\n};\n\n}());\n","type":"application/javascript","module-type":"route"},"$:/core/modules/server/routes/get-login-basic.js":{"title":"$:/core/modules/server/routes/get-login-basic.js","text":"/*\\\ntitle: $:/core/modules/server/routes/get-login-basic.js\ntype: application/javascript\nmodule-type: route\n\nGET /login-basic -- force a Basic Authentication challenge\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/login-basic$/;\n\nexports.handler = function(request,response,state) {\n\tif(!state.authenticatedUsername) {\n\t\t// Challenge if there's no username\n\t\tresponse.writeHead(401,{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\n\t} else {\n\t\t// Redirect to the root wiki if login worked\n\t\tvar location = ($tw.syncadaptor && $tw.syncadaptor.host)? $tw.syncadaptor.host: \"/\";\n\t\tresponse.writeHead(302,{\n\t\t\tLocation: location\n\t\t});\n\t\tresponse.end();\n\t}\n};\n\n}());\n","type":"application/javascript","module-type":"route"},"$:/core/modules/server/routes/get-status.js":{"title":"$:/core/modules/server/routes/get-status.js","text":"/*\\\ntitle: $:/core/modules/server/routes/get-status.js\ntype: application/javascript\nmodule-type: route\n\nGET /status\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/status$/;\n\nexports.handler = function(request,response,state) {\n\tvar text = JSON.stringify({\n\t\tusername: state.authenticatedUsername || state.server.get(\"anon-username\") || \"\",\n\t\tanonymous: !state.authenticatedUsername,\n\t\tread_only: !state.server.isAuthorized(\"writers\",state.authenticatedUsername),\n\t\tlogout_is_available: false,\n\t\tspace: {\n\t\t\trecipe: \"default\"\n\t\t},\n\t\ttiddlywiki_version: $tw.version\n\t});\n\tstate.sendResponse(200,{\"Content-Type\": \"application/json\"},text,\"utf8\");\n};\n\n}());\n","type":"application/javascript","module-type":"route"},"$:/core/modules/server/routes/get-tiddler-html.js":{"title":"$:/core/modules/server/routes/get-tiddler-html.js","text":"/*\\\ntitle: $:/core/modules/server/routes/get-tiddler-html.js\ntype: application/javascript\nmodule-type: route\n\nGET /:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/([^\\/]+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = $tw.utils.decodeURIComponentSafe(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar renderType = tiddler.getFieldString(\"_render_type\"),\n\t\t\trenderTemplate = tiddler.getFieldString(\"_render_template\");\n\t\t// Tiddler fields '_render_type' and '_render_template' overwrite\n\t\t// system wide settings for render type and template\n\t\tif(state.wiki.isSystemTiddler(title)) {\n\t\t\trenderType = renderType || state.server.get(\"system-tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"system-tiddler-render-template\");\n\t\t} else {\n\t\t\trenderType = renderType || state.server.get(\"tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"tiddler-render-template\");\n\t\t}\n\t\tvar text = state.wiki.renderTiddler(renderType,renderTemplate,{parseAsInline: true, variables: {currentTiddler: title}});\n\n\t\t// Naughty not to set a content-type, but it's the easiest way to ensure the browser will see HTML pages as HTML, and accept plain text tiddlers as CSS or JS\n\t\tstate.sendResponse(200,{},text,\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n","type":"application/javascript","module-type":"route"},"$:/core/modules/server/routes/get-tiddler.js":{"title":"$:/core/modules/server/routes/get-tiddler.js","text":"/*\\\ntitle: $:/core/modules/server/routes/get-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = $tw.utils.decodeURIComponentSafe(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title),\n\t\ttiddlerFields = {},\n\t\tknownFields = [\n\t\t\t\"bag\", \"created\", \"creator\", \"modified\", \"modifier\", \"permissions\", \"recipe\", \"revision\", \"tags\", \"text\", \"title\", \"type\", \"uri\"\n\t\t];\n\tif(tiddler) {\n\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\tif(knownFields.indexOf(name) !== -1) {\n\t\t\t\ttiddlerFields[name] = value;\n\t\t\t} else {\n\t\t\t\ttiddlerFields.fields = tiddlerFields.fields || {};\n\t\t\t\ttiddlerFields.fields[name] = value;\n\t\t\t}\n\t\t});\n\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\ttiddlerFields.bag = \"default\";\n\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\tstate.sendResponse(200,{\"Content-Type\": \"application/json\"},JSON.stringify(tiddlerFields),\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n","type":"application/javascript","module-type":"route"},"$:/core/modules/server/routes/get-tiddlers-json.js":{"title":"$:/core/modules/server/routes/get-tiddlers-json.js","text":"/*\\\ntitle: $:/core/modules/server/routes/get-tiddlers-json.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers.json?filter=<filter>\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_FILTER = \"[all[tiddlers]!is[system]sort[title]]\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers.json$/;\n\nexports.handler = function(request,response,state) {\n\tvar filter = state.queryParameters.filter || DEFAULT_FILTER;\n\tif(state.wiki.getTiddlerText(\"$:/config/Server/AllowAllExternalFilters\") !== \"yes\") {\n\t\tif(state.wiki.getTiddlerText(\"$:/config/Server/ExternalFilters/\" + filter) !== \"yes\") {\n\t\t\tconsole.log(\"Blocked attempt to GET /recipes/default/tiddlers.json with filter: \" + filter);\n\t\t\tresponse.writeHead(403);\n\t\t\tresponse.end();\n\t\t\treturn;\n\t\t}\n\t}\n\tif(state.wiki.getTiddlerText(\"$:/config/SyncSystemTiddlersFromServer\") === \"no\") {\n\t\tfilter += \"+[!is[system]]\";\n\t}\n\tvar excludeFields = (state.queryParameters.exclude || \"text\").split(\",\"),\n\t\ttitles = state.wiki.filterTiddlers(filter);\n\tvar tiddlers = [];\n\t$tw.utils.each(titles,function(title) {\n\t\tvar tiddler = state.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tvar tiddlerFields = tiddler.getFieldStrings({exclude: excludeFields});\n\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\ttiddlers.push(tiddlerFields);\n\t\t}\n\t});\n\tvar text = JSON.stringify(tiddlers);\n\tstate.sendResponse(200,{\"Content-Type\": \"application/json\"},text,\"utf8\");\n};\n\n}());\n","type":"application/javascript","module-type":"route"},"$:/core/modules/server/routes/put-tiddler.js":{"title":"$:/core/modules/server/routes/put-tiddler.js","text":"/*\\\ntitle: $:/core/modules/server/routes/put-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nPUT /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"PUT\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = $tw.utils.decodeURIComponentSafe(state.params[0]),\n\tfields = $tw.utils.parseJSONSafe(state.data);\n\t// Pull up any subfields in the `fields` object\n\tif(fields.fields) {\n\t\t$tw.utils.each(fields.fields,function(field,name) {\n\t\t\tfields[name] = field;\n\t\t});\n\t\tdelete fields.fields;\n\t}\n\t// Remove any revision field\n\tif(fields.revision) {\n\t\tdelete fields.revision;\n\t}\n\t// If this is a skinny tiddler, it means the client never got the full\n\t// version of the tiddler to edit. So we must preserve whatever text\n\t// already exists on the server, or else we'll inadvertently delete it.\n\tif(fields._is_skinny !== undefined) {\n\t\tvar tiddler = state.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tfields.text = tiddler.fields.text;\n\t\t}\n\t\tdelete fields._is_skinny;\n\t}\n\tstate.wiki.addTiddler(new $tw.Tiddler(fields,{title: title}));\n\tvar changeCount = state.wiki.getChangeCount(title).toString();\n\tresponse.writeHead(204, \"OK\",{\n\t\tEtag: \"\\\"default/\" + encodeURIComponent(title) + \"/\" + changeCount + \":\\\"\",\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n","type":"application/javascript","module-type":"route"},"$:/core/modules/server/server.js":{"title":"$:/core/modules/server/server.js","text":"/*\\\ntitle: $:/core/modules/server/server.js\ntype: application/javascript\nmodule-type: library\n\nServe tiddlers over http\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\"),\n\t\tquerystring = require(\"querystring\"),\n\t\tcrypto = require(\"crypto\"),\n\t\tzlib = require(\"zlib\");\n}\n\n/*\nA simple HTTP server with regexp-based routes\noptions: variables - optional hashmap of variables to set (a misnomer - they are really constant parameters)\n\t\t routes - optional array of routes to use\n\t\t wiki - reference to wiki object\n*/\nfunction Server(options) {\n\tvar self = this;\n\tthis.routes = options.routes || [];\n\tthis.authenticators = options.authenticators || [];\n\tthis.wiki = options.wiki;\n\tthis.boot = options.boot || $tw.boot;\n\t// Initialise the variables\n\tthis.variables = $tw.utils.extend({},this.defaultVariables);\n\tif(options.variables) {\n\t\tfor(var variable in options.variables) {\n\t\t\tif(options.variables[variable]) {\n\t\t\t\tthis.variables[variable] = options.variables[variable];\n\t\t\t}\n\t\t}\n\t}\n\t// Setup the default required plugins\n\tthis.requiredPlugins = this.get(\"required-plugins\").split(',');\n\t// Initialise CSRF\n\tthis.csrfDisable = this.get(\"csrf-disable\") === \"yes\";\n\t// Initialize Gzip compression\n\tthis.enableGzip = this.get(\"gzip\") === \"yes\";\n\t// Initialize browser-caching\n\tthis.enableBrowserCache = this.get(\"use-browser-cache\") === \"yes\";\n\t// Initialise authorization\n\tvar authorizedUserName;\n\tif(this.get(\"username\") && this.get(\"password\")) {\n\t\tauthorizedUserName = this.get(\"username\");\n\t} else if(this.get(\"credentials\")) {\n\t\tauthorizedUserName = \"(authenticated)\";\n\t} else {\n\t\tauthorizedUserName = \"(anon)\";\n\t}\n\tthis.authorizationPrincipals = {\n\t\treaders: (this.get(\"readers\") || authorizedUserName).split(\",\").map($tw.utils.trim),\n\t\twriters: (this.get(\"writers\") || authorizedUserName).split(\",\").map($tw.utils.trim)\n\t}\n\tif(this.get(\"admin\") || authorizedUserName !== \"(anon)\") {\n\t\tthis.authorizationPrincipals[\"admin\"] = (this.get(\"admin\") || authorizedUserName).split(',').map($tw.utils.trim)\n\t}\n\t// Load and initialise authenticators\n\t$tw.modules.forEachModuleOfType(\"authenticator\", function(title,authenticatorDefinition) {\n\t\t// console.log(\"Loading authenticator \" + title);\n\t\tself.addAuthenticator(authenticatorDefinition.AuthenticatorClass);\n\t});\n\t// Load route handlers\n\t$tw.modules.forEachModuleOfType(\"route\", function(title,routeDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addRoute(routeDefinition);\n\t});\n\t// Initialise the http vs https\n\tthis.listenOptions = null;\n\tthis.protocol = \"http\";\n\tvar tlsKeyFilepath = this.get(\"tls-key\"),\n\t\ttlsCertFilepath = this.get(\"tls-cert\"),\n\t\ttlsPassphrase = this.get(\"tls-passphrase\");\n\tif(tlsCertFilepath && tlsKeyFilepath) {\n\t\tthis.listenOptions = {\n\t\t\tkey: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsKeyFilepath),\"utf8\"),\n\t\t\tcert: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsCertFilepath),\"utf8\"),\n\t\t\tpassphrase: tlsPassphrase || ''\n\t\t};\n\t\tthis.protocol = \"https\";\n\t}\n\tthis.transport = require(this.protocol);\n\t// Name the server and init the boot state\n\tthis.servername = $tw.utils.transliterateToSafeASCII(this.get(\"server-name\") || this.wiki.getTiddlerText(\"$:/SiteTitle\") || \"TiddlyWiki5\");\n\tthis.boot.origin = this.get(\"origin\")? this.get(\"origin\"): this.protocol+\"://\"+this.get(\"host\")+\":\"+this.get(\"port\");\n\tthis.boot.pathPrefix = this.get(\"path-prefix\") || \"\";\n}\n\n/*\nSend a response to the client. This method checks if the response must be sent\nor if the client alrady has the data cached. If that's the case only a 304\nresponse will be transmitted and the browser will use the cached data.\nOnly requests with status code 200 are considdered for caching.\nrequest: request instance passed to the handler\nresponse: response instance passed to the handler\nstatusCode: stauts code to send to the browser\nheaders: response headers (they will be augmented with an `Etag` header)\ndata: the data to send (passed to the end method of the response instance)\nencoding: the encoding of the data to send (passed to the end method of the response instance)\n*/\nfunction sendResponse(request,response,statusCode,headers,data,encoding) {\n\tif(this.enableBrowserCache && (statusCode == 200)) {\n\t\tvar hash = crypto.createHash('md5');\n\t\t// Put everything into the hash that could change and invalidate the data that\n\t\t// the browser already stored. The headers the data and the encoding.\n\t\thash.update(data);\n\t\thash.update(JSON.stringify(headers));\n\t\tif(encoding) {\n\t\t\thash.update(encoding);\n\t\t}\n\t\tvar contentDigest = hash.digest(\"hex\");\n\t\t// RFC 7232 section 2.3 mandates for the etag to be enclosed in quotes\n\t\theaders[\"Etag\"] = '\"' + contentDigest + '\"';\n\t\theaders[\"Cache-Control\"] = \"max-age=0, must-revalidate\";\n\t\t// Check if any of the hashes contained within the if-none-match header\n\t\t// matches the current hash.\n\t\t// If one matches, do not send the data but tell the browser to use the\n\t\t// cached data.\n\t\t// We do not implement \"*\" as it makes no sense here.\n\t\tvar ifNoneMatch = request.headers[\"if-none-match\"];\n\t\tif(ifNoneMatch) {\n\t\t\tvar matchParts = ifNoneMatch.split(\",\").map(function(etag) {\n\t\t\t\treturn etag.replace(/^[ \"]+|[ \"]+$/g, \"\");\n\t\t\t});\n\t\t\tif(matchParts.indexOf(contentDigest) != -1) {\n\t\t\t\tresponse.writeHead(304,headers);\n\t\t\t\tresponse.end();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// RFC 7231, 6.1. Overview of Status Codes:\n\t\t// Browser clients may cache 200, 203, 204, 206, 300, 301, \n\t\t// 404, 405, 410, 414, and 501 unless given explicit cache controls\n\t\theaders[\"Cache-Control\"] = headers[\"Cache-Control\"] || \"no-store\";\n\t}\n\t/*\n\tIf the gzip=yes is set, check if the user agent permits compression. If so,\n\tcompress our response if the raw data is bigger than 2k. Compressing less\n\tdata is inefficient. Note that we use the synchronous functions from zlib\n\tto stay in the imperative style. The current `Server` doesn't depend on\n\tthis, and we may just as well use the async versions.\n\t*/\n\tif(this.enableGzip && (data.length > 2048)) {\n\t\tvar acceptEncoding = request.headers[\"accept-encoding\"] || \"\";\n\t\tif(/\\bdeflate\\b/.test(acceptEncoding)) {\n\t\t\theaders[\"Content-Encoding\"] = \"deflate\";\n\t\t\tdata = zlib.deflateSync(data);\n\t\t} else if(/\\bgzip\\b/.test(acceptEncoding)) {\n\t\t\theaders[\"Content-Encoding\"] = \"gzip\";\n\t\t\tdata = zlib.gzipSync(data);\n\t\t}\n\t}\n\n\tresponse.writeHead(statusCode,headers);\n\tresponse.end(data,encoding);\n}\n\nServer.prototype.defaultVariables = {\n\tport: \"8080\",\n\thost: \"127.0.0.1\",\n\t\"required-plugins\": \"$:/plugins/tiddlywiki/filesystem,$:/plugins/tiddlywiki/tiddlyweb\",\n\t\"root-tiddler\": \"$:/core/save/all\",\n\t\"root-render-type\": \"text/plain\",\n\t\"root-serve-type\": \"text/html\",\n\t\"tiddler-render-type\": \"text/html\",\n\t\"tiddler-render-template\": \"$:/core/templates/server/static.tiddler.html\",\n\t\"system-tiddler-render-type\": \"text/plain\",\n\t\"system-tiddler-render-template\": \"$:/core/templates/wikified-tiddler\",\n\t\"debug-level\": \"none\",\n\t\"gzip\": \"no\",\n\t\"use-browser-cache\": \"no\"\n};\n\nServer.prototype.get = function(name) {\n\treturn this.variables[name];\n};\n\nServer.prototype.addRoute = function(route) {\n\tthis.routes.push(route);\n};\n\nServer.prototype.addAuthenticator = function(AuthenticatorClass) {\n\t// Instantiate and initialise the authenticator\n\tvar authenticator = new AuthenticatorClass(this),\n\t\tresult = authenticator.init();\n\tif(typeof result === \"string\") {\n\t\t$tw.utils.error(\"Error: \" + result);\n\t} else if(result) {\n\t\t// Only use the authenticator if it initialised successfully\n\t\tthis.authenticators.push(authenticator);\n\t}\n};\n\nServer.prototype.findMatchingRoute = function(request,state) {\n\tfor(var t=0; t<this.routes.length; t++) {\n\t\tvar potentialRoute = this.routes[t],\n\t\t\tpathRegExp = potentialRoute.path,\n\t\t\tpathname = state.urlInfo.pathname,\n\t\t\tmatch;\n\t\tif(state.pathPrefix) {\n\t\t\tif(pathname.substr(0,state.pathPrefix.length) === state.pathPrefix) {\n\t\t\t\tpathname = pathname.substr(state.pathPrefix.length) || \"/\";\n\t\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t\t} else {\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t}\n\t\tif(match && request.method === potentialRoute.method) {\n\t\t\tstate.params = [];\n\t\t\tfor(var p=1; p<match.length; p++) {\n\t\t\t\tstate.params.push(match[p]);\n\t\t\t}\n\t\t\treturn potentialRoute;\n\t\t}\n\t}\n\treturn null;\n};\n\nServer.prototype.methodMappings = {\n\t\"GET\": \"readers\",\n\t\"OPTIONS\": \"readers\",\n\t\"HEAD\": \"readers\",\n\t\"PUT\": \"writers\",\n\t\"POST\": \"writers\",\n\t\"DELETE\": \"writers\"\n};\n\n/*\nCheck whether a given user is authorized for the specified authorizationType (\"readers\" or \"writers\"). Pass null or undefined as the username to check for anonymous access\n*/\nServer.prototype.isAuthorized = function(authorizationType,username) {\n\tvar principals = this.authorizationPrincipals[authorizationType] || [];\n\treturn principals.indexOf(\"(anon)\") !== -1 || (username && (principals.indexOf(\"(authenticated)\") !== -1 || principals.indexOf(username) !== -1));\n}\n\nServer.prototype.requestHandler = function(request,response,options) {\n\toptions = options || {};\n\t// Compose the state object\n\tvar self = this;\n\tvar state = {};\n\tstate.wiki = options.wiki || self.wiki;\n\tstate.boot = options.boot || self.boot;\n\tstate.server = self;\n\tstate.urlInfo = url.parse(request.url);\n\tstate.queryParameters = querystring.parse(state.urlInfo.query);\n\tstate.pathPrefix = options.pathPrefix || this.get(\"path-prefix\") || \"\";\n\tstate.sendResponse = sendResponse.bind(self,request,response);\n\t// Get the principals authorized to access this resource\n\tstate.authorizationType = options.authorizationType || this.methodMappings[request.method] || \"readers\";\n\t// Check for the CSRF header if this is a write\n\tif(!this.csrfDisable && state.authorizationType === \"writers\" && request.headers[\"x-requested-with\"] !== \"TiddlyWiki\") {\n\t\tresponse.writeHead(403,\"'X-Requested-With' header required to login to '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Check whether anonymous access is granted\n\tstate.allowAnon = this.isAuthorized(state.authorizationType,null);\n\t// Authenticate with the first active authenticator\n\tif(this.authenticators.length > 0) {\n\t\tif(!this.authenticators[0].authenticateRequest(request,response,state)) {\n\t\t\t// Bail if we failed (the authenticator will have sent the response)\n\t\t\treturn;\n\t\t}\n\t}\n\t// Authorize with the authenticated username\n\tif(!this.isAuthorized(state.authorizationType,state.authenticatedUsername)) {\n\t\tresponse.writeHead(401,\"'\" + state.authenticatedUsername + \"' is not authorized to access '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Find the route that matches this path\n\tvar route = self.findMatchingRoute(request,state);\n\t// Optionally output debug info\n\tif(self.get(\"debug-level\") !== \"none\") {\n\t\tconsole.log(\"Request path:\",JSON.stringify(state.urlInfo));\n\t\tconsole.log(\"Request headers:\",JSON.stringify(request.headers));\n\t\tconsole.log(\"authenticatedUsername:\",state.authenticatedUsername);\n\t}\n\t// Return a 404 if we didn't find a route\n\tif(!route) {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Receive the request body if necessary and hand off to the route handler\n\tif(route.bodyFormat === \"stream\" || request.method === \"GET\" || request.method === \"HEAD\") {\n\t\t// Let the route handle the request stream itself\n\t\troute.handler(request,response,state);\n\t} else if(route.bodyFormat === \"string\" || !route.bodyFormat) {\n\t\t// Set the encoding for the incoming request\n\t\trequest.setEncoding(\"utf8\");\n\t\tvar data = \"\";\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata += chunk.toString();\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = data;\n\t\t\troute.handler(request,response,state);\n\t\t});\n\t} else if(route.bodyFormat === \"buffer\") {\n\t\tvar data = [];\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata.push(chunk);\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = Buffer.concat(data);\n\t\t\troute.handler(request,response,state);\n\t\t})\n\t} else {\n\t\tresponse.writeHead(400,\"Invalid bodyFormat \" + route.bodyFormat + \" in route \" + route.method + \" \" + route.path.source);\n\t\tresponse.end();\n\t}\n};\n\n/*\nListen for requests\nport: optional port number (falls back to value of \"port\" variable)\nhost: optional host address (falls back to value of \"host\" variable)\nprefix: optional prefix (falls back to value of \"path-prefix\" variable)\n*/\nServer.prototype.listen = function(port,host,prefix) {\n\tvar self = this;\n\t// Handle defaults for port and host\n\tport = port || this.get(\"port\");\n\thost = host || this.get(\"host\");\n\tprefix = prefix || this.get(\"path-prefix\") || \"\";\n\t// Check for the port being a string and look it up as an environment variable\n\tif(parseInt(port,10).toString() !== port) {\n\t\tport = process.env[port] || 8080;\n\t}\n\t// Warn if required plugins are missing\n\tvar missing = [];\n\tfor (var index=0; index<this.requiredPlugins.length; index++) {\n\t\tif (!this.wiki.getTiddler(this.requiredPlugins[index])) {\n\t\t\tmissing.push(this.requiredPlugins[index]);\n\t\t}\n\t}\n\tif(missing.length > 0) {\n\t\tvar error = \"Warning: Plugin(s) required for client-server operation are missing.\\n\"+\n\t\t\t\"\\\"\"+ missing.join(\"\\\", \\\"\")+\"\\\"\";\n\t\t$tw.utils.warning(error);\n\t}\n\t// Create the server\n\tvar server;\n\tif(this.listenOptions) {\n\t\tserver = this.transport.createServer(this.listenOptions,this.requestHandler.bind(this));\n\t} else {\n\t\tserver = this.transport.createServer(this.requestHandler.bind(this));\n\t}\n\t// Display the port number after we've started listening (the port number might have been specified as zero, in which case we will get an assigned port)\n\tserver.on(\"listening\",function() {\n\t\tvar address = server.address(),\n\t\t\turl = self.protocol + \"://\" + (address.family === \"IPv6\" ? \"[\" + address.address + \"]\" : address.address) + \":\" + address.port + prefix;\n\t\t$tw.utils.log(\"Serving on \" + url,\"brown/orange\");\n\t\t$tw.utils.log(\"(press ctrl-C to exit)\",\"red\");\n\t});\n\t// Listen\n\treturn server.listen(port,host);\n};\n\nexports.Server = Server;\n\n})();\n","type":"application/javascript","module-type":"library"},"$:/core/modules/browser-messaging.js":{"title":"$:/core/modules/browser-messaging.js","text":"/*\\\ntitle: $:/core/modules/browser-messaging.js\ntype: application/javascript\nmodule-type: startup\n\nBrowser message handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"browser-messaging\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*\nLoad a specified url as an iframe and call the callback when it is loaded. If the url is already loaded then the existing iframe instance is used\n*/\nfunction loadIFrame(url,callback) {\n\t// Check if iframe already exists\n\tvar iframeInfo = $tw.browserMessaging.iframeInfoMap[url];\n\tif(iframeInfo) {\n\t\t// We've already got the iframe\n\t\tcallback(null,iframeInfo);\n\t} else {\n\t\t// Create the iframe and save it in the list\n\t\tvar iframe = document.createElement(\"iframe\");\n\t\tiframeInfo = {\n\t\t\turl: url,\n\t\t\tstatus: \"loading\",\n\t\t\tdomNode: iframe\n\t\t};\n\t\t$tw.browserMessaging.iframeInfoMap[url] = iframeInfo;\n\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t// Add the iframe to the DOM and hide it\n\t\tiframe.style.display = \"none\";\n\t\tiframe.setAttribute(\"library\",\"true\");\n\t\tdocument.body.appendChild(iframe);\n\t\t// Set up onload\n\t\tiframe.onload = function() {\n\t\t\tiframeInfo.status = \"loaded\";\n\t\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t\tcallback(null,iframeInfo);\n\t\t};\n\t\tiframe.onerror = function() {\n\t\t\tcallback(\"Cannot load iframe\");\n\t\t};\n\t\ttry {\n\t\t\tiframe.src = url;\n\t\t} catch(ex) {\n\t\t\tcallback(ex);\n\t\t}\n\t}\n}\n\n/*\nUnload library iframe for given url\n*/\nfunction unloadIFrame(url){\n\tvar iframes = document.getElementsByTagName('iframe');\n\tfor(var t=iframes.length-1; t--; t>=0) {\n\t\tvar iframe = iframes[t];\n\t\tif(iframe.getAttribute(\"library\") === \"true\" &&\n\t\t  iframe.getAttribute(\"src\") === url) {\n\t\t\tiframe.parentNode.removeChild(iframe);\n\t\t}\n\t}\n}\n\nfunction saveIFrameInfoTiddler(iframeInfo) {\n\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),{\n\t\ttitle: \"$:/temp/ServerConnection/\" + iframeInfo.url,\n\t\ttext: iframeInfo.status,\n\t\ttags: [\"$:/tags/ServerConnection\"],\n\t\turl: iframeInfo.url\n\t},$tw.wiki.getModificationFields()));\n}\n\nexports.startup = function() {\n\t// Initialise the store of iframes we've created\n\t$tw.browserMessaging = {\n\t\tiframeInfoMap: {} // Hashmap by URL of {url:,status:\"loading/loaded\",domNode:}\n\t};\n\t// Listen for widget messages to control loading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\tif(url) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers.json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-info\",\n\t\t\t\t\t\t\tinfoTitlePrefix: paramObject.infoTitlePrefix || \"$:/temp/RemoteAssetInfo/\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for widget messages to control unloading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-unload-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\t$tw.browserMessaging.iframeInfoMap[url] = undefined;\n\t\tif(url) {\n\t\t\tunloadIFrame(url);\n\t\t\t$tw.utils.each(\n\t\t\t\t$tw.wiki.filterTiddlers(\"[[$:/temp/ServerConnection/\" + url + \"]] [prefix[$:/temp/RemoteAssetInfo/\" + url + \"/]]\"),\n\t\t\t\tfunction(title) {\n\t\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-from-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url,\n\t\t\ttitle = paramObject.title;\n\t\tif(url && title) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers/\" + encodeURIComponent(title) + \".json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-tiddler\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for window messages from other windows\n\twindow.addEventListener(\"message\",function listener(event){\n\t\t// console.log(\"browser-messaging: \",document.location.toString())\n\t\t// console.log(\"browser-messaging: Received message from\",event.origin);\n\t\t// console.log(\"browser-messaging: Message content\",event.data);\n\t\tswitch(event.data.verb) {\n\t\t\tcase \"GET-RESPONSE\":\n\t\t\t\tif(event.data.status.charAt(0) === \"2\") {\n\t\t\t\t\tif(event.data.cookies) {\n\t\t\t\t\t\tif(event.data.cookies.type === \"save-info\") {\n\t\t\t\t\t\t\tvar tiddlers = $tw.utils.parseJSONSafe(event.data.body);\n\t\t\t\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\t\t\t\t\ttitle: event.data.cookies.infoTitlePrefix + event.data.cookies.url + \"/\" + tiddler.title,\n\t\t\t\t\t\t\t\t\t\"original-title\": tiddler.title,\n\t\t\t\t\t\t\t\t\ttext: \"\",\n\t\t\t\t\t\t\t\t\ttype: \"text/vnd.tiddlywiki\",\n\t\t\t\t\t\t\t\t\t\"original-type\": tiddler.type,\n\t\t\t\t\t\t\t\t\t\"plugin-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-plugin-type\": tiddler[\"plugin-type\"],\n\t\t\t\t\t\t\t\t\t\"module-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-module-type\": tiddler[\"module-type\"],\n\t\t\t\t\t\t\t\t\ttags: [\"$:/tags/RemoteAssetInfo\"],\n\t\t\t\t\t\t\t\t\t\"original-tags\": $tw.utils.stringifyList(tiddler.tags || []),\n\t\t\t\t\t\t\t\t\t\"server-url\": event.data.cookies.url\n\t\t\t\t\t\t\t\t},$tw.wiki.getModificationFields()));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if(event.data.cookies.type === \"save-tiddler\") {\n\t\t\t\t\t\t\tvar tiddler = $tw.utils.parseJSONSafe(event.data.body);\n\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t},false);\n};\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/core/modules/startup/commands.js":{"title":"$:/core/modules/startup/commands.js","text":"/*\\\ntitle: $:/core/modules/startup/commands.js\ntype: application/javascript\nmodule-type: startup\n\nCommand processing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"commands\";\nexports.platforms = [\"node\"];\nexports.after = [\"story\"];\nexports.synchronous = false;\n\nexports.startup = function(callback) {\n\t// On the server, start a commander with the command line arguments\n\tvar commander = new $tw.Commander(\n\t\t$tw.boot.argv,\n\t\tfunction(err) {\n\t\t\tif(err) {\n\t\t\t\treturn $tw.utils.error(\"Error: \" + err);\n\t\t\t}\n\t\t\tcallback();\n\t\t},\n\t\t$tw.wiki,\n\t\t{output: process.stdout, error: process.stderr}\n\t);\n\tcommander.execute();\n};\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/core/modules/startup/favicon.js":{"title":"$:/core/modules/startup/favicon.js","text":"/*\\\ntitle: $:/core/modules/startup/favicon.js\ntype: application/javascript\nmodule-type: startup\n\nFavicon handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"favicon\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Favicon tiddler\nvar FAVICON_TITLE = \"$:/favicon.ico\";\n\nexports.startup = function() {\n\t// Set up the favicon\n\tsetFavicon();\n\t// Reset the favicon when the tiddler changes\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,FAVICON_TITLE)) {\n\t\t\tsetFavicon();\n\t\t}\n\t});\n};\n\nfunction setFavicon() {\n\tvar tiddler = $tw.wiki.getTiddler(FAVICON_TITLE);\n\tif(tiddler) {\n\t\tvar faviconLink = document.getElementById(\"faviconLink\");\n\t\tfaviconLink.setAttribute(\"href\",$tw.utils.makeDataUri(tiddler.fields.text,tiddler.fields.type,tiddler.fields._canonical_uri));\n\t}\n}\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/core/modules/startup/info.js":{"title":"$:/core/modules/startup/info.js","text":"/*\\\ntitle: $:/core/modules/startup/info.js\ntype: application/javascript\nmodule-type: startup\n\nInitialise $:/info tiddlers via $:/temp/info-plugin pseudo-plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"info\";\nexports.before = [\"startup\"];\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_INFO_PLUGIN = \"$:/temp/info-plugin\";\n\nexports.startup = function() {\n\t// Function to bake the info plugin with new tiddlers\n\tvar updateInfoPlugin = function(tiddlerFieldsArray) {\n\t\t// Get the existing tiddlers\n\t\tvar json = $tw.wiki.getTiddlerData(TITLE_INFO_PLUGIN,{tiddlers: {}});\n\t\t// Add the new ones\n\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\tif(fields && fields.title) {\n\t\t\t\tjson.tiddlers[fields.title] = fields;\n\t\t\t}\n\t\t});\n\t\t// Bake the info tiddlers into a plugin. We use the non-standard plugin-type \"info\" because ordinary plugins are only registered asynchronously after being loaded dynamically\n\t\tvar fields = {\n\t\t\ttitle: TITLE_INFO_PLUGIN,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"info\",\n\t\t\ttext: JSON.stringify(json,null,$tw.config.preferences.jsonSpaces)\n\t\t};\n\t\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\n\t};\n\t// Collect up the info tiddlers\n\tvar tiddlerFieldsArray = [];\n\t// Give each info module a chance to provide as many info tiddlers as they want as an array, and give them a callback for dynamically updating them\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tArray.prototype.push.apply(tiddlerFieldsArray,moduleExports.getInfoTiddlerFields(updateInfoPlugin));\n\t\t}\n\t});\n\tupdateInfoPlugin(tiddlerFieldsArray);\n\tvar changes = $tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]);\n\t$tw.wiki.registerPluginTiddlers(\"info\",[TITLE_INFO_PLUGIN]);\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/core/modules/startup/load-modules.js":{"title":"$:/core/modules/startup/load-modules.js","text":"/*\\\ntitle: $:/core/modules/startup/load-modules.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"load-modules\";\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Load modules\n\t$tw.modules.applyMethods(\"utils\",$tw.utils);\n\tif($tw.node) {\n\t\t$tw.modules.applyMethods(\"utils-node\",$tw.utils);\n\t}\n\tif($tw.browser) {\n\t\t$tw.modules.applyMethods(\"utils-browser\",$tw.utils);\n\t}\n\t$tw.modules.applyMethods(\"global\",$tw);\n\t$tw.modules.applyMethods(\"config\",$tw.config);\n\t$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap(\"tiddlerfield\");\n\t$tw.modules.applyMethods(\"tiddlermethod\",$tw.Tiddler.prototype);\n\t$tw.modules.applyMethods(\"wikimethod\",$tw.Wiki.prototype);\n\t$tw.wiki.addIndexersToWiki();\n\t$tw.modules.applyMethods(\"tiddlerdeserializer\",$tw.Wiki.tiddlerDeserializerModules);\n\t$tw.macros = $tw.modules.getModulesByTypeAsHashmap(\"macro\");\n\t$tw.wiki.initParsers();\n\t$tw.Commander.initCommands();\n};\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/core/modules/startup/password.js":{"title":"$:/core/modules/startup/password.js","text":"/*\\\ntitle: $:/core/modules/startup/password.js\ntype: application/javascript\nmodule-type: startup\n\nPassword handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"password\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t$tw.rootWidget.addEventListener(\"tm-set-password\",function(event) {\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: $tw.language.getString(\"Encryption/PromptSetPassword\"),\n\t\t\tnoUserName: true,\n\t\t\tsubmitText: $tw.language.getString(\"Encryption/SetPassword\"),\n\t\t\tcanCancel: true,\n\t\t\trepeatPassword: true,\n\t\t\tcallback: function(data) {\n\t\t\t\tif(data) {\n\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t}\n\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t}\n\t\t});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-clear-password\",function(event) {\n\t\tif($tw.browser) {\n\t\t\tif(!confirm($tw.language.getString(\"Encryption/ConfirmClearPassword\"))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$tw.crypto.setPassword(null);\n\t});\n\t// Ensure that $:/isEncrypted is maintained properly\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,\"$:/isEncrypted\")) {\n\t\t\t$tw.crypto.updateCryptoStateTiddler();\n\t\t}\n\t});\n};\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/core/modules/startup/plugins.js":{"title":"$:/core/modules/startup/plugins.js","text":"/*\\\ntitle: $:/core/modules/startup/plugins.js\ntype: application/javascript\nmodule-type: startup\n\nStartup logic concerned with managing plugins\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"plugins\";\nexports.after = [\"load-modules\"];\nexports.before = [\"startup\"];\nexports.synchronous = true;\n\nvar TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE = \"$:/status/RequireReloadDueToPluginChange\";\n\nvar PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = \"$:/config/RegisterPluginType/\";\n\nexports.startup = function() {\n\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"no\"});\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Work out which of the changed tiddlers are plugins that we need to reregister\n\t\tvar changesToProcess = [],\n\t\t\trequireReloadDueToPluginChange = false;\n\t\t$tw.utils.each(Object.keys(changes),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\t\trequiresReload = $tw.wiki.doesPluginRequireReload(title);\n\t\t\tif(requiresReload) {\n\t\t\t\trequireReloadDueToPluginChange = true;\n\t\t\t} else if(tiddler) {\n\t\t\t\tvar pluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif($tw.wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields[\"plugin-type\"] || \"\"),\"no\") === \"yes\") {\n\t\t\t\t\tchangesToProcess.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t// Issue warning if any of the tiddlers require a reload\n\t\tif(requireReloadDueToPluginChange) {\n\t\t\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"yes\"});\n\t\t}\n\t\t// Read or delete the plugin info of the changed tiddlers\n\t\tif(changesToProcess.length > 0) {\n\t\t\tvar changes = $tw.wiki.readPluginInfo(changesToProcess);\n\t\t\tif(changes.modifiedPlugins.length > 0 || changes.deletedPlugins.length > 0) {\n\t\t\t\tvar changedShadowTiddlers = {};\n\t\t\t\t// Collect the shadow tiddlers of any deleted plugins\n\t\t\t\t$tw.utils.each(changes.deletedPlugins,function(pluginTitle) {\n\t\t\t\t\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\n\t\t\t\t\tif(pluginInfo) {\n\t\t\t\t\t\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\n\t\t\t\t\t\t\tchangedShadowTiddlers[title] = true;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// Collect the shadow tiddlers of any modified plugins\n\t\t\t\t$tw.utils.each(changes.modifiedPlugins,function(pluginTitle) {\n\t\t\t\t\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\n\t\t\t\t\tif(pluginInfo && pluginInfo.tiddlers) {\n\t\t\t\t\t\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\n\t\t\t\t\t\t\tchangedShadowTiddlers[title] = false;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// (Re-)register any modified plugins\n\t\t\t\t$tw.wiki.registerPluginTiddlers(null,changes.modifiedPlugins);\n\t\t\t\t// Unregister any deleted plugins\n\t\t\t\t$tw.wiki.unregisterPluginTiddlers(null,changes.deletedPlugins);\n\t\t\t\t// Unpack the shadow tiddlers\n\t\t\t\t$tw.wiki.unpackPluginTiddlers();\n\t\t\t\t// Queue change events for the changed shadow tiddlers\n\t\t\t\t$tw.utils.each(Object.keys(changedShadowTiddlers),function(title) {\n\t\t\t\t\t$tw.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title]);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n};\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/core/modules/startup/render.js":{"title":"$:/core/modules/startup/render.js","text":"/*\\\ntitle: $:/core/modules/startup/render.js\ntype: application/javascript\nmodule-type: startup\n\nTitle, stylesheet and page rendering\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"render\";\nexports.platforms = [\"browser\"];\nexports.after = [\"story\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar PAGE_TITLE_TITLE = \"$:/core/wiki/title\";\nvar PAGE_STYLESHEET_TITLE = \"$:/core/ui/PageStylesheet\";\nvar PAGE_TEMPLATE_TITLE = \"$:/core/ui/RootTemplate\";\n\n// Time (in ms) that we defer refreshing changes to draft tiddlers\nvar DRAFT_TIDDLER_TIMEOUT_TITLE = \"$:/config/Drafts/TypingTimeout\";\nvar THROTTLE_REFRESH_TIMEOUT = 400;\n\nexports.startup = function() {\n\t// Set up the title\n\t$tw.titleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TITLE_TITLE, {\n\t\tdocument: $tw.fakeDocument,\n\t\tparseAsInline: true,\n\t\timportPageMacros: true,\n\t});\n\t$tw.titleContainer = $tw.fakeDocument.createElement(\"div\");\n\t$tw.titleWidgetNode.render($tw.titleContainer,null);\n\tdocument.title = $tw.titleContainer.textContent;\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.titleWidgetNode.refresh(changes,$tw.titleContainer,null)) {\n\t\t\tdocument.title = $tw.titleContainer.textContent;\n\t\t}\n\t});\n\t// Set up the styles\n\t$tw.styleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_STYLESHEET_TITLE,{document: $tw.fakeDocument});\n\t$tw.styleContainer = $tw.fakeDocument.createElement(\"style\");\n\t$tw.styleWidgetNode.render($tw.styleContainer,null);\n\t$tw.styleWidgetNode.assignedStyles = $tw.styleContainer.textContent;\n\t$tw.styleElement = document.createElement(\"style\");\n\t$tw.styleElement.innerHTML = $tw.styleWidgetNode.assignedStyles;\n\tdocument.head.insertBefore($tw.styleElement,document.head.firstChild);\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"styleRefresh\",function(changes) {\n\t\tif($tw.styleWidgetNode.refresh(changes,$tw.styleContainer,null)) {\n\t\t\tvar newStyles = $tw.styleContainer.textContent;\n\t\t\tif(newStyles !== $tw.styleWidgetNode.assignedStyles) {\n\t\t\t\t$tw.styleWidgetNode.assignedStyles = newStyles;\n\t\t\t\t$tw.styleElement.innerHTML = $tw.styleWidgetNode.assignedStyles;\n\t\t\t}\n\t\t}\n\t}));\n\t// Display the $:/core/ui/PageTemplate tiddler to kick off the display\n\t$tw.perf.report(\"mainRender\",function() {\n\t\t$tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget, recursionMarker: \"no\"});\n\t\t$tw.pageContainer = document.createElement(\"div\");\n\t\t$tw.utils.addClass($tw.pageContainer,\"tc-page-container-wrapper\");\n\t\tdocument.body.insertBefore($tw.pageContainer,document.body.firstChild);\n\t\t$tw.pageWidgetNode.render($tw.pageContainer,null);\n   \t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t})();\n\t// Remove any splash screen elements\n\tvar removeList = document.querySelectorAll(\".tc-remove-when-wiki-loaded\");\n\t$tw.utils.each(removeList,function(removeItem) {\n\t\tif(removeItem.parentNode) {\n\t\t\tremoveItem.parentNode.removeChild(removeItem);\n\t\t}\n\t});\n\t// Prepare refresh mechanism\n\tvar deferredChanges = Object.create(null),\n\t\ttimerId;\n\tfunction refresh() {\n\t\t// Process the refresh\n\t\t$tw.hooks.invokeHook(\"th-page-refreshing\");\n\t\t$tw.pageWidgetNode.refresh(deferredChanges);\n\t\tdeferredChanges = Object.create(null);\n\t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t}\n\tvar throttledRefresh = $tw.perf.report(\"throttledRefresh\",refresh);\n\n\t// Add the change event handler\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"mainRefresh\",function(changes) {\n\t\t// Check if only tiddlers that are throttled have changed\n\t\tvar onlyThrottledTiddlersHaveChanged = true;\n\t\tfor(var title in changes) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(!$tw.wiki.isVolatileTiddler(title) && (!tiddler || !(tiddler.hasField(\"draft.of\") || tiddler.hasField(\"throttle.refresh\")))) {\n\t\t\t\tonlyThrottledTiddlersHaveChanged = false;\n\t\t\t}\n\t\t}\n\t\t// Defer the change if only drafts have changed\n\t\tif(timerId) {\n\t\t\tclearTimeout(timerId);\n\t\t}\n\t\ttimerId = null;\n\t\tif(onlyThrottledTiddlersHaveChanged) {\n\t\t\tvar timeout = parseInt($tw.wiki.getTiddlerText(DRAFT_TIDDLER_TIMEOUT_TITLE,\"\"),10);\n\t\t\tif(isNaN(timeout)) {\n\t\t\t\ttimeout = THROTTLE_REFRESH_TIMEOUT;\n\t\t\t}\n\t\t\ttimerId = setTimeout(throttledRefresh,timeout);\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t} else {\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t\trefresh();\n\t\t}\n\t}));\n\t// Fix up the link between the root widget and the page container\n\t$tw.rootWidget.domNodes = [$tw.pageContainer];\n\t$tw.rootWidget.children = [$tw.pageWidgetNode];\n\t// Run any post-render startup actions\n\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/PostRender\");\n};\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/core/modules/startup/rootwidget.js":{"title":"$:/core/modules/startup/rootwidget.js","text":"/*\\\ntitle: $:/core/modules/startup/rootwidget.js\ntype: application/javascript\nmodule-type: startup\n\nSetup the root widget and the core root widget handlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"rootwidget\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"story\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Install the HTTP client event handler\n\t$tw.httpClient = new $tw.utils.HttpClient();\n\tvar getPropertiesWithPrefix = function(properties,prefix) {\n\t\tvar result = Object.create(null);\n\t\t$tw.utils.each(properties,function(value,name) {\n\t\t\tif(name.indexOf(prefix) === 0) {\n\t\t\t\tresult[name.substring(prefix.length)] = properties[name];\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t};\n\t$tw.rootWidget.addEventListener(\"tm-http-request\",function(event) {\n\t\tvar params = event.paramObject || {};\n\t\t$tw.httpClient.initiateHttpRequest({\n\t\t\twiki: event.widget.wiki,\n\t\t\turl: params.url,\n\t\t\tmethod: params.method,\n\t\t\tbody: params.body,\n\t\t\tbinary: params.binary,\n\t\t\tuseDefaultHeaders: params.useDefaultHeaders,\n\t\t\toncompletion: params.oncompletion,\n\t\t\tonprogress: params.onprogress,\n\t\t\tbindStatus: params[\"bind-status\"],\n\t\t\tbindProgress: params[\"bind-progress\"],\n\t\t\tvariables: getPropertiesWithPrefix(params,\"var-\"),\n\t\t\theaders: getPropertiesWithPrefix(params,\"header-\"),\n\t\t\tpasswordHeaders: getPropertiesWithPrefix(params,\"password-header-\"),\n\t\t\tqueryStrings: getPropertiesWithPrefix(params,\"query-\"),\n\t\t\tpasswordQueryStrings: getPropertiesWithPrefix(params,\"password-query-\"),\n\t\t\tbasicAuthUsername: params[\"basic-auth-username\"],\n\t\t\tbasicAuthUsernameFromStore: params[\"basic-auth-username-from-store\"],\n\t\t\tbasicAuthPassword: params[\"basic-auth-password\"],\n\t\t\tbasicAuthPasswordFromStore: params[\"basic-auth-password-from-store\"],\n\t\t\tbearerAuthToken: params[\"bearer-auth-token\"],\n\t\t\tbearerAuthTokenFromStore: params[\"bearer-auth-token-from-store\"]\n\t\t});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-http-cancel-all-requests\",function(event) {\n\t\t$tw.httpClient.cancelAllHttpRequests();\n\t});\n\t// Install the modal message mechanism\n\t$tw.modal = new $tw.utils.Modal($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-modal\",function(event) {\n\t\t$tw.modal.display(event.param,{variables: event.paramObject, event: event});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-show-switcher\",function(event) {\n\t\t$tw.modal.display(\"$:/core/ui/SwitcherModal\",{variables: event.paramObject, event: event});\n\t});\n\t// Install the notification  mechanism\n\t$tw.notifier = new $tw.utils.Notifier($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-notify\",function(event) {\n\t\t$tw.notifier.display(event.param,{variables: event.paramObject});\n\t});\n\t// Install the copy-to-clipboard  mechanism\n\t$tw.rootWidget.addEventListener(\"tm-copy-to-clipboard\",function(event) {\n\t\t$tw.utils.copyToClipboard(event.param,{\n\t\t\tsuccessNotification: event.paramObject && event.paramObject.successNotification,\n\t\t\tfailureNotification: event.paramObject && event.paramObject.failureNotification\n\t\t});\n\t});\n\t// Install the tm-focus-selector message\n\t$tw.rootWidget.addEventListener(\"tm-focus-selector\",function(event) {\n\t\tvar selector = event.param || \"\",\n\t\t\telement,\n\t\t    \tbaseElement = event.event && event.event.target ? event.event.target.ownerDocument : document;\n\t\telement = $tw.utils.querySelectorSafe(selector,baseElement);\n\t\tif(element && element.focus) {\n\t\t\telement.focus(event.paramObject);\n\t\t}\n\t});\n\t// Install the tm-rename-tiddler and tm-relink-tiddler messages\n\tvar makeRenameHandler = function(method) {\n\t\treturn function(event) {\n\t\t\tvar options = {},\n\t\t\t\tparamObject = event.paramObject || {},\n\t\t\t\tfrom = paramObject.from || event.tiddlerTitle,\n\t\t\t\tto = paramObject.to;\n\t\t\toptions.dontRenameInTags = (paramObject.renameInTags === \"false\" || paramObject.renameInTags === \"no\") ? true : false;\n\t\t\toptions.dontRenameInLists = (paramObject.renameInLists === \"false\" || paramObject.renameInLists === \"no\") ? true : false;\n\t\t\t$tw.wiki[method](from,to,options);\n\t\t};\n\t};\n\t$tw.rootWidget.addEventListener(\"tm-rename-tiddler\",makeRenameHandler(\"renameTiddler\"));\n\t$tw.rootWidget.addEventListener(\"tm-relink-tiddler\",makeRenameHandler(\"relinkTiddler\"));\n\t// Install the scroller\n\t$tw.pageScroller = new $tw.utils.PageScroller();\n\t$tw.rootWidget.addEventListener(\"tm-scroll\",function(event) {\n\t\t$tw.pageScroller.handleEvent(event);\n\t});\n\tvar fullscreen = $tw.utils.getFullScreenApis();\n\tif(fullscreen) {\n\t\t$tw.rootWidget.addEventListener(\"tm-full-screen\",function(event) {\n\t\t\tvar fullScreenDocument = event.event ? event.event.target.ownerDocument : document;\n\t\t\tif(event.param === \"enter\") {\n\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t} else if(event.param === \"exit\") {\n\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t} else {\n\t\t\t\tif(fullScreenDocument[fullscreen._fullscreenElement]) {\n\t\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t\t} else {\n\t\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/core/modules/startup.js":{"title":"$:/core/modules/startup.js","text":"/*\\\ntitle: $:/core/modules/startup.js\ntype: application/javascript\nmodule-type: startup\n\nMiscellaneous startup logic for both the client and server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"startup\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\n// Set to `true` to enable performance instrumentation\nvar PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE = \"$:/config/Performance/Instrumentation\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.startup = function() {\n\t// Minimal browser detection\n\tif($tw.browser) {\n\t\t$tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent));\n\t\t$tw.browser.isFirefox = !!document.mozFullScreenEnabled;\n\t\t// 2023-07-21 Edge returns UA below. So we use \"isChromeLike\"\n\t\t//'mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/114.0.0.0 safari/537.36 edg/114.0.1823.82'\n\t\t$tw.browser.isChromeLike = navigator.userAgent.toLowerCase().indexOf(\"chrome\") > -1;\n\t\t$tw.browser.hasTouch = !!window.matchMedia && window.matchMedia(\"(pointer: coarse)\").matches;\n\t\t$tw.browser.isMobileChrome = $tw.browser.isChromeLike && $tw.browser.hasTouch;\n\t}\n\t// Platform detection\n\t$tw.platform = {};\n\tif($tw.browser) {\n\t\t$tw.platform.isMac = /Mac/.test(navigator.platform);\n\t\t$tw.platform.isWindows = /win/i.test(navigator.platform);\n\t\t$tw.platform.isLinux = /Linux/i.test(navigator.platform);\n\t} else {\n\t\tswitch(require(\"os\").platform()) {\n\t\t\tcase \"darwin\":\n\t\t\t\t$tw.platform.isMac = true;\n\t\t\t\tbreak;\n\t\t\tcase \"win32\":\n\t\t\t\t$tw.platform.isWindows = true;\n\t\t\t\tbreak;\n\t\t\tcase \"freebsd\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t\tcase \"linux\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t// Initialise version\n\t$tw.version = $tw.utils.extractVersionInfo();\n\t// Set up the performance framework\n\t$tw.perf = new $tw.Performance($tw.wiki.getTiddlerText(PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE,\"no\") === \"yes\");\n\t// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers\n\t$tw.rootWidget = new widget.widget({\n\t\ttype: \"widget\",\n\t\tchildren: []\n\t},{\n\t\twiki: $tw.wiki,\n\t\tdocument: $tw.browser ? document : $tw.fakeDocument\n\t});\n\t// Execute any startup actions\n\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction\");\n\tif($tw.browser) {\n\t\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/Browser\");\n\t}\n\tif($tw.node) {\n\t\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/Node\");\n\t}\n\t// Kick off the language manager and switcher\n\t$tw.language = new $tw.Language();\n\t$tw.languageSwitcher = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"language\",\n\t\tcontrollerTitle: \"$:/language\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/languages/en-GB\"\n\t\t],\n\t\tonSwitch: function(plugins) {\n\t\t\tif($tw.browser) {\n\t\t\t\tvar pluginTiddler = $tw.wiki.getTiddler(plugins[0]);\n\t\t\t\tif(pluginTiddler) {\n\t\t\t\t\tdocument.documentElement.setAttribute(\"dir\",pluginTiddler.getFieldString(\"text-direction\") || \"auto\");\n\t\t\t\t} else {\n\t\t\t\t\tdocument.documentElement.removeAttribute(\"dir\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Kick off the theme manager\n\t$tw.themeManager = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"theme\",\n\t\tcontrollerTitle: \"$:/theme\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/themes/tiddlywiki/snowwhite\",\n\t\t\t\"$:/themes/tiddlywiki/vanilla\"\n\t\t]\n\t});\n\t// Kick off the keyboard manager\n\t$tw.keyboardManager = new $tw.KeyboardManager();\n\t// Listen for shortcuts\n\tif($tw.browser) {\n\t\t$tw.utils.addEventListeners(document,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t}\n\t// Clear outstanding tiddler store change events to avoid an unnecessary refresh cycle at startup\n\t$tw.wiki.clearTiddlerEventQueue();\n\t// Find a working syncadaptor\n\t$tw.syncadaptor = undefined;\n\t$tw.modules.forEachModuleOfType(\"syncadaptor\",function(title,module) {\n\t\tif(!$tw.syncadaptor && module.adaptorClass) {\n\t\t\t$tw.syncadaptor = new module.adaptorClass({wiki: $tw.wiki});\n\t\t}\n\t});\n\t// Set up the syncer object if we've got a syncadaptor\n\tif($tw.syncadaptor) {\n\t\t$tw.syncer = new $tw.Syncer({\n\t\t\twiki: $tw.wiki,\n\t\t\tsyncadaptor: $tw.syncadaptor,\n\t\t\tlogging: $tw.wiki.getTiddlerText('$:/config/SyncLogging', \"yes\") === \"yes\"\n\t\t});\n\t}\n\t// Setup the saver handler\n\t$tw.saverHandler = new $tw.SaverHandler({\n\t\twiki: $tw.wiki,\n\t\tdirtyTracking: !$tw.syncadaptor,\n\t\tpreloadDirty: $tw.boot.preloadDirty || []\n\t});\n\t// Host-specific startup\n\tif($tw.browser) {\n\t\t// Install the popup manager\n\t\t$tw.popup = new $tw.utils.Popup();\n\t\t// Install the animator\n\t\t$tw.anim = new $tw.utils.Animator();\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/core/modules/startup/story.js":{"title":"$:/core/modules/startup/story.js","text":"/*\\\ntitle: $:/core/modules/startup/story.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"story\";\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar DEFAULT_STORY_TITLE = \"$:/StoryList\";\nvar DEFAULT_HISTORY_TITLE = \"$:/HistoryList\";\n\n// Default tiddlers\nvar DEFAULT_TIDDLERS_TITLE = \"$:/DefaultTiddlers\";\n\n// Config\nvar CONFIG_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/UpdateAddressBar\"; // Can be \"no\", \"permalink\", \"permaview\"\nvar CONFIG_UPDATE_HISTORY = \"$:/config/Navigation/UpdateHistory\"; // Can be \"yes\" or \"no\"\nvar CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD = \"$:/config/Navigation/Permalinkview/CopyToClipboard\"; // Can be \"yes\" (default) or \"no\"\nvar CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/Permalinkview/UpdateAddressBar\"; // Can be \"yes\" (default) or \"no\"\n\n\n// Links to help, if there is no param\nvar HELP_OPEN_EXTERNAL_WINDOW = \"http://tiddlywiki.com/#WidgetMessage%3A%20tm-open-external-window\";\n\nexports.startup = function() {\n\t// Open startup tiddlers\n\topenStartupTiddlers({\n\t\tdisableHistory: $tw.boot.disableStartupNavigation\n\t});\n\tif($tw.browser) {\n\t\t// Set up location hash update\n\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\tif($tw.utils.hop(changes,DEFAULT_STORY_TITLE) || $tw.utils.hop(changes,DEFAULT_HISTORY_TITLE)) {\n\t\t\t\tupdateLocationHash({\n\t\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_UPDATE_ADDRESS_BAR,\"permaview\").trim(),\n\t\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim()\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// Listen for changes to the browser location hash\n\t\twindow.addEventListener(\"hashchange\",function() {\n\t\t\tvar hash = $tw.utils.getLocationHash();\n\t\t\tif(hash !== $tw.locationHash) {\n\t\t\t\t$tw.locationHash = hash;\n\t\t\t\tif(hash !== \"#\") {\n\t\t\t\t\topenStartupTiddlers({defaultToCurrentStory: true});\n\t\t\t\t}\n\t\t\t}\n\t\t},false);\n\t\t// Listen for the tm-browser-refresh message\n\t\t$tw.rootWidget.addEventListener(\"tm-browser-refresh\",function(event) {\n\t\t\twindow.location.reload(true);\n\t\t});\n\t\t// Listen for tm-open-external-window message\n\t\t$tw.rootWidget.addEventListener(\"tm-open-external-window\",function(event) {\n\t\t\tvar paramObject = event.paramObject || {},\n\t\t\t\tstrUrl = event.param || HELP_OPEN_EXTERNAL_WINDOW,\n\t\t\t\tstrWindowName = paramObject.windowName,\n\t\t\t\tstrWindowFeatures = paramObject.windowFeatures;\n\t\t\twindow.open(strUrl, strWindowName, strWindowFeatures);\n\t\t});\n\t\t// Listen for the tm-print message\n\t\t$tw.rootWidget.addEventListener(\"tm-print\",function(event) {\n\t\t\t(event.event.view || window).print();\n\t\t});\n\t\t// Listen for the tm-home message\n\t\t$tw.rootWidget.addEventListener(\"tm-home\",function(event) {\n\t\t\twindow.location.hash = \"\";\n\t\t\tvar storyFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE),\n\t\t\t\tstoryList = $tw.wiki.filterTiddlers(storyFilter);\n\t\t\t//invoke any hooks that might change the default story list\n\t\t\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t\t\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t\t\tif(storyList[0]) {\n\t\t\t\t$tw.wiki.addToHistory(storyList[0]);\n\t\t\t}\n\t\t});\n\t\t// Listen for the tm-permalink message\n\t\t$tw.rootWidget.addEventListener(\"tm-permalink\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\",\n\t\t\t\tsuccessNotification: event.paramObject && event.paramObject.successNotification,\n\t\t\t\tfailureNotification: event.paramObject && event.paramObject.failureNotification\n\t\t\t});\n\t\t});\n\t\t// Listen for the tm-permaview message\n\t\t$tw.rootWidget.addEventListener(\"tm-permaview\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\",\n\t\t\t\tsuccessNotification: event.paramObject && event.paramObject.successNotification,\n\t\t\t\tfailureNotification: event.paramObject && event.paramObject.failureNotification\n\t\t\t});\n\t\t});\n\t}\n};\n\n/*\nProcess the location hash to open the specified tiddlers. Options:\ndisableHistory: if true $:/History is NOT updated\ndefaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers\n*/\nfunction openStartupTiddlers(options) {\n\toptions = options || {};\n\t// Work out the target tiddler and the story filter. \"null\" means \"unspecified\"\n\tvar target = null,\n\t\tstoryFilter = null;\n\tif($tw.locationHash.length > 1) {\n\t\tvar hash = $tw.locationHash.substr(1),\n\t\t\tsplit = hash.indexOf(\":\");\n\t\tif(split === -1) {\n\t\t\ttarget = $tw.utils.decodeURIComponentSafe(hash.trim());\n\t\t} else {\n\t\t\ttarget = $tw.utils.decodeURIComponentSafe(hash.substr(0,split).trim());\n\t\t\tstoryFilter = $tw.utils.decodeURIComponentSafe(hash.substr(split + 1).trim());\n\t\t}\n\t}\n\t// If the story wasn't specified use the current tiddlers or a blank story\n\tif(storyFilter === null) {\n\t\tif(options.defaultToCurrentStory) {\n\t\t\tvar currStoryList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE);\n\t\t\tstoryFilter = $tw.utils.stringifyList(currStoryList);\n\t\t} else {\n\t\t\tif(target && target !== \"\") {\n\t\t\t\tstoryFilter = \"\";\n\t\t\t} else {\n\t\t\t\tstoryFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE);\n\t\t\t}\n\t\t}\n\t}\n\t// Process the story filter to get the story list\n\tvar storyList = $tw.wiki.filterTiddlers(storyFilter);\n\t// Invoke any hooks that want to change the default story list\n\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t// If the target tiddler isn't included then splice it in at the top\n\tif(target && storyList.indexOf(target) === -1) {\n\t\tstoryList.unshift(target);\n\t}\n\t// Save the story list\n\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t// Update history\n\tvar story = new $tw.Story({\n\t\twiki: $tw.wiki,\n\t\tstoryTitle: DEFAULT_STORY_TITLE,\n\t\thistoryTitle: DEFAULT_HISTORY_TITLE\n\t});\n\tif(!options.disableHistory) {\n\t\t// If a target tiddler was specified add it to the history stack\n\t\tif(target && target !== \"\") {\n\t\t\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\n\t\t\tif(target.indexOf(\"[[\") === 0 && target.substr(-2) === \"]]\") {\n\t\t\t\ttarget = target.substr(2,target.length - 4);\n\t\t\t}\n\t\t\tstory.addToHistory(target);\n\t\t} else if(storyList.length > 0) {\n\t\t\tstory.addToHistory(storyList[0]);\n\t\t}\n\t}\n}\n\n/*\noptions: See below\noptions.updateAddressBar: \"permalink\", \"permaview\" or \"no\" (defaults to \"permaview\")\noptions.updateHistory: \"yes\" or \"no\" (defaults to \"no\")\noptions.copyToClipboard: \"permalink\", \"permaview\" or \"no\" (defaults to \"no\")\noptions.targetTiddler: optional title of target tiddler for permalink\noptions.successNotification: optional title of tiddler to use as the notification in case of success\noptions.failureNotification: optional title of tiddler to use as the notification in case of failure\n*/\nfunction updateLocationHash(options) {\n\t// Get the story and the history stack\n\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\n\t\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\n\t\ttargetTiddler = \"\";\n\tif(options.targetTiddler) {\n\t\ttargetTiddler = options.targetTiddler;\n\t} else {\n\t\t// The target tiddler is the one at the top of the stack\n\t\tif(historyList.length > 0) {\n\t\t\ttargetTiddler = historyList[historyList.length-1].title;\n\t\t}\n\t\t// Blank the target tiddler if it isn't present in the story\n\t\tif(storyList.indexOf(targetTiddler) === -1) {\n\t\t\ttargetTiddler = \"\";\n\t\t}\n\t}\n\t// Assemble the location hash\n\tswitch(options.updateAddressBar) {\n\t\tcase \"permalink\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler);\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t\tbreak;\n\t}\n\t// Copy URL to the clipboard\n\tvar url = \"\";\n\tswitch(options.copyToClipboard) {\n\t\tcase \"permalink\":\n\t\t\turl = $tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler);\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\turl = $tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t\tbreak;\n\t}\n\tif(url) {\n\t\t$tw.utils.copyToClipboard(url,{successNotification: options.successNotification, failureNotification: options.failureNotification});\n\t}\n\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\n\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\n\t\tif(options.updateHistory === \"yes\") {\n\t\t\t// Assign the location hash so that history is updated\n\t\t\twindow.location.hash = $tw.locationHash;\n\t\t} else {\n\t\t\t// We use replace so that browser history isn't affected\n\t\t\twindow.location.replace(window.location.toString().split(\"#\")[0] + $tw.locationHash);\n\t\t}\n\t}\n}\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/core/modules/startup/windows.js":{"title":"$:/core/modules/startup/windows.js","text":"/*\\\ntitle: $:/core/modules/startup/windows.js\ntype: application/javascript\nmodule-type: startup\n\nSetup root widget handlers for the messages concerned with opening external browser windows\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"windows\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Global to keep track of open windows (hashmap by title)\n$tw.windows = {};\n// Default template to use for new windows\nvar DEFAULT_WINDOW_TEMPLATE = \"$:/core/templates/single.tiddler.window\";\n\nexports.startup = function() {\n\t// Handle open window message\n\t$tw.rootWidget.addEventListener(\"tm-open-window\",function(event) {\n\t\t// Get the parameters\n\t\tvar refreshHandler,\n\t\t\ttitle = event.param || event.tiddlerTitle,\n\t\t\tparamObject = event.paramObject || {},\n\t\t\twindowTitle = paramObject.windowTitle || title,\n\t\t\twindowID = paramObject.windowID || title,\n\t\t\ttemplate = paramObject.template || DEFAULT_WINDOW_TEMPLATE,\n\t\t\twidth = paramObject.width || \"700\",\n\t\t\theight = paramObject.height || \"600\",\n\t\t\ttop = paramObject.top,\n\t\t\tleft = paramObject.left,\n\t\t\tvariables = $tw.utils.extend({},paramObject,{currentTiddler: title, \"tv-window-id\": windowID});\n\t\t// Open the window\n\t\tvar srcWindow,\n\t\t\tsrcDocument;\n\t\t// In case that popup blockers deny opening a new window\n\t\ttry {\n\t\t\tsrcWindow = window.open(\"\",\"external-\" + windowID,\"scrollbars,width=\" + width + \",height=\" + height + (top ? \",top=\" + top : \"\" ) + (left ? \",left=\" + left : \"\" )),\n\t\t\tsrcDocument = srcWindow.document;\n\t\t}\n\t\tcatch(e) {\n\t\t\treturn;\n\t\t}\n\t\t$tw.windows[windowID] = srcWindow;\n\t\t// Check for reopening the same window\n\t\tif(srcWindow.haveInitialisedWindow) {\n\t\t\tsrcWindow.focus();\n\t\t\treturn;\n\t\t}\n\t\t// Initialise the document\n\t\tsrcDocument.write(\"<!DOCTYPE html><head></head><body class='tc-body tc-single-tiddler-window'></body></html>\");\n\t\tsrcDocument.close();\n\t\tsrcDocument.title = windowTitle;\n\t\tsrcWindow.addEventListener(\"beforeunload\",function(event) {\n\t\t\tdelete $tw.windows[windowID];\n\t\t\t$tw.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t},false);\n\t\t// Set up the styles\n\t\tvar styleWidgetNode = $tw.wiki.makeTranscludeWidget(\"$:/core/ui/PageStylesheet\",{\n\t\t\t\tdocument: $tw.fakeDocument,\n\t\t\t\tvariables: variables,\n\t\t\t\timportPageMacros: true}),\n\t\t\tstyleContainer = $tw.fakeDocument.createElement(\"style\");\n\t\tstyleWidgetNode.render(styleContainer,null);\n\t\tvar styleElement = srcDocument.createElement(\"style\");\n\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\tsrcDocument.head.insertBefore(styleElement,srcDocument.head.firstChild);\n\t\t// Render the text of the tiddler\n\t\tvar parser = $tw.wiki.parseTiddler(template),\n\t\t\twidgetNode = $tw.wiki.makeWidget(parser,{document: srcDocument, parentWidget: $tw.rootWidget, variables: variables});\n\t\twidgetNode.render(srcDocument.body,srcDocument.body.firstChild);\n\t\t// Function to handle refreshes\n\t\trefreshHandler = function(changes) {\n\t\t\tif(styleWidgetNode.refresh(changes,styleContainer,null)) {\n\t\t\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\t\t}\n\t\t\twidgetNode.refresh(changes);\n\t\t};\n\t\t$tw.wiki.addEventListener(\"change\",refreshHandler);\n\t\t// Listen for keyboard shortcuts\n\t\t$tw.utils.addEventListeners(srcDocument,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t\tsrcWindow.document.documentElement.addEventListener(\"click\",$tw.popup,true);\n\t\tsrcWindow.haveInitialisedWindow = true;\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-close-window\",function(event) {\n\t\tvar windowID = event.param,\n\t\t\twin = $tw.windows[windowID];\n\t\t\tif(win) {\n\t\t\t\twin.close();\n\t\t\t}\n\t});\n\tvar closeAllWindows = function() {\n\t\t$tw.utils.each($tw.windows,function(win) {\n\t\t\twin.close();\n\t\t});\n\t}\n\t$tw.rootWidget.addEventListener(\"tm-close-all-windows\",closeAllWindows);\n\t// Close open windows when unloading main window\n\t$tw.addUnloadTask(closeAllWindows);\n};\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/core/modules/story.js":{"title":"$:/core/modules/story.js","text":"/*\\\ntitle: $:/core/modules/story.js\ntype: application/javascript\nmodule-type: global\n\nLightweight object for managing interactions with the story and history lists.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nConstruct Story object with options:\nwiki: reference to wiki object to use to resolve tiddler titles\nstoryTitle: title of story list tiddler\nhistoryTitle: title of history list tiddler\n*/\nfunction Story(options) {\n\toptions = options || {};\n\tthis.wiki = options.wiki || $tw.wiki;\n\tthis.storyTitle = options.storyTitle || \"$:/StoryList\";\n\tthis.historyTitle = options.historyTitle || \"$:/HistoryList\";\n};\n\nStory.prototype.navigateTiddler = function(navigateTo,navigateFromTitle,navigateFromClientRect) {\n\tthis.addToStory(navigateTo,navigateFromTitle);\n\tthis.addToHistory(navigateTo,navigateFromClientRect);\n};\n\nStory.prototype.getStoryList = function() {\n\treturn this.wiki.getTiddlerList(this.storyTitle) || [];\n};\n\nStory.prototype.addToStory = function(navigateTo,navigateFromTitle,options) {\n\toptions = options || {};\n\tvar storyList = this.getStoryList();\n\t// See if the tiddler is already there\n\tvar slot = storyList.indexOf(navigateTo);\n\t// Quit if it already exists in the story river\n\tif(slot >= 0) {\n\t\treturn;\n\t}\n\t// First we try to find the position of the story element we navigated from\n\tvar fromIndex = storyList.indexOf(navigateFromTitle);\n\tif(fromIndex >= 0) {\n\t\t// The tiddler is added from inside the river\n\t\t// Determine where to insert the tiddler; Fallback is \"below\"\n\t\tswitch(options.openLinkFromInsideRiver) {\n\t\t\tcase \"top\":\n\t\t\t\tslot = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"bottom\":\n\t\t\t\tslot = storyList.length;\n\t\t\t\tbreak;\n\t\t\tcase \"above\":\n\t\t\t\tslot = fromIndex;\n\t\t\t\tbreak;\n\t\t\tcase \"below\": // Intentional fall-through\n\t\t\tdefault:\n\t\t\t\tslot = fromIndex + 1;\n\t\t\t\tbreak;\n\t\t}\n\t} else {\n\t\t// The tiddler is opened from outside the river. Determine where to insert the tiddler; default is \"top\"\n\t\tif(options.openLinkFromOutsideRiver === \"bottom\") {\n\t\t\t// Insert at bottom\n\t\t\tslot = storyList.length;\n\t\t} else {\n\t\t\t// Insert at top\n\t\t\tslot = 0;\n\t\t}\n\t}\n\t// Add the tiddler\n\tstoryList.splice(slot,0,navigateTo);\n\t// Save the story\n\tthis.saveStoryList(storyList);\n};\n\nStory.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList},\n\t\tthis.wiki.getModificationFields()\n\t));\n};\n\nStory.prototype.addToHistory = function(navigateTo,navigateFromClientRect) {\n\tvar titles = $tw.utils.isArray(navigateTo) ? navigateTo : [navigateTo];\n\t// Add a new record to the top of the history stack\n\tvar historyList = this.wiki.getTiddlerData(this.historyTitle,[]);\n\t$tw.utils.each(titles,function(title) {\n\t\thistoryList.push({title: title, fromPageRect: navigateFromClientRect});\n\t});\n\tthis.wiki.setTiddlerData(this.historyTitle,historyList,{\"current-tiddler\": titles[titles.length-1]});\n};\n\nStory.prototype.storyCloseTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCloseAllTiddlers = function() {\n// TBD\n};\n\nStory.prototype.storyCloseOtherTiddlers = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyEditTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyDeleteTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storySaveTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCancelTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyNewTiddler = function(targetTitle) {\n// TBD\n};\n\nexports.Story = Story;\n\n\n})();\n","type":"application/javascript","module-type":"global"},"$:/core/modules/storyviews/classic.js":{"title":"$:/core/modules/storyviews/classic.js","text":"/*\\\ntitle: $:/core/modules/storyviews/classic.js\ntype: application/javascript\nmodule-type: storyview\n\nViews the story as a linear sequence\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ClassicStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nClassicStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration()\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!targetElement || targetElement.nodeType === Node.TEXT_NODE) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nClassicStoryView.prototype.insert = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!targetElement || targetElement.nodeType === Node.TEXT_NODE) {\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar computedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Reset the margin once the transition is over\n\t\tsetTimeout(function() {\n\t\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t\t{transition: \"none\"},\n\t\t\t\t{marginBottom: \"\"}\n\t\t\t]);\n\t\t},duration);\n\t\t// Set up the initial position of the element\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t// Transition to the final position\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t]);\n\t}\n};\n\nClassicStoryView.prototype.remove = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode(),\n\t\t\tremoveElement = function() {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t};\n\t\t// Blur the focus if it is within the descendents of the node we are removing\n\t\tif($tw.utils.domContains(targetElement,targetElement.ownerDocument.activeElement)) {\n\t\t\ttargetElement.ownerDocument.activeElement.blur();\n\t\t}\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!targetElement || targetElement.nodeType === Node.TEXT_NODE) {\n\t\t\tremoveElement();\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar currWidth = targetElement.offsetWidth,\n\t\t\tcomputedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Remove the dom nodes of the widget at the end of the transition\n\t\tsetTimeout(removeElement,duration);\n\t\t// Animate the closure\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"translateX(0px)\"},\n\t\t\t{marginBottom:  currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{transform: \"translateX(-\" + currWidth + \"px)\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n};\n\nexports.classic = ClassicStoryView;\n\n})();\n","type":"application/javascript","module-type":"storyview"},"$:/core/modules/storyviews/pop.js":{"title":"$:/core/modules/storyviews/pop.js","text":"/*\\\ntitle: $:/core/modules/storyviews/pop.js\ntype: application/javascript\nmodule-type: storyview\n\nAnimates list insertions and removals\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar PopStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nPopStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!targetElement || targetElement.nodeType === Node.TEXT_NODE) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nPopStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!targetElement || targetElement.nodeType === Node.TEXT_NODE) {\n\t\treturn;\n\t}\n\t// Reset once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"none\"}\n\t\t]);\n\t\t$tw.utils.setStyle(widget.document.body,[\n\t\t\t{\"overflow-x\": \"\"}\n\t\t]);\n\t},duration);\n\t// Prevent the page from overscrolling due to the zoom factor\n\t$tw.utils.setStyle(widget.document.body,[\n\t\t{\"overflow-x\": \"hidden\"}\n\t]);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(2)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nPopStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\tif(targetElement && targetElement.parentNode) {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t}\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!targetElement || targetElement.nodeType === Node.TEXT_NODE) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Remove the element at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(0.1)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.pop = PopStoryView;\n\n})();\n","type":"application/javascript","module-type":"storyview"},"$:/core/modules/storyviews/zoomin.js":{"title":"$:/core/modules/storyviews/zoomin.js","text":"/*\\\ntitle: $:/core/modules/storyviews/zoomin.js\ntype: application/javascript\nmodule-type: storyview\n\nZooms between individual tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ZoominListView = function(listWidget) {\n\tvar self = this;\n\tthis.listWidget = listWidget;\n\tthis.textNodeLogger = new $tw.utils.Logger(\"zoomin story river view\", {\n\t\tenable: true,\n\t\tcolour: 'red'\n\t});\n\t// Get the index of the tiddler that is at the top of the history\n\tvar history = this.listWidget.wiki.getTiddlerDataCached(this.listWidget.historyTitle,[]),\n\t\ttargetTiddler;\n\tif(history.length > 0) {\n\t\ttargetTiddler = history[history.length-1].title;\n\t}\n\t// Make all the tiddlers position absolute, and hide all but the top (or first) one\n\t$tw.utils.each(this.listWidget.children,function(itemWidget,index) {\n\t\tvar domNode = itemWidget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(domNode instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\tif((targetTiddler && targetTiddler !== itemWidget.parseTreeNode.itemTitle) || (!targetTiddler && index)) {\n\t\t\tdomNode.style.display = \"none\";\n\t\t} else {\n\t\t\tself.currentTiddlerDomNode = domNode;\n\t\t}\n\t\t$tw.utils.addClass(domNode,\"tc-storyview-zoomin-tiddler\");\n\t});\n};\n\nZoominListView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\t\tlistElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!targetElement) {\n\t\treturn;\n\t} else if (targetElement.nodeType === Node.TEXT_NODE) {\n\t\tthis.logTextNodeRoot(targetElement);\n\t\treturn;\n\t}\n\t// Make the new tiddler be position absolute and visible so that we can measure it\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"0 0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t// Get the position of the source node, or use the centre of the window as the source position\n\tvar sourceBounds = historyInfo.fromPageRect || {\n\t\t\tleft: window.innerWidth/2 - 2,\n\t\t\ttop: window.innerHeight/2 - 2,\n\t\t\twidth: window.innerWidth/8,\n\t\t\theight: window.innerHeight/8\n\t\t};\n\t// Try to find the title node in the target tiddler\n\tvar titleDomNode = findTitleDomNode(listItemWidget) || listItemWidget.findFirstDomNode(),\n\t\tzoomBounds = titleDomNode.getBoundingClientRect();\n\t// Compute the transform for the target tiddler to make the title lie over the source rectange\n\tvar targetBounds = targetElement.getBoundingClientRect(),\n\t\tscale = sourceBounds.width / zoomBounds.width,\n\t\tx = sourceBounds.left - targetBounds.left - (zoomBounds.left - targetBounds.left) * scale,\n\t\ty = sourceBounds.top - targetBounds.top - (zoomBounds.top - targetBounds.top) * scale;\n\t// Transform the target tiddler to its starting position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(targetElement);\n\t// Apply the ending transitions with a timeout to ensure that the previously applied transformations are applied first\n\tvar self = this,\n\t\tprevCurrentTiddler = this.currentTiddlerDomNode;\n\tthis.currentTiddlerDomNode = targetElement;\n\t// Transform the target tiddler to its natural size\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{zIndex: \"500\"},\n\t]);\n\t// Transform the previous tiddler out of the way and then hide it\n\tif(prevCurrentTiddler && prevCurrentTiddler !== targetElement) {\n\t\tscale = zoomBounds.width / sourceBounds.width;\n\t\tx =  zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale;\n\t\ty =  zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale;\n\t\t$tw.utils.setStyle(prevCurrentTiddler,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transformOrigin: \"0 0\"},\n\t\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"},\n\t\t\t{zIndex: \"0\"}\n\t\t]);\n\t\t// Hide the tiddler when the transition has finished\n\t\tsetTimeout(function() {\n\t\t\tif(self.currentTiddlerDomNode !== prevCurrentTiddler) {\n\t\t\t\tprevCurrentTiddler.style.display = \"none\";\n\t\t\t}\n\t\t},duration);\n\t}\n\t// Scroll the target into view\n//\t$tw.pageScroller.scrollIntoView(targetElement);\n};\n\n/*\nFind the first child DOM node of a widget that has the class \"tc-title\"\n*/\nfunction findTitleDomNode(widget,targetClass) {\n\ttargetClass = targetClass || \"tc-title\";\n\tvar domNode = widget.findFirstDomNode();\n\tif(domNode && domNode.querySelector) {\n\t\treturn $tw.utils.querySelectorSafe(\".\" + targetClass,domNode);\n\t}\n\treturn null;\n}\n\nZoominListView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!targetElement) {\n\t\treturn;\n\t} else if (targetElement.nodeType === Node.TEXT_NODE) {\n\t\tthis.logTextNodeRoot(targetElement);\n\t\treturn;\n\t}\n\t// Make the newly inserted node position absolute and hidden\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"none\"}\n\t]);\n};\n\nZoominListView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!targetElement || targetElement.nodeType === Node.TEXT_NODE) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Abandon if hidden\n\tif(targetElement.style.display != \"block\" ) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Set up the tiddler that is being closed\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\t// We'll move back to the previous or next element in the story\n\tvar toWidget = widget.previousSibling();\n\tif(!toWidget) {\n\t\ttoWidget = widget.nextSibling();\n\t}\n\tvar toWidgetDomNode = toWidget && toWidget.findFirstDomNode();\n\t// Set up the tiddler we're moving back in\n\tif(toWidgetDomNode) {\n\t\tif (toWidgetDomNode.nodeType === Node.TEXT_NODE) {\n\t\t\tthis.logTextNodeRoot(toWidgetDomNode);\n\t\t\ttoWidgetDomNode = null;\n\t\t} else {\n\t\t\t$tw.utils.addClass(toWidgetDomNode,\"tc-storyview-zoomin-tiddler\");\n\t\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t\t{display: \"block\"},\n\t\t\t\t{transformOrigin: \"50% 50%\"},\n\t\t\t\t{transform: \"translateX(0px) translateY(0px) scale(10)\"},\n\t\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t\t{opacity: \"0\"},\n\t\t\t\t{zIndex: \"500\"}\n\t\t\t]);\n\t\t\tthis.currentTiddlerDomNode = toWidgetDomNode;\n\t\t}\n\t}\n\t// Animate them both\n\t// Force layout\n\t$tw.utils.forceLayout(this.listWidget.parentDomNode);\n\t// First, the tiddler we're closing\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(0.1)\"},\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"0\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\tsetTimeout(removeElement,duration);\n\t// Now the tiddler we're going back to\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t\t{opacity: \"1\"}\n\t\t]);\n\t}\n\treturn true; // Indicate that we'll delete the DOM node\n};\n\nZoominListView.prototype.logTextNodeRoot = function(node) {\n\tthis.textNodeLogger.log($tw.language.getString(\"Error/ZoominTextNode\") + \" \" + node.textContent);\n};\n\nexports.zoomin = ZoominListView;\n\n})();\n","type":"application/javascript","module-type":"storyview"},"$:/core/modules/syncer.js":{"title":"$:/core/modules/syncer.js","text":"/*\\\ntitle: $:/core/modules/syncer.js\ntype: application/javascript\nmodule-type: global\n\nThe syncer tracks changes to the store and synchronises them to a remote data store represented as a \"sync adaptor\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDefaults\n*/\nSyncer.prototype.titleIsLoggedIn = \"$:/status/IsLoggedIn\";\nSyncer.prototype.titleIsAnonymous = \"$:/status/IsAnonymous\";\nSyncer.prototype.titleIsReadOnly = \"$:/status/IsReadOnly\";\nSyncer.prototype.titleUserName = \"$:/status/UserName\";\nSyncer.prototype.titleSyncFilter = \"$:/config/SyncFilter\";\nSyncer.prototype.titleSyncPollingInterval = \"$:/config/SyncPollingInterval\";\nSyncer.prototype.titleSyncDisableLazyLoading = \"$:/config/SyncDisableLazyLoading\";\nSyncer.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\nSyncer.prototype.titleSyncThrottleInterval = \"$:/config/SyncThrottleInterval\";\nSyncer.prototype.taskTimerInterval = 0.25 * 1000; // Interval for sync timer\nSyncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s...\nSyncer.prototype.errorRetryInterval = 5 * 1000; // Interval to retry after an error\nSyncer.prototype.fallbackInterval = 10 * 1000; // Unless the task is older than 10s\nSyncer.prototype.pollTimerInterval = 60 * 1000; // Interval for polling for changes from the adaptor\n\n/*\nInstantiate the syncer with the following options:\nsyncadaptor: reference to syncadaptor to be used\nwiki: wiki to be synced\n*/\nfunction Syncer(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\t// Save parameters\n\tthis.syncadaptor = options.syncadaptor;\n\tthis.disableUI = !!options.disableUI;\n\tthis.titleIsLoggedIn = options.titleIsLoggedIn || this.titleIsLoggedIn;\n\tthis.titleUserName = options.titleUserName || this.titleUserName;\n\tthis.titleSyncFilter = options.titleSyncFilter || this.titleSyncFilter;\n\tthis.titleSavedNotification = options.titleSavedNotification || this.titleSavedNotification;\n\tthis.taskTimerInterval = options.taskTimerInterval || this.taskTimerInterval;\n\tthis.throttleInterval = options.throttleInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncThrottleInterval,\"\"),10) || this.throttleInterval;\n\tthis.errorRetryInterval = options.errorRetryInterval || this.errorRetryInterval;\n\tthis.fallbackInterval = options.fallbackInterval || this.fallbackInterval;\n\tthis.pollTimerInterval = options.pollTimerInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncPollingInterval,\"\"),10) || this.pollTimerInterval;\n\tthis.logging = \"logging\" in options ? options.logging : true;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\")  + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\"),{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging,\n\t\tsaveHistory: true\n\t});\n\t// Make another logger for connection errors\n\tthis.loggerConnection = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\")  + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\") + \"-connection\",{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging\n\t});\n\t// Ask the syncadaptor to use the main logger\n\tif(this.syncadaptor.setLoggerSaveBuffer) {\n\t\tthis.syncadaptor.setLoggerSaveBuffer(this.logger);\n\t}\n\t// Compile the dirty tiddler filter\n\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t// Record information for known tiddlers\n\tthis.readTiddlerInfo();\n\tthis.titlesToBeLoaded = {}; // Hashmap of titles of tiddlers that need loading from the server\n\tthis.titlesHaveBeenLazyLoaded = {}; // Hashmap of titles of tiddlers that have already been lazily loaded from the server\n\t// Timers\n\tthis.taskTimerId = null; // Timer for task dispatch\n\t// Number of outstanding requests\n\tthis.numTasksInProgress = 0;\n\t// True when we want to force an immediate sync from the server\n\tthis.forceSyncFromServer = false;\n\tthis.timestampLastSyncFromServer = new Date();\n\t// Listen out for changes to tiddlers\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Filter the changes to just include ones that are being synced\n\t\tvar filteredChanges = self.getSyncedTiddlers(function(callback) {\n\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\tvar tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title);\n\t\t\t\tcallback(tiddler,title);\n\t\t\t});\n\t\t});\n\t\tif(filteredChanges.length > 0) {\n\t\t\tself.processTaskQueue();\n\t\t} else {\n\t\t\t// Look for deletions of tiddlers we're already syncing\t\n\t\t\tvar outstandingDeletion = false\n\t\t\t$tw.utils.each(changes,function(change,title,object) {\n\t\t\t\tif(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) {\n\t\t\t\t\toutstandingDeletion = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(outstandingDeletion) {\n\t\t\t\tself.processTaskQueue();\n\t\t\t}\n\t\t}\n\t});\n\t// Browser event handlers\n\tif($tw.browser && !this.disableUI) {\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t\t// Listen out for login/logout/refresh events in the browser\n\t\t$tw.rootWidget.addEventListener(\"tm-login\",function(event) {\n\t\t\tvar username = event && event.paramObject && event.paramObject.username,\n\t\t\t\tpassword = event && event.paramObject && event.paramObject.password;\n\t\t\tif(username && password) {\n\t\t\t\t// Login with username and password\n\t\t\t\tself.login(username,password,function() {});\n\t\t\t} else {\n\t\t\t\t// No username and password, so we display a prompt\n\t\t\t\tself.handleLoginEvent();\t\t\t\t\n\t\t\t}\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-logout\",function() {\n\t\t\tself.handleLogoutEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-server-refresh\",function() {\n\t\t\tself.handleRefreshEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-copy-syncer-logs-to-clipboard\",function() {\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getSystemInfo() + \"\\n\\nLog:\\n\" + self.logger.getBuffer());\n\t\t});\n\t}\n\t// Listen out for lazyLoad events\n\tif(!this.disableUI && this.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== \"yes\") {\n\t\tthis.wiki.addEventListener(\"lazyLoad\",function(title) {\n\t\t\tself.handleLazyLoadEvent(title);\n\t\t});\t\t\n\t}\n\t// Get the login status\n\tthis.getStatus(function(err,isLoggedIn) {\n\t\t// Do a sync from the server\n\t\tself.syncFromServer();\n\t});\n}\n\n/*\nShow a generic network error alert\n*/\nSyncer.prototype.displayError = function(msg,err) {\n\tif(err === ($tw.language.getString(\"Error/XMLHttpRequest\") + \": 0\")) {\n\t\tthis.loggerConnection.alert($tw.language.getString(\"Error/NetworkErrorAlert\"));\n\t\tthis.logger.log(msg + \":\",err);\n\t} else {\n\t\tthis.logger.alert(msg + \":\",err);\n\t}\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getSyncedTiddlers = function(source) {\n\treturn this.filterFn.call(this.wiki,source);\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getTiddlerRevision = function(title) {\n\tif(this.syncadaptor && this.syncadaptor.getTiddlerRevision) {\n\t\treturn this.syncadaptor.getTiddlerRevision(title);\n\t} else {\n\t\treturn this.wiki.getTiddler(title).fields.revision;\t\n\t} \n};\n\n/*\nRead (or re-read) the latest tiddler info from the store\n*/\nSyncer.prototype.readTiddlerInfo = function() {\n\t// Hashmap by title of {revision:,changeCount:,adaptorInfo:}\n\t// \"revision\" is the revision of the tiddler last seen on the server, and \"changecount\" is the corresponding local changecount\n\tthis.tiddlerInfo = {};\n\t// Record information for known tiddlers\n\tvar self = this,\n\t\ttiddlers = this.getSyncedTiddlers();\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tself.tiddlerInfo[title] = {\n\t\t\t\trevision: self.getTiddlerRevision(title),\n\t\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\t\tchangeCount: self.wiki.getChangeCount(title)\n\t\t\t};\n\t\t}\n\t});\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSyncer.prototype.isDirty = function() {\n\tvar self = this;\n\tfunction checkIsDirty() {\n\t\t// Check tiddlers that are in the store and included in the filter function\n\t\tvar titles = self.getSyncedTiddlers();\n\t\tfor(var index=0; index<titles.length; index++) {\n\t\t\tvar title = titles[index],\n\t\t\t\ttiddlerInfo = self.tiddlerInfo[title];\n\t\t\tif(self.wiki.tiddlerExists(title)) {\n\t\t\t\tif(tiddlerInfo) {\n\t\t\t\t\t// If the tiddler is known on the server and has been modified locally then it needs to be saved to the server\n\t\t\t\t\tif(self.wiki.getChangeCount(title) > tiddlerInfo.changeCount) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// If the tiddler isn't known on the server then it needs to be saved to the server\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Check tiddlers that are known from the server but not currently in the store\n\t\ttitles = Object.keys(self.tiddlerInfo);\n\t\tfor(index=0; index<titles.length; index++) {\n\t\t\tif(!self.wiki.tiddlerExists(titles[index])) {\n\t\t\t\t// There must be a pending delete\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\tvar dirtyStatus = checkIsDirty();\n\treturn dirtyStatus;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSyncer.prototype.updateDirtyStatus = function() {\n\tif($tw.browser && !this.disableUI) {\n\t\tvar dirty = this.isDirty();\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",dirty);\n\t\tif(!dirty) {\n\t\t\tthis.loggerConnection.clearAlerts();\n\t\t}\n\t}\n};\n\n/*\nSave an incoming tiddler in the store, and updates the associated tiddlerInfo\n*/\nSyncer.prototype.storeTiddler = function(tiddlerFields) {\n\t// Save the tiddler\n\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\tthis.wiki.addTiddler(tiddler);\n\t// Save the tiddler revision and changeCount details\n\tthis.tiddlerInfo[tiddlerFields.title] = {\n\t\trevision: this.getTiddlerRevision(tiddlerFields.title),\n\t\tadaptorInfo: this.syncadaptor.getTiddlerInfo(tiddler),\n\t\tchangeCount: this.wiki.getChangeCount(tiddlerFields.title)\n\t};\n};\n\nSyncer.prototype.getStatus = function(callback) {\n\tvar self = this;\n\t// Check if the adaptor supports getStatus()\n\tif(this.syncadaptor && this.syncadaptor.getStatus) {\n\t\t// Mark us as not logged in\n\t\tthis.wiki.addTiddler({title: this.titleIsLoggedIn,text: \"no\"});\n\t\t// Get login status\n\t\tthis.syncadaptor.getStatus(function(err,isLoggedIn,username,isReadOnly,isAnonymous) {\n\t\t\tif(err) {\n\t\t\t\tself.displayError(\"Get Status Error\",err);\n\t\t\t} else {\n\t\t\t\t// Set the various status tiddlers\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsReadOnly,text: isReadOnly ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsAnonymous,text: isAnonymous ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? \"yes\" : \"no\"});\n\t\t\t\tif(isLoggedIn) {\n\t\t\t\t\tself.wiki.addTiddler({title: self.titleUserName,text: username || \"\"});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tif(callback) {\n\t\t\t\tcallback(err,isLoggedIn,username);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null,true,\"UNAUTHENTICATED\");\n\t}\n};\n\n/*\nSynchronise from the server by reading the skinny tiddler list and queuing up loads for any tiddlers that we don't already have up to date\n*/\nSyncer.prototype.syncFromServer = function() {\n\tif(this.canSyncFromServer()) {\n\t\tthis.forceSyncFromServer = true;\n\t\tthis.processTaskQueue();\t\n\t}\n};\n\nSyncer.prototype.canSyncFromServer = function() {\n\treturn !!this.syncadaptor.getUpdatedTiddlers || !!this.syncadaptor.getSkinnyTiddlers;\n}\n\n/*\nForce load a tiddler from the server\n*/\nSyncer.prototype.enqueueLoadTiddler = function(title) {\n\tthis.titlesToBeLoaded[title] = true;\n\tthis.processTaskQueue();\n};\n\n/*\nLazily load a skinny tiddler if we can\n*/\nSyncer.prototype.handleLazyLoadEvent = function(title) {\n\t// Ignore if the syncadaptor doesn't handle it\n\tif(!this.syncadaptor.supportsLazyLoading) {\n\t\treturn;\n\t}\n\t// Don't lazy load the same tiddler twice\n\tif(!this.titlesHaveBeenLazyLoaded[title]) {\n\t\t// Don't lazy load if the tiddler isn't included in the sync filter\n\t\tif(this.getSyncedTiddlers().indexOf(title) !== -1) {\n\t\t\t// Mark the tiddler as needing loading, and having already been lazily loaded\n\t\t\tthis.titlesToBeLoaded[title] = true;\n\t\t\tthis.titlesHaveBeenLazyLoaded[title] = true;\n\t\t\tthis.processTaskQueue();\n\t\t}\n\t}\n};\n\n/*\nDispay a password prompt and allow the user to login\n*/\nSyncer.prototype.handleLoginEvent = function() {\n\tvar self = this;\n\tthis.getStatus(function(err,isLoggedIn,username) {\n\t\tif(!err && !isLoggedIn) {\n\t\t\tif(self.syncadaptor && self.syncadaptor.displayLoginPrompt) {\n\t\t\t\tself.syncadaptor.displayLoginPrompt(self);\n\t\t\t} else {\n\t\t\t\tself.displayLoginPrompt();\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nDispay a password prompt\n*/\nSyncer.prototype.displayLoginPrompt = function() {\n\tvar self = this;\n\tvar promptInfo = $tw.passwordPrompt.createPrompt({\n\t\tserviceName: $tw.language.getString(\"LoginToTiddlySpace\"),\n\t\tcallback: function(data) {\n\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\tself.syncFromServer();\n\t\t\t});\n\t\t\treturn true; // Get rid of the password prompt\n\t\t}\n\t});\n};\n\n/*\nAttempt to login to TiddlyWeb.\n\tusername: username\n\tpassword: password\n\tcallback: invoked with arguments (err,isLoggedIn)\n*/\nSyncer.prototype.login = function(username,password,callback) {\n\tthis.logger.log(\"Attempting to login as\",username);\n\tvar self = this;\n\tif(this.syncadaptor.login) {\n\t\tthis.syncadaptor.login(username,password,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.getStatus(function(err,isLoggedIn,username) {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback(err,isLoggedIn);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\tcallback(null,true);\n\t}\n};\n\n/*\nAttempt to log out of TiddlyWeb\n*/\nSyncer.prototype.handleLogoutEvent = function() {\n\tthis.logger.log(\"Attempting to logout\");\n\tvar self = this;\n\tif(this.syncadaptor.logout) {\n\t\tthis.syncadaptor.logout(function(err) {\n\t\t\tif(err) {\n\t\t\t\tself.displayError(\"Logout Error\",err);\n\t\t\t} else {\n\t\t\t\tself.getStatus();\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nImmediately refresh from the server\n*/\nSyncer.prototype.handleRefreshEvent = function() {\n\tthis.syncFromServer();\n};\n\n/*\nProcess the next task\n*/\nSyncer.prototype.processTaskQueue = function() {\n\tvar self = this;\n\t// Only process a task if the sync adaptor is fully initialised and we're not already performing\n\t// a task. If we are already performing a task then we'll dispatch the next one when it completes\n\tif((!this.syncadaptor.isReady || this.syncadaptor.isReady()) && this.numTasksInProgress === 0) {\n\t\t// Choose the next task to perform\n\t\tvar task = this.chooseNextTask();\n\t\t// Perform the task if we had one\n\t\tif(typeof task === \"object\" && task !== null) {\n\t\t\tthis.numTasksInProgress += 1;\n\t\t\ttask.run(function(err) {\n\t\t\t\tself.numTasksInProgress -= 1;\n\t\t\t\tif(err) {\n\t\t\t\t\tself.displayError(\"Sync error while processing \" + task.type + \" of '\" + task.title + \"'\",err);\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\tself.triggerTimeout(self.errorRetryInterval);\n\t\t\t\t} else {\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\t// Process the next task\n\t\t\t\t\tself.processTaskQueue.call(self);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// No task is ready so update the status\n\t\t\tthis.updateDirtyStatus();\n\t\t\t// And trigger a timeout if there is a pending task\n\t\t\tif(task === true) {\n\t\t\t\tthis.triggerTimeout(this.taskTimerInterval);\n\t\t\t} else if(this.canSyncFromServer()) {\n\t\t\t\tthis.triggerTimeout(this.pollTimerInterval);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthis.updateDirtyStatus();\n\t\tthis.triggerTimeout(this.taskTimerInterval);\n\t}\n};\n\nSyncer.prototype.triggerTimeout = function(interval) {\n\tvar self = this;\n\tif(this.taskTimerId) {\n\t\tclearTimeout(this.taskTimerId);\n\t}\n\tthis.taskTimerId = setTimeout(function() {\n\t\tself.taskTimerId = null;\n\t\tself.processTaskQueue.call(self);\n\t},interval || self.taskTimerInterval);\n};\n\n/*\nChoose the next sync task. We prioritise saves to the server, then getting updates from the server, then deletes to the server, then loads from the server\n\nReturns either:\n* a task object\n* the boolean true if there are pending sync tasks that aren't yet due\n* null if there's no pending sync tasks (just the next poll)\n*/\nSyncer.prototype.chooseNextTask = function() {\n\tvar now = new Date(),\n\t\tthresholdLastSaved = now - this.throttleInterval,\n\t\thavePending = null;\n\t// First we look for tiddlers that have been modified locally and need saving back to the server\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title),\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(tiddler) {\n\t\t\t// If the tiddler is not known on the server, or has been modified locally no more recently than the threshold then it needs to be saved to the server\n\t\t\tvar hasChanged = !tiddlerInfo || this.wiki.getChangeCount(title) > tiddlerInfo.changeCount,\n\t\t\t\tisReadyToSave = !tiddlerInfo || !tiddlerInfo.timestampLastSaved || tiddlerInfo.timestampLastSaved < thresholdLastSaved;\n\t\t\tif(hasChanged) {\n\t\t\t\tif(isReadyToSave) {\n\t\t\t\t\treturn new SaveTiddlerTask(this,title);\n\t\t\t\t} else {\n\t\t\t\t\thavePending = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Second we check for an outstanding sync from server\n\tif(this.forceSyncFromServer || (this.timestampLastSyncFromServer && (now.valueOf() >= (this.timestampLastSyncFromServer.valueOf() + this.pollTimerInterval)))) {\n\t\treturn new SyncFromServerTask(this);\n\t}\n\t// Third, we check tiddlers that are known from the server but not currently in the store, and so need deleting on the server\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\ttitle = titles[index];\n\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\treturn new DeleteTiddlerTask(this,title);\n\t\t}\n\t}\n\t// Finally, check for tiddlers that need loading\n\ttitle = Object.keys(this.titlesToBeLoaded)[0];\n\tif(title) {\n\t\tdelete this.titlesToBeLoaded[title];\n\t\treturn new LoadTiddlerTask(this,title);\n\t}\n\t// No tasks are ready now, but might be in the future\n\treturn havePending;\n};\n\nfunction SaveTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"save\";\n}\n\nSaveTiddlerTask.prototype.toString = function() {\n\treturn \"SAVE \" + this.title;\n}\n\nSaveTiddlerTask.prototype.run = function(callback) {\n\tvar self = this,\n\t\tchangeCount = this.syncer.wiki.getChangeCount(this.title),\n\t\ttiddler = this.syncer.wiki.tiddlerExists(this.title) && this.syncer.wiki.getTiddler(this.title);\n\tthis.syncer.logger.log(\"Dispatching 'save' task:\",this.title);\n\tif(tiddler) {\n\t\tthis.syncer.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) {\n\t\t\t// If there's an error, exit without changing any internal state\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Adjust the info stored about this tiddler\n\t\t\tself.syncer.tiddlerInfo[self.title] = {\n\t\t\t\tchangeCount: changeCount,\n\t\t\t\tadaptorInfo: adaptorInfo,\n\t\t\t\trevision: revision,\n\t\t\t\ttimestampLastSaved: new Date()\n\t\t\t};\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t},{\n\t\t\ttiddlerInfo: self.syncer.tiddlerInfo[self.title]\n\t\t});\n\t} else {\n\t\t$tw.utils.nextTick(callback(null));\n\t}\n};\n\nfunction DeleteTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"delete\";\n}\n\nDeleteTiddlerTask.prototype.toString = function() {\n\treturn \"DELETE \" + this.title;\n}\n\nDeleteTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'delete' task:\",this.title);\n\tthis.syncer.syncadaptor.deleteTiddler(this.title,function(err) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Remove the info stored about this tiddler\n\t\tdelete self.syncer.tiddlerInfo[self.title];\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t},{\n\t\ttiddlerInfo: self.syncer.tiddlerInfo[this.title]\n\t});\n};\n\nfunction LoadTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"load\";\n}\n\nLoadTiddlerTask.prototype.toString = function() {\n\treturn \"LOAD \" + this.title;\n}\n\nLoadTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'load' task:\",this.title);\n\tthis.syncer.syncadaptor.loadTiddler(this.title,function(err,tiddlerFields) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Update the info stored about this tiddler\n\t\tif(tiddlerFields) {\n\t\t\tself.syncer.storeTiddler(tiddlerFields);\n\t\t}\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t});\n};\n\nfunction SyncFromServerTask(syncer) {\n\tthis.syncer = syncer;\n\tthis.type = \"syncfromserver\";\n}\n\nSyncFromServerTask.prototype.toString = function() {\n\treturn \"SYNCFROMSERVER\";\n}\n\nSyncFromServerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tvar syncSystemFromServer = (self.syncer.wiki.getTiddlerText(\"$:/config/SyncSystemTiddlersFromServer\") === \"yes\" ? true : false);\n\tvar successCallback = function() {\n\t\tself.syncer.forceSyncFromServer = false;\n\t\tself.syncer.timestampLastSyncFromServer = new Date();\n\t\tcallback(null);\n\t};\n\tif(this.syncer.syncadaptor.getUpdatedTiddlers) {\n\t\tthis.syncer.syncadaptor.getUpdatedTiddlers(self.syncer,function(err,updates) {\n\t\t\tif(err) {\n\t\t\t\tself.syncer.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tif(updates) {\n\t\t\t\t$tw.utils.each(updates.modifications,function(title) {\n\t\t\t\t\tself.syncer.titlesToBeLoaded[title] = true;\n\t\t\t\t});\n\t\t\t\t$tw.utils.each(updates.deletions,function(title) {\n\t\t\t\t\tif(syncSystemFromServer || !self.syncer.wiki.isSystemTiddler(title)) {\n\t\t\t\t\t\tdelete self.syncer.tiddlerInfo[title];\n\t\t\t\t\t\tself.syncer.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\t\tself.syncer.wiki.deleteTiddler(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn successCallback();\n\t\t});\n\t} else if(this.syncer.syncadaptor.getSkinnyTiddlers) {\n\t\tthis.syncer.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\tself.syncer.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Keep track of which tiddlers we already know about have been reported this time\n\t\t\tvar previousTitles = Object.keys(self.syncer.tiddlerInfo);\n\t\t\t// Process each incoming tiddler\n\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t// Get the incoming tiddler fields, and the existing tiddler\n\t\t\t\tvar tiddlerFields = tiddlers[t],\n\t\t\t\t\tincomingRevision = tiddlerFields.revision + \"\",\n\t\t\t\t\ttiddler = self.syncer.wiki.tiddlerExists(tiddlerFields.title) && self.syncer.wiki.getTiddler(tiddlerFields.title),\n\t\t\t\t\ttiddlerInfo = self.syncer.tiddlerInfo[tiddlerFields.title],\n\t\t\t\t\tcurrRevision = tiddlerInfo ? tiddlerInfo.revision : null,\n\t\t\t\t\tindexInPreviousTitles = previousTitles.indexOf(tiddlerFields.title);\n\t\t\t\tif(indexInPreviousTitles !== -1) {\n\t\t\t\t\tpreviousTitles.splice(indexInPreviousTitles,1);\n\t\t\t\t}\n\t\t\t\t// Ignore the incoming tiddler if it's the same as the revision we've already got\n\t\t\t\tif(currRevision !== incomingRevision) {\n\t\t\t\t\t// Only load the skinny version if we don't already have a fat version of the tiddler\n\t\t\t\t\tif(!tiddler || tiddler.fields.text === undefined) {\n\t\t\t\t\t\tself.syncer.storeTiddler(tiddlerFields);\n\t\t\t\t\t}\n\t\t\t\t\t// Do a full load of this tiddler\n\t\t\t\t\tself.syncer.titlesToBeLoaded[tiddlerFields.title] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Delete any tiddlers that were previously reported but missing this time\n\t\t\t$tw.utils.each(previousTitles,function(title) {\n\t\t\t\tif(syncSystemFromServer || !self.syncer.wiki.isSystemTiddler(title)) {\n\t\t\t\t\tdelete self.syncer.tiddlerInfo[title];\n\t\t\t\t\tself.syncer.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\tself.syncer.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t});\n\t\t\tself.syncer.forceSyncFromServer = false;\n\t\t\tself.syncer.timestampLastSyncFromServer = new Date();\n\t\t\treturn successCallback();\n\t\t});\n\t} else {\n\t\treturn successCallback();\n\t}\n};\n\nexports.Syncer = Syncer;\n\n})();\n","type":"application/javascript","module-type":"global"},"$:/core/modules/tiddler.js":{"title":"$:/core/modules/tiddler.js","text":"/*\\\ntitle: $:/core/modules/tiddler.js\ntype: application/javascript\nmodule-type: tiddlermethod\n\nExtension methods for the $tw.Tiddler object (constructor and methods required at boot time are in boot/boot.js)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.hasTag = function(tag) {\n\treturn this.fields.tags && this.fields.tags.indexOf(tag) !== -1;\n};\n\nexports.isPlugin = function() {\n\treturn this.fields.type === \"application/json\" && this.hasField(\"plugin-type\");\n};\n\nexports.isDraft = function() {\n\treturn this.hasField(\"draft.of\");\n};\n\nexports.getFieldString = function(field,defaultValue) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn defaultValue || \"\";\n\t}\n\t// Stringify the field with the associated tiddler field module (if any)\n\tvar fieldModule = $tw.Tiddler.fieldModules[field];\n\tif(fieldModule && fieldModule.stringify) {\n\t\treturn fieldModule.stringify.call(this,value);\n\t} else {\n\t\treturn value.toString();\n\t}\n};\n\n/*\nGet the value of a field as a list\n*/\nexports.getFieldList = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn [];\n\t}\n\treturn $tw.utils.parseStringArray(value);\n};\n\n/*\nGet all the fields as a hashmap of strings. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStrings = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [];\n\tvar fields = {};\n\tfor(var field in this.fields) {\n\t\tif($tw.utils.hop(this.fields,field)) {\n\t\t\tif(exclude.indexOf(field) === -1) {\n\t\t\t\tfields[field] = this.getFieldString(field);\n\t\t\t}\n\t\t}\n\t}\n\treturn fields;\n};\n\n/*\nGet all the fields as a name:value block. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStringBlock = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [],\n\t\tfields = Object.keys(this.fields).sort(),\n\t\tresult = [];\n\tfor(var t=0; t<fields.length; t++) {\n\t\tvar field = fields[t];\n\t\tif(exclude.indexOf(field) === -1) {\n\t\t\tresult.push(field + \": \" + this.getFieldString(field));\n\t\t}\n\t}\n\treturn result.join(\"\\n\");\n};\n\nexports.getFieldDay = function(field) {\n\tif(this.cache && this.cache.day && $tw.utils.hop(this.cache.day,field) ) {\n\t\treturn this.cache.day[field];\n\t}\n\tvar day = \"\";\n\tif(this.fields[field]) {\n\t\tday = (new Date($tw.utils.parseDate(this.fields[field]))).setHours(0,0,0,0);\n\t}\n\tthis.cache.day = this.cache.day || {};\n\tthis.cache.day[field] = day;\n\treturn day;\n};\n\n})();\n","type":"application/javascript","module-type":"tiddlermethod"},"$:/core/modules/upgraders/plugins.js":{"title":"$:/core/modules/upgraders/plugins.js","text":"/*\\\ntitle: $:/core/modules/upgraders/plugins.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that checks that plugins are newer than any already installed version\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar BLOCKED_PLUGINS = {\n\t\"$:/themes/tiddlywiki/stickytitles\": {\n\t\tversions: [\"*\"]\n\t},\n\t\"$:/plugins/tiddlywiki/fullscreen\": {\n\t\tversions: [\"*\"]\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tupgradeLibrary,\n\t\tgetLibraryTiddler = function(title) {\n\t\t\tif(!upgradeLibrary) {\n\t\t\t\tupgradeLibrary = wiki.getTiddlerData(UPGRADE_LIBRARY_TITLE,{});\n\t\t\t\tupgradeLibrary.tiddlers = upgradeLibrary.tiddlers || {};\n\t\t\t}\n\t\t\treturn upgradeLibrary.tiddlers[title];\n\t\t};\n\n\t// Go through all the incoming tiddlers\n\t$tw.utils.each(titles,function(title) {\n\t\tvar incomingTiddler = tiddlers[title];\n\t\t// Check if we're dealing with a plugin\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"]) {\n\t\t\t// Check whether the plugin contains JS modules\n\t\t\tvar requiresReload = wiki.doesPluginInfoRequireReload($tw.utils.parseJSONSafe(incomingTiddler.text)) ? (wiki.getTiddlerText(\"$:/language/ControlPanel/Plugins/PluginWillRequireReload\") + \" \") : \"\";\n\t\t\tmessages[title] = requiresReload;\n\t\t\tif(incomingTiddler.version) {\n\t\t\t\t// Upgrade the incoming plugin if it is in the upgrade library\n\t\t\t\tvar libraryTiddler = getLibraryTiddler(title);\n\t\t\t\tif(libraryTiddler && libraryTiddler[\"plugin-type\"] && libraryTiddler.version) {\n\t\t\t\t\ttiddlers[title] = libraryTiddler;\n\t\t\t\t\tmessages[title] = requiresReload + $tw.language.getString(\"Import/Upgrader/Plugins/Upgraded\",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Suppress the incoming plugin if it is older than the currently installed one\n\t\t\t\tvar existingTiddler = wiki.getTiddler(title);\n\t\t\t\tif(existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t\t\t\t// Reject the incoming plugin by blanking all its fields\n\t\t\t\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) {\n\t\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Version\",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Check whether the plugin is on the blocked list\n\t\t\tvar blockInfo = BLOCKED_PLUGINS[title];\n\t\t\tif(blockInfo) {\n\t\t\t\tif(blockInfo.versions.indexOf(\"*\") !== -1 || (incomingTiddler.version && blockInfo.versions.indexOf(incomingTiddler.version) !== -1)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Incompatible\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n","type":"application/javascript","module-type":"upgrader"},"$:/core/modules/upgraders/system.js":{"title":"$:/core/modules/upgraders/system.js","text":"/*\\\ntitle: $:/core/modules/upgraders/system.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that suppresses certain system tiddlers that shouldn't be imported\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DONT_IMPORT_LIST = [\"$:/Import\", \"$:/build\"],\n\tUNSELECT_PREFIX_LIST = [\"$:/temp/\",\"$:/state/\",\"$:/StoryList\",\"$:/HistoryList\"],\n\tWARN_IMPORT_PREFIX_LIST = [\"$:/core/modules/\"];\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tshowAlert = false;\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tif(DONT_IMPORT_LIST.indexOf(title) !== -1) {\n\t\t\ttiddlers[title] = Object.create(null);\n\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Suppressed\");\n\t\t} else {\n\t\t\tfor(var t=0; t<UNSELECT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = UNSELECT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Tiddler/Unselected\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(var t=0; t<WARN_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = WARN_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix && wiki.isShadowTiddler(title)) {\n\t\t\t\t\tshowAlert = true;\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Warning\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tif(showAlert) {\n\t\tvar logger = new $tw.utils.Logger(\"import\");\n\t\tlogger.alert($tw.language.getString(\"Import/Upgrader/System/Alert\"));\n\t}\n\treturn messages;\n};\n\n})();\n","type":"application/javascript","module-type":"upgrader"},"$:/core/modules/upgraders/themetweaks.js":{"title":"$:/core/modules/upgraders/themetweaks.js","text":"/*\\\ntitle: $:/core/modules/upgraders/themetweaks.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that handles the change in theme tweak storage introduced in 5.0.14-beta.\n\nPreviously, theme tweaks were stored in two data tiddlers:\n\n* $:/themes/tiddlywiki/vanilla/metrics\n* $:/themes/tiddlywiki/vanilla/settings\n\nNow, each tweak is stored in its own separate tiddler.\n\nThis upgrader copies any values from the old format to the new. The old data tiddlers are not deleted in case they have been used to store additional indexes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar MAPPINGS = {\n\t\"$:/themes/tiddlywiki/vanilla/metrics\": {\n\t\t\"fontsize\": \"$:/themes/tiddlywiki/vanilla/metrics/fontsize\",\n\t\t\"lineheight\": \"$:/themes/tiddlywiki/vanilla/metrics/lineheight\",\n\t\t\"storyleft\": \"$:/themes/tiddlywiki/vanilla/metrics/storyleft\",\n\t\t\"storytop\": \"$:/themes/tiddlywiki/vanilla/metrics/storytop\",\n\t\t\"storyright\": \"$:/themes/tiddlywiki/vanilla/metrics/storyright\",\n\t\t\"storywidth\": \"$:/themes/tiddlywiki/vanilla/metrics/storywidth\",\n\t\t\"tiddlerwidth\": \"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"\n\t},\n\t\"$:/themes/tiddlywiki/vanilla/settings\": {\n\t\t\"fontfamily\": \"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tvar mapping = MAPPINGS[title];\n\t\tif(mapping) {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlers[title]),\n\t\t\t\ttiddlerData = wiki.getTiddlerDataCached(tiddler,{});\n\t\t\tfor(var index in mapping) {\n\t\t\t\tvar mappedTitle = mapping[index];\n\t\t\t\tif(!tiddlers[mappedTitle] || tiddlers[mappedTitle].title !== mappedTitle) {\n\t\t\t\t\ttiddlers[mappedTitle] = {\n\t\t\t\t\t\ttitle: mappedTitle,\n\t\t\t\t\t\ttext: tiddlerData[index]\n\t\t\t\t\t};\n\t\t\t\t\tmessages[mappedTitle] = $tw.language.getString(\"Import/Upgrader/ThemeTweaks/Created\",{variables: {\n\t\t\t\t\t\tfrom: title + \"##\" + index\n\t\t\t\t\t}});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n","type":"application/javascript","module-type":"upgrader"},"$:/core/modules/utils/base64-utf8/base64-utf8.module.js":{"text":"(function(){// From https://gist.github.com/Nijikokun/5192472\n//\n// UTF8 Module\n//\n// Cleaner and modularized utf-8 encoding and decoding library for javascript.\n//\n// copyright: MIT\n// author: Nijiko Yonskai, @nijikokun, nijikokun@gmail.com\n!function(r,e,o,t){void 0!==o.module&&o.module.exports?o.module.exports=e.apply(o):void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"utf8\",[],e):o.utf8=e.apply(o)}(0,function(){return{encode:function(r){if(\"string\"!=typeof r)return r;r=r.replace(/\\r\\n/g,\"\\n\");for(var e,o=\"\",t=0;t<r.length;t++)if((e=r.charCodeAt(t))<128)o+=String.fromCharCode(e);else if(e>127&&e<2048)o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128);else if(e>55295&&e<57344&&r.length>t+1){var i=e,n=r.charCodeAt(t+1);t++;var d=65536+(i-55296<<10|n-56320);o+=String.fromCharCode(d>>18|240),o+=String.fromCharCode(d>>12&63|128),o+=String.fromCharCode(d>>6&63|128),o+=String.fromCharCode(63&d|128)}else o+=String.fromCharCode(e>>12|224),o+=String.fromCharCode(e>>6&63|128),o+=String.fromCharCode(63&e|128);return o},decode:function(r){if(\"string\"!=typeof r)return r;for(var e=\"\",o=0,t=0;o<r.length;)if((t=r.charCodeAt(o))<128)e+=String.fromCharCode(t),o++;else if(t>191&&t<224)e+=String.fromCharCode((31&t)<<6|63&r.charCodeAt(o+1)),o+=2;else if(t>223&&t<240)e+=String.fromCharCode((15&t)<<12|(63&r.charCodeAt(o+1))<<6|63&r.charCodeAt(o+2)),o+=3;else{var i=(7&t)<<18|(63&r.charCodeAt(o+1))<<12|(63&r.charCodeAt(o+2))<<6|63&r.charCodeAt(o+3);e+=String.fromCharCode(55296+(i-65536>>10))+String.fromCharCode(56320+(i-65536&1023)),o+=4}return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var i=0;i<t.length;i++)o[t[i]]=o.require(t[i]);o.module.exports=e.apply(o)}else void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"base64\",t||[],e):o.base64=e.apply(o)}(0,function(r){var e=r||this.utf8,o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";return{encode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=e.encode(r);for(var t,i,n,d,f,a,h,C=\"\",c=0;c<r.length;)d=(t=r.charCodeAt(c++))>>2,f=(3&t)<<4|(i=r.charCodeAt(c++))>>4,a=(15&i)<<2|(n=r.charCodeAt(c++))>>6,h=63&n,isNaN(i)?a=h=64:isNaN(n)&&(h=64),C+=o.charAt(d)+o.charAt(f)+o.charAt(a)+o.charAt(h);return C},decode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=r.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");for(var t,i,n,d,f,a,h=\"\",C=0;C<r.length;)t=o.indexOf(r.charAt(C++))<<2|(d=o.indexOf(r.charAt(C++)))>>4,i=(15&d)<<4|(f=o.indexOf(r.charAt(C++)))>>2,n=(3&f)<<6|(a=o.indexOf(r.charAt(C++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(i)),64!=a&&(h+=String.fromCharCode(n));return e.decode(h)}}},this,[\"utf8\"]);}).call(exports);","type":"application/javascript","title":"$:/core/modules/utils/base64-utf8/base64-utf8.module.js","module-type":"library"},"$:/core/modules/utils/crypto.js":{"title":"$:/core/modules/utils/crypto.js","text":"/*\\\ntitle: $:/core/modules/utils/crypto.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions related to crypto.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for an encrypted store area in the text of a TiddlyWiki file\n*/\nexports.extractEncryptedStoreArea = function(text) {\n\tvar encryptedStoreAreaStartMarker = \"<pre id=\\\"encryptedStoreArea\\\" type=\\\"text/plain\\\" style=\\\"display:none;\\\">\",\n\t\tencryptedStoreAreaStart = text.indexOf(encryptedStoreAreaStartMarker);\n\tif(encryptedStoreAreaStart !== -1) {\n\t\tvar encryptedStoreAreaEnd = text.indexOf(\"</pre>\",encryptedStoreAreaStart);\n\t\tif(encryptedStoreAreaEnd !== -1) {\n\t\t\treturn $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd));\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If the password is not provided then the password in the password store will be used\n*/\nexports.decryptStoreArea = function(encryptedStoreArea,password) {\n\tvar decryptedText = $tw.crypto.decrypt(encryptedStoreArea,password);\n\tif(decryptedText) {\n\t\tvar json = $tw.utils.parseJSONSafe(decryptedText),\n\t\t\ttiddlers = [];\n\t\tfor(var title in json) {\n\t\t\tif(title !== \"$:/isEncrypted\") {\n\t\t\t\ttiddlers.push(json[title]);\n\t\t\t}\n\t\t}\n\t\treturn tiddlers;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If that fails, the user is prompted for a password.\nencryptedStoreArea: text of the TiddlyWiki encrypted store area\ncallback: function(tiddlers) called with the array of decrypted tiddlers\n\nThe following configuration settings are supported:\n\n$tw.config.usePasswordVault: causes any password entered by the user to also be put into the system password vault\n*/\nexports.decryptStoreAreaInteractive = function(encryptedStoreArea,callback,options) {\n\t// Try to decrypt with the current password\n\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea);\n\tif(tiddlers) {\n\t\tcallback(tiddlers);\n\t} else {\n\t\t// Prompt for a new password and keep trying\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: \"Enter a password to decrypt the imported TiddlyWiki\",\n\t\t\tnoUserName: true,\n\t\t\tcanCancel: true,\n\t\t\tsubmitText: \"Decrypt\",\n\t\t\tcallback: function(data) {\n\t\t\t\t// Exit if the user cancelled\n\t\t\t\tif(!data) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Attempt to decrypt the tiddlers\n\t\t\t\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea,data.password);\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tif($tw.config.usePasswordVault) {\n\t\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t\t}\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t\t// Exit and remove the password prompt\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\t// We didn't decrypt everything, so continue to prompt for password\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/csv.js":{"title":"$:/core/modules/utils/csv.js","text":"/*\\\ntitle: $:/core/modules/utils/csv.js\ntype: application/javascript\nmodule-type: utils\n\nA barebones CSV parser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar QUOTE = '\"';\n\nvar getCellInfo = function(text, start, length, SEPARATOR) {\n\tvar isCellQuoted = text.charAt(start) === QUOTE;\n\tvar cellStart = isCellQuoted ? start + 1 : start;\n\t\n\tif (text.charAt(i) === SEPARATOR) {\n\t\treturn [cellStart, cellStart, false];\n\t}\n\t\n\tfor (var i = cellStart; i < length; i++) {\n\t\tvar cellCharacter = text.charAt(i);\n\t\tvar isEOL = cellCharacter === \"\\n\" || cellCharacter === \"\\r\";\n\t\t\n\t\tif (isEOL && !isCellQuoted) {\n\t\t\treturn [cellStart, i, false];\n\t\t\t\n\t\t} else if (cellCharacter === SEPARATOR && !isCellQuoted) {\n\t\t\treturn [cellStart, i, false];\n\t\t\t\n\t\t} else if (cellCharacter === QUOTE && isCellQuoted) {\n\t\t\tvar nextCharacter = i + 1 < length ? text.charAt(i + 1) : '';\n\t\t\tif (nextCharacter !== QUOTE) {\n\t\t\t\treturn [cellStart, i, true];\n\t\t\t} else {\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn [cellStart, i, isCellQuoted];\n}\n\t\nexports.parseCsvString = function(text, options) {\n\tif (!text) {\n\t\treturn [];\n\t}\n\t\n\toptions = options || {};\n\tvar SEPARATOR = options.separator || \",\",\n\t\tlength = text.length,\n\t\trows = [],\n\t\tnextRow = [];\n\t\t\n\tfor (var i = 0; i < length; i++) {\n\t\tvar cellInfo = getCellInfo(text, i, length, SEPARATOR);\n\t\tvar cellText = text.substring(cellInfo[0], cellInfo[1]);\n\t\tif (cellInfo[2]) {\n\t\t\tcellText = cellText.replace(/\"\"/g, '\"');\n\t\t\tcellInfo[1]++;\n\t\t}\n\t\tnextRow.push(cellText);\n\t\t\n\t\ti = cellInfo[1];\n\t\t\n\t\tvar character = text.charAt(i);\n\t\tvar nextCharacter = i + 1 < length ? text.charAt(i + 1) : '';\n\t\t\n\t\tif (character === \"\\r\" || character === \"\\n\") {\n\t\t\t// Edge case for empty rows\n\t\t\tif (nextRow.length === 1 && nextRow[0] === '') {\n\t\t\t\tnextRow.length = 0;\n\t\t\t}\n\t\t\trows.push(nextRow);\n\t\t\tnextRow = [];\n\t\t\t\n\t\t\tif (character === \"\\r\") {\n\t\t\t\tvar nextCharacter = i + 1 < length ? text.charAt(i + 1) : '';\n\t\t\t\t\n\t\t\t\tif (nextCharacter === \"\\n\") {\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t// Special case if last cell in last row is an empty cell\n\tif (text.charAt(length - 1) === SEPARATOR) {\n\t\tnextRow.push(\"\");\n\t}\n\t\n\trows.push(nextRow);\n\t\n\treturn rows;\n}\n\n/*\nParse a CSV string with a header row and return an array of hashmaps.\n*/\nexports.parseCsvStringWithHeader = function(text,options) {\n\tvar csv = $tw.utils.parseCsvString(text, options);\n\tvar headers = csv[0];\n\t\n\tcsv = csv.slice(1);\n\tfor (var i = 0; i < csv.length; i++) {\n\t\tvar row = csv[i];\n\t\tvar rowObject = Object.create(null);\n\n\t\tfor(var columnIndex=0; columnIndex<headers.length; columnIndex++) {\n\t\t\tvar columnName = headers[columnIndex];\n\t\t\tif (columnName) {\n\t\t\t\trowObject[columnName] = $tw.utils.trim(row[columnIndex] || \"\");\n\t\t\t}\n\t\t}\n\t\tcsv[i] = rowObject;\n\t}\n\treturn csv;\n}\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/diff-match-patch/diff_match_patch.js":{"text":"(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=.5;this.Patch_Margin=4;this.Match_MaxBits=32}var DIFF_DELETE=-1,DIFF_INSERT=1,DIFF_EQUAL=0;\ndiff_match_patch.prototype.diff_main=function(a,b,c,d){\"undefined\"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error(\"Null input. (diff_main)\");if(a==b)return a?[[DIFF_EQUAL,a]]:[];\"undefined\"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);f=this.diff_commonSuffix(a,b);var g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,\nb,e,d);c&&a.unshift([DIFF_EQUAL,c]);g&&a.push([DIFF_EQUAL,g]);this.diff_cleanupMerge(a);return a};\ndiff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[DIFF_INSERT,b]];if(!b)return[[DIFF_DELETE,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[DIFF_INSERT,e.substring(0,g)],[DIFF_EQUAL,f],[DIFF_INSERT,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=DIFF_DELETE),c):1==f.length?[[DIFF_DELETE,a],[DIFF_INSERT,b]]:(e=this.diff_halfMatch_(a,b))?(b=e[1],f=e[3],a=e[4],e=this.diff_main(e[0],e[2],c,d),c=this.diff_main(b,f,c,d),e.concat([[DIFF_EQUAL,\na]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a,b,d):this.diff_bisect_(a,b,d)};\ndiff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([DIFF_EQUAL,\"\"]);for(var e=d=b=0,f=\"\",g=\"\";b<a.length;){switch(a[b][0]){case DIFF_INSERT:e++;g+=a[b][1];break;case DIFF_DELETE:d++;f+=a[b][1];break;case DIFF_EQUAL:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=\nd.length}d=e=0;g=f=\"\"}b++}a.pop();return a};\ndiff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=2*f,h=Array(g),l=Array(g),k=0;k<g;k++)h[k]=-1,l[k]=-1;h[f+1]=0;l[f+1]=0;k=d-e;for(var m=0!=k%2,p=0,x=0,w=0,q=0,t=0;t<f&&!((new Date).getTime()>c);t++){for(var v=-t+p;v<=t-x;v+=2){var n=f+v;var r=v==-t||v!=t&&h[n-1]<h[n+1]?h[n+1]:h[n-1]+1;for(var y=r-v;r<d&&y<e&&a.charAt(r)==b.charAt(y);)r++,y++;h[n]=r;if(r>d)x+=2;else if(y>e)p+=2;else if(m&&(n=f+k-v,0<=n&&n<g&&-1!=l[n])){var u=d-l[n];if(r>=\nu)return this.diff_bisectSplit_(a,b,r,y,c)}}for(v=-t+w;v<=t-q;v+=2){n=f+v;u=v==-t||v!=t&&l[n-1]<l[n+1]?l[n+1]:l[n-1]+1;for(r=u-v;u<d&&r<e&&a.charAt(d-u-1)==b.charAt(e-r-1);)u++,r++;l[n]=u;if(u>d)q+=2;else if(r>e)w+=2;else if(!m&&(n=f+k-v,0<=n&&n<g&&-1!=h[n]&&(r=h[n],y=f+r-n,u=d-u,r>=u)))return this.diff_bisectSplit_(a,b,r,y,c)}}return[[DIFF_DELETE,a],[DIFF_INSERT,b]]};\ndiff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};\ndiff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b=\"\",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf(\"\\n\",c);-1==f&&(f=a.length-1);var h=a.substring(c,f+1);c=f+1;(e.hasOwnProperty?e.hasOwnProperty(h):void 0!==e[h])?b+=String.fromCharCode(e[h]):(b+=String.fromCharCode(g),e[h]=g,d[g++]=h)}return b}var d=[],e={};d[0]=\"\";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};\ndiff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join(\"\")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;d=0;for(var e=1;;){var f=a.substring(c-e);f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};\ndiff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g=\"\",h,k,l,m;-1!=(e=b.indexOf(d,e+1));){var p=f.diff_commonPrefix(a.substring(c),b.substring(e)),u=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<u+p&&(g=b.substring(e-u,e)+b.substring(e,e+p),h=a.substring(0,c-u),k=a.substring(c+p),l=b.substring(0,e-u),m=b.substring(e+p))}return 2*g.length>=a.length?[h,k,l,m,g]:null}if(0>=this.Diff_Timeout)return null;\nvar d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4));d=c(d,e,Math.ceil(d.length/2));if(g||d)g=d?g?g[4].length>d[4].length?g:d:d:g;else return null;if(a.length>b.length){d=g[0];e=g[1];var h=g[2];var l=g[3]}else h=g[0],l=g[1],d=g[2],e=g[3];return[d,e,h,l,g[4]]};\ndiff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,l=0,k=0;f<a.length;)a[f][0]==DIFF_EQUAL?(c[d++]=f,g=l,h=k,k=l=0,e=a[f][1]):(a[f][0]==DIFF_INSERT?l+=a[f][1].length:k+=a[f][1].length,e&&e.length<=Math.max(g,h)&&e.length<=Math.max(l,k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,d--,f=0<d?c[d-1]:-1,k=l=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(a[f-1][0]==\nDIFF_DELETE&&a[f][0]==DIFF_INSERT){b=a[f-1][1];c=a[f][1];d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[DIFF_EQUAL,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[DIFF_EQUAL,b.substring(0,e)]),a[f-1][0]=DIFF_INSERT,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=DIFF_DELETE,a[f+1][1]=b.substring(e),f++;f++}f++}};\ndiff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_);c=g&&c.match(diff_match_patch.linebreakRegex_);d=h&&d.match(diff_match_patch.linebreakRegex_);var k=c&&a.match(diff_match_patch.blanklineEndRegex_),l=d&&b.match(diff_match_patch.blanklineStartRegex_);\nreturn k||l?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(a[c-1][0]==DIFF_EQUAL&&a[c+1][0]==DIFF_EQUAL){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g){var h=e.substring(e.length-g);d=d.substring(0,d.length-g);e=h+e.substring(0,e.length-g);f=h+f}g=d;h=e;for(var l=f,k=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){d+=e.charAt(0);e=e.substring(1)+f.charAt(0);f=f.substring(1);var m=b(d,e)+b(e,f);m>=k&&(k=m,g=d,h=e,l=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-\n1,1),c--),a[c][1]=h,l?a[c+1][1]=l:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\\s/;diff_match_patch.linebreakRegex_=/[\\r\\n]/;diff_match_patch.blanklineEndRegex_=/\\n\\r?\\n$/;diff_match_patch.blanklineStartRegex_=/^\\r?\\n\\r?\\n/;\ndiff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,l=!1,k=!1;f<a.length;)a[f][0]==DIFF_EQUAL?(a[f][1].length<this.Diff_EditCost&&(l||k)?(c[d++]=f,g=l,h=k,e=a[f][1]):(d=0,e=null),l=k=!1):(a[f][0]==DIFF_DELETE?k=!0:l=!0,e&&(g&&h&&l&&k||e.length<this.Diff_EditCost/2&&3==g+h+l+k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,e=null,g&&h?(l=k=!0,d=0):(d--,f=0<d?c[d-1]:-1,l=k=!1),b=!0)),f++;b&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([DIFF_EQUAL,\"\"]);for(var b=0,c=0,d=0,e=\"\",f=\"\",g;b<a.length;)switch(a[b][0]){case DIFF_INSERT:d++;f+=a[b][1];b++;break;case DIFF_DELETE:c++;e+=a[b][1];b++;break;case DIFF_EQUAL:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&a[b-c-d-1][0]==DIFF_EQUAL?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[DIFF_EQUAL,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-\ng)+a[b][1],f=f.substring(0,f.length-g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[DIFF_INSERT,f]):0===d?a.splice(b-c,c+d,[DIFF_DELETE,e]):a.splice(b-c-d,c+d,[DIFF_DELETE,e],[DIFF_INSERT,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&a[b-1][0]==DIFF_EQUAL?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=\"\"}\"\"===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)a[b-1][0]==DIFF_EQUAL&&a[b+1][0]==DIFF_EQUAL&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,\na[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){a[g][0]!==DIFF_INSERT&&(c+=a[g][1].length);a[g][0]!==DIFF_DELETE&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&a[g][0]===DIFF_DELETE?f:f+(b-e)};\ndiff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\\n/g,g=0;g<a.length;g++){var h=a[g][0],l=a[g][1].replace(c,\"&amp;\").replace(d,\"&lt;\").replace(e,\"&gt;\").replace(f,\"&para;<br>\");switch(h){case DIFF_INSERT:b[g]='<ins style=\"background:#e6ffe6;\">'+l+\"</ins>\";break;case DIFF_DELETE:b[g]='<del style=\"background:#ffe6e6;\">'+l+\"</del>\";break;case DIFF_EQUAL:b[g]=\"<span>\"+l+\"</span>\"}}return b.join(\"\")};\ndiff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_INSERT&&(b[c]=a[c][1]);return b.join(\"\")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_DELETE&&(b[c]=a[c][1]);return b.join(\"\")};\ndiff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][1];switch(a[e][0]){case DIFF_INSERT:c+=f.length;break;case DIFF_DELETE:d+=f.length;break;case DIFF_EQUAL:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};\ndiff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case DIFF_INSERT:b[c]=\"+\"+encodeURI(a[c][1]);break;case DIFF_DELETE:b[c]=\"-\"+a[c][1].length;break;case DIFF_EQUAL:b[c]=\"=\"+a[c][1].length}return b.join(\"\\t\").replace(/%20/g,\" \")};\ndiff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case \"+\":try{c[d++]=[DIFF_INSERT,decodeURI(h)]}catch(k){throw Error(\"Illegal escape in diff_fromDelta: \"+h);}break;case \"-\":case \"=\":var l=parseInt(h,10);if(isNaN(l)||0>l)throw Error(\"Invalid number in diff_fromDelta: \"+h);h=a.substring(e,e+=l);\"=\"==f[g].charAt(0)?c[d++]=[DIFF_EQUAL,h]:c[d++]=[DIFF_DELETE,h];break;default:if(f[g])throw Error(\"Invalid diff operation in diff_fromDelta: \"+\nf[g]);}}if(e!=a.length)throw Error(\"Delta length (\"+e+\") does not equal source text length (\"+a.length+\").\");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error(\"Null input. (match_main)\");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};\ndiff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return f.Match_Distance?e+g/f.Match_Distance:g?1:e}if(b.length>this.Match_MaxBits)throw Error(\"Pattern too long for this browser.\");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));var l=1<<b.length-1;h=-1;for(var k,m,p=b.length+a.length,x,w=0;w<b.length;w++){k=0;for(m=p;k<m;)d(w,\nc+m)<=g?k=m:p=m,m=Math.floor((p-k)/2+k);p=m;k=Math.max(1,c-m+1);var q=Math.min(c+m,a.length)+b.length;m=Array(q+2);for(m[q+1]=(1<<w)-1;q>=k;q--){var t=e[a.charAt(q-1)];m[q]=0===w?(m[q+1]<<1|1)&t:(m[q+1]<<1|1)&t|(x[q+1]|x[q])<<1|1|x[q+1];if(m[q]&l&&(t=d(w,q-1),t<=g))if(g=t,h=q-1,h>c)k=Math.max(1,2*c-h);else break}if(d(w+1,c)>g)break;x=m}return h};\ndiff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b};\ndiff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([DIFF_EQUAL,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([DIFF_EQUAL,d]);a.start1-=c.length;a.start2-=\nc.length;a.length1+=c.length+d.length;a.length2+=c.length+d.length}};\ndiff_match_patch.prototype.patch_make=function(a,b,c){if(\"string\"==typeof a&&\"string\"==typeof b&&\"undefined\"==typeof c){var d=a;b=this.diff_main(d,b,!0);2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b))}else if(a&&\"object\"==typeof a&&\"undefined\"==typeof b&&\"undefined\"==typeof c)b=a,d=this.diff_text1(b);else if(\"string\"==typeof a&&b&&\"object\"==typeof b&&\"undefined\"==typeof c)d=a;else if(\"string\"==typeof a&&\"string\"==typeof b&&c&&\"object\"==typeof c)d=a,b=c;else throw Error(\"Unknown call format to patch_make.\");\nif(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,l=0;l<b.length;l++){var k=b[l][0],m=b[l][1];e||k===DIFF_EQUAL||(a.start1=f,a.start2=g);switch(k){case DIFF_INSERT:a.diffs[e++]=b[l];a.length2+=m.length;d=d.substring(0,g)+m+d.substring(g);break;case DIFF_DELETE:a.length1+=m.length;a.diffs[e++]=b[l];d=d.substring(0,g)+d.substring(g+m.length);break;case DIFF_EQUAL:m.length<=2*this.Patch_Margin&&e&&b.length!=l+1?(a.diffs[e++]=b[l],a.length1+=m.length,a.length2+=m.length):\nm.length>=2*this.Patch_Margin&&e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}k!==DIFF_INSERT&&(f+=m.length);k!==DIFF_DELETE&&(g+=m.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};\ndiff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};\ndiff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),l=-1;if(h.length>this.Match_MaxBits){var k=this.match_main(b,h.substring(0,this.Match_MaxBits),g);-1!=k&&(l=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==l||k>=l)&&(k=-1)}else k=this.match_main(b,h,\ng);if(-1==k)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=k-g,g=-1==l?b.substring(k,k+h.length):b.substring(k,l+this.Match_MaxBits),h==g)b=b.substring(0,k)+this.diff_text2(a[f].diffs)+b.substring(k+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);h=0;var m;for(l=0;l<a[f].diffs.length;l++){var p=a[f].diffs[l];p[0]!==DIFF_EQUAL&&(m=this.diff_xIndex(g,h));p[0]===\nDIFF_INSERT?b=b.substring(0,k+m)+p[1]+b.substring(k+m):p[0]===DIFF_DELETE&&(b=b.substring(0,k+m)+b.substring(k+this.diff_xIndex(g,h+p[1].length)));p[0]!==DIFF_DELETE&&(h+=p[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};\ndiff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c=\"\",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;d=a[0];var e=d.diffs;if(0==e.length||e[0][0]!=DIFF_EQUAL)e.unshift([DIFF_EQUAL,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||e[e.length-\n1][0]!=DIFF_EQUAL?(e.push([DIFF_EQUAL,c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};\ndiff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g=\"\";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,l=!0;h.start1=e-g.length;h.start2=f-g.length;\"\"!==g&&(h.length1=h.length2=g.length,h.diffs.push([DIFF_EQUAL,g]));for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){g=d.diffs[0][0];var k=d.diffs[0][1];g===DIFF_INSERT?(h.length2+=k.length,f+=k.length,h.diffs.push(d.diffs.shift()),\nl=!1):g===DIFF_DELETE&&1==h.diffs.length&&h.diffs[0][0]==DIFF_EQUAL&&k.length>2*b?(h.length1+=k.length,e+=k.length,l=!1,h.diffs.push([g,k]),d.diffs.shift()):(k=k.substring(0,b-h.length1-this.Patch_Margin),h.length1+=k.length,e+=k.length,g===DIFF_EQUAL?(h.length2+=k.length,f+=k.length):l=!1,h.diffs.push([g,k]),k==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(k.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);k=this.diff_text1(d.diffs).substring(0,\nthis.Patch_Margin);\"\"!==k&&(h.length1+=k.length,h.length2+=k.length,0!==h.diffs.length&&h.diffs[h.diffs.length-1][0]===DIFF_EQUAL?h.diffs[h.diffs.length-1][1]+=k:h.diffs.push([DIFF_EQUAL,k]));l||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join(\"\")};\ndiff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split(\"\\n\");for(var c=0,d=/^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error(\"Invalid patch string: \"+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);\"\"===e[2]?(f.start1--,f.length1=1):\"0\"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);\"\"===e[4]?(f.start2--,f.length2=1):\"0\"==e[4]?f.length2=0:(f.start2--,f.length2=\nparseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error(\"Illegal escape in patch_fromText: \"+g);}if(\"-\"==e)f.diffs.push([DIFF_DELETE,g]);else if(\"+\"==e)f.diffs.push([DIFF_INSERT,g]);else if(\" \"==e)f.diffs.push([DIFF_EQUAL,g]);else if(\"@\"==e)break;else if(\"\"!==e)throw Error('Invalid patch mode \"'+e+'\" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};\ndiff_match_patch.patch_obj.prototype.toString=function(){for(var a=[\"@@ -\"+(0===this.length1?this.start1+\",0\":1==this.length1?this.start1+1:this.start1+1+\",\"+this.length1)+\" +\"+(0===this.length2?this.start2+\",0\":1==this.length2?this.start2+1:this.start2+1+\",\"+this.length2)+\" @@\\n\"],b,c=0;c<this.diffs.length;c++){switch(this.diffs[c][0]){case DIFF_INSERT:b=\"+\";break;case DIFF_DELETE:b=\"-\";break;case DIFF_EQUAL:b=\" \"}a[c+1]=b+encodeURI(this.diffs[c][1])+\"\\n\"}return a.join(\"\").replace(/%20/g,\" \")};\nthis.diff_match_patch=diff_match_patch;this.DIFF_DELETE=DIFF_DELETE;this.DIFF_INSERT=DIFF_INSERT;this.DIFF_EQUAL=DIFF_EQUAL;\n}).call(exports);","type":"application/javascript","title":"$:/core/modules/utils/diff-match-patch/diff_match_patch.js","module-type":"library"},"$:/core/modules/utils/dom/animations/slide.js":{"title":"$:/core/modules/utils/dom/animations/slide.js","text":"/*\\\ntitle: $:/core/modules/utils/dom/animations/slide.js\ntype: application/javascript\nmodule-type: animation\n\nA simple slide animation that varies the height of the element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction slideOpen(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration();\n\t// Get the current height of the domNode\n\tvar computedStyle = window.getComputedStyle(domNode),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrPaddingBottom = parseInt(computedStyle.paddingBottom,10),\n\t\tcurrPaddingTop = parseInt(computedStyle.paddingTop,10),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"none\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{marginTop: currMarginTop + \"px\"},\n\t\t{paddingBottom: currPaddingBottom + \"px\"},\n\t\t{paddingTop: currPaddingTop + \"px\"},\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n}\n\nfunction slideClosed(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration(),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Clear the properties we've set when the animation is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n}\n\nexports.slide = {\n\topen: slideOpen,\n\tclose: slideClosed\n};\n\n})();\n","type":"application/javascript","module-type":"animation"},"$:/core/modules/utils/dom/animator.js":{"title":"$:/core/modules/utils/dom/animator.js","text":"/*\\\ntitle: $:/core/modules/utils/dom/animator.js\ntype: application/javascript\nmodule-type: utils\n\nOrchestrates animations and transitions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Animator() {\n\t// Get the registered animation modules\n\tthis.animations = {};\n\t$tw.modules.applyMethods(\"animation\",this.animations);\n}\n\nAnimator.prototype.perform = function(type,domNode,options) {\n\toptions = options || {};\n\t// Find an animation that can handle this type\n\tvar chosenAnimation;\n\t$tw.utils.each(this.animations,function(animation,name) {\n\t\tif($tw.utils.hop(animation,type)) {\n\t\t\tchosenAnimation = animation[type];\n\t\t}\n\t});\n\tif(!chosenAnimation) {\n\t\tchosenAnimation = function(domNode,options) {\n\t\t\tif(options.callback) {\n\t\t\t\toptions.callback();\n\t\t\t}\n\t\t};\n\t}\n\t// Call the animation\n\tchosenAnimation(domNode,options);\n};\n\nexports.Animator = Animator;\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/dom/browser.js":{"title":"$:/core/modules/utils/dom/browser.js","text":"/*\\\ntitle: $:/core/modules/utils/dom/browser.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser feature detection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet style properties of an element\n\telement: dom node\n\tstyles: ordered array of {name: value} pairs\n*/\nexports.setStyle = function(element,styles) {\n\tif(element.nodeType === 1) { // Element.ELEMENT_NODE\n\t\tfor(var t=0; t<styles.length; t++) {\n\t\t\tfor(var styleName in styles[t]) {\n\t\t\t\telement.style[$tw.utils.convertStyleNameToPropertyName(styleName)] = styles[t][styleName];\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nConverts a standard CSS property name into the local browser-specific equivalent. For example:\n\t\"background-color\" --> \"backgroundColor\"\n\t\"transition\" --> \"webkitTransition\"\n*/\n\nvar styleNameCache = {}; // We'll cache the style name conversions\n\nexports.convertStyleNameToPropertyName = function(styleName) {\n\t// Return from the cache if we can\n\tif(styleNameCache[styleName]) {\n\t\treturn styleNameCache[styleName];\n\t}\n\t// Convert it by first removing any hyphens\n\tvar propertyName = $tw.utils.unHyphenateCss(styleName);\n\t// Then check if it needs a prefix\n\tif($tw.browser && document.body.style[propertyName] === undefined) {\n\t\tvar prefixes = [\"O\",\"MS\",\"Moz\",\"webkit\"];\n\t\tfor(var t=0; t<prefixes.length; t++) {\n\t\t\tvar prefixedName = prefixes[t] + propertyName.substr(0,1).toUpperCase() + propertyName.substr(1);\n\t\t\tif(document.body.style[prefixedName] !== undefined) {\n\t\t\t\tpropertyName = prefixedName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// Put it in the cache too\n\tstyleNameCache[styleName] = propertyName;\n\treturn propertyName;\n};\n\n/*\nConverts a JS format CSS property name back into the dashed form used in CSS declarations. For example:\n\t\"backgroundColor\" --> \"background-color\"\n\t\"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.convertPropertyNameToStyleName = function(propertyName) {\n\t// Rehyphenate the name\n\tvar styleName = $tw.utils.hyphenateCss(propertyName);\n\t// If there's a webkit prefix, add a dash (other browsers have uppercase prefixes, and so get the dash automatically)\n\tif(styleName.indexOf(\"webkit\") === 0) {\n\t\tstyleName = \"-\" + styleName;\n\t} else if(styleName.indexOf(\"-m-s\") === 0) {\n\t\tstyleName = \"-ms\" + styleName.substr(4);\n\t}\n\treturn styleName;\n};\n\n/*\nRound trip a stylename to a property name and back again. For example:\n\t\"transform\" --> \"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.roundTripPropertyName = function(propertyName) {\n\treturn $tw.utils.convertPropertyNameToStyleName($tw.utils.convertStyleNameToPropertyName(propertyName));\n};\n\n/*\nConverts a standard event name into the local browser specific equivalent. For example:\n\t\"animationEnd\" --> \"webkitAnimationEnd\"\n*/\n\nvar eventNameCache = {}; // We'll cache the conversions\n\nvar eventNameMappings = {\n\t\"transitionEnd\": {\n\t\tcorrespondingCssProperty: \"transition\",\n\t\tmappings: {\n\t\t\ttransition: \"transitionend\",\n\t\t\tOTransition: \"oTransitionEnd\",\n\t\t\tMSTransition: \"msTransitionEnd\",\n\t\t\tMozTransition: \"transitionend\",\n\t\t\twebkitTransition: \"webkitTransitionEnd\"\n\t\t}\n\t},\n\t\"animationEnd\": {\n\t\tcorrespondingCssProperty: \"animation\",\n\t\tmappings: {\n\t\t\tanimation: \"animationend\",\n\t\t\tOAnimation: \"oAnimationEnd\",\n\t\t\tMSAnimation: \"msAnimationEnd\",\n\t\t\tMozAnimation: \"animationend\",\n\t\t\twebkitAnimation: \"webkitAnimationEnd\"\n\t\t}\n\t}\n};\n\nexports.convertEventName = function(eventName) {\n\tif(eventNameCache[eventName]) {\n\t\treturn eventNameCache[eventName];\n\t}\n\tvar newEventName = eventName,\n\t\tmappings = eventNameMappings[eventName];\n\tif(mappings) {\n\t\tvar convertedProperty = $tw.utils.convertStyleNameToPropertyName(mappings.correspondingCssProperty);\n\t\tif(mappings.mappings[convertedProperty]) {\n\t\t\tnewEventName = mappings.mappings[convertedProperty];\n\t\t}\n\t}\n\t// Put it in the cache too\n\teventNameCache[eventName] = newEventName;\n\treturn newEventName;\n};\n\n/*\nReturn the names of the fullscreen APIs\n*/\nexports.getFullScreenApis = function() {\n\tvar d = document,\n\t\tdb = d.body,\n\t\tresult = {\n\t\t\"_requestFullscreen\": db.webkitRequestFullscreen !== undefined ? \"webkitRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.mozRequestFullScreen !== undefined ? \"mozRequestFullScreen\" :\n\t\t\t\t\t\t\tdb.msRequestFullscreen !== undefined ? \"msRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.requestFullscreen !== undefined ? \"requestFullscreen\" : \"\",\n\t\t\"_exitFullscreen\": d.webkitExitFullscreen !== undefined ? \"webkitExitFullscreen\" :\n\t\t\t\t\t\t\td.mozCancelFullScreen !== undefined ? \"mozCancelFullScreen\" :\n\t\t\t\t\t\t\td.msExitFullscreen !== undefined ? \"msExitFullscreen\" :\n\t\t\t\t\t\t\td.exitFullscreen !== undefined ? \"exitFullscreen\" : \"\",\n\t\t\"_fullscreenElement\": d.webkitFullscreenElement !== undefined ? \"webkitFullscreenElement\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozFullScreenElement\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"msFullscreenElement\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenElement\" : \"\",\n\t\t\"_fullscreenChange\": d.webkitFullscreenElement !== undefined ? \"webkitfullscreenchange\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozfullscreenchange\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"MSFullscreenChange\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenchange\" : \"\"\n\t};\n\tif(!result._requestFullscreen || !result._exitFullscreen || !result._fullscreenElement || !result._fullscreenChange) {\n\t\treturn null;\n\t} else {\n\t\treturn result;\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/dom/csscolorparser.js":{"title":"$:/core/modules/utils/dom/csscolorparser.js","text":"// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n  \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n  \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n  \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n  \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n  \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n  \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n  \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n  \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n  \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n  \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n  \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n  \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n  \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n  \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n  \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n  \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n  \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n  \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n  \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n  \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n  \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n  \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n  \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n  \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n  \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n  \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n  \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n  \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n  \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n  \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n  \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n  \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n  \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n  \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n  \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n  \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n  \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n  \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n  \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n  \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n  \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n  \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n  \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n  \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n  \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n  \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n  \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n  \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n  \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n  \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n  \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n  \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n  \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n  \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n  \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n  \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n  \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n  \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n  \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n  \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n  \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n  \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n  \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n  \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n  \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n  \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n  \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n  \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n  \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n  \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n  \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n  \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n  \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n  \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) {  // Clamp to integer 0 .. 255.\n  i = Math.round(i);  // Seems to be what Chrome does (vs truncation).\n  return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) {  // Clamp to float 0.0 .. 1.0.\n  return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) {  // int or percentage.\n  if (str[str.length - 1] === '%')\n    return clamp_css_byte(parseFloat(str) / 100 * 255);\n  return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) {  // float or percentage.\n  if (str[str.length - 1] === '%')\n    return clamp_css_float(parseFloat(str) / 100);\n  return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n  if (h < 0) h += 1;\n  else if (h > 1) h -= 1;\n\n  if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n  if (h * 2 < 1) return m2;\n  if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n  return m1;\n}\n\nfunction parseCSSColor(css_str) {\n  // Remove all whitespace, not compliant, but should just be more accepting.\n  var str = css_str.replace(/ /g, '').toLowerCase();\n\n  // Color keywords (and transparent) lookup.\n  if (str in kCSSColorTable) return kCSSColorTable[str].slice();  // dup.\n\n  // #abc and #abc123 syntax.\n  if (str[0] === '#') {\n    if (str.length === 4) {\n      var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\n      if (!(iv >= 0 && iv <= 0xfff)) return null;  // Covers NaN.\n      return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n              (iv & 0xf0) | ((iv & 0xf0) >> 4),\n              (iv & 0xf) | ((iv & 0xf) << 4),\n              1];\n    } else if (str.length === 7) {\n      var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\n      if (!(iv >= 0 && iv <= 0xffffff)) return null;  // Covers NaN.\n      return [(iv & 0xff0000) >> 16,\n              (iv & 0xff00) >> 8,\n              iv & 0xff,\n              1];\n    }\n\n    return null;\n  }\n\n  var op = str.indexOf('('), ep = str.indexOf(')');\n  if (op !== -1 && ep + 1 === str.length) {\n    var fname = str.substr(0, op);\n    var params = str.substr(op+1, ep-(op+1)).split(',');\n    var alpha = 1;  // To allow case fallthrough.\n    switch (fname) {\n      case 'rgba':\n        if (params.length !== 4) return null;\n        alpha = parse_css_float(params.pop());\n        // Fall through.\n      case 'rgb':\n        if (params.length !== 3) return null;\n        return [parse_css_int(params[0]),\n                parse_css_int(params[1]),\n                parse_css_int(params[2]),\n                alpha];\n      case 'hsla':\n        if (params.length !== 4) return null;\n        alpha = parse_css_float(params.pop());\n        // Fall through.\n      case 'hsl':\n        if (params.length !== 3) return null;\n        var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360;  // 0 .. 1\n        // NOTE(deanm): According to the CSS spec s/l should only be\n        // percentages, but we don't bother and let float or percentage.\n        var s = parse_css_float(params[1]);\n        var l = parse_css_float(params[2]);\n        var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n        var m1 = l * 2 - m2;\n        return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n                clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n                clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n                alpha];\n      default:\n        return null;\n    }\n  }\n\n  return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/dom.js":{"title":"$:/core/modules/utils/dom.js","text":"/*\\\ntitle: $:/core/modules/utils/dom.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static DOM-related utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Popup = require(\"$:/core/modules/utils/dom/popup.js\");\n\n/*\nDetermines whether element 'a' contains element 'b'\nCode thanks to John Resig, http://ejohn.org/blog/comparing-document-position/\n*/\nexports.domContains = function(a,b) {\n\treturn a.contains ?\n\t\ta !== b && a.contains(b) :\n\t\t!!(a.compareDocumentPosition(b) & 16);\n};\n\nexports.domMatchesSelector = function(node,selector) {\n\treturn node.matches ? node.matches(selector) : node.msMatchesSelector(selector);\n};\n\n/*\nSelect text in a an input or textarea (setSelectionRange crashes on certain input types)\n*/\nexports.setSelectionRangeSafe = function(node,start,end,direction) {\n\ttry {\n\t\tnode.setSelectionRange(start,end,direction);\n\t} catch(e) {\n\t\tnode.select();\n\t}\n};\n\n/*\nSelect the text in an input or textarea by position\n*/\nexports.setSelectionByPosition = function(node,selectFromStart,selectFromEnd) {\n\t$tw.utils.setSelectionRangeSafe(node,selectFromStart,node.value.length - selectFromEnd);\n};\n\nexports.removeChildren = function(node) {\n\twhile(node.hasChildNodes()) {\n\t\tnode.removeChild(node.firstChild);\n\t}\n};\n\nexports.hasClass = function(el,className) {\n\treturn el && el.hasAttribute && el.hasAttribute(\"class\") && el.getAttribute(\"class\").split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = (el.getAttribute(\"class\") || \"\").split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t\tel.setAttribute(\"class\",c.join(\" \"));\n\t}\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = (el.getAttribute(\"class\") || \"\").split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.setAttribute(\"class\",c.join(\" \"));\n\t}\n};\n\nexports.toggleClass = function(el,className,status) {\n\tif(status === undefined) {\n\t\tstatus = !exports.hasClass(el,className);\n\t}\n\tif(status) {\n\t\texports.addClass(el,className);\n\t} else {\n\t\texports.removeClass(el,className);\n\t}\n};\n\n/*\nGet the first parent element that has scrollbars or use the body as fallback.\n*/\nexports.getScrollContainer = function(el) {\n\tvar doc = el.ownerDocument;\n\twhile(el.parentNode) {\n\t\tel = el.parentNode;\n\t\tif(el.scrollTop) {\n\t\t\treturn el;\n\t\t}\n\t}\n\treturn doc.body;\n};\n\n/*\nGet the scroll position of the viewport\nReturns:\n\t{\n\t\tx: horizontal scroll position in pixels,\n\t\ty: vertical scroll position in pixels\n\t}\n*/\nexports.getScrollPosition = function(srcWindow) {\n\tvar scrollWindow = srcWindow || window;\n\tif(\"scrollX\" in scrollWindow) {\n\t\treturn {x: scrollWindow.scrollX, y: scrollWindow.scrollY};\n\t} else {\n\t\treturn {x: scrollWindow.document.documentElement.scrollLeft, y: scrollWindow.document.documentElement.scrollTop};\n\t}\n};\n\n/*\nAdjust the height of a textarea to fit its content, preserving scroll position, and return the height\n*/\nexports.resizeTextAreaToFit = function(domNode,minHeight) {\n\t// Get the scroll container and register the current scroll position\n\tvar container = $tw.utils.getScrollContainer(domNode),\n\t\tscrollTop = container.scrollTop;\n    // Measure the specified minimum height\n\tdomNode.style.height = minHeight;\n\tvar measuredHeight = domNode.offsetHeight || parseInt(minHeight,10);\n\t// Set its height to auto so that it snaps to the correct height\n\tdomNode.style.height = \"auto\";\n\t// Calculate the revised height\n\tvar newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,measuredHeight);\n\t// Only try to change the height if it has changed\n\tif(newHeight !== domNode.offsetHeight) {\n\t\tdomNode.style.height = newHeight + \"px\";\n\t\t// Make sure that the dimensions of the textarea are recalculated\n\t\t$tw.utils.forceLayout(domNode);\n\t\t// Set the container to the position we registered at the beginning\n\t\tcontainer.scrollTop = scrollTop;\n\t}\n\treturn newHeight;\n};\n\n/*\nGets the bounding rectangle of an element in absolute page coordinates\n*/\nexports.getBoundingPageRect = function(element) {\n\tvar scrollPos = $tw.utils.getScrollPosition(element.ownerDocument.defaultView),\n\t\tclientRect = element.getBoundingClientRect();\n\treturn {\n\t\tleft: clientRect.left + scrollPos.x,\n\t\twidth: clientRect.width,\n\t\tright: clientRect.right + scrollPos.x,\n\t\ttop: clientRect.top + scrollPos.y,\n\t\theight: clientRect.height,\n\t\tbottom: clientRect.bottom + scrollPos.y\n\t};\n};\n\n/*\nSaves a named password in the browser\n*/\nexports.savePassword = function(name,password) {\n\tvar done = false;\n\ttry {\n\t\twindow.localStorage.setItem(\"tw5-password-\" + name,password);\n\t\tdone = true;\n\t} catch(e) {\n\t}\n\tif(!done) {\n\t\t$tw.savedPasswords = $tw.savedPasswords || Object.create(null);\n\t\t$tw.savedPasswords[name] = password;\n\t}\n};\n\n/*\nRetrieve a named password from the browser\n*/\nexports.getPassword = function(name) {\n\tvar value;\n\ttry {\n\t\tvalue = window.localStorage.getItem(\"tw5-password-\" + name);\n\t} catch(e) {\n\t}\n\tif(value !== undefined) {\n\t\treturn value;\n\t} else {\n\t\treturn ($tw.savedPasswords || Object.create(null))[name] || \"\";\n\t}\n};\n\n/*\nForce layout of a dom node and its descendents\n*/\nexports.forceLayout = function(element) {\n\tvar dummy = element.offsetWidth;\n};\n\n/*\nPulse an element for debugging purposes\n*/\nexports.pulseElement = function(element) {\n\t// Event handler to remove the class at the end\n\telement.addEventListener($tw.browser.animationEnd,function handler(event) {\n\t\telement.removeEventListener($tw.browser.animationEnd,handler,false);\n\t\t$tw.utils.removeClass(element,\"pulse\");\n\t},false);\n\t// Apply the pulse class\n\t$tw.utils.removeClass(element,\"pulse\");\n\t$tw.utils.forceLayout(element);\n\t$tw.utils.addClass(element,\"pulse\");\n};\n\n/*\nAttach specified event handlers to a DOM node\ndomNode: where to attach the event handlers\nevents: array of event handlers to be added (see below)\nEach entry in the events array is an object with these properties:\nhandlerFunction: optional event handler function\nhandlerObject: optional event handler object\nhandlerMethod: optionally specifies object handler method name (defaults to `handleEvent`)\n*/\nexports.addEventListeners = function(domNode,events) {\n\t$tw.utils.each(events,function(eventInfo) {\n\t\tvar handler;\n\t\tif(eventInfo.handlerFunction) {\n\t\t\thandler = eventInfo.handlerFunction;\n\t\t} else if(eventInfo.handlerObject) {\n\t\t\tif(eventInfo.handlerMethod) {\n\t\t\t\thandler = function(event) {\n\t\t\t\t\teventInfo.handlerObject[eventInfo.handlerMethod].call(eventInfo.handlerObject,event);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\thandler = eventInfo.handlerObject;\n\t\t\t}\n\t\t}\n\t\tdomNode.addEventListener(eventInfo.name,handler,false);\n\t});\n};\n\n/*\nGet the computed styles applied to an element as an array of strings of individual CSS properties\n*/\nexports.getComputedStyles = function(domNode) {\n\tvar textAreaStyles = window.getComputedStyle(domNode,null),\n\t\tstyleDefs = [],\n\t\tname;\n\tfor(var t=0; t<textAreaStyles.length; t++) {\n\t\tname = textAreaStyles[t];\n\t\tstyleDefs.push(name + \": \" + textAreaStyles.getPropertyValue(name) + \";\");\n\t}\n\treturn styleDefs;\n};\n\n/*\nApply a set of styles passed as an array of strings of individual CSS properties\n*/\nexports.setStyles = function(domNode,styleDefs) {\n\tdomNode.style.cssText = styleDefs.join(\"\");\n};\n\n/*\nCopy the computed styles from a source element to a destination element\n*/\nexports.copyStyles = function(srcDomNode,dstDomNode) {\n\t$tw.utils.setStyles(dstDomNode,$tw.utils.getComputedStyles(srcDomNode));\n};\n\n/*\nCopy plain text to the clipboard on browsers that support it\n*/\nexports.copyToClipboard = function(text,options) {\n\toptions = options || {};\n\ttext = text || \"\";\n\tvar textArea = document.createElement(\"textarea\");\n\ttextArea.style.position = \"fixed\";\n\ttextArea.style.top = 0;\n\ttextArea.style.left = 0;\n\ttextArea.style.fontSize = \"12pt\";\n\ttextArea.style.width = \"2em\";\n\ttextArea.style.height = \"2em\";\n\ttextArea.style.padding = 0;\n\ttextArea.style.border = \"none\";\n\ttextArea.style.outline = \"none\";\n\ttextArea.style.boxShadow = \"none\";\n\ttextArea.style.background = \"transparent\";\n\ttextArea.value = text;\n\tdocument.body.appendChild(textArea);\n\ttextArea.select();\n\ttextArea.setSelectionRange(0,text.length);\n\tvar succeeded = false;\n\ttry {\n\t\tsucceeded = document.execCommand(\"copy\");\n\t} catch(err) {\n\t}\n\tif(!options.doNotNotify) {\n\t\tvar successNotification = options.successNotification || \"$:/language/Notifications/CopiedToClipboard/Succeeded\",\n\t\t\tfailureNotification = options.failureNotification || \"$:/language/Notifications/CopiedToClipboard/Failed\"\n\t\t$tw.notifier.display(succeeded ? successNotification : failureNotification);\n\t}\n\tdocument.body.removeChild(textArea);\n};\n\nexports.getLocationPath = function() {\n\treturn window.location.toString().split(\"#\")[0];\n};\n\n/*\nCollect DOM variables\n*/\nexports.collectDOMVariables = function(selectedNode,domNode,event) {\n\tvar variables = {},\n\t    selectedNodeRect,\n\t    domNodeRect;\n\tif(selectedNode) {\n\t\t$tw.utils.each(selectedNode.attributes,function(attribute) {\n\t\t\tvariables[\"dom-\" + attribute.name] = attribute.value.toString();\n\t\t});\n\t\t\n\t\tif(\"offsetLeft\" in selectedNode) {\n\t\t\t// Add variables with a (relative and absolute) popup coordinate string for the selected node\n\t\t\tvar nodeRect = {\n\t\t\t\tleft: selectedNode.offsetLeft,\n\t\t\t\ttop: selectedNode.offsetTop,\n\t\t\t\twidth: selectedNode.offsetWidth,\n\t\t\t\theight: selectedNode.offsetHeight\n\t\t\t};\n\t\t\tvariables[\"tv-popup-coords\"] = Popup.buildCoordinates(Popup.coordinatePrefix.csOffsetParent,nodeRect);\n\n\t\t\tvar absRect = $tw.utils.extend({}, nodeRect);\n\t\t\tfor(var currentNode = selectedNode.offsetParent; currentNode; currentNode = currentNode.offsetParent) {\n\t\t\t\tabsRect.left += currentNode.offsetLeft;\n\t\t\t\tabsRect.top += currentNode.offsetTop;\n\t\t\t}\n\t\t\tvariables[\"tv-popup-abs-coords\"] = Popup.buildCoordinates(Popup.coordinatePrefix.csAbsolute,absRect);\n\n\t\t\t// Add variables for offset of selected node\n\t\t\tvariables[\"tv-selectednode-posx\"] = selectedNode.offsetLeft.toString();\n\t\t\tvariables[\"tv-selectednode-posy\"] = selectedNode.offsetTop.toString();\n\t\t\tvariables[\"tv-selectednode-width\"] = selectedNode.offsetWidth.toString();\n\t\t\tvariables[\"tv-selectednode-height\"] = selectedNode.offsetHeight.toString();\n\t\t}\n\t}\n\t\n\tif(domNode && (\"offsetWidth\" in domNode)) {\n\t\tvariables[\"tv-widgetnode-width\"] = domNode.offsetWidth.toString();\n\t\tvariables[\"tv-widgetnode-height\"] = domNode.offsetHeight.toString();\n\t}\n\n\tif(event && (\"clientX\" in event) && (\"clientY\" in event)) {\n\t\tif(selectedNode) {\n\t\t\t// Add variables for event X and Y position relative to selected node\n\t\t\tselectedNodeRect = selectedNode.getBoundingClientRect();\n\t\t\tvariables[\"event-fromselected-posx\"] = (event.clientX - selectedNodeRect.left).toString();\n\t\t\tvariables[\"event-fromselected-posy\"] = (event.clientY - selectedNodeRect.top).toString();\n\t\t}\n\t\t\n\t\tif(domNode) {\n\t\t\t// Add variables for event X and Y position relative to event catcher node\n\t\t\tdomNodeRect = domNode.getBoundingClientRect();\n\t\t\tvariables[\"event-fromcatcher-posx\"] = (event.clientX - domNodeRect.left).toString();\n\t\t\tvariables[\"event-fromcatcher-posy\"] = (event.clientY - domNodeRect.top).toString();\n\t\t}\n\n\t\t// Add variables for event X and Y position relative to the viewport\n\t\tvariables[\"event-fromviewport-posx\"] = event.clientX.toString();\n\t\tvariables[\"event-fromviewport-posy\"] = event.clientY.toString();\n\t}\n\treturn variables;\n};\n\n/*\nMake sure the CSS selector is not invalid\n*/\nexports.querySelectorSafe = function(selector,baseElement) {\n\tbaseElement = baseElement || document;\n\ttry {\n\t\treturn baseElement.querySelector(selector);\n\t} catch(e) {\n\t\tconsole.log(\"Invalid selector: \",selector);\n\t}\n};\n\nexports.querySelectorAllSafe = function(selector,baseElement) {\n\tbaseElement = baseElement || document;\n\ttry {\n\t\treturn baseElement.querySelectorAll(selector);\n\t} catch(e) {\n\t\tconsole.log(\"Invalid selector: \",selector);\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/dom/dragndrop.js":{"title":"$:/core/modules/utils/dom/dragndrop.js","text":"/*\\\ntitle: $:/core/modules/utils/dom/dragndrop.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser data transfer utilities, used with the clipboard and drag and drop\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOptions:\n\ndomNode: dom node to make draggable\nselector: CSS selector to identify element within domNode to be used as drag handle (optional)\ndragImageType: \"pill\", \"blank\" or \"dom\" (the default)\ndragTiddlerFn: optional function to retrieve the title of tiddler to drag\ndragFilterFn: optional function to retreive the filter defining a list of tiddlers to drag\nwidget: widget to use as the context for the filter\n*/\nexports.makeDraggable = function(options) {\n\tvar dragImageType = options.dragImageType || \"dom\",\n\t\tdragImage,\n\t\tdomNode = options.domNode;\n\t// Make the dom node draggable (not necessary for anchor tags)\n\tif(!options.selector && ((domNode.tagName || \"\").toLowerCase() !== \"a\")) {\n\t\tdomNode.setAttribute(\"draggable\",\"true\");\n\t}\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragstart\", handlerFunction: function(event) {\n\t\t\tif(event.dataTransfer === undefined) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Collect the tiddlers being dragged\n\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t\tstartActions = options.startActions,\n\t\t\t\tvariables,\n\t\t\t\tdomNodeRect;\n\t\t\tif(dragFilter) {\n\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t}\n\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t// Check that we've something to drag\n\t\t\tif(titles.length > 0 && (options.selector && $tw.utils.domMatchesSelector(event.target,options.selector) || event.target === domNode)) {\n\t\t\t\t// Mark the drag in progress\n\t\t\t\t$tw.dragInProgress = domNode;\n\t\t\t\t// Set the dragging class on the element being dragged\n\t\t\t\t$tw.utils.addClass(domNode,\"tc-dragging\");\n\t\t\t\t// Invoke drag-start actions if given\n\t\t\t\tif(startActions !== undefined) {\n\t\t\t\t\t// Collect our variables\n\t\t\t\t\tvariables = $tw.utils.collectDOMVariables(domNode,null,event);\n\t\t\t\t\tvariables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\t\t\tvariables[\"actionTiddler\"] = titleString;\n\t\t\t\t\toptions.widget.invokeActionString(startActions,options.widget,event,variables);\n\t\t\t\t}\n\t\t\t\t// Create the drag image elements\n\t\t\t\tdragImage = options.widget.document.createElement(\"div\");\n\t\t\t\tdragImage.className = \"tc-tiddler-dragger\";\n\t\t\t\tvar inner = options.widget.document.createElement(\"div\");\n\t\t\t\tinner.className = \"tc-tiddler-dragger-inner\";\n\t\t\t\tinner.appendChild(options.widget.document.createTextNode(\n\t\t\t\t\ttitles.length === 1 ? \n\t\t\t\t\t\ttitles[0] :\n\t\t\t\t\t\ttitles.length + \" tiddlers\"\n\t\t\t\t));\n\t\t\t\tdragImage.appendChild(inner);\n\t\t\t\toptions.widget.document.body.appendChild(dragImage);\n\t\t\t\t// Set the data transfer properties\n\t\t\t\tvar dataTransfer = event.dataTransfer;\n\t\t\t\t// Set up the image\n\t\t\t\tdataTransfer.effectAllowed = \"all\";\n\t\t\t\tif(dataTransfer.setDragImage) {\n\t\t\t\t\tif(dragImageType === \"pill\") {\n\t\t\t\t\t\tdataTransfer.setDragImage(dragImage.firstChild,-16,-16);\n\t\t\t\t\t} else if(dragImageType === \"blank\") {\n\t\t\t\t\t\tdragImage.removeChild(dragImage.firstChild);\n\t\t\t\t\t\tdataTransfer.setDragImage(dragImage,0,0);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar r = domNode.getBoundingClientRect();\n\t\t\t\t\t\tdataTransfer.setDragImage(domNode,event.clientX-r.left,event.clientY-r.top);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Set up the data transfer\n\t\t\t\tif(dataTransfer.clearData) {\n\t\t\t\t\tdataTransfer.clearData();\n\t\t\t\t}\n\t\t\t\tvar jsonData = [];\n\t\t\t\tif(titles.length > 1) {\n\t\t\t\t\ttitles.forEach(function(title) {\n\t\t\t\t\t\tjsonData.push(options.widget.wiki.getTiddlerAsJson(title));\n\t\t\t\t\t});\n\t\t\t\t\tjsonData = \"[\" + jsonData.join(\",\") + \"]\";\n\t\t\t\t} else {\n\t\t\t\t\tjsonData = options.widget.wiki.getTiddlerAsJson(titles[0]);\n\t\t\t\t}\n\t\t\t\t// IE doesn't like these content types\n\t\t\t\tif(!$tw.browser.isIE) {\n\t\t\t\t\tdataTransfer.setData(\"text/vnd.tiddler\",jsonData);\n\t\t\t\t\tdataTransfer.setData(\"text/plain\",titleString);\n\t\t\t\t\tdataTransfer.setData(\"text/x-moz-url\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\t}\n\t\t\t\t// If browser is Chrome-like and has a touch-input device do NOT .setData\n\t\t\t\tif(!($tw.browser.isMobileChrome)) {\n\t\t\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\t}\n\t\t\t\tdataTransfer.setData(\"Text\",titleString);\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\treturn false;\n\t\t}},\n\t\t{name: \"dragend\", handlerFunction: function(event) {\n\t\t\tif((options.selector && $tw.utils.domMatchesSelector(event.target,options.selector)) || event.target === domNode) {\n\t\t\t\t// Collect the tiddlers being dragged\n\t\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t\t\tendActions = options.endActions,\n\t\t\t\t\tvariables;\n\t\t\t\tif(dragFilter) {\n\t\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t\t}\n\t\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t\t$tw.dragInProgress = null;\n\t\t\t\t// Invoke drag-end actions if given\n\t\t\t\tif(endActions !== undefined) {\n\t\t\t\t\tvariables = $tw.utils.collectDOMVariables(domNode,null,event);\n\t\t\t\t\tvariables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\t\t\tvariables[\"actionTiddler\"] = titleString;\n\t\t\t\t\toptions.widget.invokeActionString(endActions,options.widget,event,variables);\n\t\t\t\t}\n\t\t\t\t// Remove the dragging class on the element being dragged\n\t\t\t\t$tw.utils.removeClass(domNode,\"tc-dragging\");\n\t\t\t\t// Delete the drag image element\n\t\t\t\tif(dragImage) {\n\t\t\t\t\tdragImage.parentNode.removeChild(dragImage);\n\t\t\t\t\tdragImage = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}}\n\t]);\n};\n\nexports.importDataTransfer = function(dataTransfer,fallbackTitle,callback) {\n\t// Try each provided data type in turn\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Available data types:\");\n\t\tfor(var type=0; type<dataTransfer.types.length; type++) {\n\t\t\tconsole.log(\"type\",dataTransfer.types[type],dataTransfer.getData(dataTransfer.types[type]))\n\t\t}\n\t}\n\tfor(var t=0; t<importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = importDataTypes[t];\n\t\t\tvar data = dataTransfer.getData(dataType.type);\n\t\t\t// Import the tiddlers in the data\n\t\t\tif(data !== \"\" && data !== null) {\n\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\tconsole.log(\"Importing data type '\" + dataType.type + \"', data: '\" + data + \"'\")\n\t\t\t\t}\n\t\t\t\tvar tiddlerFields = dataType.toTiddlerFieldsArray(data,fallbackTitle);\n\t\t\t\tcallback(tiddlerFields);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n};\n\nexports.importPaste = function(item,fallbackTitle,callback) {\n\t// Try each provided data type in turn\n\tfor(var t=0; t<importDataTypes.length; t++) {\n\t\tif(item.type === importDataTypes[t].type) {\n\t\t\t// Get the data\n\t\t\tvar dataType = importDataTypes[t];\n\n\t\t\titem.getAsString(function(data){\n\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\tconsole.log(\"Importing data type '\" + dataType.type + \"', data: '\" + data + \"'\")\n\t\t\t\t}\n\t\t\t\tvar tiddlerFields = dataType.toTiddlerFieldsArray(data,fallbackTitle);\n\t\t\t\tcallback(tiddlerFields);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t}\n};\n\nexports.itemHasValidDataType = function(item) {\n\tfor(var t=0; t<importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || importDataTypes[t].IECompatible) {\n\t\t\tif(item.type === importDataTypes[t].type) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n\nvar importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn parseJSONTiddlers(data,fallbackTitle);\n\t}},\n\t{type: \"URL\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = $tw.utils.decodeURIComponentSafe(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = $tw.utils.decodeURIComponentSafe(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/html\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/plain\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"Text\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = $tw.utils.decodeURIComponentSafe(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}}\n];\n\nfunction parseJSONTiddlers(json,fallbackTitle) {\n\tvar data = $tw.utils.parseJSONSafe(json);\n\tif(!$tw.utils.isArray(data)) {\n\t\tdata = [data];\n\t}\n\tdata.forEach(function(fields) {\n\t\tfields.title = fields.title || fallbackTitle;\n\t});\n\treturn data;\n};\n\nfunction dragEventContainsType(event,targetType) {\n\tif(event.dataTransfer.types) {\n\t\tfor(var i=0; i<event.dataTransfer.types.length; i++) {\n\t\t\tif(event.dataTransfer.types[i] === targetType) {\n\t\t\t\treturn true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nexports.dragEventContainsFiles = function(event) {\n\treturn (dragEventContainsType(event,\"Files\") && !dragEventContainsType(event,\"text/plain\"));\n};\n\nexports.dragEventContainsType = dragEventContainsType;\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/dom/http.js":{"title":"$:/core/modules/utils/dom/http.js","text":"/*\\\ntitle: $:/core/modules/utils/dom/http.js\ntype: application/javascript\nmodule-type: utils\n\nHTTP support\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nManage tm-http-request events. Options include:\nwiki: Reference to the wiki to be used for state tiddler tracking\nstateTrackerTitle: Title of tiddler to be used for state tiddler tracking\n*/\nfunction HttpClient(options) {\n\toptions = options || {};\n\tthis.nextId = 1;\n\tthis.wiki = options.wiki || $tw.wiki;\n\tthis.stateTrackerTitle = options.stateTrackerTitle || \"$:/state/http-requests\";\n\tthis.requests = []; // Array of {id: string,request: HttpClientRequest}\n\tthis.updateRequestTracker();\n}\n\n/*\nReturn the index into this.requests[] corresponding to a given ID. Returns null if not found\n*/\nHttpClient.prototype.getRequestIndex = function(targetId) {\n\tvar targetIndex = null;\n\t$tw.utils.each(this.requests,function(requestInfo,index) {\n\t\tif(requestInfo.id === targetId) {\n\t\t\ttargetIndex = index;\n\t\t}\n\t});\n\treturn targetIndex;\n};\n\n/*\nUpdate the state tiddler that is tracking the outstanding requests\n*/\nHttpClient.prototype.updateRequestTracker = function() {\n\tthis.wiki.addTiddler({title: this.stateTrackerTitle, text: \"\" + this.requests.length});\n};\n\nHttpClient.prototype.initiateHttpRequest = function(options) {\n\tvar self = this,\n\t\tid = this.nextId,\n\t\trequest = new HttpClientRequest(options);\n\tthis.nextId += 1;\n\tthis.requests.push({id: id, request: request});\n\tthis.updateRequestTracker();\n\trequest.send(function(err) {\n\t\tvar targetIndex = self.getRequestIndex(id);\n\t\tif(targetIndex !== null) {\n\t\t\tself.requests.splice(targetIndex,1);\n\t\t\tself.updateRequestTracker();\n\t\t}\n\t});\n\treturn id;\n};\n\nHttpClient.prototype.cancelAllHttpRequests = function() {\n\tvar self = this;\n\tif(this.requests.length > 0) {\n\t\tfor(var t=this.requests.length - 1; t--; t>=0) {\n\t\t\tvar requestInfo = this.requests[t];\n\t\t\trequestInfo.request.cancel();\n\t\t}\n\t}\n\tthis.requests = [];\n\tthis.updateRequestTracker();\n};\n\nHttpClient.prototype.cancelHttpRequest = function(targetId) {\n\tvar targetIndex = this.getRequestIndex(targetId);\n\tif(targetIndex !== null) {\n\t\tthis.requests[targetIndex].request.cancel();\n\t\tthis.requests.splice(targetIndex,1);\n\t\tthis.updateRequestTracker();\n\t}\n};\n\n/*\nInitiate an HTTP request. Options:\nwiki: wiki to be used for executing action strings\nurl: URL for request\nmethod: method eg GET, POST\nbody: text of request body\nbinary: set to \"yes\" to force binary processing of response payload\noncompletion: action string to be invoked on completion\nonprogress: action string to be invoked on progress updates\nbindStatus: optional title of tiddler to which status (\"pending\", \"complete\", \"error\") should be written\nbindProgress: optional title of tiddler to which the progress of the request (0 to 100) should be bound\nvariables: hashmap of variable name to string value passed to action strings\nheaders: hashmap of header name to header value to be sent with the request\npasswordHeaders: hashmap of header name to password store name to be sent with the request\nqueryStrings: hashmap of query string parameter name to parameter value to be sent with the request\npasswordQueryStrings: hashmap of query string parameter name to password store name to be sent with the request\nbasicAuthUsername: plain username for basic authentication\nbasicAuthUsernameFromStore: name of password store entry containing username\nbasicAuthPassword: plain password for basic authentication\nbasicAuthPasswordFromStore: name of password store entry containing password\nbearerAuthToken: plain text token for bearer authentication\nbearerAuthTokenFromStore: name of password store entry contain bear authorization token\n*/\nfunction HttpClientRequest(options) {\n\tvar self = this;\n\tconsole.log(\"Initiating an HTTP request\",options)\n\tthis.wiki = options.wiki;\n\tthis.completionActions = options.oncompletion;\n\tthis.progressActions = options.onprogress;\n\tthis.bindStatus = options[\"bindStatus\"];\n\tthis.bindProgress = options[\"bindProgress\"];\n\tthis.method = options.method || \"GET\";\n\tthis.body = options.body || \"\";\n\tthis.binary = options.binary || \"\";\n\tthis.useDefaultHeaders = options.useDefaultHeaders !== \"false\" ? true : false,\n\tthis.variables = options.variables;\n\tvar url = options.url;\n\t$tw.utils.each(options.queryStrings,function(value,name) {\n\t\turl = $tw.utils.setQueryStringParameter(url,name,value);\n\t});\n\t$tw.utils.each(options.passwordQueryStrings,function(value,name) {\n\t\turl = $tw.utils.setQueryStringParameter(url,name,$tw.utils.getPassword(value) || \"\");\n\t});\n\tthis.url = url;\n\tthis.requestHeaders = {};\n\t$tw.utils.each(options.headers,function(value,name) {\n\t\tself.requestHeaders[name] = value;\n\t});\n\t$tw.utils.each(options.passwordHeaders,function(value,name) {\n\t\tself.requestHeaders[name] = $tw.utils.getPassword(value) || \"\";\n\t});\n\tthis.basicAuthUsername = options.basicAuthUsername || (options.basicAuthUsernameFromStore && $tw.utils.getPassword(options.basicAuthUsernameFromStore)) || \"\";\n\tthis.basicAuthPassword = options.basicAuthPassword || (options.basicAuthPasswordFromStore && $tw.utils.getPassword(options.basicAuthPasswordFromStore)) || \"\";\n\tthis.bearerAuthToken = options.bearerAuthToken || (options.bearerAuthTokenFromStore && $tw.utils.getPassword(options.bearerAuthTokenFromStore)) || \"\";\n\tif(this.basicAuthUsername && this.basicAuthPassword) {\n\t\tthis.requestHeaders.Authorization = \"Basic \" + $tw.utils.base64Encode(this.basicAuthUsername + \":\" + this.basicAuthPassword);\n\t} else if(this.bearerAuthToken) {\n\t\tthis.requestHeaders.Authorization = \"Bearer \" + this.bearerAuthToken;\n\t}\n}\n\nHttpClientRequest.prototype.send = function(callback) {\n\tvar self = this,\n\t\tsetBinding = function(title,text) {\n\t\t\tif(title) {\n\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler({title: title, text: text}));\n\t\t\t}\n\t\t};\n\tif(this.url) {\n\t\tsetBinding(this.bindStatus,\"pending\");\n\t\tsetBinding(this.bindProgress,\"0\");\n\t\t// Set the request tracker tiddler\n\t\tvar requestTrackerTitle = this.wiki.generateNewTitle(\"$:/temp/HttpRequest\");\n\t\tthis.wiki.addTiddler({\n\t\t\ttitle: requestTrackerTitle,\n\t\t\ttags: \"$:/tags/HttpRequest\",\n\t\t\ttext: JSON.stringify({\n\t\t\t\turl: this.url,\n\t\t\t\ttype: this.method,\n\t\t\t\tstatus: \"inprogress\",\n\t\t\t\theaders: this.requestHeaders,\n\t\t\t\tdata: this.body\n\t\t\t})\n\t\t});\n\t\tthis.xhr = $tw.utils.httpRequest({\n\t\t\turl: this.url,\n\t\t\ttype: this.method,\n\t\t\tuseDefaultHeaders: this.useDefaultHeaders,\n\t\t\theaders: this.requestHeaders,\n\t\t\tdata: this.body,\n\t\t\treturnProp: this.binary === \"\" ? \"responseText\" : \"response\",\n\t\t\tresponseType: this.binary === \"\" ? \"text\" : \"arraybuffer\",\n\t\t\tcallback: function(err,data,xhr) {\n\t\t\t\tvar hasSucceeded = xhr.status >= 200 && xhr.status < 300,\n\t\t\t\t\tcompletionCode = hasSucceeded ? \"complete\" : \"error\",\n\t\t\t\t\theaders = {};\n\t\t\t\t$tw.utils.each(xhr.getAllResponseHeaders().split(\"\\r\\n\"),function(line) {\n\t\t\t\t\tvar pos = line.indexOf(\":\");\n\t\t\t\t\tif(pos !== -1) {\n\t\t\t\t\t\theaders[line.substr(0,pos)] = line.substr(pos + 1).trim();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tsetBinding(self.bindStatus,completionCode);\n\t\t\t\tsetBinding(self.bindProgress,\"100\");\n\t\t\t\tvar resultVariables = {\n\t\t\t\t\tstatus: xhr.status.toString(),\n\t\t\t\t\tstatusText: xhr.statusText,\n\t\t\t\t\terror: (err || \"\").toString(),\n\t\t\t\t\tdata: (data || \"\").toString(),\n\t\t\t\t\theaders: JSON.stringify(headers)\n\t\t\t\t};\n\t\t\t\t/* Convert data from binary to base64 */\n\t\t\t\tif (xhr.responseType === \"arraybuffer\") {\n\t\t\t\t\tvar binary = \"\",\n\t\t\t\t\t\tbytes = new Uint8Array(data),\n\t\t\t\t\t\tlen = bytes.byteLength;\n\t\t\t\t\tfor (var i=0; i<len; i++) {\n\t\t\t\t\t\tbinary += String.fromCharCode(bytes[i]);\n\t\t\t\t\t}\n\t\t\t\t\tresultVariables.data = $tw.utils.base64Encode(binary,true);\n\t\t\t\t}\n\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getTiddler(requestTrackerTitle),{\n\t\t\t\t\tstatus: completionCode,\n\t\t\t\t}));\n\t\t\t\tself.wiki.invokeActionString(self.completionActions,undefined,$tw.utils.extend({},self.variables,resultVariables),{parentWidget: $tw.rootWidget});\n\t\t\t\tcallback(hasSucceeded ? null : xhr.statusText);\n\t\t\t\t// console.log(\"Back!\",err,data,xhr);\n\t\t\t},\n\t\t\tprogress: function(lengthComputable,loaded,total) {\n\t\t\t\tif(lengthComputable) {\n\t\t\t\t\tsetBinding(self.bindProgress,\"\" + Math.floor((loaded/total) * 100))\n\t\t\t\t}\n\t\t\t\tself.wiki.invokeActionString(self.progressActions,undefined,{\n\t\t\t\t\tlengthComputable: lengthComputable ? \"yes\" : \"no\",\n\t\t\t\t\tloaded: loaded,\n\t\t\t\t\ttotal: total\n\t\t\t\t},{parentWidget: $tw.rootWidget});\n\t\t\t}\n\t\t});\n\t}\n};\n\nHttpClientRequest.prototype.cancel = function() {\n\tif(this.xhr) {\n\t\tthis.xhr.abort();\n\t}\n};\n\nexports.HttpClient = HttpClient;\n\n/*\nMake an HTTP request. Options are:\n\turl: URL to retrieve\n\theaders: hashmap of headers to send\n\ttype: GET, PUT, POST etc\n\tcallback: function invoked with (err,data,xhr)\n\tprogress: optional function invoked with (lengthComputable,loaded,total)\n\treturnProp: string name of the property to return as first argument of callback\n\tresponseType: \"text\" or \"arraybuffer\"\n*/\nexports.httpRequest = function(options) {\n\tvar type = options.type || \"GET\",\n\t\turl = options.url,\n\t\tuseDefaultHeaders = options.useDefaultHeaders !== false ? true : false,\n\t\theaders = options.headers || (useDefaultHeaders ? {accept: \"application/json\"} : {}),\n\t\thasHeader = function(targetHeader) {\n\t\t\ttargetHeader = targetHeader.toLowerCase();\n\t\t\tvar result = false;\n\t\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\t\tif(headerTitle.toLowerCase() === targetHeader) {\n\t\t\t\t\tresult = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\tgetHeader = function(targetHeader) {\n\t\t\treturn headers[targetHeader] || headers[targetHeader.toLowerCase()];\n\t\t},\n\t\tisSimpleRequest = function(type,headers) {\n\t\t\tif([\"GET\",\"HEAD\",\"POST\"].indexOf(type) === -1) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor(var header in headers) {\n\t\t\t\tif([\"accept\",\"accept-language\",\"content-language\",\"content-type\"].indexOf(header.toLowerCase()) === -1) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(hasHeader(\"Content-Type\") && [\"application/x-www-form-urlencoded\",\"multipart/form-data\",\"text/plain\"].indexOf(getHeader[\"Content-Type\"]) === -1) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\treturnProp = options.returnProp || \"responseText\",\n\t\trequest = new XMLHttpRequest(),\n\t\tdata = \"\",\n\t\tf,results;\n\t// Massage the data hashmap into a string\n\tif(options.data) {\n\t\tif(typeof options.data === \"string\") { // Already a string\n\t\t\tdata = options.data;\n\t\t} else { // A hashmap of strings\n\t\t\tresults = [];\n\t\t\t$tw.utils.each(options.data,function(dataItem,dataItemTitle) {\n\t\t\t\tresults.push(dataItemTitle + \"=\" + encodeURIComponent(dataItem));\n\t\t\t});\n\t\t\tif(type === \"GET\" || type === \"HEAD\") {\n\t\t\t\turl += \"?\" + results.join(\"&\");\n\t\t\t} else {\n\t\t\t\tdata = results.join(\"&\");\n\t\t\t}\n\t\t}\n\t}\n\trequest.responseType = options.responseType || \"text\";\n\t// Set up the state change handler\n\trequest.onreadystatechange = function() {\n\t\tif(this.readyState === 4) {\n\t\t\tif(this.status >= 200 && this.status < 300) {\n\t\t\t\t// Success!\n\t\t\t\toptions.callback(null,this[returnProp],this);\n\t\t\t\treturn;\n\t\t\t}\n\t\t// Something went wrong\n\t\toptions.callback($tw.language.getString(\"Error/XMLHttpRequest\") + \": \" + this.status,this[returnProp],this);\n\t\t}\n\t};\n\t// Handle progress\n\tif(options.progress) {\n\t\trequest.onprogress = function(event) {\n\t\t\tconsole.log(\"Progress event\",event)\n\t\t\toptions.progress(event.lengthComputable,event.loaded,event.total);\n\t\t};\n\t}\n\t// Make the request\n\trequest.open(type,url,true);\n\t// Headers\n\tif(headers) {\n\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\trequest.setRequestHeader(headerTitle,header);\n\t\t});\n\t}\n\tif(data && !hasHeader(\"Content-Type\") && useDefaultHeaders) {\n\t\trequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\tif(!hasHeader(\"X-Requested-With\") && !isSimpleRequest(type,headers) && useDefaultHeaders) {\n\t\trequest.setRequestHeader(\"X-Requested-With\",\"TiddlyWiki\");\n\t}\n\t// Send data\n\ttry {\n\t\trequest.send(data);\n\t} catch(e) {\n\t\toptions.callback(e,null,this);\n\t}\n\treturn request;\n};\n\nexports.setQueryStringParameter = function(url,paramName,paramValue) {\n\tvar URL = $tw.browser ? window.URL : require(\"url\").URL,\n\t\tnewUrl;\n\ttry {\n\t\tnewUrl = new URL(url);\n\t} catch(e) {\n\t}\n\tif(newUrl && paramName) {\n\t\tnewUrl.searchParams.set(paramName,paramValue || \"\");\n\t\treturn newUrl.toString();\n\t} else {\n\t\treturn url;\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/dom/keyboard.js":{"title":"$:/core/modules/utils/dom/keyboard.js","text":"/*\\\ntitle: $:/core/modules/utils/dom/keyboard.js\ntype: application/javascript\nmodule-type: utils\n\nKeyboard utilities; now deprecated. Instead, use $tw.keyboardManager\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n[\"parseKeyDescriptor\",\"checkKeyDescriptor\"].forEach(function(method) {\n\texports[method] = function() {\n\t\tif($tw.keyboardManager) {\n\t\t\treturn $tw.keyboardManager[method].apply($tw.keyboardManager,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t};\n});\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/dom/modal.js":{"title":"$:/core/modules/utils/dom/modal.js","text":"/*\\\ntitle: $:/core/modules/utils/dom/modal.js\ntype: application/javascript\nmodule-type: utils\n\nModal message mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\nvar navigator = require(\"$:/core/modules/widgets/navigator.js\");\n\nvar Modal = function(wiki) {\n\tthis.wiki = wiki;\n\tthis.modalCount = 0;\n};\n\n/*\nDisplay a modal dialogue\n\ttitle: Title of tiddler to display\n\toptions: see below\nOptions include:\n\tdownloadLink: Text of a big download link to include\n\tevent: widget event\n\tvariables: from event.paramObject\n*/\nModal.prototype.display = function(title,options) {\n\toptions = options || {};\n\tthis.srcDocument = options.variables && (options.variables.rootwindow === \"true\" ||\n\t\t\t\toptions.variables.rootwindow === \"yes\") ? document :\n\t\t\t\t(options.event && options.event.event && options.event.event.target ? options.event.event.target.ownerDocument : document);\n\tthis.srcWindow = this.srcDocument.defaultView;\n\tvar self = this,\n\t\trefreshHandler,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\ttiddler = this.wiki.getTiddler(title);\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Create the variables\n\tvar variables = $tw.utils.extend({\n\t\t\tcurrentTiddler: title,\n\t\t\t\"tv-story-list\": (options.event && options.event.widget ? options.event.widget.getVariable(\"tv-story-list\") : \"\"),\n\t\t\t\"tv-history-list\": (options.event && options.event.widget ? options.event.widget.getVariable(\"tv-history-list\") : \"\")\n\t\t},options.variables);\n\n\t// Create the wrapper divs\n\tvar wrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalBackdrop = this.srcDocument.createElement(\"div\"),\n\t\tmodalWrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalHeader = this.srcDocument.createElement(\"div\"),\n\t\theaderTitle = this.srcDocument.createElement(\"h3\"),\n\t\tmodalBody = this.srcDocument.createElement(\"div\"),\n\t\tmodalLink = this.srcDocument.createElement(\"a\"),\n\t\tmodalFooter = this.srcDocument.createElement(\"div\"),\n\t\tmodalFooterHelp = this.srcDocument.createElement(\"span\"),\n\t\tmodalFooterButtons = this.srcDocument.createElement(\"span\");\n\t// Up the modal count and adjust the body class\n\tthis.modalCount++;\n\tthis.adjustPageClass();\n\t// Add classes\n\t$tw.utils.addClass(wrapper,\"tc-modal-wrapper\");\n\tif(tiddler.fields && tiddler.fields.class) {\n\t\t$tw.utils.addClass(wrapper,tiddler.fields.class);\n\t}\n\t$tw.utils.addClass(modalBackdrop,\"tc-modal-backdrop\");\n\t$tw.utils.addClass(modalWrapper,\"tc-modal\");\n\t$tw.utils.addClass(modalHeader,\"tc-modal-header\");\n\t$tw.utils.addClass(modalBody,\"tc-modal-body\");\n\t$tw.utils.addClass(modalFooter,\"tc-modal-footer\");\n\t// Join them together\n\twrapper.appendChild(modalBackdrop);\n\twrapper.appendChild(modalWrapper);\n\tmodalHeader.appendChild(headerTitle);\n\tmodalWrapper.appendChild(modalHeader);\n\tmodalWrapper.appendChild(modalBody);\n\tmodalFooter.appendChild(modalFooterHelp);\n\tmodalFooter.appendChild(modalFooterButtons);\n\tmodalWrapper.appendChild(modalFooter);\n\tvar navigatorTree = {\n\t\t\"type\": \"navigator\",\n\t\t\"attributes\": {\n\t\t\t\"story\": {\n\t\t\t\t\"name\": \"story\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"value\": variables[\"tv-story-list\"]\n\t\t\t},\n\t\t\t\"history\": {\n\t\t\t\t\"name\": \"history\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"value\": variables[\"tv-history-list\"]\n\t\t\t}\n\t\t},\n\t\t\"tag\": \"$navigator\",\n\t\t\"isBlock\": true,\n\t\t\"children\": []\n\t};\n\tvar navigatorWidgetNode = new navigator.navigator(navigatorTree, {\n\t\twiki: this.wiki,\n\t\tdocument : this.srcDocument,\n\t\tparentWidget: $tw.rootWidget\n\t});\n\tnavigatorWidgetNode.render(modalBody,null);\n\n\t// Render the title of the message\n\tvar headerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"subtitle\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\tattributes: {\n\t\t\t\ttext: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t}}}],\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\theaderWidgetNode.render(headerTitle,null);\n\t// Render the body of the message\n\tvar bodyWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\n\tbodyWidgetNode.render(modalBody,null);\n\t// Setup the link if present\n\tif(options.downloadLink) {\n\t\tmodalLink.href = options.downloadLink;\n\t\tmodalLink.appendChild(this.srcDocument.createTextNode(\"Right-click to save changes\"));\n\t\tmodalBody.appendChild(modalLink);\n\t}\n\t// Render the footer of the message\n\tif(tiddler.fields && tiddler.fields.help) {\n\t\tvar link = this.srcDocument.createElement(\"a\");\n\t\tlink.setAttribute(\"href\",tiddler.fields.help);\n\t\tlink.setAttribute(\"target\",\"_blank\");\n\t\tlink.setAttribute(\"rel\",\"noopener noreferrer\");\n\t\tlink.appendChild(this.srcDocument.createTextNode(\"Help\"));\n\t\tmodalFooterHelp.appendChild(link);\n\t\tmodalFooterHelp.style.float = \"left\";\n\t}\n\tvar footerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"footer\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"button\",\n\t\t\tattributes: {\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: \"tm-close-tiddler\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttext: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: $tw.language.getString(\"Buttons/Close/Caption\")\n\t\t\t}}}\n\t\t]}],\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\tfooterWidgetNode.render(modalFooterButtons,null);\n\t// Set up the refresh handler\n\trefreshHandler = function(changes) {\n\t\theaderWidgetNode.refresh(changes,modalHeader,null);\n\t\tbodyWidgetNode.refresh(changes,modalBody,null);\n\t\tfooterWidgetNode.refresh(changes,modalFooterButtons,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Add the close event handler\n\tvar closeHandler = function(event) {\n\t\t// Remove our refresh handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Decrease the modal count and adjust the body class\n\t\tself.modalCount--;\n\t\tself.adjustPageClass();\n\t\t// Force layout and animate the modal message away\n\t\t$tw.utils.forceLayout(modalBackdrop);\n\t\t$tw.utils.forceLayout(modalWrapper);\n\t\t$tw.utils.setStyle(modalBackdrop,[\n\t\t\t{opacity: \"0\"}\n\t\t]);\n\t\t$tw.utils.setStyle(modalWrapper,[\n\t\t\t{transform: \"translateY(\" + self.srcWindow.innerHeight + \"px)\"}\n\t\t]);\n\t\t// Set up an event for the transition end\n\t\tself.srcWindow.setTimeout(function() {\n\t\t\tif(wrapper.parentNode) {\n\t\t\t\t// Remove the modal message from the DOM\n\t\t\t\tself.srcDocument.body.removeChild(wrapper);\n\t\t\t}\n\t\t},duration);\n\t\t// Don't let anyone else handle the tm-close-tiddler message\n\t\treturn false;\n\t};\n\theaderWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tbodyWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tfooterWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\t// Whether to close the modal dialog when the mask (area outside the modal) is clicked\n\tif(tiddler.fields && (tiddler.fields[\"mask-closable\"] === \"yes\" || tiddler.fields[\"mask-closable\"] === \"true\")) {\n\t\tmodalBackdrop.addEventListener(\"click\",closeHandler,false);\n\t}\n\t// Set the initial styles for the message\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-this.srcWindow.innerHeight) + \"px)\"}\n\t]);\n\t// Put the message into the document\n\tthis.srcDocument.body.appendChild(wrapper);\n\t// Set up animation for the styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{transition: \"opacity \" + duration + \"ms ease-out\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(modalBackdrop);\n\t$tw.utils.forceLayout(modalWrapper);\n\t// Set final animated styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0.7\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n};\n\nModal.prototype.adjustPageClass = function() {\n\tvar windowContainer = $tw.pageContainer ? ($tw.pageContainer === this.srcDocument.body.firstChild ? $tw.pageContainer : this.srcDocument.body.firstChild) : null;\n\tif(windowContainer) {\n\t\t$tw.utils.toggleClass(windowContainer,\"tc-modal-displayed\",this.modalCount > 0);\n\t}\n\t$tw.utils.toggleClass(this.srcDocument.body,\"tc-modal-prevent-scroll\",this.modalCount > 0);\n};\n\nexports.Modal = Modal;\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/dom/notifier.js":{"title":"$:/core/modules/utils/dom/notifier.js","text":"/*\\\ntitle: $:/core/modules/utils/dom/notifier.js\ntype: application/javascript\nmodule-type: utils\n\nNotifier mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Notifier = function(wiki) {\n\tthis.wiki = wiki;\n};\n\n/*\nDisplay a notification\n\ttitle: Title of tiddler containing the notification text\n\toptions: see below\nOptions include:\n*/\nNotifier.prototype.display = function(title,options) {\n\toptions = options || {};\n\t// Create the wrapper divs\n\tvar self = this,\n\t\tnotification = document.createElement(\"div\"),\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\trefreshHandler;\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Add classes and roles\n\t$tw.utils.addClass(notification,\"tc-notification\");\n\tnotification.setAttribute(\"role\",\"alert\");\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Render the body of the notification\n\tvar widgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables,\n\t\timportPageMacros: true});\n\twidgetNode.render(notification,null);\n\trefreshHandler = function(changes) {\n\t\twidgetNode.refresh(changes,notification,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Set the initial styles for the notification\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"0\"},\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"},\n\t\t{transition: \"opacity \" + duration + \"ms ease-out, \" + $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Add the notification to the DOM\n\tdocument.body.appendChild(notification);\n\t// Force layout\n\t$tw.utils.forceLayout(notification);\n\t// Set final animated styles\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n\t// Set a timer to remove the notification\n\twindow.setTimeout(function() {\n\t\t// Remove our change event handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Force layout and animate the notification away\n\t\t$tw.utils.forceLayout(notification);\n\t\t$tw.utils.setStyle(notification,[\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transform: \"translateX(\" + (notification.offsetWidth) + \"px)\"}\n\t\t]);\n\t\t// Remove the modal message from the DOM once the transition ends\n\t\tsetTimeout(function() {\n\t\t\tif(notification.parentNode) {\n\t\t\t\tdocument.body.removeChild(notification);\n\t\t\t}\n\t\t},duration);\n\t},$tw.config.preferences.notificationDuration);\n};\n\nexports.Notifier = Notifier;\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/dom/popup.js":{"title":"$:/core/modules/utils/dom/popup.js","text":"/*\\\ntitle: $:/core/modules/utils/dom/popup.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Popup object prototype that manages popups in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a Popup object with these options:\n\trootElement: the DOM element to which the popup zapper should be attached\n*/\nvar Popup = function(options) {\n\toptions = options || {};\n\tthis.rootElement = options.rootElement || document.documentElement;\n\tthis.popups = []; // Array of {title:,wiki:,domNode:} objects\n};\n\n/*\nGlobal regular expression for parsing the location of a popup.\nThis is also used by the Reveal widget.\n*/\nexports.popupLocationRegExp = /^(@?)\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/\n\n/*\nObjekt containing the available prefixes for coordinates build with the `buildCoordinates` function:\n - csOffsetParent: Uses a coordinate system based on the offset parent (no prefix).\n - csAbsolute: Use an absolute coordinate system (prefix \"@\").\n*/\nexports.coordinatePrefix = { csOffsetParent: \"\", csAbsolute: \"@\" }\n\n/*\nTrigger a popup open or closed. Parameters are in a hashmap:\n\ttitle: title of the tiddler where the popup details are stored\n\tdomNode: dom node to which the popup will be positioned (one of domNode or domNodeRect is required)\n\tdomNodeRect: rectangle to which the popup will be positioned\n\twiki: wiki\n\tforce: if specified, forces the popup state to true or false (instead of toggling it)\n\tfloating: if true, skips registering the popup, meaning that it will need manually clearing\n*/\nPopup.prototype.triggerPopup = function(options) {\n\t// Check if this popup is already active\n\tvar index = this.findPopup(options.title);\n\t// Compute the new state\n\tvar state = index === -1;\n\tif(options.force !== undefined) {\n\t\tstate = options.force;\n\t}\n\t// Show or cancel the popup according to the new state\n\tif(state) {\n\t\tthis.show(options);\n\t} else {\n\t\tthis.cancel(index);\n\t}\n};\n\nPopup.prototype.findPopup = function(title) {\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\treturn index;\n};\n\nPopup.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\t// Find out what was clicked on\n\t\tvar info = this.popupInfo(event.target),\n\t\t\tcancelLevel = info.popupLevel - 1;\n\t\t// Don't remove the level that was clicked on if we clicked on a handle\n\t\tif(info.isHandle) {\n\t\t\tcancelLevel++;\n\t\t}\n\t\t// Cancel\n\t\tthis.cancel(cancelLevel);\n\t}\n};\n\n/*\nFind the popup level containing a DOM node. Returns:\npopupLevel: count of the number of nested popups containing the specified element\nisHandle: true if the specified element is within a popup handle\n*/\nPopup.prototype.popupInfo = function(domNode) {\n\tvar isHandle = false,\n\t\tpopupCount = 0,\n\t\tnode = domNode;\n\t// First check ancestors to see if we're within a popup handle\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup-handle\")) {\n\t\t\tisHandle = true;\n\t\t\tpopupCount++;\n\t\t}\n\t\tif($tw.utils.hasClass(node,\"tc-popup-keep\")) {\n\t\t\tisHandle = true;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\t// Then count the number of ancestor popups\n\tnode = domNode;\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup\")) {\n\t\t\tpopupCount++;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\tvar info = {\n\t\tpopupLevel: popupCount,\n\t\tisHandle: isHandle\n\t};\n\treturn info;\n};\n\n/*\nDisplay a popup by adding it to the stack\n*/\nPopup.prototype.show = function(options) {\n\t// Find out what was clicked on\n\tvar info = this.popupInfo(options.domNode);\n\t// Cancel any higher level popups\n\tthis.cancel(info.popupLevel);\n\n\t// Store the popup details if not already there\n\tif(!options.floating && this.findPopup(options.title) === -1) {\n\t\tthis.popups.push({\n\t\t\ttitle: options.title,\n\t\t\twiki: options.wiki,\n\t\t\tdomNode: options.domNode,\n\t\t\tnoStateReference: options.noStateReference\n\t\t});\n\t}\n\t// Set the state tiddler\n\tvar rect;\n\tif(options.domNodeRect) {\n\t\trect = options.domNodeRect;\n\t} else {\n\t\trect = {\n\t\t\tleft: options.domNode.offsetLeft,\n\t\t\ttop: options.domNode.offsetTop,\n\t\t\twidth: options.domNode.offsetWidth,\n\t\t\theight: options.domNode.offsetHeight\n\t\t};\n\t}\n\tif(options.absolute && options.domNode) {\n\t\t// Walk the offsetParent chain and add the position of the offsetParents to make\n\t\t// the position absolute to the root node of the page.\n\t\tvar currentNode = options.domNode.offsetParent;\n\t\twhile(currentNode) {\n\t\t\trect.left += currentNode.offsetLeft;\n\t\t\trect.top += currentNode.offsetTop;\n\t\t\tcurrentNode = currentNode.offsetParent;\n\t\t}\n\t}\n\tvar popupRect = exports.buildCoordinates(options.absolute?exports.coordinatePrefix.csAbsolute:exports.coordinatePrefix.csOffsetParent,rect);\n\tif(options.noStateReference) {\n\t\toptions.wiki.setText(options.title,\"text\",undefined,popupRect);\n\t} else {\n\t\toptions.wiki.setTextReference(options.title,popupRect);\n\t}\n\t// Add the click handler if we have any popups\n\tif(this.popups.length > 0) {\n\t\tthis.rootElement.addEventListener(\"click\",this,true);\n\t}\n};\n\n/*\nCancel all popups at or above a specified level or DOM node\nlevel: popup level to cancel (0 cancels all popups)\n*/\nPopup.prototype.cancel = function(level) {\n\tvar numPopups = this.popups.length;\n\tlevel = Math.max(0,Math.min(level,numPopups));\n\tfor(var t=level; t<numPopups; t++) {\n\t\tvar popup = this.popups.pop();\n\t\tif(popup.title) {\n\t\t\tif(popup.noStateReference) {\n\t\t\t\tpopup.wiki.deleteTiddler(popup.title);\n\t\t\t} else {\n\t\t\t\tpopup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title);\n        \t\t}\n\t\t}\n\t}\n\tif(this.popups.length === 0) {\n\t\tthis.rootElement.removeEventListener(\"click\",this,false);\n\t}\n};\n\n/*\nReturns true if the specified title and text identifies an active popup.\nThis function is safe to call, even if the popup class was not initialized.\n*/\nexports.readPopupState = function(text) {\n\treturn exports.popupLocationRegExp.test(text);\n};\n\n/*\nParses a coordinate string in the format `(x,y,w,h)` or `@(x,y,z,h)` and returns\nan object containing the position, width and height. The absolute-Mark is boolean\nvalue that indicates the coordinate system of the coordinates. If they start with\nan `@`, `absolute` is set to true and the coordinates are relative to the root\nelement. If the initial `@` is missing, they are relative to the offset parent\nelement and `absoute` is false.\nThis function is safe to call, even if the popup class was not initialized.\n*/\nexports.parseCoordinates = function(coordinates) {\n\tvar match = exports.popupLocationRegExp.exec(coordinates);\n\tif(match) {\n\t\treturn {\n\t\t\tabsolute: (match[1] === \"@\"),\n\t\t\tleft: parseFloat(match[2]),\n\t\t\ttop: parseFloat(match[3]),\n\t\t\twidth: parseFloat(match[4]),\n\t\t\theight: parseFloat(match[5])\n\t\t};\n\t} else {\n\t\treturn false;\n\t}\n}\n\n/*\nBuilds a coordinate string from a coordinate system identifier and an object\ncontaining the left, top, width and height values.\nUse constants defined in coordinatePrefix to specify a coordinate system.\nIf one of the parameters is invalid for building a coordinate string `(0,0,0,0)`\nwill be returned.\nThis function is safe to call, even if the popup class was not initialized.\n*/\nexports.buildCoordinates = function(prefix,position) {\n\tvar coord = prefix + \"(\" + position.left + \",\" + position.top + \",\" + position.width + \",\" + position.height + \")\";\n\tif (exports.popupLocationRegExp.test(coord)) {\n\t\treturn coord;\n\t} else {\n\t\treturn \"(0,0,0,0)\";\n\t}\n}\n\nexports.Popup = Popup;\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/dom/scroller.js":{"title":"$:/core/modules/utils/dom/scroller.js","text":"/*\\\ntitle: $:/core/modules/utils/dom/scroller.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Scroller object prototype that manages scrolling in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nEvent handler for when the `tm-scroll` event hits the document body\n*/\nvar PageScroller = function() {\n\tthis.idRequestFrame = null;\n\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\twindow.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\tfunction(callback) {\n\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t};\n\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\twindow.webkitCancelAnimationFrame ||\n\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\tfunction(id) {\n\t\t\twindow.clearTimeout(id);\n\t\t};\n};\n\nPageScroller.prototype.isScrolling = function() {\n\treturn this.idRequestFrame !== null;\n}\n\nPageScroller.prototype.cancelScroll = function(srcWindow) {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(srcWindow,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle an event\n*/\nPageScroller.prototype.handleEvent = function(event) {\n\tif(event.type === \"tm-scroll\") {\n\t\tvar options = {};\n\t\tif($tw.utils.hop(event.paramObject,\"animationDuration\")) {\n\t\t\toptions.animationDuration = event.paramObject.animationDuration;\n\t\t}\n\t\tif(event.paramObject && event.paramObject.selector) {\n\t\t\tthis.scrollSelectorIntoView(null,event.paramObject.selector,null,options);\n\t\t} else {\n\t\t\tthis.scrollIntoView(event.target,null,options);\n\t\t}\n\t\treturn false; // Event was handled\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element,callback,options) {\n\tvar self = this,\n\t\tduration = $tw.utils.hop(options,\"animationDuration\") ? parseInt(options.animationDuration) : $tw.utils.getAnimationDuration(),\n\t\tsrcWindow = element ? element.ownerDocument.defaultView : window;\n\t// Now get ready to scroll the body\n\tthis.cancelScroll(srcWindow);\n\tthis.startTime = Date.now();\n\t// Get the height of any position:fixed toolbars\n\tvar toolbar = srcWindow.document.querySelector(\".tc-adjust-top-of-scroll\"),\n\t\toffset = 0;\n\tif(toolbar) {\n\t\toffset = toolbar.offsetHeight;\n\t}\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar getBounds = function() {\n\t\t\tvar clientBounds = typeof callback === 'function' ? callback() : element.getBoundingClientRect(),\n\t\t\t\tscrollPosition = $tw.utils.getScrollPosition(srcWindow);\n\t\t\treturn {\n\t\t\t\tleft: clientBounds.left + scrollPosition.x,\n\t\t\t\ttop: clientBounds.top + scrollPosition.y - offset,\n\t\t\t\twidth: clientBounds.width,\n\t\t\t\theight: clientBounds.height\n\t\t\t};\n\t\t},\n\t\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\t\t// targetPos/targetSize - position and size of the target element\n\t\t// currentPos/currentSize - position and size of the current scroll viewport\n\t\t// returns: new position of the scroll viewport\n\t\tgetEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\tvar newPos = targetPos;\n\t\t\t// If we are scrolling within 50 pixels of the top/left then snap to zero\n\t\t\tif(newPos < 50) {\n\t\t\t\tnewPos = 0;\n\t\t\t}\n\t\t\treturn newPos;\n\t\t},\n\t\tdrawFrame = function drawFrame() {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll(srcWindow);\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tvar scrollPosition = $tw.utils.getScrollPosition(srcWindow),\n\t\t\t\tbounds = getBounds(),\n\t\t\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,srcWindow.innerWidth),\n\t\t\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,srcWindow.innerHeight);\n\t\t\tsrcWindow.scrollTo(scrollPosition.x + (endX - scrollPosition.x) * t,scrollPosition.y + (endY - scrollPosition.y) * t);\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\tdrawFrame();\n};\n\nPageScroller.prototype.scrollSelectorIntoView = function(baseElement,selector,callback,options) {\n\tbaseElement = baseElement || document;\n\tvar element = $tw.utils.querySelectorSafe(selector,baseElement);\n\tif(element) {\n\t\tthis.scrollIntoView(element,callback,options);\n\t}\n};\n\nexports.PageScroller = PageScroller;\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/edition-info.js":{"title":"$:/core/modules/utils/edition-info.js","text":"/*\\\ntitle: $:/core/modules/utils/edition-info.js\ntype: application/javascript\nmodule-type: utils-node\n\nInformation about the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\nvar editionInfo;\n\nexports.getEditionInfo = function() {\n\tif(!editionInfo) {\n\t\t// Enumerate the edition paths\n\t\tvar editionPaths = $tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar);\n\t\teditionInfo = {};\n\t\tfor(var editionIndex=0; editionIndex<editionPaths.length; editionIndex++) {\n\t\t\tvar editionPath = editionPaths[editionIndex];\n\t\t\t// Enumerate the folders\n\t\t\tvar entries = fs.readdirSync(editionPath);\n\t\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\t\tvar entry = entries[entryIndex];\n\t\t\t\t// Check if directories have a valid tiddlywiki.info\n\t\t\t\t// Check if the entry is a hidden directory\n\t\t\t\tif((entry.charAt(0) !== \".\") && !editionInfo[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\n\t\t\t\t\tvar file=path.resolve(editionPath,entry,\"tiddlywiki.info\");\n\t\t\t\t\tif(fs.existsSync(file)) {\n\t\t\t\t\t\tvar info = $tw.utils.parseJSONSafe(fs.readFileSync(file,\"utf8\"),null);\n\t\t\t\t\t\tif(info) {\n\t\t\t\t\t\t\teditionInfo[entry] = info;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn editionInfo;\n};\n\n})();","type":"application/javascript","module-type":"utils-node"},"$:/core/modules/utils/errors.js":{"title":"$:/core/modules/utils/errors.js","text":"/*\\\ntitle: $:/core/modules/utils/errors.js\ntype: application/javascript\nmodule-type: utils\n\nCustom errors for TiddlyWiki.\n\n\\*/\n(function(){\n\nfunction TranscludeRecursionError() {\n\tError.apply(this,arguments);\n\tthis.signatures = Object.create(null);\n};\n\n/* Maximum permitted depth of the widget tree for recursion detection */\nTranscludeRecursionError.MAX_WIDGET_TREE_DEPTH = 1000;\n\nTranscludeRecursionError.prototype = Object.create(Error);\n\nexports.TranscludeRecursionError = TranscludeRecursionError;\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/escapecss.js":{"title":"$:/core/modules/utils/escapecss.js","text":"/*\\\ntitle: $:/core/modules/utils/escapecss.js\ntype: application/javascript\nmodule-type: utils\n\nProvides CSS.escape() functionality.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, window: false */\n\"use strict\";\n\nexports.escapeCSS = (function() {\n\t// use browser's native CSS.escape() function if available\n\tif ($tw.browser && window.CSS && window.CSS.escape) {\n\t\treturn window.CSS.escape;\n\t}\n\n\t// otherwise, a utility method is provided\n\t// see also https://drafts.csswg.org/cssom/#serialize-an-identifier\n\n\t/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\n\treturn function(value) {\n\t\tif (arguments.length == 0) {\n\t\t\tthrow new TypeError('`CSS.escape` requires an argument.');\n\t\t}\n\t\tvar string = String(value);\n\t\tvar length = string.length;\n\t\tvar index = -1;\n\t\tvar codeUnit;\n\t\tvar result = '';\n\t\tvar firstCodeUnit = string.charCodeAt(0);\n\t\twhile (++index < length) {\n\t\t\tcodeUnit = string.charCodeAt(index);\n\t\t\t// Note: there’s no need to special-case astral symbols, surrogate\n\t\t\t// pairs, or lone surrogates.\n\n\t\t\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\n\t\t\t// (U+FFFD).\n\t\t\tif (codeUnit == 0x0000) {\n\t\t\t\tresult += '\\uFFFD';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is in the range [\\1-\\1F] (U+0001 to U+001F) or is\n\t\t\t\t// U+007F, […]\n\t\t\t\t(codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||\n\t\t\t\t// If the character is the first character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039), […]\n\t\t\t\t(index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n\t\t\t\t// If the character is the second character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\n\t\t\t\t(\n\t\t\t\t\tindex == 1 &&\n\t\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 &&\n\t\t\t\t\tfirstCodeUnit == 0x002D\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\n\t\t\t\tresult += '\\\\' + codeUnit.toString(16) + ' ';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is the first character and is a `-` (U+002D), and\n\t\t\t\t// there is no second character, […]\n\t\t\t\tindex == 0 &&\n\t\t\t\tlength == 1 &&\n\t\t\t\tcodeUnit == 0x002D\n\t\t\t) {\n\t\t\t\tresult += '\\\\' + string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the character is not handled by one of the above rules and is\n\t\t\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\n\t\t\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\n\t\t\t// U+005A), or [a-z] (U+0061 to U+007A), […]\n\t\t\tif (\n\t\t\t\tcodeUnit >= 0x0080 ||\n\t\t\t\tcodeUnit == 0x002D ||\n\t\t\t\tcodeUnit == 0x005F ||\n\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 ||\n\t\t\t\tcodeUnit >= 0x0041 && codeUnit <= 0x005A ||\n\t\t\t\tcodeUnit >= 0x0061 && codeUnit <= 0x007A\n\t\t\t) {\n\t\t\t\t// the character itself\n\t\t\t\tresult += string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Otherwise, the escaped character.\n\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character\n\t\t\tresult += '\\\\' + string.charAt(index);\n\n\t\t}\n\t\treturn result;\n\t};\n})();\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/fakedom.js":{"title":"$:/core/modules/utils/fakedom.js","text":"/*\\\ntitle: $:/core/modules/utils/fakedom.js\ntype: application/javascript\nmodule-type: global\n\nA barebones implementation of DOM interfaces needed by the rendering mechanism.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Sequence number used to enable us to track objects for testing\nvar sequenceNumber = null;\n\nvar bumpSequenceNumber = function(object) {\n\tif(sequenceNumber !== null) {\n\t\tobject.sequenceNumber = sequenceNumber++;\n\t}\n};\n\nvar TW_Node = function (){\n\tthrow TypeError(\"Illegal constructor\");\n};\n\nObject.defineProperty(TW_Node.prototype, 'ELEMENT_NODE', {\n\tget: function() {\n\t\treturn 1;\n\t}\n});\n\nObject.defineProperty(TW_Node.prototype, 'TEXT_NODE', {\n\tget: function() {\n\t\treturn 3;\n\t}\n});\n\nvar TW_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text + \"\";\n};\n\nObject.setPrototypeOf(TW_TextNode.prototype,TW_Node.prototype);\n\nObject.defineProperty(TW_TextNode.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn this.TEXT_NODE;\n\t}\n});\n\nObject.defineProperty(TW_TextNode.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\treturn this.textContent.replace(/(\\r?\\n)/g,\"\");\n\t}\n});\n\nvar TW_Style = function(el) {\n\t// Define the internal style object\n\tvar styleObject = {\n\t\t// Method to get the entire style object\n\t\tget: function() {\n\t\t\treturn el._style;\n\t\t},\n\t\t// Method to set styles using a string (e.g. \"color:red; background-color:blue;\")\n\t\tset: function(str) {\n\t\t\tvar self = this;\n\t\t\tstr = str || \"\";\n\t\t\t$tw.utils.each(str.split(\";\"),function(declaration) {\n\t\t\t\tvar parts = declaration.split(\":\"),\n\t\t\t\t\tname = $tw.utils.trim(parts[0]),\n\t\t\t\t\tvalue = $tw.utils.trim(parts[1]);\n\t\t\t\tif(name && value) {\n\t\t\t\t\tel._style[$tw.utils.convertStyleNameToPropertyName(name)] = value;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t// Method to set a specific property without transforming the property name, such as a custom property\n\t\tsetProperty: function(name, value) {\n\t\t\tel._style[name] = value;\n\t\t}\n\t};\n\n\t// Return a Proxy to handle direct access to individual style properties\n\treturn new Proxy(styleObject, {\n\t\tget: function(target, property) {\n\t\t\t// If the property exists on styleObject, return it (get, set, setProperty methods)\n\t\t\tif (property in target) {\n\t\t\t\treturn target[property];\n\t\t\t}\n\t\t\t// Otherwise, return the corresponding property from _style\n\t\t\treturn el._style[$tw.utils.convertStyleNameToPropertyName(property)] || \"\";\n\t\t},\n\t\tset: function(target, property, value) {\n\t\t\t// Set the property in _style\n\t\t\tel._style[$tw.utils.convertStyleNameToPropertyName(property)] = value;\n\t\t\treturn true;\n\t\t}\n\t});\n};\n\nvar TW_Element = function(tag, namespace) {\n\tbumpSequenceNumber(this);\n\tthis.isTiddlyWikiFakeDom = true;\n\tthis.tag = tag;\n\tthis.attributes = {};\n\tthis.isRaw = false;\n\tthis.children = [];\n\tthis._style = {}; // Internal style object\n\tthis.style = new TW_Style(this); // Proxy for style management\n\tthis.namespaceURI = namespace || \"http://www.w3.org/1999/xhtml\";\n};\n\n\nObject.setPrototypeOf(TW_Element.prototype,TW_Node.prototype);\n\nObject.defineProperty(TW_Element.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn this.ELEMENT_NODE;\n\t}\n});\n\nTW_Element.prototype.getAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot getAttribute on a raw TW_Element\";\n\t}\n\treturn this.attributes[name];\n};\n\nTW_Element.prototype.setAttribute = function(name,value) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot setAttribute on a raw TW_Element\";\n\t}\n\tif(name === \"style\") {\n\t\tthis.style.set(value);\n\t} else {\n\t\tthis.attributes[name] = value + \"\";\n\t}\n};\n\nTW_Element.prototype.setAttributeNS = function(namespace,name,value) {\n\tthis.setAttribute(name,value);\n};\n\nTW_Element.prototype.removeAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot removeAttribute on a raw TW_Element\";\n\t}\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\tdelete this.attributes[name];\n\t}\n};\n\nTW_Element.prototype.appendChild = function(node) {\n\tthis.children.push(node);\n\tnode.parentNode = this;\n};\n\nTW_Element.prototype.insertBefore = function(node,nextSibling) {\n\tif(nextSibling) {\n\t\tvar p = this.children.indexOf(nextSibling);\n\t\tif(p !== -1) {\n\t\t\tthis.children.splice(p,0,node);\n\t\t\tnode.parentNode = this;\n\t\t} else {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t} else {\n\t\tthis.appendChild(node);\n\t}\n};\n\nTW_Element.prototype.removeChild = function(node) {\n\tvar p = this.children.indexOf(node);\n\tif(p !== -1) {\n\t\tthis.children.splice(p,1);\n\t}\n};\n\nTW_Element.prototype.hasChildNodes = function() {\n\treturn !!this.children.length;\n};\n\nObject.defineProperty(TW_Element.prototype, \"childNodes\", {\n\tget: function() {\n\t\treturn this.children;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"firstChild\", {\n\tget: function() {\n\t\treturn this.children[0];\n\t}\n});\n\nTW_Element.prototype.addEventListener = function(type,listener,useCapture) {\n\t// Do nothing\n};\n\nObject.defineProperty(TW_Element.prototype, \"tagName\", {\n\tget: function() {\n\t\treturn this.tag || \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"className\", {\n\tget: function() {\n\t\treturn this.attributes[\"class\"] || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes[\"class\"] = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"value\", {\n\tget: function() {\n\t\treturn this.attributes.value || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes.value = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"outerHTML\", {\n\tget: function() {\n\t\tvar output = [],attr,a,v;\n\t\toutput.push(\"<\",this.tag);\n\t\tif(this.attributes) {\n\t\t\tattr = [];\n\t\t\tfor(a in this.attributes) {\n\t\t\t\tattr.push(a);\n\t\t\t}\n\t\t\tattr.sort();\n\t\t\tfor(a=0; a<attr.length; a++) {\n\t\t\t\tv = this.attributes[attr[a]];\n\t\t\t\tif(v !== undefined) {\n\t\t\t\t\toutput.push(\" \",attr[a],\"=\\\"\",$tw.utils.htmlEncode(v),\"\\\"\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this._style) {\n\t\t\tvar style = [];\n\t\t\tfor(var s in this._style) {\n\t\t\t\tstyle.push($tw.utils.convertPropertyNameToStyleName(s) + \":\" + this._style[s] + \";\");\n\t\t\t}\n\t\t\tif(style.length > 0) {\n\t\t\t\toutput.push(\" style=\\\"\",style.join(\"\"),\"\\\"\");\n\t\t\t}\n\t\t}\n\t\toutput.push(\">\");\n\t\tif($tw.config.htmlVoidElements.indexOf(this.tag) === -1) {\n\t\t\toutput.push(this.innerHTML);\n\t\t\toutput.push(\"</\",this.tag,\">\");\n\t\t}\n\t\treturn output.join(\"\");\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"innerHTML\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn this.rawHTML;\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tif(node instanceof TW_Element) {\n\t\t\t\t\tb.push(node.outerHTML);\n\t\t\t\t} else if(node instanceof TW_TextNode) {\n\t\t\t\t\tb.push($tw.utils.htmlTextEncode(node.textContent));\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.isRaw = true;\n\t\tthis.rawHTML = value;\n\t\tthis.rawTextContent = null;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textInnerHTML\", {\n\tset: function(value) {\n\t\tif(this.isRaw) {\n\t\t\tthis.rawTextContent = value;\n\t\t} else {\n\t\t\tthrow \"Cannot set textInnerHTML of a non-raw TW_Element\";\n\t\t}\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tif(this.rawTextContent === null) {\n\t\t\t\treturn \"\";\n\t\t\t} else {\n\t\t\t\treturn this.rawTextContent;\n\t\t\t}\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.textContent);\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.children = [new TW_TextNode(value)];\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn \"\";\n\t\t} else {\n\t\t\tvar b = [],\n\t\t\t\tisBlock = $tw.config.htmlBlockElements.indexOf(this.tag) !== -1;\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\tif(this.tag === \"li\") {\n\t\t\t\tb.push(\"* \");\n\t\t\t}\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.formattedTextContent);\n\t\t\t});\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\treturn b.join(\"\");\n\t\t}\n\t}\n});\n\nvar document = {\n\tsetSequenceNumber: function(value) {\n\t\tsequenceNumber = value;\n\t},\n\tcreateElementNS: function(namespace,tag) {\n\t\treturn new TW_Element(tag,namespace);\n\t},\n\tcreateElement: function(tag) {\n\t\treturn new TW_Element(tag);\n\t},\n\tcreateTextNode: function(text) {\n\t\treturn new TW_TextNode(text);\n\t},\n\tcompatMode: \"CSS1Compat\", // For KaTeX to know that we're not a browser in quirks mode\n\tisTiddlyWikiFakeDom: true\n};\n\nexports.fakeDocument = document;\n\n})();\n","type":"application/javascript","module-type":"global"},"$:/core/modules/utils/filesystem.js":{"title":"$:/core/modules/utils/filesystem.js","text":"/*\\\ntitle: $:/core/modules/utils/filesystem.js\ntype: application/javascript\nmodule-type: utils-node\n\nFile system utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\n/*\nReturn the subdirectories of a path\n*/\nexports.getSubdirectories = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn null;\n\t}\n\tvar subdirs = [];\n\t$tw.utils.each(fs.readdirSync(dirPath),function(item) {\n\t\tif($tw.utils.isDirectory(path.resolve(dirPath,item))) {\n\t\t\tsubdirs.push(item);\n\t\t}\n\t});\n\treturn subdirs;\n}\n\n/*\nRecursively (and synchronously) copy a directory and all its content\n*/\nexports.copyDirectory = function(srcPath,dstPath) {\n\t// Remove any trailing path separators\n\tsrcPath = path.resolve($tw.utils.removeTrailingSeparator(srcPath));\n\tdstPath = path.resolve($tw.utils.removeTrailingSeparator(dstPath));\n\t// Check that neither director is within the other\n\tif(srcPath.substring(0,dstPath.length) === dstPath || dstPath.substring(0,srcPath.length) === srcPath) {\n\t\treturn \"Cannot copy nested directories\";\n\t}\n\t// Create the destination directory\n\tvar err = $tw.utils.createDirectory(dstPath);\n\tif(err) {\n\t\treturn err;\n\t}\n\t// Function to copy a folder full of files\n\tvar copy = function(srcPath,dstPath) {\n\t\tvar srcStats = fs.lstatSync(srcPath),\n\t\t\tdstExists = fs.existsSync(dstPath);\n\t\tif(srcStats.isFile()) {\n\t\t\t$tw.utils.copyFile(srcPath,dstPath);\n\t\t} else if(srcStats.isDirectory()) {\n\t\t\tvar items = fs.readdirSync(srcPath);\n\t\t\tfor(var t=0; t<items.length; t++) {\n\t\t\t\tvar item = items[t],\n\t\t\t\t\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\n\t\t\t\tif(err) {\n\t\t\t\t\treturn err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tcopy(srcPath,dstPath);\n\treturn null;\n};\n\n/*\nCopy a file\n*/\nvar FILE_BUFFER_LENGTH = 64 * 1024,\n\tfileBuffer;\n\nexports.copyFile = function(srcPath,dstPath) {\n\t// Create buffer if required\n\tif(!fileBuffer) {\n\t\tfileBuffer = Buffer.alloc(FILE_BUFFER_LENGTH);\n\t}\n\t// Create any directories in the destination\n\t$tw.utils.createDirectory(path.dirname(dstPath));\n\t// Copy the file\n\tvar srcFile = fs.openSync(srcPath,\"r\"),\n\t\tdstFile = fs.openSync(dstPath,\"w\"),\n\t\tbytesRead = 1,\n\t\tpos = 0;\n\twhile (bytesRead > 0) {\n\t\tbytesRead = fs.readSync(srcFile,fileBuffer,0,FILE_BUFFER_LENGTH,pos);\n\t\tfs.writeSync(dstFile,fileBuffer,0,bytesRead);\n\t\tpos += bytesRead;\n\t}\n\tfs.closeSync(srcFile);\n\tfs.closeSync(dstFile);\n\treturn null;\n};\n\n/*\nRemove trailing path separator\n*/\nexports.removeTrailingSeparator = function(dirPath) {\n\tvar len = dirPath.length;\n\tif(dirPath.charAt(len-1) === path.sep) {\n\t\tdirPath = dirPath.substr(0,len-1);\n\t}\n\treturn dirPath;\n};\n\n/*\nRecursively create a directory\n*/\nexports.createDirectory = function(dirPath) {\n\tif(dirPath.substr(dirPath.length-1,1) !== path.sep) {\n\t\tdirPath = dirPath + path.sep;\n\t}\n\tvar pos = 1;\n\tpos = dirPath.indexOf(path.sep,pos);\n\twhile(pos !== -1) {\n\t\tvar subDirPath = dirPath.substr(0,pos);\n\t\tif(!$tw.utils.isDirectory(subDirPath)) {\n\t\t\ttry {\n\t\t\t\tfs.mkdirSync(subDirPath);\n\t\t\t} catch(e) {\n\t\t\t\treturn \"Error creating directory '\" + subDirPath + \"'\";\n\t\t\t}\n\t\t}\n\t\tpos = dirPath.indexOf(path.sep,pos + 1);\n\t}\n\treturn null;\n};\n\n/*\nRecursively create directories needed to contain a specified file\n*/\nexports.createFileDirectories = function(filePath) {\n\treturn $tw.utils.createDirectory(path.dirname(filePath));\n};\n\n/*\nRecursively delete a directory\n*/\nexports.deleteDirectory = function(dirPath) {\n\tif(fs.existsSync(dirPath)) {\n\t\tvar entries = fs.readdirSync(dirPath);\n\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\tvar currPath = dirPath + path.sep + entries[entryIndex];\n\t\t\tif(fs.lstatSync(currPath).isDirectory()) {\n\t\t\t\t$tw.utils.deleteDirectory(currPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(currPath);\n\t\t\t}\n\t\t}\n\tfs.rmdirSync(dirPath);\n\t}\n\treturn null;\n};\n\n/*\nCheck if a path identifies a directory\n*/\nexports.isDirectory = function(dirPath) {\n\treturn fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n};\n\n/*\nCheck if a path identifies a directory that is empty\n*/\nexports.isDirectoryEmpty = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn false;\n\t}\n\tvar files = fs.readdirSync(dirPath),\n\t\tempty = true;\n\t$tw.utils.each(files,function(file,index) {\n\t\tif(file.charAt(0) !== \".\") {\n\t\t\tempty = false;\n\t\t}\n\t});\n\treturn empty;\n};\n\n/*\nRecursively delete a tree of empty directories\n*/\nexports.deleteEmptyDirs = function(dirpath,callback) {\n\tvar self = this;\n\tfs.readdir(dirpath,function(err,files) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\tif(files.length > 0) {\n\t\t\treturn callback(null);\n\t\t}\n\t\tfs.rmdir(dirpath,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.deleteEmptyDirs(path.dirname(dirpath),callback);\n\t\t});\n\t});\n};\n\n/*\nCreate a fileInfo object for saving a tiddler:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file on disk (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n\tisEditableFile: true if the tiddler was loaded via non-standard options & marked editable\nOptions include:\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\textFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters,\n\tfileInfo: an existing fileInfo to check against\n*/\nexports.generateTiddlerFileInfo = function(tiddler,options) {\n\tvar fileInfo = {}, metaExt;\n\t// Propagate the isEditableFile flag\n\tif(options.fileInfo && !!options.fileInfo.isEditableFile) {\n\t\tfileInfo.isEditableFile = true;\n\t\tfileInfo.originalpath = options.fileInfo.originalpath;\n\t}\n\t// Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace\n\tvar hasUnsafeFields = false;\n\t$tw.utils.each(tiddler.getFieldStrings(),function(value,fieldName) {\n\t\tif(fieldName !== \"text\") {\n\t\t\thasUnsafeFields = hasUnsafeFields || /[\\x00-\\x1F]/mg.test(value);\n\t\t\thasUnsafeFields = hasUnsafeFields || ($tw.utils.trim(value) !== value);\n\t\t}\n\t\thasUnsafeFields = hasUnsafeFields || /:|#/mg.test(fieldName);\n\t});\n\t// Check for field values \n\tif(hasUnsafeFields) {\n\t\t// Save as a JSON file\n\t\tfileInfo.type = \"application/json\";\n\t\tfileInfo.hasMetaFile = false;\n\t} else {\n\t\t// Save as a .tid or a text/binary file plus a .meta file\n\t\tvar tiddlerType = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\tif(tiddlerType === \"text/vnd.tiddlywiki\" || tiddlerType === \"text/vnd.tiddlywiki-multiple\" || tiddler.hasField(\"_canonical_uri\")) {\n\t\t\t// Save as a .tid file\n\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\tfileInfo.hasMetaFile = false;\n\t\t} else {\n\t\t\t// Save as a text/binary file and a .meta file\n\t\t\tfileInfo.type = tiddlerType;\n\t\t\tfileInfo.hasMetaFile = true;\n\t\t}\n\t\tif(options.extFilters) {\n\t\t\t// Check for extension overrides\n\t\t\tmetaExt = $tw.utils.generateTiddlerExtension(tiddler.fields.title,{\n\t\t\t\textFilters: options.extFilters,\n\t\t\t\twiki: options.wiki\n\t\t\t});\n\t\t\tif(metaExt) {\n\t\t\t\tif(metaExt === \".tid\") {\n\t\t\t\t\t// Overriding to the .tid extension needs special handling\n\t\t\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\t\t\tfileInfo.hasMetaFile = false;\n\t\t\t\t} else if (metaExt === \".json\") {\n\t\t\t\t\t// Overriding to the .json extension needs special handling\n\t\t\t\t\tfileInfo.type = \"application/json\";\n\t\t\t\t\tfileInfo.hasMetaFile = false;\n\t\t\t\t} else {\n\t\t\t\t\t//If the new type matches a known extention, use that MIME type's encoding\n\t\t\t\t\tvar extInfo = $tw.utils.getFileExtensionInfo(metaExt);\n\t\t\t\t\tfileInfo.type = extInfo ? extInfo.type : null;\n\t\t\t\t\tfileInfo.encoding = $tw.utils.getTypeEncoding(metaExt);\n\t\t\t\t\tfileInfo.hasMetaFile = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Take the file extension from the tiddler content type or metaExt\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[fileInfo.type] || {extension: \"\"};\n\t// Generate the filepath\n\tfileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler.fields.title,{\n\t\textension: metaExt || contentTypeInfo.extension,\n\t\tdirectory: options.directory,\n\t\tpathFilters: options.pathFilters,\n\t\twiki: options.wiki,\n\t\tfileInfo: options.fileInfo\n\t});\n\treturn fileInfo;\n};\n\n/*\nGenerate the file extension for saving a tiddler\nOptions include:\n\textFilters: optional array of filters to be used to generate the extention\n\twiki: optional wiki for evaluating the extFilters\n*/\nexports.generateTiddlerExtension = function(title,options) {\n\tvar extension;\n\t// Check if any of the extFilters applies\n\tif(options.extFilters && options.wiki) { \n\t\t$tw.utils.each(options.extFilters,function(filter) {\n\t\t\tif(!extension) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\textension = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn extension;\n};\n\n/*\nGenerate the filepath for saving a tiddler\nOptions include:\n\textension: file extension to be added the finished filepath\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters\n\tfileInfo: an existing fileInfo object to check against\n\tfileInfo.overwrite: if true, turns off filename clash numbers (defaults to false)\n*/\nexports.generateTiddlerFilepath = function(title,options) {\n\tvar directory = options.directory || \"\",\n\t\textension = options.extension || \"\",\n\t\toriginalpath = (options.fileInfo && options.fileInfo.originalpath) ? options.fileInfo.originalpath : \"\",\n\t\toverwrite = options.fileInfo && options.fileInfo.overwrite || false,\n\t\tfilepath;\n\t// Check if any of the pathFilters applies\n\tif(options.pathFilters && options.wiki) {\n\t\t$tw.utils.each(options.pathFilters,function(filter) {\n\t\t\tif(!filepath) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\tfilepath = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tif(!filepath && !!originalpath) {\n\t\t//Use the originalpath without the extension\n\t\tvar ext = path.extname(originalpath);\n\t\tfilepath = originalpath.substring(0,originalpath.length - ext.length);\n\t} else if(!filepath) {\n\t\tfilepath = title;\n\t\t// Remove any forward or backward slashes so we don't create directories\n\t\tfilepath = filepath.replace(/\\/|\\\\/g,\"_\");\n\t}\n\t// Replace any Windows control codes\n\tfilepath = filepath.replace(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i,\"_$1_\");\n\t// Replace any leading spaces with the same number of underscores\n\tfilepath = filepath.replace(/^ +/,function (u) { return u.replace(/ /g, \"_\")});\n\t//If the path does not start with \".\" or \"..\" && a path seperator, then\n\tif(!/^\\.{1,2}[/\\\\]/g.test(filepath)) {\n\t\t// Don't let the filename start with any dots because such files are invisible on *nix\n\t\tfilepath = filepath.replace(/^\\.+/g,function (u) { return u.replace(/\\./g, \"_\")});\n\t}\n\t// Replace any Unicode control codes\n\tfilepath = filepath.replace(/[\\x00-\\x1f\\x80-\\x9f]/g,\"_\");\n\t// Replace any characters that can't be used in cross-platform filenames\n\tfilepath = $tw.utils.transliterate(filepath.replace(/<|>|~|\\:|\\\"|\\||\\?|\\*|\\^/g,\"_\"));\n\t// Replace any dots or spaces at the end of the extension with the same number of underscores\n\textension = extension.replace(/[\\. ]+$/, function (u) { return u.replace(/[\\. ]/g, \"_\")});\n\t// Truncate the extension if it is too long\n\tif(extension.length > 32) {\n\t\textension = extension.substr(0,32);\n\t}\n\t// If the filepath already ends in the extension then remove it\n\tif(filepath.substring(filepath.length - extension.length) === extension) {\n\t\tfilepath = filepath.substring(0,filepath.length - extension.length);\n\t}\n\t// Truncate the filename if it is too long\n\tif(filepath.length > 200) {\n\t\tfilepath = filepath.substr(0,200);\n\t}\n\t// If the resulting filename is blank (eg because the title is just punctuation)\n\tif(!filepath || /^_+$/g.test(filepath)) {\n\t\t// ...then just use the character codes of the title\n\t\tfilepath = \"\";\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tif(filepath) {\n\t\t\t\tfilepath += \"-\";\n\t\t\t}\n\t\t\tfilepath += char.charCodeAt(0).toString();\n\t\t});\n\t}\n\t// Add a uniquifier if the file already exists (default)\n\tvar fullPath = path.resolve(directory, filepath + extension);\n\tif (!overwrite) {\n\t\tvar oldPath = (options.fileInfo) ? options.fileInfo.filepath : undefined,\n\t\tcount = 0;\n\t\tdo {\n\t\t\tfullPath = path.resolve(directory,filepath + (count ? \"_\" + count : \"\") + extension);\n\t\t\tif(oldPath && oldPath == fullPath) break;\n\t\t\tcount++;\n\t\t} while(fs.existsSync(fullPath));\n\t}\n\t// If the last write failed with an error, or if path does not start with:\n\t//\tthe resolved options.directory, the resolved wikiPath directory, the wikiTiddlersPath directory, \n\t//\tor the 'originalpath' directory, then $tw.utils.encodeURIComponentExtended() and resolve to options.directory.\n\tvar writePath = $tw.hooks.invokeHook(\"th-make-tiddler-path\",fullPath,fullPath),\n\t\tencode = (options.fileInfo || {writeError: false}).writeError == true;\n\tif(!encode) {\n\t\tencode = !(writePath.indexOf($tw.boot.wikiTiddlersPath) == 0 ||\n\t\t\twritePath.indexOf(path.resolve(directory)) == 0 ||\n\t\t\twritePath.indexOf(path.resolve($tw.boot.wikiPath)) == 0 ||\n\t\t\twritePath.indexOf(path.resolve($tw.boot.wikiTiddlersPath,originalpath)) == 0 );\n\t\t}\n\tif(encode) {\n\t\twritePath = path.resolve(directory,$tw.utils.encodeURIComponentExtended(fullPath));\n\t}\n\t// Return the full path to the file\n\treturn writePath;\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFile = function(tiddler,fileInfo,callback) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFile(fileInfo.filepath,tiddler.fields.text || \"\",typeInfo.encoding,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tfs.writeFile(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn callback(null,fileInfo);\n\t\t\t});\n\t\t});\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn callback(null,fileInfo);\n\t\t\t});\n\t\t} else {\n\t\t\tfs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn callback(null,fileInfo);\n\t\t\t});\n\t\t}\n\t}\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFileSync = function(tiddler,fileInfo) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFileSync(fileInfo.filepath,tiddler.fields.text || \"\",typeInfo.encoding);\n\t\tfs.writeFileSync(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\");\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFileSync(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\");\n\t\t} else {\n\t\t\tfs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\");\n\t\t}\n\t}\n\treturn fileInfo;\n};\n\n/*\nDelete a file described by the fileInfo if it exits\n*/\nexports.deleteTiddlerFile = function(fileInfo,callback) {\n\t//Only attempt to delete files that exist on disk\n\tif(!fileInfo.filepath || !fs.existsSync(fileInfo.filepath)) {\n\t\t//For some reason, the tiddler is only in memory or we can't modify the file at this path\n\t\t$tw.syncer.displayError(\"Server deleteTiddlerFile task failed for filepath: \"+fileInfo.filepath);\n\t\treturn callback(null,fileInfo);\n\t}\n\t// Delete the file\n\tfs.unlink(fileInfo.filepath,function(err) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Delete the metafile if present\n\t\tif(fileInfo.hasMetaFile && fs.existsSync(fileInfo.filepath + \".meta\")) {\n\t\t\tfs.unlink(fileInfo.filepath + \".meta\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),function(err) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\treturn callback(null,fileInfo);\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn callback(null,fileInfo);\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nCleanup old files on disk, by comparing the options values:\n\tadaptorInfo from $tw.syncer.tiddlerInfo\n\tbootInfo from $tw.boot.files\n*/\nexports.cleanupTiddlerFiles = function(options,callback) {\n\tvar adaptorInfo = options.adaptorInfo || {},\n\tbootInfo = options.bootInfo || {},\n\ttitle = options.title || \"undefined\";\n\tif(adaptorInfo.filepath && bootInfo.filepath && adaptorInfo.filepath !== bootInfo.filepath) {\n\t\t$tw.utils.deleteTiddlerFile(adaptorInfo,function(err) {\n\t\t\tif(err) {\n\t\t\t\tif ((err.code == \"EPERM\" || err.code == \"EACCES\") && err.syscall == \"unlink\") {\n\t\t\t\t\t// Error deleting the previous file on disk, should fail gracefully\n\t\t\t\t\t$tw.syncer.displayError(\"Server desynchronized. Error cleaning up previous file for tiddler: \\\"\"+title+\"\\\"\",err);\n\t\t\t\t\treturn callback(null,bootInfo);\n\t\t\t\t} else {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn callback(null,bootInfo);\n\t\t});\n\t} else {\n\t\treturn callback(null,bootInfo);\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"utils-node"},"$:/core/modules/utils/linkedlist.js":{"title":"$:/core/modules/utils/linkedlist.js","text":"/*\\\nmodule-type: utils\ntitle: $:/core/modules/utils/linkedlist.js\ntype: application/javascript\n\nThis is a doubly-linked indexed list intended for manipulation, particularly\npushTop, which it does with significantly better performance than an array.\n\n\\*/\n(function(){\n\nfunction LinkedList() {\n\tthis.clear();\n};\n\nLinkedList.prototype.clear = function() {\n\t// LinkedList performs the duty of both the head and tail node\n\tthis.next = new LLMap();\n\tthis.prev = new LLMap();\n\t// Linked list head initially points to itself\n\tthis.next.set(null, null);\n\tthis.prev.set(null, null);\n\tthis.length = 0;\n};\n\nLinkedList.prototype.remove = function(value) {\n\tif($tw.utils.isArray(value)) {\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_assertString(value[t]);\n\t\t}\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_removeOne(this,value[t]);\n\t\t}\n\t} else {\n\t\t_assertString(value);\n\t\t_removeOne(this,value);\n\t}\n};\n\n/*\nPush behaves like array.push and accepts multiple string arguments. But it also\naccepts a single array argument too, to be consistent with its other methods.\n*/\nLinkedList.prototype.push = function(/* values */) {\n\tvar i, values = arguments;\n\tif($tw.utils.isArray(values[0])) {\n\t\tvalues = values[0];\n\t}\n\tfor(i = 0; i < values.length; i++) {\n\t\t_assertString(values[i]);\n\t}\n\tfor(i = 0; i < values.length; i++) {\n\t\t_linkToEnd(this,values[i]);\n\t}\n\treturn this.length;\n};\n\nLinkedList.prototype.pushTop = function(value) {\n\tvar t;\n\tif($tw.utils.isArray(value)) {\n\t\tfor (t=0; t<value.length; t++) {\n\t\t\t_assertString(value[t]);\n\t\t}\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\t_removeOne(this,value[t]);\n\t\t}\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\t_linkToEnd(this,value[t]);\n\t\t}\n\t} else {\n\t\t_assertString(value);\n\t\t_removeOne(this,value);\n\t\t_linkToEnd(this,value);\n\t}\n};\n\nLinkedList.prototype.each = function(callback) {\n\tvar visits = Object.create(null),\n\t\tvalue = this.next.get(null);\n\twhile(value !== null) {\n\t\tcallback(value);\n\t\tvar next = this.next.get(value);\n\t\tif(Array.isArray(next)) {\n\t\t\tvar i = visits[value] || 0;\n\t\t\tvisits[value] = i+1;\n\t\t\tvalue = next[i];\n\t\t} else {\n\t\t\tvalue = next;\n\t\t}\n\t}\n};\n\nLinkedList.prototype.toArray = function() {\n\tvar output = new Array(this.length),\n\t\tindex = 0;\n\tthis.each(function(value) { output[index++] = value; });\n\treturn output;\n};\n\nLinkedList.prototype.makeTiddlerIterator = function(wiki) {\n\tvar self = this;\n\treturn function(callback) {\n\t\tself.each(function(title) {\n\t\t\tcallback(wiki.getTiddler(title),title);\n\t\t});\n\t};\n};\n\nfunction _removeOne(list,value) {\n\tvar nextEntry = list.next.get(value);\n\tif(nextEntry === undefined) {\n\t\treturn;\n\t}\n\tvar prevEntry = list.prev.get(value),\n\t\tprev = prevEntry,\n\t\tnext = nextEntry,\n\t\tref;\n\tif(Array.isArray(nextEntry)) {\n\t\tnext = nextEntry[0];\n\t\tprev = prevEntry[0];\n\t}\n\t// Relink preceding element.\n\tref = list.next.get(prev);\n\tif(Array.isArray(ref)) {\n\t\tvar i = ref.indexOf(value);\n\t\tref[i] = next;\n\t} else {\n\t\tlist.next.set(prev,next);\n\t}\n\n\t// Now relink following element\n\tref = list.prev.get(next);\n\tif(Array.isArray(ref)) {\n\t\tvar i = ref.indexOf(value);\n\t\tref[i] = prev;\n\t} else {\n\t\tlist.prev.set(next,prev);\n\t}\n\n\t// Delink actual value. If it uses arrays, just remove first entries.\n\tif(Array.isArray(nextEntry) && nextEntry.length > 1) {\n\t\tnextEntry.shift();\n\t\tprevEntry.shift();\n\t} else {\n\t\tlist.next.set(value,undefined);\n\t\tlist.prev.set(value,undefined);\n\t}\n\tlist.length -= 1;\n};\n\n// Sticks the given node onto the end of the list.\nfunction _linkToEnd(list,value) {\n\tvar old = list.next.get(value);\n\tvar last = list.prev.get(null);\n\t// Does it already exists?\n\tif(old !== undefined) {\n\t\tif(!Array.isArray(old)) {\n\t\t\told = [old];\n\t\t\tlist.next.set(value,old);\n\t\t\tlist.prev.set(value,[list.prev.get(value)]);\n\t\t}\n\t\told.push(null);\n\t\tlist.prev.get(value).push(last);\n\t} else {\n\t\tlist.next.set(value,null);\n\t\tlist.prev.set(value,last);\n\t}\n\t// Make the old last point to this new one.\n\tif(value !== last) {\n\t\tvar array = list.next.get(last);\n\t\tif(Array.isArray(array)) {\n\t\t\tarray[array.length-1] = value;\n\t\t} else {\n\t\t\tlist.next.set(last,value);\n\t\t}\n\t\tlist.prev.set(null,value);\n\t} else {\n\t\t// Edge case, the pushed value was already the last value.\n\t\t// The second-to-last nextPtr for that value must point to itself now.\n\t\tvar array = list.next.get(last);\n\t\tarray[array.length-2] = value;\n\t}\n\tlist.length += 1;\n};\n\nfunction _assertString(value) {\n\tif(typeof value !== \"string\") {\n\t\tthrow \"Linked List only accepts string values, not \" + value;\n\t}\n};\n\nvar LLMap = function() {\n\tthis.map = Object.create(null);\n};\n\n// Just a wrapper so our object map can also accept null.\nLLMap.prototype = {\n\tset: function(key,val) {\n\t\t(key === null) ? (this.null = val) : (this.map[key] = val);\n\t},\n\tget: function(key) {\n\t\treturn (key === null) ? this.null : this.map[key];\n\t}\n};\n\nexports.LinkedList = LinkedList;\n\n})();\n","module-type":"utils","type":"application/javascript"},"$:/core/modules/utils/logger.js":{"title":"$:/core/modules/utils/logger.js","text":"/*\\\ntitle: $:/core/modules/utils/logger.js\ntype: application/javascript\nmodule-type: utils\n\nA basic logging implementation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ALERT_TAG = \"$:/tags/Alert\";\n\n/*\nMake a new logger\n*/\nfunction Logger(componentName,options) {\n\toptions = options || {};\n\tthis.componentName = componentName || \"\";\n\tthis.colour = options.colour || \"white\";\n\tthis.enable = \"enable\" in options ? options.enable : true;\n\tthis.save = \"save\" in options ? options.save : true;\n\tthis.saveLimit = options.saveLimit || 100 * 1024;\n\tthis.saveBufferLogger = this;\n\tthis.buffer = \"\";\n\tthis.alertCount = 0;\n}\n\nLogger.prototype.setSaveBuffer = function(logger) {\n\tthis.saveBufferLogger = logger;\n};\n\n/*\nLog a message\n*/\nLogger.prototype.log = function(/* args */) {\n\tvar self = this;\n\tif(this.enable) {\n\t\tif(this.saveBufferLogger.save) {\n\t\t\tthis.saveBufferLogger.buffer += $tw.utils.formatDateString(new Date(),\"YYYY MM DD 0hh:0mm:0ss.0XXX\") + \":\";\n\t\t\t$tw.utils.each(Array.prototype.slice.call(arguments,0),function(arg,index) {\n\t\t\t\tself.saveBufferLogger.buffer += \" \" + arg;\n\t\t\t});\n\t\t\tthis.saveBufferLogger.buffer += \"\\n\";\n\t\t\tthis.saveBufferLogger.buffer = this.saveBufferLogger.buffer.slice(-this.saveBufferLogger.saveLimit);\n\t\t}\n\t\tif(console !== undefined && console.log !== undefined) {\n\t\t\tvar logMessage = [$tw.utils.terminalColour(this.colour) + this.componentName + \":\"].concat(Array.prototype.slice.call(arguments,0));\n\t\t\tlogMessage[logMessage.length-1] += $tw.utils.terminalColour();\n\t\t\treturn Function.apply.call(console.log, console, logMessage);\n\t\t}\n\t} \n};\n\n/*\nRead the message buffer\n*/\nLogger.prototype.getBuffer = function() {\n\treturn this.saveBufferLogger.buffer;\n};\n\n/*\nLog a structure as a table\n*/\nLogger.prototype.table = function(value) {\n\t(console.table || console.log)(value);\n};\n\n/*\nAlert a message\n*/\nLogger.prototype.alert = function(/* args */) {\n\tif(this.enable) {\n\t\t// Prepare the text of the alert\n\t\tvar text = Array.prototype.join.call(arguments,\" \");\n\t\t// Create alert tiddlers in the browser\n\t\tif($tw.browser) {\n\t\t\t// Check if there is an existing alert with the same text and the same component\n\t\t\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\n\t\t\t\talertFields,\n\t\t\t\texistingCount,\n\t\t\t\tself = this;\n\t\t\t$tw.utils.each(existingAlerts,function(title) {\n\t\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\t\tif(tiddler.fields.text === text && tiddler.fields.component === self.componentName && tiddler.fields.modified && (!alertFields || tiddler.fields.modified < alertFields.modified)) {\n\t\t\t\t\t\talertFields = $tw.utils.extend({},tiddler.fields);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(alertFields) {\n\t\t\t\texistingCount = alertFields.count || 1;\n\t\t\t} else {\n\t\t\t\talertFields = {\n\t\t\t\t\ttitle: $tw.wiki.generateNewTitle(\"$:/temp/alerts/alert\",{prefix: \"\"}),\n\t\t\t\t\ttext: text,\n\t\t\t\t\ttags: [ALERT_TAG],\n\t\t\t\t\tcomponent: this.componentName\n\t\t\t\t};\n\t\t\t\texistingCount = 0;\n\t\t\t\tthis.alertCount += 1;\n\t\t\t}\n\t\t\talertFields.modified = new Date();\n\t\t\tif(++existingCount > 1) {\n\t\t\t\talertFields.count = existingCount;\n\t\t\t} else {\n\t\t\t\talertFields.count = undefined;\n\t\t\t}\n\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\n\t\t\t// Log the alert as well\n\t\t\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\t// Print an orange message to the console if not in the browser\n\t\t\tconsole.error(\"\\x1b[1;33m\" + text + \"\\x1b[0m\");\n\t\t}\n\t}\n};\n\n/*\nClear outstanding alerts\n*/\nLogger.prototype.clearAlerts = function() {\n\tvar self = this;\n\tif($tw.browser && this.alertCount > 0) {\n\t\t$tw.utils.each($tw.wiki.getTiddlersWithTag(ALERT_TAG),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(tiddler.fields.component === self.componentName) {\n\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t}\n\t\t});\n\t\tthis.alertCount = 0;\n\t}\n};\n\nexports.Logger = Logger;\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/parsetree.js":{"title":"$:/core/modules/utils/parsetree.js","text":"/*\\\ntitle: $:/core/modules/utils/parsetree.js\ntype: application/javascript\nmodule-type: utils\n\nParse tree utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nAdd attribute to parse tree node\nCan be invoked as (node,name,value) or (node,attr)\n*/\nexports.addAttributeToParseTreeNode = function(node,name,value) {\n\tvar attribute = typeof name === \"object\" ? name : {name: name, type: \"string\", value: value};\n\tname = attribute.name;\n\tnode.attributes = node.attributes || {};\n\tnode.orderedAttributes = node.orderedAttributes || [];\n\tnode.attributes[name] = attribute;\n\tvar foundIndex = -1;\n\t$tw.utils.each(node.orderedAttributes,function(attr,index) {\n\t\tif(attr.name === name) {\n\t\t\tfoundIndex = index;\n\t\t}\n\t});\n\tif(foundIndex === -1) {\n\t\tnode.orderedAttributes.push(attribute);\n\t} else {\n\t\tnode.orderedAttributes[foundIndex] = attribute;\n\t}\n};\n\nexports.getOrderedAttributesFromParseTreeNode = function(node) {\n\tif(node.orderedAttributes) {\n\t\treturn node.orderedAttributes;\n\t} else {\n\t\tvar attributes = [];\n\t\t$tw.utils.each(node.attributes,function(attribute) {\n\t\t\tattributes.push(attribute);\n\t\t});\n\t\treturn attributes.sort(function(a,b) {\n\t\t\treturn a.name < b.name ? -1 : (a.name > b.name ? 1 : 0);\n\t\t});\n\t}\n};\n\nexports.getAttributeValueFromParseTreeNode = function(node,name,defaultValue) {\n\tif(node.attributes && node.attributes[name] && node.attributes[name].value !== undefined) {\n\t\treturn node.attributes[name].value;\n\t}\n\treturn defaultValue;\n};\n\nexports.addClassToParseTreeNode = function(node,classString) {\n\tvar classes = [],\n\t\tattribute;\n\tnode.attributes = node.attributes || {};\n\tattribute = node.attributes[\"class\"];\n\tif(!attribute) {\n\t\t// If the class attribute does not exist, we must create it first.\n\t\tattribute = {name: \"class\", type: \"string\", value: \"\"};\n\t\tnode.attributes[\"class\"] = attribute;\n\t\tnode.orderedAttributes = node.orderedAttributes || [];\n\t\tnode.orderedAttributes.push(attribute);\n\t}\n\tif(attribute.type === \"string\") {\n\t\tif(attribute.value !== \"\") {\n\t\t\tclasses = attribute.value.split(\" \");\n\t\t}\n\t\tif(classString !== \"\") {\n\t\t\t$tw.utils.pushTop(classes,classString.split(\" \"));\n\t\t}\n\t\tattribute.value = classes.join(\" \");\n\t}\n};\n\nexports.addStyleToParseTreeNode = function(node,name,value) {\n\tvar attribute;\n\tnode.attributes = node.attributes || {};\n\tattribute = node.attributes.style;\n\tif(!attribute) {\n\t\tattribute = {name: \"style\", type: \"string\", value: \"\"};\n\t\tnode.attributes.style = attribute;\n\t\tnode.orderedAttributes = node.orderedAttributes || [];\n\t\tnode.orderedAttributes.push(attribute);\n\t}\n\tif(attribute.type === \"string\") {\n\t\tattribute.value += name + \":\" + value + \";\";\n\t}\n};\n\nexports.findParseTreeNode = function(nodeArray,search) {\n\tfor(var t=0; t<nodeArray.length; t++) {\n\t\tif(nodeArray[t].type === search.type && nodeArray[t].tag === search.tag) {\n\t\t\treturn nodeArray[t];\n\t\t}\n\t}\n\treturn undefined;\n};\n\n/*\nHelper to get the text of a parse tree node or array of nodes\n*/\nexports.getParseTreeText = function getParseTreeText(tree) {\n\tvar output = [];\n\tif($tw.utils.isArray(tree)) {\n\t\t$tw.utils.each(tree,function(node) {\n\t\t\toutput.push(getParseTreeText(node));\n\t\t});\n\t} else {\n\t\tif(tree.type === \"text\") {\n\t\t\toutput.push(tree.text);\n\t\t}\n\t\tif(tree.children) {\n\t\t\treturn getParseTreeText(tree.children);\n\t\t}\n\t}\n\treturn output.join(\"\");\n};\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/performance.js":{"title":"$:/core/modules/utils/performance.js","text":"/*\\\ntitle: $:/core/modules/utils/performance.js\ntype: application/javascript\nmodule-type: global\n\nPerformance measurement.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Performance(enabled) {\n\tthis.enabled = !!enabled;\n\tthis.measures = {}; // Hashmap by measurement name of {time:, invocations:}\n\tthis.logger = new $tw.utils.Logger(\"performance\");\n\tthis.showGreeting();\n}\n\nPerformance.prototype.showGreeting = function() {\n\tif($tw.browser) {\n\t\tthis.logger.log(\"Execute $tw.perf.log(); to see filter execution timings\");\n\t}\n};\n\n/*\nWrap performance reporting around a top level function\n*/\nPerformance.prototype.report = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tself.logger.log(name + \": \" + $tw.utils.timer(startTime).toFixed(2) + \"ms\");\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nPerformance.prototype.log = function() {\n\tvar self = this,\n\t\ttotalTime = 0,\n\t\torderedMeasures = Object.keys(this.measures).sort(function(a,b) {\n\t\t\tif(self.measures[a].time > self.measures[b].time) {\n\t\t\t\treturn -1;\n\t\t\t} else if (self.measures[a].time < self.measures[b].time) {\n\t\t\t\treturn + 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\ttotalTime += self.measures[name].time;\n\t});\n\tvar results = []\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\tvar measure = self.measures[name];\n\t\tresults.push({name: name,invocations: measure.invocations, avgTime: measure.time / measure.invocations, totalTime: measure.time, percentTime: (measure.time / totalTime) * 100})\n\t});\n\tself.logger.table(results);\n};\n\n/*\nWrap performance measurements around a subfunction\n*/\nPerformance.prototype.measure = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tif(!(name in self.measures)) {\n\t\t\t\tself.measures[name] = {time: 0, invocations: 0};\n\t\t\t}\n\t\t\tself.measures[name].time += $tw.utils.timer(startTime);\n\t\t\tself.measures[name].invocations++;\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nexports.Performance = Performance;\n\n})();\n","type":"application/javascript","module-type":"global"},"$:/core/modules/utils/pluginmaker.js":{"title":"$:/core/modules/utils/pluginmaker.js","text":"/*\\\ntitle: $:/core/modules/utils/pluginmaker.js\ntype: application/javascript\nmodule-type: utils\n\nA quick and dirty way to pack up plugins within the browser.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRepack a plugin, and then delete any non-shadow payload tiddlers\n*/\nexports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {\n\tadditionalTiddlers = additionalTiddlers || [];\n\texcludeTiddlers = excludeTiddlers || [];\n\t// Get the plugin tiddler\n\tvar pluginTiddler = $tw.wiki.getTiddler(title);\n\tif(!pluginTiddler) {\n\t\tthrow \"No such tiddler as \" + title;\n\t}\n\t// Extract the JSON\n\tvar jsonPluginTiddler = $tw.utils.parseJSONSafe(pluginTiddler.fields.text,null);\n\tif(!jsonPluginTiddler) {\n\t\tthrow \"Cannot parse plugin tiddler \" + title + \"\\n\" + $tw.language.getString(\"Error/Caption\") + \": \" + e;\n\t}\n\t// Get the list of tiddlers\n\tvar tiddlers = Object.keys(jsonPluginTiddler.tiddlers);\n\t// Add the additional tiddlers\n\t$tw.utils.pushTop(tiddlers,additionalTiddlers);\n\t// Remove any excluded tiddlers\n\tfor(var t=tiddlers.length-1; t>=0; t--) {\n\t\tif(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {\n\t\t\ttiddlers.splice(t,1);\n\t\t}\n\t}\n\t// Pack up the tiddlers into a block of JSON\n\tvar plugins = {};\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\tfields = {};\n\t\t$tw.utils.each(tiddler.fields,function (value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\tplugins[title] = fields;\n\t});\n\t// Retrieve and bump the version number\n\tvar pluginVersion = $tw.utils.parseVersion(pluginTiddler.getFieldString(\"version\") || \"0.0.0\") || {\n\t\t\tmajor: \"0\",\n\t\t\tminor: \"0\",\n\t\t\tpatch: \"0\"\n\t\t};\n\tpluginVersion.patch++;\n\tvar version = pluginVersion.major + \".\" + pluginVersion.minor + \".\" + pluginVersion.patch;\n\tif(pluginVersion.prerelease) {\n\t\tversion += \"-\" + pluginVersion.prerelease;\n\t}\n\tif(pluginVersion.build) {\n\t\tversion += \"+\" + pluginVersion.build;\n\t}\n\t// Save the tiddler\n\t$tw.wiki.addTiddler(new $tw.Tiddler(pluginTiddler,{text: JSON.stringify({tiddlers: plugins},null,4), version: version}));\n\t// Delete any non-shadow constituent tiddlers\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tif($tw.wiki.tiddlerExists(title)) {\n\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t}\n\t});\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t// Return a heartwarming confirmation\n\treturn \"Plugin \" + title + \" successfully saved\";\n};\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/repository.js":{"title":"$:/core/modules/utils/repository.js","text":"/*\\\ntitle: $:/core/modules/utils/repository.js\ntype: application/javascript\nmodule-type: utils\n\nUtilities for working with the TiddlyWiki repository file structure\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nGet an object containing all the plugins as a hashmap by title of the JSON representation of the plugin\nOptions:\n\nignoreEnvironmentVariables: defaults to false\n*/\nexports.getAllPlugins = function(options) {\n\toptions = options || {};\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttiddlers = {};\n\t// Collect up the library plugins\n\tvar collectPlugins = function(folder) {\n\t\t\tvar pluginFolders = $tw.utils.getSubdirectories(folder) || [];\n\t\t\tfor(var p=0; p<pluginFolders.length; p++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\n\t\t\t\t\tvar pluginFields = $tw.loadPluginFolder(path.resolve(folder,\"./\" + pluginFolders[p]));\n\t\t\t\t\tif(pluginFields && pluginFields.title) {\n\t\t\t\t\t\ttiddlers[pluginFields.title] = pluginFields;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcollectPublisherPlugins = function(folder) {\n\t\t\tvar publisherFolders = $tw.utils.getSubdirectories(folder) || [];\n\t\t\tfor(var t=0; t<publisherFolders.length; t++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\n\t\t\t\t\tcollectPlugins(path.resolve(folder,\"./\" + publisherFolders[t]));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.pluginsPath,options.ignoreEnvironmentVariables ? undefined : $tw.config.pluginsEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.themesPath,options.ignoreEnvironmentVariables ? undefined : $tw.config.themesEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.languagesPath,options.ignoreEnvironmentVariables ? undefined : $tw.config.languagesEnvVar),collectPlugins);\n\treturn tiddlers;\n};\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/transliterate.js":{"title":"$:/core/modules/utils/transliterate.js","text":"/*\\\ntitle: $:/core/modules/utils/transliterate.js\ntype: application/javascript\nmodule-type: utils\n\nTransliteration static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nTransliterate string to ASCII\n\n(Some pairs taken from http://semplicewebsites.com/removing-accents-javascript)\n*/\nexports.transliterationPairs = {\n\t\"Á\":\"A\",\n\t\"Ă\":\"A\",\n\t\"Ắ\":\"A\",\n\t\"Ặ\":\"A\",\n\t\"Ằ\":\"A\",\n\t\"Ẳ\":\"A\",\n\t\"Ẵ\":\"A\",\n\t\"Ǎ\":\"A\",\n\t\"Â\":\"A\",\n\t\"Ấ\":\"A\",\n\t\"Ậ\":\"A\",\n\t\"Ầ\":\"A\",\n\t\"Ẩ\":\"A\",\n\t\"Ẫ\":\"A\",\n\t\"Ä\":\"A\",\n\t\"Ǟ\":\"A\",\n\t\"Ȧ\":\"A\",\n\t\"Ǡ\":\"A\",\n\t\"Ạ\":\"A\",\n\t\"Ȁ\":\"A\",\n\t\"À\":\"A\",\n\t\"Ả\":\"A\",\n\t\"Ȃ\":\"A\",\n\t\"Ā\":\"A\",\n\t\"Ą\":\"A\",\n\t\"Å\":\"A\",\n\t\"Ǻ\":\"A\",\n\t\"Ḁ\":\"A\",\n\t\"Ⱥ\":\"A\",\n\t\"Ã\":\"A\",\n\t\"Ꜳ\":\"AA\",\n\t\"Æ\":\"AE\",\n\t\"Ǽ\":\"AE\",\n\t\"Ǣ\":\"AE\",\n\t\"Ꜵ\":\"AO\",\n\t\"Ꜷ\":\"AU\",\n\t\"Ꜹ\":\"AV\",\n\t\"Ꜻ\":\"AV\",\n\t\"Ꜽ\":\"AY\",\n\t\"Ḃ\":\"B\",\n\t\"Ḅ\":\"B\",\n\t\"Ɓ\":\"B\",\n\t\"Ḇ\":\"B\",\n\t\"Ƀ\":\"B\",\n\t\"Ƃ\":\"B\",\n\t\"Ć\":\"C\",\n\t\"Č\":\"C\",\n\t\"Ç\":\"C\",\n\t\"Ḉ\":\"C\",\n\t\"Ĉ\":\"C\",\n\t\"Ċ\":\"C\",\n\t\"Ƈ\":\"C\",\n\t\"Ȼ\":\"C\",\n\t\"Ď\":\"D\",\n\t\"Ḑ\":\"D\",\n\t\"Ḓ\":\"D\",\n\t\"Ḋ\":\"D\",\n\t\"Ḍ\":\"D\",\n\t\"Ɗ\":\"D\",\n\t\"Ḏ\":\"D\",\n\t\"Dz\":\"D\",\n\t\"Dž\":\"D\",\n\t\"Đ\":\"D\",\n\t\"Ƌ\":\"D\",\n\t\"DZ\":\"DZ\",\n\t\"DŽ\":\"DZ\",\n\t\"É\":\"E\",\n\t\"Ĕ\":\"E\",\n\t\"Ě\":\"E\",\n\t\"Ȩ\":\"E\",\n\t\"Ḝ\":\"E\",\n\t\"Ê\":\"E\",\n\t\"Ế\":\"E\",\n\t\"Ệ\":\"E\",\n\t\"Ề\":\"E\",\n\t\"Ể\":\"E\",\n\t\"Ễ\":\"E\",\n\t\"Ḙ\":\"E\",\n\t\"Ë\":\"E\",\n\t\"Ė\":\"E\",\n\t\"Ẹ\":\"E\",\n\t\"Ȅ\":\"E\",\n\t\"È\":\"E\",\n\t\"Ẻ\":\"E\",\n\t\"Ȇ\":\"E\",\n\t\"Ē\":\"E\",\n\t\"Ḗ\":\"E\",\n\t\"Ḕ\":\"E\",\n\t\"Ę\":\"E\",\n\t\"Ɇ\":\"E\",\n\t\"Ẽ\":\"E\",\n\t\"Ḛ\":\"E\",\n\t\"Ꝫ\":\"ET\",\n\t\"Ḟ\":\"F\",\n\t\"Ƒ\":\"F\",\n\t\"Ǵ\":\"G\",\n\t\"Ğ\":\"G\",\n\t\"Ǧ\":\"G\",\n\t\"Ģ\":\"G\",\n\t\"Ĝ\":\"G\",\n\t\"Ġ\":\"G\",\n\t\"Ɠ\":\"G\",\n\t\"Ḡ\":\"G\",\n\t\"Ǥ\":\"G\",\n\t\"Ḫ\":\"H\",\n\t\"Ȟ\":\"H\",\n\t\"Ḩ\":\"H\",\n\t\"Ĥ\":\"H\",\n\t\"Ⱨ\":\"H\",\n\t\"Ḧ\":\"H\",\n\t\"Ḣ\":\"H\",\n\t\"Ḥ\":\"H\",\n\t\"Ħ\":\"H\",\n\t\"Í\":\"I\",\n\t\"Ĭ\":\"I\",\n\t\"Ǐ\":\"I\",\n\t\"Î\":\"I\",\n\t\"Ï\":\"I\",\n\t\"Ḯ\":\"I\",\n\t\"İ\":\"I\",\n\t\"Ị\":\"I\",\n\t\"Ȉ\":\"I\",\n\t\"Ì\":\"I\",\n\t\"Ỉ\":\"I\",\n\t\"Ȋ\":\"I\",\n\t\"Ī\":\"I\",\n\t\"Į\":\"I\",\n\t\"Ɨ\":\"I\",\n\t\"Ĩ\":\"I\",\n\t\"Ḭ\":\"I\",\n\t\"Ꝺ\":\"D\",\n\t\"Ꝼ\":\"F\",\n\t\"Ᵹ\":\"G\",\n\t\"Ꞃ\":\"R\",\n\t\"Ꞅ\":\"S\",\n\t\"Ꞇ\":\"T\",\n\t\"Ꝭ\":\"IS\",\n\t\"Ĵ\":\"J\",\n\t\"Ɉ\":\"J\",\n\t\"Ḱ\":\"K\",\n\t\"Ǩ\":\"K\",\n\t\"Ķ\":\"K\",\n\t\"Ⱪ\":\"K\",\n\t\"Ꝃ\":\"K\",\n\t\"Ḳ\":\"K\",\n\t\"Ƙ\":\"K\",\n\t\"Ḵ\":\"K\",\n\t\"Ꝁ\":\"K\",\n\t\"Ꝅ\":\"K\",\n\t\"Ĺ\":\"L\",\n\t\"Ƚ\":\"L\",\n\t\"Ľ\":\"L\",\n\t\"Ļ\":\"L\",\n\t\"Ḽ\":\"L\",\n\t\"Ḷ\":\"L\",\n\t\"Ḹ\":\"L\",\n\t\"Ⱡ\":\"L\",\n\t\"Ꝉ\":\"L\",\n\t\"Ḻ\":\"L\",\n\t\"Ŀ\":\"L\",\n\t\"Ɫ\":\"L\",\n\t\"Lj\":\"L\",\n\t\"Ł\":\"L\",\n\t\"LJ\":\"LJ\",\n\t\"Ḿ\":\"M\",\n\t\"Ṁ\":\"M\",\n\t\"Ṃ\":\"M\",\n\t\"Ɱ\":\"M\",\n\t\"Ń\":\"N\",\n\t\"Ň\":\"N\",\n\t\"Ņ\":\"N\",\n\t\"Ṋ\":\"N\",\n\t\"Ṅ\":\"N\",\n\t\"Ṇ\":\"N\",\n\t\"Ǹ\":\"N\",\n\t\"Ɲ\":\"N\",\n\t\"Ṉ\":\"N\",\n\t\"Ƞ\":\"N\",\n\t\"Nj\":\"N\",\n\t\"Ñ\":\"N\",\n\t\"NJ\":\"NJ\",\n\t\"ð\":\"d\",\n\t\"Ð\":\"D\",\n\t\"Ó\":\"O\",\n\t\"Ŏ\":\"O\",\n\t\"Ǒ\":\"O\",\n\t\"Ô\":\"O\",\n\t\"Ố\":\"O\",\n\t\"Ộ\":\"O\",\n\t\"Ồ\":\"O\",\n\t\"Ổ\":\"O\",\n\t\"Ỗ\":\"O\",\n\t\"Ö\":\"O\",\n\t\"Ȫ\":\"O\",\n\t\"Ȯ\":\"O\",\n\t\"Ȱ\":\"O\",\n\t\"Ọ\":\"O\",\n\t\"Ő\":\"O\",\n\t\"Ȍ\":\"O\",\n\t\"Ò\":\"O\",\n\t\"Ỏ\":\"O\",\n\t\"Ơ\":\"O\",\n\t\"Ớ\":\"O\",\n\t\"Ợ\":\"O\",\n\t\"Ờ\":\"O\",\n\t\"Ở\":\"O\",\n\t\"Ỡ\":\"O\",\n\t\"Ȏ\":\"O\",\n\t\"Ꝋ\":\"O\",\n\t\"Ꝍ\":\"O\",\n\t\"Ō\":\"O\",\n\t\"Ṓ\":\"O\",\n\t\"Ṑ\":\"O\",\n\t\"Ɵ\":\"O\",\n\t\"Ǫ\":\"O\",\n\t\"Ǭ\":\"O\",\n\t\"Ø\":\"O\",\n\t\"Ǿ\":\"O\",\n\t\"Õ\":\"O\",\n\t\"Ṍ\":\"O\",\n\t\"Ṏ\":\"O\",\n\t\"Ȭ\":\"O\",\n\t\"Ƣ\":\"OI\",\n\t\"Ꝏ\":\"OO\",\n\t\"Ɛ\":\"E\",\n\t\"Ɔ\":\"O\",\n\t\"Ȣ\":\"OU\",\n\t\"Ṕ\":\"P\",\n\t\"Ṗ\":\"P\",\n\t\"Ꝓ\":\"P\",\n\t\"Ƥ\":\"P\",\n\t\"Ꝕ\":\"P\",\n\t\"Ᵽ\":\"P\",\n\t\"Ꝑ\":\"P\",\n\t\"Ꝙ\":\"Q\",\n\t\"Ꝗ\":\"Q\",\n\t\"Ŕ\":\"R\",\n\t\"Ř\":\"R\",\n\t\"Ŗ\":\"R\",\n\t\"Ṙ\":\"R\",\n\t\"Ṛ\":\"R\",\n\t\"Ṝ\":\"R\",\n\t\"Ȑ\":\"R\",\n\t\"Ȓ\":\"R\",\n\t\"Ṟ\":\"R\",\n\t\"Ɍ\":\"R\",\n\t\"Ɽ\":\"R\",\n\t\"Ꜿ\":\"C\",\n\t\"Ǝ\":\"E\",\n\t\"ß\":\"ss\",\n\t\"ẞ\":\"SS\",\n\t\"Ś\":\"S\",\n\t\"Ṥ\":\"S\",\n\t\"Š\":\"S\",\n\t\"Ṧ\":\"S\",\n\t\"Ş\":\"S\",\n\t\"Ŝ\":\"S\",\n\t\"Ș\":\"S\",\n\t\"Ṡ\":\"S\",\n\t\"Ṣ\":\"S\",\n\t\"Ṩ\":\"S\",\n\t\"þ\": \"th\",\n\t\"Þ\": \"TH\",\n\t\"Ť\":\"T\",\n\t\"Ţ\":\"T\",\n\t\"Ṱ\":\"T\",\n\t\"Ț\":\"T\",\n\t\"Ⱦ\":\"T\",\n\t\"Ṫ\":\"T\",\n\t\"Ṭ\":\"T\",\n\t\"Ƭ\":\"T\",\n\t\"Ṯ\":\"T\",\n\t\"Ʈ\":\"T\",\n\t\"Ŧ\":\"T\",\n\t\"Ɐ\":\"A\",\n\t\"Ꞁ\":\"L\",\n\t\"Ɯ\":\"M\",\n\t\"Ʌ\":\"V\",\n\t\"Ꜩ\":\"TZ\",\n\t\"Ú\":\"U\",\n\t\"Ŭ\":\"U\",\n\t\"Ǔ\":\"U\",\n\t\"Û\":\"U\",\n\t\"Ṷ\":\"U\",\n\t\"Ü\":\"U\",\n\t\"Ǘ\":\"U\",\n\t\"Ǚ\":\"U\",\n\t\"Ǜ\":\"U\",\n\t\"Ǖ\":\"U\",\n\t\"Ṳ\":\"U\",\n\t\"Ụ\":\"U\",\n\t\"Ű\":\"U\",\n\t\"Ȕ\":\"U\",\n\t\"Ù\":\"U\",\n\t\"Ủ\":\"U\",\n\t\"Ư\":\"U\",\n\t\"Ứ\":\"U\",\n\t\"Ự\":\"U\",\n\t\"Ừ\":\"U\",\n\t\"Ử\":\"U\",\n\t\"Ữ\":\"U\",\n\t\"Ȗ\":\"U\",\n\t\"Ū\":\"U\",\n\t\"Ṻ\":\"U\",\n\t\"Ų\":\"U\",\n\t\"Ů\":\"U\",\n\t\"Ũ\":\"U\",\n\t\"Ṹ\":\"U\",\n\t\"Ṵ\":\"U\",\n\t\"Ꝟ\":\"V\",\n\t\"Ṿ\":\"V\",\n\t\"Ʋ\":\"V\",\n\t\"Ṽ\":\"V\",\n\t\"Ꝡ\":\"VY\",\n\t\"Ẃ\":\"W\",\n\t\"Ŵ\":\"W\",\n\t\"Ẅ\":\"W\",\n\t\"Ẇ\":\"W\",\n\t\"Ẉ\":\"W\",\n\t\"Ẁ\":\"W\",\n\t\"Ⱳ\":\"W\",\n\t\"Ẍ\":\"X\",\n\t\"Ẋ\":\"X\",\n\t\"Ý\":\"Y\",\n\t\"Ŷ\":\"Y\",\n\t\"Ÿ\":\"Y\",\n\t\"Ẏ\":\"Y\",\n\t\"Ỵ\":\"Y\",\n\t\"Ỳ\":\"Y\",\n\t\"Ƴ\":\"Y\",\n\t\"Ỷ\":\"Y\",\n\t\"Ỿ\":\"Y\",\n\t\"Ȳ\":\"Y\",\n\t\"Ɏ\":\"Y\",\n\t\"Ỹ\":\"Y\",\n\t\"Ź\":\"Z\",\n\t\"Ž\":\"Z\",\n\t\"Ẑ\":\"Z\",\n\t\"Ⱬ\":\"Z\",\n\t\"Ż\":\"Z\",\n\t\"Ẓ\":\"Z\",\n\t\"Ȥ\":\"Z\",\n\t\"Ẕ\":\"Z\",\n\t\"Ƶ\":\"Z\",\n\t\"IJ\":\"IJ\",\n\t\"Œ\":\"OE\",\n\t\"ᴀ\":\"A\",\n\t\"ᴁ\":\"AE\",\n\t\"ʙ\":\"B\",\n\t\"ᴃ\":\"B\",\n\t\"ᴄ\":\"C\",\n\t\"ᴅ\":\"D\",\n\t\"ᴇ\":\"E\",\n\t\"ꜰ\":\"F\",\n\t\"ɢ\":\"G\",\n\t\"ʛ\":\"G\",\n\t\"ʜ\":\"H\",\n\t\"ɪ\":\"I\",\n\t\"ʁ\":\"R\",\n\t\"ᴊ\":\"J\",\n\t\"ᴋ\":\"K\",\n\t\"ʟ\":\"L\",\n\t\"ᴌ\":\"L\",\n\t\"ᴍ\":\"M\",\n\t\"ɴ\":\"N\",\n\t\"ᴏ\":\"O\",\n\t\"ɶ\":\"OE\",\n\t\"ᴐ\":\"O\",\n\t\"ᴕ\":\"OU\",\n\t\"ᴘ\":\"P\",\n\t\"ʀ\":\"R\",\n\t\"ᴎ\":\"N\",\n\t\"ᴙ\":\"R\",\n\t\"ꜱ\":\"S\",\n\t\"ᴛ\":\"T\",\n\t\"ⱻ\":\"E\",\n\t\"ᴚ\":\"R\",\n\t\"ᴜ\":\"U\",\n\t\"ᴠ\":\"V\",\n\t\"ᴡ\":\"W\",\n\t\"ʏ\":\"Y\",\n\t\"ᴢ\":\"Z\",\n\t\"á\":\"a\",\n\t\"ă\":\"a\",\n\t\"ắ\":\"a\",\n\t\"ặ\":\"a\",\n\t\"ằ\":\"a\",\n\t\"ẳ\":\"a\",\n\t\"ẵ\":\"a\",\n\t\"ǎ\":\"a\",\n\t\"â\":\"a\",\n\t\"ấ\":\"a\",\n\t\"ậ\":\"a\",\n\t\"ầ\":\"a\",\n\t\"ẩ\":\"a\",\n\t\"ẫ\":\"a\",\n\t\"ä\":\"a\",\n\t\"ǟ\":\"a\",\n\t\"ȧ\":\"a\",\n\t\"ǡ\":\"a\",\n\t\"ạ\":\"a\",\n\t\"ȁ\":\"a\",\n\t\"à\":\"a\",\n\t\"ả\":\"a\",\n\t\"ȃ\":\"a\",\n\t\"ā\":\"a\",\n\t\"ą\":\"a\",\n\t\"ᶏ\":\"a\",\n\t\"ẚ\":\"a\",\n\t\"å\":\"a\",\n\t\"ǻ\":\"a\",\n\t\"ḁ\":\"a\",\n\t\"ⱥ\":\"a\",\n\t\"ã\":\"a\",\n\t\"ꜳ\":\"aa\",\n\t\"æ\":\"ae\",\n\t\"ǽ\":\"ae\",\n\t\"ǣ\":\"ae\",\n\t\"ꜵ\":\"ao\",\n\t\"ꜷ\":\"au\",\n\t\"ꜹ\":\"av\",\n\t\"ꜻ\":\"av\",\n\t\"ꜽ\":\"ay\",\n\t\"ḃ\":\"b\",\n\t\"ḅ\":\"b\",\n\t\"ɓ\":\"b\",\n\t\"ḇ\":\"b\",\n\t\"ᵬ\":\"b\",\n\t\"ᶀ\":\"b\",\n\t\"ƀ\":\"b\",\n\t\"ƃ\":\"b\",\n\t\"ɵ\":\"o\",\n\t\"ć\":\"c\",\n\t\"č\":\"c\",\n\t\"ç\":\"c\",\n\t\"ḉ\":\"c\",\n\t\"ĉ\":\"c\",\n\t\"ɕ\":\"c\",\n\t\"ċ\":\"c\",\n\t\"ƈ\":\"c\",\n\t\"ȼ\":\"c\",\n\t\"ď\":\"d\",\n\t\"ḑ\":\"d\",\n\t\"ḓ\":\"d\",\n\t\"ȡ\":\"d\",\n\t\"ḋ\":\"d\",\n\t\"ḍ\":\"d\",\n\t\"ɗ\":\"d\",\n\t\"ᶑ\":\"d\",\n\t\"ḏ\":\"d\",\n\t\"ᵭ\":\"d\",\n\t\"ᶁ\":\"d\",\n\t\"đ\":\"d\",\n\t\"ɖ\":\"d\",\n\t\"ƌ\":\"d\",\n\t\"ı\":\"i\",\n\t\"ȷ\":\"j\",\n\t\"ɟ\":\"j\",\n\t\"ʄ\":\"j\",\n\t\"dz\":\"dz\",\n\t\"dž\":\"dz\",\n\t\"é\":\"e\",\n\t\"ĕ\":\"e\",\n\t\"ě\":\"e\",\n\t\"ȩ\":\"e\",\n\t\"ḝ\":\"e\",\n\t\"ê\":\"e\",\n\t\"ế\":\"e\",\n\t\"ệ\":\"e\",\n\t\"ề\":\"e\",\n\t\"ể\":\"e\",\n\t\"ễ\":\"e\",\n\t\"ḙ\":\"e\",\n\t\"ë\":\"e\",\n\t\"ė\":\"e\",\n\t\"ẹ\":\"e\",\n\t\"ȅ\":\"e\",\n\t\"è\":\"e\",\n\t\"ẻ\":\"e\",\n\t\"ȇ\":\"e\",\n\t\"ē\":\"e\",\n\t\"ḗ\":\"e\",\n\t\"ḕ\":\"e\",\n\t\"ⱸ\":\"e\",\n\t\"ę\":\"e\",\n\t\"ᶒ\":\"e\",\n\t\"ɇ\":\"e\",\n\t\"ẽ\":\"e\",\n\t\"ḛ\":\"e\",\n\t\"ꝫ\":\"et\",\n\t\"ḟ\":\"f\",\n\t\"ƒ\":\"f\",\n\t\"ᵮ\":\"f\",\n\t\"ᶂ\":\"f\",\n\t\"ǵ\":\"g\",\n\t\"ğ\":\"g\",\n\t\"ǧ\":\"g\",\n\t\"ģ\":\"g\",\n\t\"ĝ\":\"g\",\n\t\"ġ\":\"g\",\n\t\"ɠ\":\"g\",\n\t\"ḡ\":\"g\",\n\t\"ᶃ\":\"g\",\n\t\"ǥ\":\"g\",\n\t\"ḫ\":\"h\",\n\t\"ȟ\":\"h\",\n\t\"ḩ\":\"h\",\n\t\"ĥ\":\"h\",\n\t\"ⱨ\":\"h\",\n\t\"ḧ\":\"h\",\n\t\"ḣ\":\"h\",\n\t\"ḥ\":\"h\",\n\t\"ɦ\":\"h\",\n\t\"ẖ\":\"h\",\n\t\"ħ\":\"h\",\n\t\"ƕ\":\"hv\",\n\t\"í\":\"i\",\n\t\"ĭ\":\"i\",\n\t\"ǐ\":\"i\",\n\t\"î\":\"i\",\n\t\"ï\":\"i\",\n\t\"ḯ\":\"i\",\n\t\"ị\":\"i\",\n\t\"ȉ\":\"i\",\n\t\"ì\":\"i\",\n\t\"ỉ\":\"i\",\n\t\"ȋ\":\"i\",\n\t\"ī\":\"i\",\n\t\"į\":\"i\",\n\t\"ᶖ\":\"i\",\n\t\"ɨ\":\"i\",\n\t\"ĩ\":\"i\",\n\t\"ḭ\":\"i\",\n\t\"ꝺ\":\"d\",\n\t\"ꝼ\":\"f\",\n\t\"ᵹ\":\"g\",\n\t\"ꞃ\":\"r\",\n\t\"ꞅ\":\"s\",\n\t\"ꞇ\":\"t\",\n\t\"ꝭ\":\"is\",\n\t\"ǰ\":\"j\",\n\t\"ĵ\":\"j\",\n\t\"ʝ\":\"j\",\n\t\"ɉ\":\"j\",\n\t\"ḱ\":\"k\",\n\t\"ǩ\":\"k\",\n\t\"ķ\":\"k\",\n\t\"ⱪ\":\"k\",\n\t\"ꝃ\":\"k\",\n\t\"ḳ\":\"k\",\n\t\"ƙ\":\"k\",\n\t\"ḵ\":\"k\",\n\t\"ᶄ\":\"k\",\n\t\"ꝁ\":\"k\",\n\t\"ꝅ\":\"k\",\n\t\"ĺ\":\"l\",\n\t\"ƚ\":\"l\",\n\t\"ɬ\":\"l\",\n\t\"ľ\":\"l\",\n\t\"ļ\":\"l\",\n\t\"ḽ\":\"l\",\n\t\"ȴ\":\"l\",\n\t\"ḷ\":\"l\",\n\t\"ḹ\":\"l\",\n\t\"ⱡ\":\"l\",\n\t\"ꝉ\":\"l\",\n\t\"ḻ\":\"l\",\n\t\"ŀ\":\"l\",\n\t\"ɫ\":\"l\",\n\t\"ᶅ\":\"l\",\n\t\"ɭ\":\"l\",\n\t\"ł\":\"l\",\n\t\"lj\":\"lj\",\n\t\"ſ\":\"s\",\n\t\"ẜ\":\"s\",\n\t\"ẛ\":\"s\",\n\t\"ẝ\":\"s\",\n\t\"ḿ\":\"m\",\n\t\"ṁ\":\"m\",\n\t\"ṃ\":\"m\",\n\t\"ɱ\":\"m\",\n\t\"ᵯ\":\"m\",\n\t\"ᶆ\":\"m\",\n\t\"ń\":\"n\",\n\t\"ň\":\"n\",\n\t\"ņ\":\"n\",\n\t\"ṋ\":\"n\",\n\t\"ȵ\":\"n\",\n\t\"ṅ\":\"n\",\n\t\"ṇ\":\"n\",\n\t\"ǹ\":\"n\",\n\t\"ɲ\":\"n\",\n\t\"ṉ\":\"n\",\n\t\"ƞ\":\"n\",\n\t\"ᵰ\":\"n\",\n\t\"ᶇ\":\"n\",\n\t\"ɳ\":\"n\",\n\t\"ñ\":\"n\",\n\t\"nj\":\"nj\",\n\t\"ó\":\"o\",\n\t\"ŏ\":\"o\",\n\t\"ǒ\":\"o\",\n\t\"ô\":\"o\",\n\t\"ố\":\"o\",\n\t\"ộ\":\"o\",\n\t\"ồ\":\"o\",\n\t\"ổ\":\"o\",\n\t\"ỗ\":\"o\",\n\t\"ö\":\"o\",\n\t\"ȫ\":\"o\",\n\t\"ȯ\":\"o\",\n\t\"ȱ\":\"o\",\n\t\"ọ\":\"o\",\n\t\"ő\":\"o\",\n\t\"ȍ\":\"o\",\n\t\"ò\":\"o\",\n\t\"ỏ\":\"o\",\n\t\"ơ\":\"o\",\n\t\"ớ\":\"o\",\n\t\"ợ\":\"o\",\n\t\"ờ\":\"o\",\n\t\"ở\":\"o\",\n\t\"ỡ\":\"o\",\n\t\"ȏ\":\"o\",\n\t\"ꝋ\":\"o\",\n\t\"ꝍ\":\"o\",\n\t\"ⱺ\":\"o\",\n\t\"ō\":\"o\",\n\t\"ṓ\":\"o\",\n\t\"ṑ\":\"o\",\n\t\"ǫ\":\"o\",\n\t\"ǭ\":\"o\",\n\t\"ø\":\"o\",\n\t\"ǿ\":\"o\",\n\t\"õ\":\"o\",\n\t\"ṍ\":\"o\",\n\t\"ṏ\":\"o\",\n\t\"ȭ\":\"o\",\n\t\"ƣ\":\"oi\",\n\t\"ꝏ\":\"oo\",\n\t\"ɛ\":\"e\",\n\t\"ᶓ\":\"e\",\n\t\"ɔ\":\"o\",\n\t\"ᶗ\":\"o\",\n\t\"ȣ\":\"ou\",\n\t\"ṕ\":\"p\",\n\t\"ṗ\":\"p\",\n\t\"ꝓ\":\"p\",\n\t\"ƥ\":\"p\",\n\t\"ᵱ\":\"p\",\n\t\"ᶈ\":\"p\",\n\t\"ꝕ\":\"p\",\n\t\"ᵽ\":\"p\",\n\t\"ꝑ\":\"p\",\n\t\"ꝙ\":\"q\",\n\t\"ʠ\":\"q\",\n\t\"ɋ\":\"q\",\n\t\"ꝗ\":\"q\",\n\t\"ŕ\":\"r\",\n\t\"ř\":\"r\",\n\t\"ŗ\":\"r\",\n\t\"ṙ\":\"r\",\n\t\"ṛ\":\"r\",\n\t\"ṝ\":\"r\",\n\t\"ȑ\":\"r\",\n\t\"ɾ\":\"r\",\n\t\"ᵳ\":\"r\",\n\t\"ȓ\":\"r\",\n\t\"ṟ\":\"r\",\n\t\"ɼ\":\"r\",\n\t\"ᵲ\":\"r\",\n\t\"ᶉ\":\"r\",\n\t\"ɍ\":\"r\",\n\t\"ɽ\":\"r\",\n\t\"ↄ\":\"c\",\n\t\"ꜿ\":\"c\",\n\t\"ɘ\":\"e\",\n\t\"ɿ\":\"r\",\n\t\"ś\":\"s\",\n\t\"ṥ\":\"s\",\n\t\"š\":\"s\",\n\t\"ṧ\":\"s\",\n\t\"ş\":\"s\",\n\t\"ŝ\":\"s\",\n\t\"ș\":\"s\",\n\t\"ṡ\":\"s\",\n\t\"ṣ\":\"s\",\n\t\"ṩ\":\"s\",\n\t\"ʂ\":\"s\",\n\t\"ᵴ\":\"s\",\n\t\"ᶊ\":\"s\",\n\t\"ȿ\":\"s\",\n\t\"ɡ\":\"g\",\n\t\"ᴑ\":\"o\",\n\t\"ᴓ\":\"o\",\n\t\"ᴝ\":\"u\",\n\t\"ť\":\"t\",\n\t\"ţ\":\"t\",\n\t\"ṱ\":\"t\",\n\t\"ț\":\"t\",\n\t\"ȶ\":\"t\",\n\t\"ẗ\":\"t\",\n\t\"ⱦ\":\"t\",\n\t\"ṫ\":\"t\",\n\t\"ṭ\":\"t\",\n\t\"ƭ\":\"t\",\n\t\"ṯ\":\"t\",\n\t\"ᵵ\":\"t\",\n\t\"ƫ\":\"t\",\n\t\"ʈ\":\"t\",\n\t\"ŧ\":\"t\",\n\t\"ᵺ\":\"th\",\n\t\"ɐ\":\"a\",\n\t\"ᴂ\":\"ae\",\n\t\"ǝ\":\"e\",\n\t\"ᵷ\":\"g\",\n\t\"ɥ\":\"h\",\n\t\"ʮ\":\"h\",\n\t\"ʯ\":\"h\",\n\t\"ᴉ\":\"i\",\n\t\"ʞ\":\"k\",\n\t\"ꞁ\":\"l\",\n\t\"ɯ\":\"m\",\n\t\"ɰ\":\"m\",\n\t\"ᴔ\":\"oe\",\n\t\"ɹ\":\"r\",\n\t\"ɻ\":\"r\",\n\t\"ɺ\":\"r\",\n\t\"ⱹ\":\"r\",\n\t\"ʇ\":\"t\",\n\t\"ʌ\":\"v\",\n\t\"ʍ\":\"w\",\n\t\"ʎ\":\"y\",\n\t\"ꜩ\":\"tz\",\n\t\"ú\":\"u\",\n\t\"ŭ\":\"u\",\n\t\"ǔ\":\"u\",\n\t\"û\":\"u\",\n\t\"ṷ\":\"u\",\n\t\"ü\":\"u\",\n\t\"ǘ\":\"u\",\n\t\"ǚ\":\"u\",\n\t\"ǜ\":\"u\",\n\t\"ǖ\":\"u\",\n\t\"ṳ\":\"u\",\n\t\"ụ\":\"u\",\n\t\"ű\":\"u\",\n\t\"ȕ\":\"u\",\n\t\"ù\":\"u\",\n\t\"ủ\":\"u\",\n\t\"ư\":\"u\",\n\t\"ứ\":\"u\",\n\t\"ự\":\"u\",\n\t\"ừ\":\"u\",\n\t\"ử\":\"u\",\n\t\"ữ\":\"u\",\n\t\"ȗ\":\"u\",\n\t\"ū\":\"u\",\n\t\"ṻ\":\"u\",\n\t\"ų\":\"u\",\n\t\"ᶙ\":\"u\",\n\t\"ů\":\"u\",\n\t\"ũ\":\"u\",\n\t\"ṹ\":\"u\",\n\t\"ṵ\":\"u\",\n\t\"ᵫ\":\"ue\",\n\t\"ꝸ\":\"um\",\n\t\"ⱴ\":\"v\",\n\t\"ꝟ\":\"v\",\n\t\"ṿ\":\"v\",\n\t\"ʋ\":\"v\",\n\t\"ᶌ\":\"v\",\n\t\"ⱱ\":\"v\",\n\t\"ṽ\":\"v\",\n\t\"ꝡ\":\"vy\",\n\t\"ẃ\":\"w\",\n\t\"ŵ\":\"w\",\n\t\"ẅ\":\"w\",\n\t\"ẇ\":\"w\",\n\t\"ẉ\":\"w\",\n\t\"ẁ\":\"w\",\n\t\"ⱳ\":\"w\",\n\t\"ẘ\":\"w\",\n\t\"ẍ\":\"x\",\n\t\"ẋ\":\"x\",\n\t\"ᶍ\":\"x\",\n\t\"ý\":\"y\",\n\t\"ŷ\":\"y\",\n\t\"ÿ\":\"y\",\n\t\"ẏ\":\"y\",\n\t\"ỵ\":\"y\",\n\t\"ỳ\":\"y\",\n\t\"ƴ\":\"y\",\n\t\"ỷ\":\"y\",\n\t\"ỿ\":\"y\",\n\t\"ȳ\":\"y\",\n\t\"ẙ\":\"y\",\n\t\"ɏ\":\"y\",\n\t\"ỹ\":\"y\",\n\t\"ź\":\"z\",\n\t\"ž\":\"z\",\n\t\"ẑ\":\"z\",\n\t\"ʑ\":\"z\",\n\t\"ⱬ\":\"z\",\n\t\"ż\":\"z\",\n\t\"ẓ\":\"z\",\n\t\"ȥ\":\"z\",\n\t\"ẕ\":\"z\",\n\t\"ᵶ\":\"z\",\n\t\"ᶎ\":\"z\",\n\t\"ʐ\":\"z\",\n\t\"ƶ\":\"z\",\n\t\"ɀ\":\"z\",\n\t\"ff\":\"ff\",\n\t\"ffi\":\"ffi\",\n\t\"ffl\":\"ffl\",\n\t\"fi\":\"fi\",\n\t\"fl\":\"fl\",\n\t\"ij\":\"ij\",\n\t\"œ\":\"oe\",\n\t\"st\":\"st\",\n\t\"ₐ\":\"a\",\n\t\"ₑ\":\"e\",\n\t\"ᵢ\":\"i\",\n\t\"ⱼ\":\"j\",\n\t\"ₒ\":\"o\",\n\t\"ᵣ\":\"r\",\n\t\"ᵤ\":\"u\",\n\t\"ᵥ\":\"v\",\n\t\"ₓ\":\"x\",\n\t\"Ё\":\"YO\",\n\t\"Й\":\"I\",\n\t\"Ц\":\"TS\",\n\t\"У\":\"U\",\n\t\"К\":\"K\",\n\t\"Е\":\"E\",\n\t\"Н\":\"N\",\n\t\"Г\":\"G\",\n\t\"Ш\":\"SH\",\n\t\"Щ\":\"SCH\",\n\t\"З\":\"Z\",\n\t\"Х\":\"H\",\n\t\"Ъ\":\"'\",\n\t\"ё\":\"yo\",\n\t\"й\":\"i\",\n\t\"ц\":\"ts\",\n\t\"у\":\"u\",\n\t\"к\":\"k\",\n\t\"е\":\"e\",\n\t\"н\":\"n\",\n\t\"г\":\"g\",\n\t\"ш\":\"sh\",\n\t\"щ\":\"sch\",\n\t\"з\":\"z\",\n\t\"х\":\"h\",\n\t\"ъ\":\"'\",\n\t\"Ф\":\"F\",\n\t\"Ы\":\"I\",\n\t\"В\":\"V\",\n\t\"А\":\"a\",\n\t\"П\":\"P\",\n\t\"Р\":\"R\",\n\t\"О\":\"O\",\n\t\"Л\":\"L\",\n\t\"Д\":\"D\",\n\t\"Ж\":\"ZH\",\n\t\"Э\":\"E\",\n\t\"ф\":\"f\",\n\t\"ы\":\"i\",\n\t\"в\":\"v\",\n\t\"а\":\"a\",\n\t\"п\":\"p\",\n\t\"р\":\"r\",\n\t\"о\":\"o\",\n\t\"л\":\"l\",\n\t\"д\":\"d\",\n\t\"ж\":\"zh\",\n\t\"э\":\"e\",\n\t\"Я\":\"Ya\",\n\t\"Ч\":\"CH\",\n\t\"С\":\"S\",\n\t\"М\":\"M\",\n\t\"И\":\"I\",\n\t\"Т\":\"T\",\n\t\"Ь\":\"'\",\n\t\"Б\":\"B\",\n\t\"Ю\":\"YU\",\n\t\"я\":\"ya\",\n\t\"ч\":\"ch\",\n\t\"с\":\"s\",\n\t\"м\":\"m\",\n\t\"и\":\"i\",\n\t\"т\":\"t\",\n\t\"ь\":\"'\",\n\t\"б\":\"b\",\n\t\"ю\":\"yu\",\n\t\"…\":\"...\"\n};\n\nexports.transliterate = function(str) {\n\treturn str.replace(/[^A-Za-z0-9\\[\\] ]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || ch\n\t});\n};\n\nexports.transliterateToSafeASCII = function(str) {\n\treturn str.replace(/[^\\x20-\\x7F]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || \"\"\n\t});\n};\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/utils.js":{"title":"$:/core/modules/utils/utils.js","text":"/*\\\ntitle: $:/core/modules/utils/utils.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar base64utf8 = require(\"$:/core/modules/utils/base64-utf8/base64-utf8.module.js\");\n\n/*\nDisplay a message, in colour if we're on a terminal\n*/\nexports.log = function(text,colour) {\n\tconsole.log($tw.node ? exports.terminalColour(colour) + text + exports.terminalColour() : text);\n};\n\nexports.terminalColour = function(colour) {\n\tif(!$tw.browser && $tw.node && process.stdout.isTTY) {\n\t\tif(colour) {\n\t\t\tvar code = exports.terminalColourLookup[colour];\n\t\t\tif(code) {\n\t\t\t\treturn \"\\x1b[\" + code + \"m\";\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"\\x1b[0m\"; // Cancel colour\n\t\t}\n\t}\n\treturn \"\";\n};\n\nexports.terminalColourLookup = {\n\t\"black\": \"0;30\",\n\t\"red\": \"0;31\",\n\t\"green\": \"0;32\",\n\t\"brown/orange\": \"0;33\",\n\t\"blue\": \"0;34\",\n\t\"purple\": \"0;35\",\n\t\"cyan\": \"0;36\",\n\t\"light gray\": \"0;37\"\n};\n\n/*\nDisplay a warning, in colour if we're on a terminal\n*/\nexports.warning = function(text) {\n\texports.log(text,\"brown/orange\");\n};\n\n/*\nLog a table of name: value pairs\n*/\nexports.logTable = function(data) {\n\tif(console.table) {\n\t\tconsole.table(data);\n\t} else {\n\t\t$tw.utils.each(data,function(value,name) {\n\t\t\tconsole.log(name + \": \" + value);\n\t\t});\n\t}\n}\n\n/*\nReturn the integer represented by the str (string).\nReturn the dflt (default) parameter if str is not a base-10 number.\n*/\nexports.getInt = function(str,deflt) {\n\tvar i = parseInt(str,10);\n\treturn isNaN(i) ? deflt : i;\n}\n\n/*\nRepeatedly replaces a substring within a string. Like String.prototype.replace, but without any of the default special handling of $ sequences in the replace string\n*/\nexports.replaceString = function(text,search,replace) {\n\treturn text.replace(search,function() {\n\t\treturn replace;\n\t});\n};\n\n/*\nRepeats a string\n*/\nexports.repeat = function(str,count) {\n\tvar result = \"\";\n\tfor(var t=0;t<count;t++) {\n\t\tresult += str;\n\t}\n\treturn result;\n};\n\n/*\nCheck if a string starts with another string\n*/\nexports.startsWith = function(str,search) {\n\treturn str.substring(0, search.length) === search;\n};\n\n/*\nCheck if a string ends with another string\n*/\nexports.endsWith = function(str,search) {\n\treturn str.substring(str.length - search.length) === search;\n};\n\n/*\nTrim whitespace from the start and end of a string\nThanks to Steven Levithan, http://blog.stevenlevithan.com/archives/faster-trim-javascript\n*/\nexports.trim = function(str) {\n\tif(typeof str === \"string\") {\n\t\treturn str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\t} else {\n\t\treturn str;\n\t}\n};\n\nexports.trimPrefix = function(str,unwanted) {\n\tif(typeof str === \"string\" && typeof unwanted === \"string\") {\n\t\tif(unwanted === \"\") {\n\t\t\treturn str.replace(/^\\s\\s*/, '');\n\t\t} else {\n\t\t\t// Safely regexp-escape the unwanted text\n\t\t\tunwanted = unwanted.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\tvar regex = new RegExp('^(' + unwanted + ')+');\n\t\t\treturn str.replace(regex, '');\n\t\t}\n\t} else {\n\t\treturn str;\n\t}\n};\n\nexports.trimSuffix = function(str,unwanted) {\n\tif(typeof str === \"string\" && typeof unwanted === \"string\") {\n\t\tif(unwanted === \"\") {\n\t\t\treturn str.replace(/\\s\\s*$/, '');\n\t\t} else {\n\t\t\t// Safely regexp-escape the unwanted text\n\t\t\tunwanted = unwanted.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\tvar regex = new RegExp('(' + unwanted + ')+$');\n\t\t\treturn str.replace(regex, '');\n\t\t}\n\t} else {\n\t\treturn str;\n\t}\n};\n\n/*\nConvert a string to sentence case (ie capitalise first letter)\n*/\nexports.toSentenceCase = function(str) {\n\treturn (str || \"\").replace(/^\\S/, function(c) {return c.toUpperCase();});\n}\n\n/*\nConvert a string to title case (ie capitalise each initial letter)\n*/\nexports.toTitleCase = function(str) {\n\treturn (str || \"\").replace(/(^|\\s)\\S/g, function(c) {return c.toUpperCase();});\n}\n\n/*\nFind the line break preceding a given position in a string\nReturns position immediately after that line break, or the start of the string\n*/\nexports.findPrecedingLineBreak = function(text,pos) {\n\tvar result = text.lastIndexOf(\"\\n\",pos - 1);\n\tif(result === -1) {\n\t\tresult = 0;\n\t} else {\n\t\tresult++;\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nFind the line break following a given position in a string\n*/\nexports.findFollowingLineBreak = function(text,pos) {\n\t// Cut to just past the following line break, or to the end of the text\n\tvar result = text.indexOf(\"\\n\",pos);\n\tif(result === -1) {\n\t\tresult = text.length;\n\t} else {\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nReturn the number of keys in an object\n*/\nexports.count = function(object) {\n\treturn Object.keys(object || {}).length;\n};\n\n/*\nDetermine whether an array-item is an object-property\n*/\nexports.hopArray = function(object,array) {\n\tfor(var i=0; i<array.length; i++) {\n\t\tif($tw.utils.hop(object,array[i])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nRemove entries from an array\n\tarray: array to modify\n\tvalue: a single value to remove, or an array of values to remove\n*/\nexports.removeArrayEntries = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\tp = array.indexOf(value[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tarray.splice(p,1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t}\n\treturn array;\n};\n\n/*\nCheck whether any members of a hashmap are present in another hashmap\n*/\nexports.checkDependencies = function(dependencies,changes) {\n\tvar hit = false;\n\t$tw.utils.each(changes,function(change,title) {\n\t\tif($tw.utils.hop(dependencies,title)) {\n\t\t\thit = true;\n\t\t}\n\t});\n\treturn hit;\n};\n\nexports.extend = function(object /* [, src] */) {\n\t$tw.utils.each(Array.prototype.slice.call(arguments, 1), function(source) {\n\t\tif(source) {\n\t\t\tfor(var property in source) {\n\t\t\t\tobject[property] = source[property];\n\t\t\t}\n\t\t}\n\t});\n\treturn object;\n};\n\nexports.deepCopy = function(object) {\n\tvar result,t;\n\tif($tw.utils.isArray(object)) {\n\t\t// Copy arrays\n\t\tresult = object.slice(0);\n\t} else if(typeof object === \"object\") {\n\t\tresult = {};\n\t\tfor(t in object) {\n\t\t\tif(object[t] !== undefined) {\n\t\t\t\tresult[t] = $tw.utils.deepCopy(object[t]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tresult = object;\n\t}\n\treturn result;\n};\n\nexports.extendDeepCopy = function(object,extendedProperties) {\n\tvar result = $tw.utils.deepCopy(object),t;\n\tfor(t in extendedProperties) {\n\t\tif(extendedProperties[t] !== undefined) {\n\t\t\tresult[t] = $tw.utils.deepCopy(extendedProperties[t]);\n\t\t}\n\t}\n\treturn result;\n};\n\nexports.deepFreeze = function deepFreeze(object) {\n\tvar property, key;\n\tif(object) {\n\t\tObject.freeze(object);\n\t\tfor(key in object) {\n\t\t\tproperty = object[key];\n\t\t\tif($tw.utils.hop(object,key) && (typeof property === \"object\") && !Object.isFrozen(property)) {\n\t\t\t\tdeepFreeze(property);\n\t\t\t}\n\t\t}\n\t}\n};\n\nexports.slowInSlowOut = function(t) {\n\treturn (1 - ((Math.cos(t * Math.PI) + 1) / 2));\n};\n\nexports.formatTitleString = function(template,options) {\n\tvar base = options.base || \"\",\n\t\tseparator = options.separator || \"\",\n\t\tcounter = options.counter || \"\";\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^\\$basename\\$/i, function() {\n\t\t\t\treturn base;\n\t\t\t}],\n\t\t\t[/^\\$count:(\\d+)\\$/i, function(match) {\n\t\t\t\treturn $tw.utils.pad(counter,match[1]);\n\t\t\t}],\n\t\t\t[/^\\$separator\\$/i, function() {\n\t\t\t\treturn separator;\n\t\t\t}],\n\t\t\t[/^\\$count\\$/i, function() {\n\t\t\t\treturn counter + \"\";\n\t\t\t}]\n\t\t];\n\twhile(t.length){\n\t\tvar matchString = \"\",\n\t\t\tfound = false;\n\t\t$tw.utils.each(matches, function(m) {\n\t\t\tvar match = m[0].exec(t);\n\t\t\tif(match) {\n\t\t\t\tfound = true;\n\t\t\t\tmatchString = m[1].call(null,match);\n\t\t\t\tt = t.substr(match[0].length);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif(found) {\n\t\t\tresult += matchString;\n\t\t} else {\n\t\t\tresult += t.charAt(0);\n\t\t\tt = t.substr(1);\n\t\t}\n\t}\n\tresult = result.replace(/\\\\(.)/g,\"$1\");\n\treturn result;\n};\n\nexports.formatDateString = function(date,template) {\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^TIMESTAMP/, function() {\n\t\t\t\treturn date.getTime();\n\t\t\t}],\n\t\t\t[/^0hh12/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getHours12(date));\n\t\t\t}],\n\t\t\t[/^wYYYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date),4);\n\t\t\t}],\n\t\t\t[/^hh12/, function() {\n\t\t\t\treturn $tw.utils.getHours12(date);\n\t\t\t}],\n\t\t\t[/^DDth/, function() {\n\t\t\t\treturn date.getDate() + $tw.utils.getDaySuffix(date);\n\t\t\t}],\n\t\t\t[/^YYYY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear(),4);\n\t\t\t}],\n\t\t\t[/^aYYYY/, function() {\n\t\t\t\treturn $tw.utils.pad(Math.abs(date.getFullYear()),4);\n\t\t\t}],\n\t\t\t[/^\\{era:([^,\\|}]*)\\|([^}\\|]*)\\|([^}]*)\\}/, function(match) {\n\t\t\t\tvar year = date.getFullYear();\n\t\t\t\treturn year === 0 ? match[2] : (year < 0 ? match[1] : match[3]);\n\t\t\t}],\n\t\t\t[/^0hh/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getHours());\n\t\t\t}],\n\t\t\t[/^0mm/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMinutes());\n\t\t\t}],\n\t\t\t[/^0ss/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getSeconds());\n\t\t\t}],\n\t\t\t[/^0XXX/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMilliseconds(),3);\n\t\t\t}],\n\t\t\t[/^0DD/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getDate());\n\t\t\t}],\n\t\t\t[/^0MM/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMonth()+1);\n\t\t\t}],\n\t\t\t[/^0WW/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getWeek(date));\n\t\t\t}],\n\t\t\t[/^0ddddd/, function() {\n\t\t\t\treturn $tw.utils.pad(Math.floor((date - new Date(date.getFullYear(), 0, 0)) / 1000 / 60 / 60 / 24),3);\n\t\t\t}],\n\t\t\t[/^ddddd/, function() {\n\t\t\t\treturn Math.floor((date - new Date(date.getFullYear(), 0, 0)) / 1000 / 60 / 60 / 24);\n\t\t\t}],\n\t\t\t[/^dddd/, function() {\n\t\t\t\treturn [7,1,2,3,4,5,6][date.getDay()];\n\t\t\t}],\n\t\t\t[/^ddd/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^mmm/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^DDD/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^MMM/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^TZD/, function() {\n\t\t\t\tvar tz = date.getTimezoneOffset(),\n\t\t\t\tatz = Math.abs(tz);\n\t\t\t\treturn (tz < 0 ? '+' : '-') + $tw.utils.pad(Math.floor(atz / 60)) + ':' + $tw.utils.pad(atz % 60);\n\t\t\t}],\n\t\t\t[/^wYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date) - 2000);\n\t\t\t}],\n\t\t\t[/^[ap]m/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toLowerCase();\n\t\t\t}],\n\t\t\t[/^hh/, function() {\n\t\t\t\treturn date.getHours();\n\t\t\t}],\n\t\t\t[/^mm/, function() {\n\t\t\t\treturn date.getMinutes();\n\t\t\t}],\n\t\t\t[/^ss/, function() {\n\t\t\t\treturn date.getSeconds();\n\t\t\t}],\n\t\t\t[/^XXX/, function() {\n\t\t\t\treturn date.getMilliseconds();\n\t\t\t}],\n\t\t\t[/^[AP]M/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toUpperCase();\n\t\t\t}],\n\t\t\t[/^DD/, function() {\n\t\t\t\treturn date.getDate();\n\t\t\t}],\n\t\t\t[/^MM/, function() {\n\t\t\t\treturn date.getMonth() + 1;\n\t\t\t}],\n\t\t\t[/^WW/, function() {\n\t\t\t\treturn $tw.utils.getWeek(date);\n\t\t\t}],\n\t\t\t[/^YY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear() - 2000);\n\t\t\t}]\n\t\t];\n\t// If the user wants everything in UTC, shift the datestamp\n\t// Optimize for format string that essentially means\n\t// 'return raw UTC (tiddlywiki style) date string.'\n\tif(t.indexOf(\"[UTC]\") == 0 ) {\n\t\tif(t == \"[UTC]YYYY0MM0DD0hh0mm0ssXXX\")\n\t\t\treturn $tw.utils.stringifyDate(date || new Date());\n\t\tvar offset = date.getTimezoneOffset() ; // in minutes\n\t\tdate = new Date(date.getTime()+offset*60*1000) ;\n\t\tt = t.substr(5) ;\n\t}\n\twhile(t.length){\n\t\tvar matchString = \"\";\n\t\t$tw.utils.each(matches, function(m) {\n\t\t\tvar match = m[0].exec(t);\n\t\t\tif(match) {\n\t\t\t\tmatchString = m[1].call(null,match);\n\t\t\t\tt = t.substr(match[0].length);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif(matchString) {\n\t\t\tresult += matchString;\n\t\t} else {\n\t\t\tresult += t.charAt(0);\n\t\t\tt = t.substr(1);\n\t\t}\n\t}\n\tresult = result.replace(/\\\\(.)/g,\"$1\");\n\treturn result;\n};\n\nexports.getAmPm = function(date) {\n\treturn $tw.language.getString(\"Date/Period/\" + (date.getHours() >= 12 ? \"pm\" : \"am\"));\n};\n\nexports.getDaySuffix = function(date) {\n\treturn $tw.language.getString(\"Date/DaySuffix/\" + date.getDate());\n};\n\nexports.getWeek = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week to calculate weekNo\n\tvar x = new Date(dt.getFullYear(),0,1);\n\tvar n = Math.floor((dt.getTime() - x.getTime()) / 86400000);\n\treturn Math.floor(n / 7) + 1;\n};\n\nexports.getYearForWeekNo = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week\n\treturn dt.getFullYear();\n};\n\nexports.getHours12 = function(date) {\n\tvar h = date.getHours();\n\treturn h > 12 ? h-12 : ( h > 0 ? h : 12 );\n};\n\n/*\nConvert a date delta in milliseconds into a string representation of \"23 seconds ago\", \"27 minutes ago\" etc.\n\tdelta: delta in milliseconds\nReturns an object with these members:\n\tdescription: string describing the delta period\n\tupdatePeriod: time in millisecond until the string will be inaccurate\n*/\nexports.getRelativeDate = function(delta) {\n\tvar futurep = false;\n\tif(delta < 0) {\n\t\tdelta = -1 * delta;\n\t\tfuturep = true;\n\t}\n\tvar units = [\n\t\t{name: \"Years\",   duration:      365 * 24 * 60 * 60 * 1000},\n\t\t{name: \"Months\",  duration: (365/12) * 24 * 60 * 60 * 1000},\n\t\t{name: \"Days\",    duration:            24 * 60 * 60 * 1000},\n\t\t{name: \"Hours\",   duration:                 60 * 60 * 1000},\n\t\t{name: \"Minutes\", duration:                      60 * 1000},\n\t\t{name: \"Seconds\", duration:                           1000}\n\t];\n\tfor(var t=0; t<units.length; t++) {\n\t\tvar result = Math.floor(delta / units[t].duration);\n\t\tif(result >= 2) {\n\t\t\treturn {\n\t\t\t\tdelta: delta,\n\t\t\t\tdescription: $tw.language.getString(\n\t\t\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/\" + units[t].name,\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{period: result.toString()}\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t\tupdatePeriod: units[t].duration\n\t\t\t};\n\t\t}\n\t}\n\treturn {\n\t\tdelta: delta,\n\t\tdescription: $tw.language.getString(\n\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/Second\",\n\t\t\t{variables:\n\t\t\t\t{period: \"1\"}\n\t\t\t}\n\t\t),\n\t\tupdatePeriod: 1000\n\t};\n};\n\n// Convert & to \"&amp;\", < to \"&lt;\", > to \"&gt;\", \" to \"&quot;\"\nexports.htmlEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&amp;\").replace(/</mg,\"&lt;\").replace(/>/mg,\"&gt;\").replace(/\\\"/mg,\"&quot;\");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n// Converts like htmlEncode, but forgets the double quote for brevity\nexports.htmlTextEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&amp;\").replace(/</mg,\"&lt;\").replace(/>/mg,\"&gt;\");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n// Converts all HTML entities to their character equivalents\nexports.entityDecode = function(s) {\n\tvar converter = String.fromCodePoint || String.fromCharCode,\n\t\te = s.substr(1,s.length-2), // Strip the & and the ;\n\t\tc;\n\tif(e.charAt(0) === \"#\") {\n\t\tif(e.charAt(1) === \"x\" || e.charAt(1) === \"X\") {\n\t\t\tc = parseInt(e.substr(2),16);\n\t\t} else {\n\t\t\tc = parseInt(e.substr(1),10);\n\t\t}\n\t\tif(isNaN(c)) {\n\t\t\treturn s;\n\t\t} else {\n\t\t\treturn converter(c);\n\t\t}\n\t} else {\n\t\tc = $tw.config.htmlEntities[e];\n\t\tif(c) {\n\t\t\treturn converter(c);\n\t\t} else {\n\t\t\treturn s; // Couldn't convert it as an entity, just return it raw\n\t\t}\n\t}\n};\n\nexports.unescapeLineBreaks = function(s) {\n\treturn s.replace(/\\\\n/mg,\"\\n\").replace(/\\\\b/mg,\" \").replace(/\\\\s/mg,\"\\\\\").replace(/\\r/mg,\"\");\n};\n\n/*\n * Returns an escape sequence for given character. Uses \\x for characters <=\n * 0xFF to save space, \\u for the rest.\n *\n * The code needs to be in sync with th code template in the compilation\n * function for \"action\" nodes.\n */\n// Copied from peg.js, thanks to David Majda\nexports.escape = function(ch) {\n\tvar charCode = ch.charCodeAt(0);\n\tif(charCode <= 0xFF) {\n\t\treturn '\\\\x' + $tw.utils.pad(charCode.toString(16).toUpperCase());\n\t} else {\n\t\treturn '\\\\u' + $tw.utils.pad(charCode.toString(16).toUpperCase(),4);\n\t}\n};\n\n// Turns a string into a legal JavaScript string\n// Copied from peg.js, thanks to David Majda\nexports.stringify = function(s, rawUnicode) {\n\t/*\n\t* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string\n\t* literal except for the closing quote character, backslash, carriage return,\n\t* line separator, paragraph separator, and line feed. Any character may\n\t* appear in the form of an escape sequence.\n\t*\n\t* For portability, we also escape all non-ASCII characters.\n\t*/\n\tvar regex = rawUnicode ? /[\\x00-\\x1f]/g : /[\\x00-\\x1f\\x80-\\uFFFF]/g;\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\')            // backslash\n\t\t.replace(/\"/g, '\\\\\"')              // double quote character\n\t\t.replace(/'/g, \"\\\\'\")              // single quote character\n\t\t.replace(/\\r/g, '\\\\r')             // carriage return\n\t\t.replace(/\\n/g, '\\\\n')             // line feed\n\t\t.replace(regex, exports.escape);   // non-ASCII characters\n};\n\n// Turns a string into a legal JSON string\n// Derived from peg.js, thanks to David Majda\nexports.jsonStringify = function(s, rawUnicode) {\n\t// See http://www.json.org/\n\tvar regex = rawUnicode ? /[\\x00-\\x1f]/g : /[\\x00-\\x1f\\x80-\\uFFFF]/g;\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\')            // backslash\n\t\t.replace(/\"/g, '\\\\\"')              // double quote character\n\t\t.replace(/\\r/g, '\\\\r')             // carriage return\n\t\t.replace(/\\n/g, '\\\\n')             // line feed\n\t\t.replace(/\\x08/g, '\\\\b')           // backspace\n\t\t.replace(/\\x0c/g, '\\\\f')           // formfeed\n\t\t.replace(/\\t/g, '\\\\t')             // tab\n\t\t.replace(regex,function(s) {\n\t\t\treturn '\\\\u' + $tw.utils.pad(s.charCodeAt(0).toString(16).toUpperCase(),4);\n\t\t}); // non-ASCII characters\n};\n\n/*\nEscape the RegExp special characters with a preceding backslash\n*/\nexports.escapeRegExp = function(s) {\n    return s.replace(/[\\-\\/\\\\\\^\\$\\*\\+\\?\\.\\(\\)\\|\\[\\]\\{\\}]/g, '\\\\$&');\n};\n\n/*\nExtended version of encodeURIComponent that encodes additional characters including\nthose that are illegal within filepaths on various platforms including Windows\n*/\nexports.encodeURIComponentExtended = function(s) {\n\treturn encodeURIComponent(s).replace(/[!'()*]/g,function(c) {\n\t\treturn \"%\" + c.charCodeAt(0).toString(16).toUpperCase();\n\t});\n};\n\n// Checks whether a link target is external, i.e. not a tiddler title\nexports.isLinkExternal = function(to) {\n\tvar externalRegExp = /^(?:file|http|https|mailto|ftp|irc|news|obsidian|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/i;\n\treturn externalRegExp.test(to);\n};\n\nexports.nextTick = function(fn) {\n/*global window: false */\n\tif(typeof process === \"undefined\") {\n\t\t// Apparently it would be faster to use postMessage - http://dbaron.org/log/20100309-faster-timeouts\n\t\twindow.setTimeout(fn,0);\n\t} else {\n\t\tprocess.nextTick(fn);\n\t}\n};\n\n/*\nConvert a hyphenated CSS property name into a camel case one\n*/\nexports.unHyphenateCss = function(propName) {\n\treturn propName.replace(/-([a-z])/gi, function(match0,match1) {\n\t\treturn match1.toUpperCase();\n\t});\n};\n\n/*\nConvert a camelcase CSS property name into a dashed one (\"backgroundColor\" --> \"background-color\")\n*/\nexports.hyphenateCss = function(propName) {\n\treturn propName.replace(/([A-Z])/g, function(match0,match1) {\n\t\treturn \"-\" + match1.toLowerCase();\n\t});\n};\n\n/*\nParse a text reference of one of these forms:\n* title\n* !!field\n* title!!field\n* title##index\n* etc\nReturns an object with the following fields, all optional:\n* title: tiddler title\n* field: tiddler field name\n* index: JSON property index\n*/\nexports.parseTextReference = function(textRef) {\n\t// Separate out the title, field name and/or JSON indices\n\tvar reTextRef = /(?:(.*?)!!(.+))|(?:(.*?)##(.+))|(.*)/mg,\n\t\tmatch = reTextRef.exec(textRef),\n\t\tresult = {};\n\tif(match && reTextRef.lastIndex === textRef.length) {\n\t\t// Return the parts\n\t\tif(match[1]) {\n\t\t\tresult.title = match[1];\n\t\t}\n\t\tif(match[2]) {\n\t\t\tresult.field = match[2];\n\t\t}\n\t\tif(match[3]) {\n\t\t\tresult.title = match[3];\n\t\t}\n\t\tif(match[4]) {\n\t\t\tresult.index = match[4];\n\t\t}\n\t\tif(match[5]) {\n\t\t\tresult.title = match[5];\n\t\t}\n\t} else {\n\t\t// If we couldn't parse it\n\t\tresult.title = textRef\n\t}\n\treturn result;\n};\n\n/*\nChecks whether a string is a valid fieldname\n*/\nexports.isValidFieldName = function(name) {\n\tif(!name || typeof name !== \"string\") {\n\t\treturn false;\n\t}\n\t// Since v5.2.x, there are no restrictions on characters in field names\n\treturn name;\n};\n\n/*\nExtract the version number from the meta tag or from the boot file\n*/\n\n// Browser version\nexports.extractVersionInfo = function() {\n\tif($tw.packageInfo) {\n\t\treturn $tw.packageInfo.version;\n\t} else {\n\t\tvar metatags = document.getElementsByTagName(\"meta\");\n\t\tfor(var t=0; t<metatags.length; t++) {\n\t\t\tvar m = metatags[t];\n\t\t\tif(m.name === \"tiddlywiki-version\") {\n\t\t\t\treturn m.content;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the animation duration in ms\n*/\nexports.getAnimationDuration = function() {\n\treturn parseInt($tw.wiki.getTiddlerText(\"$:/config/AnimationDuration\",\"400\"),10) || 0;\n};\n\n/*\nHash a string to a number\nDerived from http://stackoverflow.com/a/15710692\n*/\nexports.hashString = function(str) {\n\treturn str.split(\"\").reduce(function(a,b) {\n\t\ta = ((a << 5) - a) + b.charCodeAt(0);\n\t\treturn a & a;\n\t},0);\n};\n\n/*\nCryptographic hash function as used by sha256 filter operator\noptions.length .. number of characters returned defaults to 64\n*/\nexports.sha256 = function(str, options) {\n\toptions = options || {}\n\treturn $tw.sjcl.codec.hex.fromBits($tw.sjcl.hash.sha256.hash(str)).substr(0,options.length || 64);\n}\n\n/*\nBase64 utility functions that work in either browser or Node.js\n*/\nif(typeof window !== 'undefined') {\n\texports.btoa = function(binstr) { return window.btoa(binstr); }\n\texports.atob = function(b64) { return window.atob(b64); }\n} else {\n\texports.btoa = function(binstr) {\n\t\treturn Buffer.from(binstr, 'binary').toString('base64');\n\t}\n\texports.atob = function(b64) {\n\t\treturn Buffer.from(b64, 'base64').toString('binary');\n\t}\n}\n\n/*\nDecode a base64 string\n*/\nexports.base64Decode = function(string64,binary,urlsafe) {\n\tvar encoded = urlsafe ? string64.replace(/_/g,'/').replace(/-/g,'+') : string64;\n\tif(binary) return exports.atob(encoded)\n\telse return base64utf8.base64.decode.call(base64utf8,encoded);\n};\n\n/*\nEncode a string to base64\n*/\nexports.base64Encode = function(string64,binary,urlsafe) {\n\tvar encoded;\n\tif(binary) encoded = exports.btoa(string64);\n\telse encoded = base64utf8.base64.encode.call(base64utf8,string64);\n\tif(urlsafe) {\n\t\tencoded = encoded.replace(/\\+/g,'-').replace(/\\//g,'_');\n\t}\n\treturn encoded;\n};\n\n/*\nConvert a hashmap into a tiddler dictionary format sequence of name:value pairs\n*/\nexports.makeTiddlerDictionary = function(data) {\n\tvar output = [];\n\tfor(var name in data) {\n\t\toutput.push(name + \": \" + data[name]);\n\t}\n\treturn output.join(\"\\n\");\n};\n\n/*\nHigh resolution microsecond timer for profiling\n*/\nexports.timer = function(base) {\n\tvar m;\n\tif($tw.node) {\n\t\tvar r = process.hrtime();\n\t\tm =  r[0] * 1e3 + (r[1] / 1e6);\n\t} else if(window.performance) {\n\t\tm = performance.now();\n\t} else {\n\t\tm = Date.now();\n\t}\n\tif(typeof base !== \"undefined\") {\n\t\tm = m - base;\n\t}\n\treturn m;\n};\n\n/*\nConvert text and content type to a data URI\n*/\nexports.makeDataUri = function(text,type,_canonical_uri) {\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar typeInfo = $tw.config.contentTypeInfo[type] || $tw.config.contentTypeInfo[\"text/plain\"],\n\t\tisBase64 = typeInfo.encoding === \"base64\",\n\t\tparts = [];\n\tif(_canonical_uri) {\n\t\tparts.push(_canonical_uri);\n\t} else {\n\t\tparts.push(\"data:\");\n\t\tparts.push(type);\n\t\tparts.push(isBase64 ? \";base64\" : \"\");\n\t\tparts.push(\",\");\n\t\tparts.push(isBase64 ? text : encodeURIComponent(text));\n\t}\n\treturn parts.join(\"\");\n};\n\n/*\nUseful for finding out the fully escaped CSS selector equivalent to a given tag. For example:\n\n$tw.utils.tagToCssSelector(\"$:/tags/Stylesheet\") --> tc-tagged-\\%24\\%3A\\%2Ftags\\%2FStylesheet\n*/\nexports.tagToCssSelector = function(tagName) {\n\treturn \"tc-tagged-\" + encodeURIComponent(tagName).replace(/[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^`{\\|}~,]/mg,function(c) {\n\t\treturn \"\\\\\" + c;\n\t});\n};\n\n/*\nIE does not have sign function\n*/\nexports.sign = Math.sign || function(x) {\n\tx = +x; // convert to a number\n\tif(x === 0 || isNaN(x)) {\n\t\treturn x;\n\t}\n\treturn x > 0 ? 1 : -1;\n};\n\n/*\nIE does not have an endsWith function\n*/\nexports.strEndsWith = function(str,ending,position) {\n\tif(str.endsWith) {\n\t\treturn str.endsWith(ending,position);\n\t} else {\n\t\tif(typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > str.length) {\n\t\t\tposition = str.length;\n\t\t}\n\t\tposition -= ending.length;\n\t\tvar lastIndex = str.indexOf(ending, position);\n\t\treturn lastIndex !== -1 && lastIndex === position;\n\t}\n};\n\n/*\nReturn system information useful for debugging\n*/\nexports.getSystemInfo = function(str,ending,position) {\n\tvar results = [],\n\t\tsave = function(desc,value) {\n\t\t\tresults.push(desc + \": \" + value);\n\t\t};\n\tif($tw.browser) {\n\t\tsave(\"User Agent\",navigator.userAgent);\n\t\tsave(\"Online Status\",window.navigator.onLine);\n\t}\n\tif($tw.node) {\n\t\tsave(\"Node Version\",process.version);\n\t}\n\treturn results.join(\"\\n\");\n};\n\nexports.parseNumber = function(str) {\n\treturn parseFloat(str) || 0;\n};\n\nexports.parseInt = function(str) {\n\treturn parseInt(str,10) || 0;\n};\n\nexports.stringifyNumber = function(num) {\n\treturn num + \"\";\n};\n\nexports.makeCompareFunction = function(type,options) {\n\toptions = options || {};\n\t// set isCaseSensitive to true if not defined in options\n\tvar isCaseSensitive = (options.isCaseSensitive === false) ? false : true,\n\t\tgt = options.invert ? -1 : +1,\n\t\tlt = options.invert ? +1 : -1,\n\t\tcompare = function(a,b) {\n\t\t\tif(a > b) {\n\t\t\t\treturn gt ;\n\t\t\t} else if(a < b) {\n\t\t\t\treturn lt;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t},\n\t\ttypes = {\n\t\t\t\"number\": function(a,b) {\n\t\t\t\treturn compare($tw.utils.parseNumber(a),$tw.utils.parseNumber(b));\n\t\t\t},\n\t\t\t\"integer\": function(a,b) {\n\t\t\t\treturn compare($tw.utils.parseInt(a),$tw.utils.parseInt(b));\n\t\t\t},\n\t\t\t\"string\": function(a,b) {\n\t\t\t\tif(!isCaseSensitive) {\n\t\t\t\t\ta = a.toLowerCase();\n\t\t\t\t\tb = b.toLowerCase();\n\t\t\t\t}\n\t\t\t\treturn compare(\"\" + a,\"\" + b);\n\t\t\t},\n\t\t\t\"date\": function(a,b) {\n\t\t\t\tvar dateA = $tw.utils.parseDate(a),\n\t\t\t\t\tdateB = $tw.utils.parseDate(b);\n\t\t\t\tif(!isFinite(dateA)) {\n\t\t\t\t\tdateA = new Date(0);\n\t\t\t\t}\n\t\t\t\tif(!isFinite(dateB)) {\n\t\t\t\t\tdateB = new Date(0);\n\t\t\t\t}\n\t\t\t\treturn compare(dateA,dateB);\n\t\t\t},\n\t\t\t\"version\": function(a,b) {\n\t\t\t\treturn $tw.utils.compareVersions(a,b);\n\t\t\t},\n\t\t\t\"alphanumeric\": function(a,b) {\n\t\t\t\tif(!isCaseSensitive) {\n\t\t\t\t\ta = a.toLowerCase();\n\t\t\t\t\tb = b.toLowerCase();\n\t\t\t\t}\n\t\t\t\treturn options.invert ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \"base\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \"base\"});\n\t\t\t}\n\t\t};\n\treturn (types[type] || types[options.defaultType] || types.number);\n};\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/widgets/action-confirm.js":{"title":"$:/core/modules/widgets/action-confirm.js","text":"/*\\\n\ntitle: $:/core/modules/widgets/action-confirm.js\ntype: application/javascript\nmodule-type: widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ConfirmWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nConfirmWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nConfirmWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.parentDomNode = parent;\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nConfirmWidget.prototype.execute = function() {\n\tthis.message = this.getAttribute(\"$message\",$tw.language.getString(\"ConfirmAction\"));\n\tthis.prompt = (this.getAttribute(\"$prompt\",\"yes\") == \"no\" ? false : true);\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nConfirmWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$message\"] || changedAttributes[\"$prompt\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nConfirmWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar invokeActions = true,\n\t\thandled = true,\n\t    \twin = event && event.event && event.event.view ? event.event.view : window;\n\tif(this.prompt) {\n\t\tinvokeActions = win.confirm(this.message);\n\t}\n\tif(invokeActions) {\n\t\thandled = this.invokeActions(triggeringWidget,event);\n\t}\n\treturn handled;\n};\n\nConfirmWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nexports[\"action-confirm\"] = ConfirmWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/action-createtiddler.js":{"title":"$:/core/modules/widgets/action-createtiddler.js","text":"/*\\\ntitle: $:/core/modules/widgets/action-createtiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to create a new tiddler with a unique name and specified fields.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw:false, require:false, exports:false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CreateTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCreateTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCreateTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Render children\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCreateTiddlerWidget.prototype.execute = function() {\n\tthis.actionBaseTitle = this.getAttribute(\"$basetitle\");\n\tthis.hasBase = !!this.actionBaseTitle;\n\tthis.actionSaveTitle = this.getAttribute(\"$savetitle\");\n\tthis.actionSaveDraftTitle = this.getAttribute(\"$savedrafttitle\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n\t//Following params are new since 5.1.22\n\tthis.actionTemplate = this.getAttribute(\"$template\");\n\tthis.useTemplate = !!this.actionTemplate;\n\tthis.actionOverwrite = this.getAttribute(\"$overwrite\",\"no\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nCreateTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nCreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar title = this.wiki.getTiddlerText(\"$:/language/DefaultNewTiddlerTitle\"), // Get the initial new-tiddler title\n\t\tfields = {},\n\t\tcreationFields,\n\t\tmodificationFields;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tfields[name] = attribute;\n\t\t}\n\t});\n\tif(this.actionTimestamp) {\n\t\tcreationFields = this.wiki.getCreationFields();\n\t\tmodificationFields = this.wiki.getModificationFields();\n\t}\n\tif(this.hasBase && this.actionOverwrite === \"no\") {\n\t\ttitle = this.wiki.generateNewTitle(this.actionBaseTitle);\n\t} else if (this.hasBase && this.actionOverwrite === \"yes\") {\n\t\ttitle = this.actionBaseTitle\n\t}\n\t// NO $basetitle BUT $template parameter is available\n\t// the title MUST be unique, otherwise the template would be overwritten\n\tif (!this.hasBase && this.useTemplate) {\n\t\ttitle = this.wiki.generateNewTitle(this.actionTemplate);\n\t} else if (!this.hasBase && !this.useTemplate) {\n\t\t// If no $basetitle and no $template then use initial title\n\t\ttitle = this.wiki.generateNewTitle(title);\n\t}\n\tvar templateTiddler = this.wiki.getTiddler(this.actionTemplate) || {};\n\tthis.wiki.addTiddler(new $tw.Tiddler(templateTiddler.fields,creationFields,fields,modificationFields,{title: title}));\n\tvar draftTitle = this.wiki.generateDraftTitle(title);\n\tif(this.actionSaveTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveTitle,title,this.getVariable(\"currentTiddler\"));\n\t}\n\tif(this.actionSaveDraftTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveDraftTitle,draftTitle,this.getVariable(\"currentTiddler\"));\n\t}\n\tthis.setVariable(\"createTiddler-title\",title);\n\tthis.setVariable(\"createTiddler-draftTitle\",draftTitle);\n\tthis.refreshChildren();\n\treturn true; // Action was invoked\n};\n\nexports[\"action-createtiddler\"] = CreateTiddlerWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/action-deletefield.js":{"title":"$:/core/modules/widgets/action-deletefield.js","text":"/*\\\ntitle: $:/core/modules/widgets/action-deletefield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete fields of a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\",null);\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\ttiddler = this.wiki.getTiddler(self.actionTiddler),\n\t\tremoveFields = {},\n\t\thasChanged = false;\n\tif((this.actionField !== null) && tiddler) {\n\t\tremoveFields[this.actionField] = undefined;\n\t\tif(this.actionField in tiddler.fields) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(tiddler) {\n\t\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\t\tif(name.charAt(0) !== \"$\" && name !== \"title\") {\n\t\t\t\tremoveFields[name] = undefined;\n\t\t\t\tif(name in tiddler.fields) {\n\t\t\t\t\thasChanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tif(hasChanged) {\n\t\t\tvar creationFields = this.actionTimestamp ? this.wiki.getCreationFields() : {};\n\t\t\tvar modificationFields = this.actionTimestamp ? this.wiki.getModificationFields() : {};\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(creationFields,tiddler,removeFields,modificationFields));\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletefield\"] = DeleteFieldWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/action-deletetiddler.js":{"title":"$:/core/modules/widgets/action-deletetiddler.js","text":"/*\\\ntitle: $:/core/modules/widgets/action-deletetiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteTiddlerWidget.prototype.execute = function() {\n\tthis.actionFilter = this.getAttribute(\"$filter\");\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$filter\"] || changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar tiddlers = [];\n\tif(this.actionFilter) {\n\t\ttiddlers = this.wiki.filterTiddlers(this.actionFilter,this);\n\t}\n\tif(this.actionTiddler) {\n\t\ttiddlers.push(this.actionTiddler);\n\t}\n\tfor(var t=0; t<tiddlers.length; t++) {\n\t\tthis.wiki.deleteTiddler(tiddlers[t]);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletetiddler\"] = DeleteTiddlerWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/action-listops.js":{"title":"$:/core/modules/widgets/action-listops.js","text":"/*\\\ntitle: $:/core/modules/widgets/action-listops.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to apply list operations to any tiddler field (defaults to the 'list' field of the current tiddler)\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar ActionListopsWidget = function(parseTreeNode, options) {\n\tthis.initialise(parseTreeNode, options);\n};\n/**\n * Inherit from the base widget class\n */\nActionListopsWidget.prototype = new Widget();\n/**\n * Render this widget into the DOM\n */\nActionListopsWidget.prototype.render = function(parent, nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n/**\n * Compute the internal state of the widget\n */\nActionListopsWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.target = this.getAttribute(\"$tiddler\", this.getVariable(\n\t\t\"currentTiddler\"));\n\tthis.filter = this.getAttribute(\"$filter\");\n\tthis.subfilter = this.getAttribute(\"$subfilter\");\n\tthis.listField = this.getAttribute(\"$field\", \"list\");\n\tthis.listIndex = this.getAttribute(\"$index\");\n\tthis.filtertags = this.getAttribute(\"$tags\");\n};\n/**\n * \tRefresh the widget by ensuring our attributes are up to date\n */\nActionListopsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n/**\n * \tInvoke the action associated with this widget\n */\nActionListopsWidget.prototype.invokeAction = function(triggeringWidget,\n\tevent) {\n\t//Apply the specified filters to the lists\n\tvar field = this.listField,\n\t\tindex,\n\t\tlist = this.listField;\n\tif(this.listIndex) {\n\t\tfield = undefined;\n\t\tindex = this.listIndex;\n\t\tlist = this.listIndex;\n\t}\n\tif(this.filter) {\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(this.filter, this)));\n\t}\n\tif(this.subfilter) {\n\t\tvar inputList = this.wiki.getTiddlerList(this.target,field,index),\n\t\t\tsubfilter = \"[all[]] \" + this.subfilter;\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(this.wiki.filterTiddlers(subfilter,this,this.wiki.makeTiddlerIterator(inputList))));\n\t}\n\tif(this.filtertags) {\n\t\tvar tiddler = this.wiki.getTiddler(this.target),\n\t\t\toldtags = tiddler ? (tiddler.fields.tags || []).slice(0) : [],\n\t\t\ttagfilter = $tw.utils.stringifyList(oldtags) + \" \" + this.filtertags,\n\t\t\tnewtags = this.wiki.filterTiddlers(tagfilter,this);\n\t\tif($tw.utils.stringifyList(oldtags.sort()) !== $tw.utils.stringifyList(newtags.sort())) {\n\t\t\tthis.wiki.setText(this.target,\"tags\",undefined,$tw.utils.stringifyList(newtags));\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-listops\"] = ActionListopsWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/action-log.js":{"title":"$:/core/modules/widgets/action-log.js","text":"/*\\\ntitle: $:/core/modules/widgets/action-log.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to log debug messages\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LogWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLogWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLogWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\nLogWidget.prototype.execute = function(){\n\tthis.message = this.getAttribute(\"$$message\",\"debug\");\n\tthis.logAll = this.getAttribute(\"$$all\",\"no\") === \"yes\" ? true : false;\n\tthis.filter = this.getAttribute(\"$$filter\");\n}\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nLogWidget.prototype.refresh = function(changedTiddlers) {\n\tthis.refreshSelf();\n\treturn true;\n};\n\n/*\nInvoke the action associated with this widget\n*/\nLogWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tthis.log();\n\treturn true; // Action was invoked\n};\n\nLogWidget.prototype.log = function() {\n\tvar data = {},\n\t\tdataCount,\n\t\tallVars = {},\n\t\tfilteredVars;\n\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.substring(0,2) !== \"$$\") {\n\t\t\tdata[name] = attribute;\n\t\t}\n\t});\n\n\tfor(var v in this.variables) {\n\t\tvar variable = this.parentWidget && this.parentWidget.variables[v];\n\t\tif(variable && variable.isFunctionDefinition) {\n\t\t\tallVars[v] = variable.value;\n\t\t} else {\n\t\t\tallVars[v]  = this.getVariable(v,{defaultValue:\"\"});\n\t\t}\n\t}\n\tif(this.filter) {\n\t\tfilteredVars = this.wiki.compileFilter(this.filter).call(this.wiki,this.wiki.makeTiddlerIterator(allVars));\n\t\t$tw.utils.each(filteredVars,function(name) {\n\t\t\tdata[name] = allVars[name];\n\t\t});\n\t}\n\tdataCount = $tw.utils.count(data);\n\n\tconsole.group(this.message);\n\tif(dataCount > 0) {\n\t\t$tw.utils.logTable(data);\n\t}\n\tif(this.logAll || !dataCount) {\n\t\tconsole.groupCollapsed(\"All variables\");\n\t\t$tw.utils.logTable(allVars);\n\t\tconsole.groupEnd();\n\t}\n\tconsole.groupEnd();\n}\n\nexports[\"action-log\"] = LogWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/action-navigate.js":{"title":"$:/core/modules/widgets/action-navigate.js","text":"/*\\\ntitle: $:/core/modules/widgets/action-navigate.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to navigate to a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigateWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigateWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigateWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigateWidget.prototype.execute = function() {\n\tthis.actionTo = this.getAttribute(\"$to\");\n\tthis.actionScroll = this.getAttribute(\"$scroll\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nNavigateWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$to\"] || changedAttributes[\"$scroll\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nNavigateWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tevent = event || {};\n\tvar bounds = triggeringWidget && triggeringWidget.getBoundingClientRect && triggeringWidget.getBoundingClientRect(),\n\t\tsuppressNavigation = event.metaKey || event.ctrlKey || (event.button === 1);\n\tif(this.actionScroll === \"yes\") {\n\t\tsuppressNavigation = false;\n\t} else if(this.actionScroll === \"no\") {\n\t\tsuppressNavigation = true;\n\t}\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.actionTo === undefined ? this.getVariable(\"currentTiddler\") : this.actionTo,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: triggeringWidget,\n\t\tnavigateFromClientRect: bounds && { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateFromClientTop: bounds && bounds.top,\n\t\tnavigateFromClientLeft: bounds && bounds.left,\n\t\tnavigateFromClientWidth: bounds && bounds.width,\n\t\tnavigateFromClientRight: bounds && bounds.right,\n\t\tnavigateFromClientBottom: bounds && bounds.bottom,\n\t\tnavigateFromClientHeight: bounds && bounds.height,\n\t\tnavigateSuppressNavigation: suppressNavigation,\n\t\tmetaKey: event.metaKey,\n\t\tctrlKey: event.ctrlKey,\n\t\taltKey: event.altKey,\n\t\tshiftKey: event.shiftKey,\n\t\tevent: event\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-navigate\"] = NavigateWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/action-popup.js":{"title":"$:/core/modules/widgets/action-popup.js","text":"/*\\\ntitle: $:/core/modules/widgets/action-popup.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to trigger a popup.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar Popup = require(\"$:/core/modules/utils/dom/popup.js\");\n\nvar ActionPopupWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nActionPopupWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nActionPopupWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nActionPopupWidget.prototype.execute = function() {\n\tthis.actionState = this.getAttribute(\"$state\");\n\tthis.actionCoords = this.getAttribute(\"$coords\");\n\tthis.floating = this.getAttribute(\"$floating\",\"no\") === \"yes\";\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nActionPopupWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$state\"] || changedAttributes[\"$coords\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nActionPopupWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Trigger the popup\n\tvar coordinates = Popup.parseCoordinates(this.actionCoords || \"\");\n\tif(coordinates) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: null,\n\t\t\tdomNodeRect: {\n\t\t\t\tleft: coordinates.left,\n\t\t\t\ttop: coordinates.top,\n\t\t\t\twidth: coordinates.width,\n\t\t\t\theight: coordinates.height\n\t\t\t},\n\t\t\ttitle: this.actionState,\n\t\t\twiki: this.wiki,\n\t\t\tfloating: this.floating,\n\t\t\tabsolute: coordinates.absolute\n\t\t});\n\t} else {\n\t\t$tw.popup.cancel(0);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-popup\"] = ActionPopupWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/action-sendmessage.js":{"title":"$:/core/modules/widgets/action-sendmessage.js","text":"/*\\\ntitle: $:/core/modules/widgets/action-sendmessage.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to send a message\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SendMessageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSendMessageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSendMessageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSendMessageWidget.prototype.execute = function() {\n\tthis.actionMessage = this.getAttribute(\"$message\");\n\tthis.actionParam = this.getAttribute(\"$param\");\n\tthis.actionName = this.getAttribute(\"$name\");\n\tthis.actionValue = this.getAttribute(\"$value\",\"\");\n\tthis.actionNames = this.getAttribute(\"$names\");\n\tthis.actionValues = this.getAttribute(\"$values\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSendMessageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Get the string parameter\n\tvar param = this.actionParam;\n\t// Assemble the parameters as a hashmap\n\tvar paramObject = Object.create(null);\n\t// Add names/values pairs if present\n\tif(this.actionNames && this.actionValues) {\n\t\tvar names = this.wiki.filterTiddlers(this.actionNames,this),\n\t\t\tvalues = this.wiki.filterTiddlers(this.actionValues,this);\n\t\t$tw.utils.each(names,function(name,index) {\n\t\t\tparamObject[name] = values[index] || \"\";\n\t\t});\n\t}\n\t// Add raw parameters\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparamObject[name] = attribute;\n\t\t}\n\t});\n\t// Add name/value pair if present\n\tif(this.actionName) {\n\t\tparamObject[this.actionName] = this.actionValue;\n\t}\n\t// Dispatch the message\n\tvar params = {\n\t\ttype: this.actionMessage,\n\t\tparam: param,\n\t\tparamObject: paramObject,\n\t\tevent: event,\n\t\ttiddlerTitle: this.getVariable(\"currentTiddler\"),\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\")\n\t};\n\tthis.dispatchEvent(params);\n\treturn true; // Action was invoked\n};\n\nexports[\"action-sendmessage\"] = SendMessageWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/action-setfield.js":{"title":"$:/core/modules/widgets/action-setfield.js","text":"/*\\\ntitle: $:/core/modules/widgets/action-setfield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set a single field or index on a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\") || (!this.hasParseTreeNodeAttribute(\"$tiddler\") && this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n\tthis.actionIndex = this.getAttribute(\"$index\");\n\tthis.actionValue = this.getAttribute(\"$value\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetFieldWidget.prototype.refresh = function(changedTiddlers) {\n\t// Nothing to refresh\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSetFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\toptions = {};\n\tif(this.actionTiddler) {\n\t\toptions.suppressTimestamp = !this.actionTimestamp;\n\t\tif((typeof this.actionField == \"string\") || (typeof this.actionIndex == \"string\")  || (typeof this.actionValue == \"string\")) {\n\t\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue,options);\n\t\t}\n\t\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\t\tif(name.charAt(0) !== \"$\") {\n\t\t\t\tself.wiki.setText(self.actionTiddler,name,undefined,attribute,options);\n\t\t\t}\n\t\t});\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-setfield\"] = SetFieldWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/action-setmultiplefields.js":{"title":"$:/core/modules/widgets/action-setmultiplefields.js","text":"/*\\\ntitle: $:/core/modules/widgets/action-setmultiplefields.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set multiple fields or indexes on a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetMultipleFieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetMultipleFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetMultipleFieldsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetMultipleFieldsWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionFields = this.getAttribute(\"$fields\");\n\tthis.actionIndexes = this.getAttribute(\"$indexes\");\n\tthis.actionValues = this.getAttribute(\"$values\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetMultipleFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"] || changedAttributes[\"$fields\"] || changedAttributes[\"$indexes\"] || changedAttributes[\"$values\"] || changedAttributes[\"$timestamp\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSetMultipleFieldsWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar tiddler = this.wiki.getTiddler(this.actionTiddler),\n\t\tnames, values = this.wiki.filterTiddlers(this.actionValues,this);\n\tif(this.actionFields) {\n\t\tvar additions = {};\n\t\tnames = this.wiki.filterTiddlers(this.actionFields,this);\n\t\t$tw.utils.each(names,function(fieldname,index) {\n\t\t\tadditions[fieldname] = values[index] || \"\";\n\t\t});\n\t\tvar creationFields = this.actionTimestamp ? this.wiki.getCreationFields() : undefined,\n\t\t\tmodificationFields = this.actionTimestamp ? this.wiki.getModificationFields() : undefined;\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(creationFields,tiddler,{title: this.actionTiddler},modificationFields,additions));\n\t} else if(this.actionIndexes) {\n\t\tvar data = this.wiki.getTiddlerData(this.actionTiddler,Object.create(null));\n\t\tnames = this.wiki.filterTiddlers(this.actionIndexes,this);\n\t\t$tw.utils.each(names,function(name,index) {\n\t\t\tdata[name] = values[index] || \"\";\n\t\t});\n\t\tthis.wiki.setTiddlerData(this.actionTiddler,data,{},{suppressTimestamp: !this.actionTimestamp});\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-setmultiplefields\"] = SetMultipleFieldsWidget;\n\n})();\n\t","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/browse.js":{"title":"$:/core/modules/widgets/browse.js","text":"/*\\\ntitle: $:/core/modules/widgets/browse.js\ntype: application/javascript\nmodule-type: widget\n\nBrowse widget for browsing for files to import\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar BrowseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nBrowseWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nBrowseWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"file\");\n\tif(this.browseMultiple) {\n\t\tdomNode.setAttribute(\"multiple\",\"multiple\");\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\t// Nw.js supports \"nwsaveas\" to force a \"save as\" dialogue that allows a new or existing file to be selected\n\tif(this.nwsaveas) {\n\t\tdomNode.setAttribute(\"nwsaveas\",this.nwsaveas);\n\t}\n\tif(this.accept) {\n\t\tdomNode.setAttribute(\"accept\",this.accept);\n\t}\n\t// Nw.js supports \"webkitdirectory\" and \"nwdirectory\" to allow a directory to be selected\n\tif(this.webkitdirectory) {\n\t\tdomNode.setAttribute(\"webkitdirectory\",this.webkitdirectory);\n\t}\n\tif(this.nwdirectory) {\n\t\tdomNode.setAttribute(\"nwdirectory\",this.nwdirectory);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"change\",function (event) {\n\t\tif(self.message) {\n\t\t\tself.dispatchEvent({type: self.message, param: self.param, files: event.target.files});\n\t\t} else {\n\t\t\tself.wiki.readFiles(event.target.files,{\n\t\t\t\tcallback: function(tiddlerFieldsArray) {\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t\t},\n\t\t\t\tdeserializer: self.deserializer\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Assign data- attributes\n\tthis.assignAttributes(domNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nBrowseWidget.prototype.execute = function() {\n\tthis.browseMultiple = this.getAttribute(\"multiple\");\n\tthis.deserializer = this.getAttribute(\"deserializer\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.nwsaveas = this.getAttribute(\"nwsaveas\");\n\tthis.accept = this.getAttribute(\"accept\");\n\tthis.webkitdirectory = this.getAttribute(\"webkitdirectory\");\n\tthis.nwdirectory = this.getAttribute(\"nwdirectory\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nBrowseWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\t\n\t}\n\treturn false;\n};\n\nexports.browse = BrowseWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/button.js":{"title":"$:/core/modules/widgets/button.js","text":"/*\\\ntitle: $:/core/modules/widgets/button.js\ntype: application/javascript\nmodule-type: widget\n\nButton widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar Popup = require(\"$:/core/modules/utils/dom/popup.js\");\n\nvar ButtonWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nButtonWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nButtonWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this,\n\t\ttag = \"button\",\n\t\tdomNode;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\n\t\ttag = this.buttonTag;\n\t}\n\tdomNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp();\n\tif(this.selectedClass) {\n\t\tif((this.set || this.setTitle) && this.setTo && this.isSelected()) {\n\t\t\t$tw.utils.pushTop(classes, this.selectedClass.split(\" \"));\n\t\t\tdomNode.setAttribute(\"aria-checked\", \"true\");\n\t\t}\n\t\tif(isPoppedUp) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t}\n\tif(isPoppedUp) {\n\t\t$tw.utils.pushTop(classes,\"tc-popup-handle\");\n\t}\n\tdomNode.className = classes.join(\" \");\n\t// Assign data- attributes\n\tthis.assignAttributes(domNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\n\t// Assign other attributes\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\tif (this.role) {\n\t\tdomNode.setAttribute(\"role\", this.role);\n\t}\n\tif(this.popup || this.popupTitle) {\n\t\tdomNode.setAttribute(\"aria-expanded\",isPoppedUp ? \"true\" : \"false\");\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tdomNode.setAttribute(\"disabled\",true);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"click\",function (event) {\n\t\tvar handled = false;\n\t\tif(self.invokeActions(self,event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.to) {\n\t\t\tself.navigateTo(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.message) {\n\t\t\tself.dispatchMessage(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.popup || self.popupTitle) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set || self.setTitle) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.actions) {\n\t\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\tself.invokeActionString(self.actions,self,event,{modifier: modifierKey});\n\t\t}\n\t\tif(handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn handled;\n\t},false);\n\t// Make it draggable if required\n\tif(this.dragTiddler || this.dragFilter) {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.dragTiddler;},\n\t\t\tdragFilterFn: function() {return self.dragFilter;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nWe don't allow actions to propagate because we trigger actions ourselves\n*/\nButtonWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nButtonWidget.prototype.getBoundingClientRect = function() {\n\treturn this.domNodes[0].getBoundingClientRect();\n};\n\nButtonWidget.prototype.isSelected = function() {\n    return this.setTitle ? (this.setField ? this.wiki.getTiddler(this.setTitle).getFieldString(this.setField) === this.setTo :\n\t\t(this.setIndex ? this.wiki.extractTiddlerDataItem(this.setTitle,this.setIndex) === this.setTo :\n\t\t\tthis.wiki.getTiddlerText(this.setTitle))) || this.defaultSetValue || this.getVariable(\"currentTiddler\") :\n\t\tthis.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable(\"currentTiddler\")) === this.setTo;\n};\n\nButtonWidget.prototype.isPoppedUp = function() {\n\tvar tiddler = this.popupTitle ? this.wiki.getTiddler(this.popupTitle) : this.wiki.getTiddler(this.popup);\n\tvar result = tiddler && tiddler.fields.text ? Popup.readPopupState(tiddler.fields.text) : false;\n\treturn result;\n};\n\nButtonWidget.prototype.navigateTo = function(event) {\n\tvar bounds = this.getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tevent: event\n\t});\n};\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\"), event: event});\n};\n\nButtonWidget.prototype.triggerPopup = function(event) {\n\tif(this.popupTitle) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\tabsolute: (this.popupAbsCoords === \"yes\"),\n\t\t\ttitle: this.popupTitle,\n\t\t\twiki: this.wiki,\n\t\t\tnoStateReference: true\n\t\t});\n\t} else {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\tabsolute: (this.popupAbsCoords === \"yes\"),\n\t\t\ttitle: this.popup,\n\t\t\twiki: this.wiki\n\t\t});\n\t}\n};\n\nButtonWidget.prototype.setTiddler = function() {\n\tif(this.setTitle) {\n\t\tthis.setField ? this.wiki.setText(this.setTitle,this.setField,undefined,this.setTo) :\n\t\t\t\t(this.setIndex ? this.wiki.setText(this.setTitle,undefined,this.setIndex,this.setTo) :\n\t\t\t\tthis.wiki.setText(this.setTitle,\"text\",undefined,this.setTo));\n\t} else {\n\t\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\"currentTiddler\"));\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nButtonWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\");\n\tthis.to = this.getAttribute(\"to\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.set = this.getAttribute(\"set\");\n\tthis.setTo = this.getAttribute(\"setTo\");\n\tthis.popup = this.getAttribute(\"popup\");\n\tthis.hover = this.getAttribute(\"hover\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.role = this.getAttribute(\"role\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\",\"\");\n\tthis.buttonTag = this.getAttribute(\"tag\");\n\tthis.dragTiddler = this.getAttribute(\"dragTiddler\");\n\tthis.dragFilter = this.getAttribute(\"dragFilter\");\n\tthis.setTitle = this.getAttribute(\"setTitle\");\n\tthis.setField = this.getAttribute(\"setField\");\n\tthis.setIndex = this.getAttribute(\"setIndex\");\n\tthis.popupTitle = this.getAttribute(\"popupTitle\");\n\tthis.popupAbsCoords = this.getAttribute(\"popupAbsCoords\", \"no\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nButtonWidget.prototype.updateDomNodeClasses = function() {\n\tvar domNodeClasses = this.domNode.className.split(\" \"),\n\t\toldClasses = this.class.split(\" \"),\n\t\tnewClasses;\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tnewClasses = this.class.split(\" \");\n\t//Remove classes assigned from the old value of class attribute\n\t$tw.utils.each(oldClasses,function(oldClass){\n\t\tvar i = domNodeClasses.indexOf(oldClass);\n\t\tif(i !== -1) {\n\t\t\tdomNodeClasses.splice(i,1);\n\t\t}\n\t});\n\t//Add new classes from updated class attribute.\n\t$tw.utils.pushTop(domNodeClasses,newClasses);\n\tthis.domNode.className = domNodeClasses.join(\" \");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nButtonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tooltip || changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.popupAbsCoords || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle || changedAttributes.disabled || changedAttributes[\"default\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tif(changedAttributes[\"class\"]) {\n\t\t\tthis.updateDomNodeClasses();\n\t\t}\n\t\tthis.assignAttributes(this.domNodes[0],{\n\t\t\tchangedAttributes: changedAttributes,\n\t\t\tsourcePrefix: \"data-\",\n\t\t\tdestPrefix: \"data-\"\n\t\t});\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.button = ButtonWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/checkbox.js":{"title":"$:/core/modules/widgets/checkbox.js","text":"/*\\\ntitle: $:/core/modules/widgets/checkbox.js\ntype: application/javascript\nmodule-type: widget\n\nCheckbox widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CheckboxWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCheckboxWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCheckboxWidget.prototype.render = function(parent,nextSibling) {\n\tvar isChecked;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",\"tc-checkbox \" + this.checkboxClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"checkbox\");\n\tisChecked = this.getValue();\n\tif(isChecked) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t\t$tw.utils.addClass(this.labelDomNode,\"tc-checkbox-checked\");\n\t}\n\tif(isChecked === undefined && this.checkboxIndeterminate === \"yes\") {\n\t\tthis.inputDomNode.indeterminate = true;\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Assign data- attributes\n\tthis.assignAttributes(this.inputDomNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nCheckboxWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.checkboxTitle);\n\tif(tiddler || this.checkboxFilter) {\n\t\tif(tiddler && this.checkboxTag) {\n\t\t\tif(this.checkboxInvertTag === \"yes\") {\n\t\t\t\treturn !tiddler.hasTag(this.checkboxTag);\n\t\t\t} else {\n\t\t\t\treturn tiddler.hasTag(this.checkboxTag);\n\t\t\t}\n\t\t}\n\t\tif(tiddler && (this.checkboxField || this.checkboxIndex)) {\n\t\t\t// Same logic applies to fields and indexes\n\t\t\tvar value;\n\t\t\tif(this.checkboxField) {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.checkboxField)) {\n\t\t\t\t\tvalue = tiddler.fields[this.checkboxField] || \"\";\n\t\t\t\t} else {\n\t\t\t\t\tvalue = this.checkboxDefault || \"\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvalue = this.wiki.extractTiddlerDataItem(tiddler,this.checkboxIndex,this.checkboxDefault || \"\");\n\t\t\t}\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Neither value found: were both specified?\n\t\t\tif(this.checkboxChecked && !this.checkboxUnchecked) {\n\t\t\t\treturn false; // Absence of checked value\n\t\t\t}\n\t\t\tif(this.checkboxUnchecked && !this.checkboxChecked) {\n\t\t\t\treturn true; // Absence of unchecked value\n\t\t\t}\n\t\t\tif(this.checkboxChecked && this.checkboxUnchecked) {\n\t\t\t\t// Both specified but neither found: indeterminate or false, depending\n\t\t\t\tif(this.checkboxIndeterminate === \"yes\") {\n\t\t\t\t\treturn undefined;\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxListField || this.checkboxListIndex || this.checkboxFilter) {\n\t\t\t// Same logic applies to lists and filters\n\t\t\tvar list;\n\t\t\tif(this.checkboxListField) {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.checkboxListField)) {\n\t\t\t\t\tlist = tiddler.getFieldList(this.checkboxListField) || [];\n\t\t\t\t} else {\n\t\t\t\t\tlist = $tw.utils.parseStringArray(this.checkboxDefault || \"\") || [];\n\t\t\t\t}\n\t\t\t} else if(this.checkboxListIndex) {\n\t\t\t\tlist = $tw.utils.parseStringArray(this.wiki.extractTiddlerDataItem(tiddler,this.checkboxListIndex,this.checkboxDefault || \"\")) || [];\n\t\t\t} else {\n\t\t\t\tlist = this.wiki.filterTiddlers(this.checkboxFilter,this) || [];\n\t\t\t}\n\t\t\tif(list.indexOf(this.checkboxChecked) !== -1) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(list.indexOf(this.checkboxUnchecked) !== -1) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Neither one present\n\t\t\tif(this.checkboxChecked && !this.checkboxUnchecked) {\n\t\t\t\treturn false; // Absence of checked value\n\t\t\t}\n\t\t\tif(this.checkboxUnchecked && !this.checkboxChecked) {\n\t\t\t\treturn true; // Absence of unchecked value\n\t\t\t}\n\t\t\tif(this.checkboxChecked && this.checkboxUnchecked) {\n\t\t\t\t// Both specified but neither found: indeterminate or false, depending\n\t\t\t\tif(this.checkboxIndeterminate === \"yes\") {\n\t\t\t\t\treturn undefined;\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Neither specified, so empty list is false, non-empty is true\n\t\t\treturn !!list.length;\n\t\t}\n\t} else {\n\t\tif(this.checkboxTag) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tif(this.checkboxDefault === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(this.checkboxDefault === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nCheckboxWidget.prototype.handleChangeEvent = function(event) {\n\tvar checked = this.inputDomNode.checked,\n\t\ttiddler = this.wiki.getTiddler(this.checkboxTitle),\n\t\tfallbackFields = {text: \"\"},\n\t\tnewFields = {title: this.checkboxTitle},\n\t\thasChanged = false,\n\t\ttagCheck = false,\n\t\thasTag = tiddler && tiddler.hasTag(this.checkboxTag),\n\t\tvalue = checked ? this.checkboxChecked : this.checkboxUnchecked,\n\t\tnotValue = checked ? this.checkboxUnchecked : this.checkboxChecked;\n\tif(this.checkboxTag && this.checkboxInvertTag === \"yes\") {\n\t\ttagCheck = hasTag === checked;\n\t} else {\n\t\ttagCheck = hasTag !== checked;\n\t}\n\t// Set the tag if specified\n\tif(this.checkboxTag && (!tiddler || tagCheck)) {\n\t\tnewFields.tags = tiddler ? (tiddler.fields.tags || []).slice(0) : [];\n\t\tvar pos = newFields.tags.indexOf(this.checkboxTag);\n\t\tif(pos !== -1) {\n\t\t\tnewFields.tags.splice(pos,1);\n\t\t}\n\t\tif(this.checkboxInvertTag === \"yes\" && !checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t} else if(this.checkboxInvertTag !== \"yes\" && checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t}\n\t\thasChanged = true;\n\t}\n\t// Set the field if specified\n\tif(this.checkboxField) {\n\t\tif(!tiddler || tiddler.fields[this.checkboxField] !== value) {\n\t\t\tnewFields[this.checkboxField] = value;\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\t// Set the index if specified\n\tif(this.checkboxIndex) {\n\t\tvar indexValue = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxIndex);\n\t\tif(!tiddler || indexValue !== value) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\t// Set the list field (or index) if specified\n\tif(this.checkboxListField || this.checkboxListIndex) {\n\t\tvar fieldContents, listContents, oldPos, newPos;\n\t\tif(this.checkboxListField) {\n\t\t\tfieldContents = (tiddler ? tiddler.fields[this.checkboxListField] : undefined) || [];\n\t\t} else {\n\t\t\tfieldContents = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxListIndex);\n\t\t}\n\t\tif($tw.utils.isArray(fieldContents)) {\n\t\t\t// Make a copy so we can modify it without changing original that's refrenced elsewhere\n\t\t\tlistContents = fieldContents.slice(0);\n\t\t} else if(fieldContents === undefined) {\n\t\t\tlistContents = [];\n\t\t} else if(typeof fieldContents === \"string\") {\n\t\t\tlistContents = $tw.utils.parseStringArray(fieldContents);\n\t\t\t// No need to copy since parseStringArray returns a fresh array, not refrenced elsewhere\n\t\t} else {\n\t\t\t// Field was neither an array nor a string; it's probably something that shouldn't become\n\t\t\t// an array (such as a date field), so bail out *without* triggering actions\n\t\t\treturn;\n\t\t}\n\t\toldPos = notValue ? listContents.indexOf(notValue) : -1;\n\t\tnewPos = value ? listContents.indexOf(value) : -1;\n\t\tif(oldPos === -1 && newPos !== -1) {\n\t\t\t// old value absent, new value present: no change needed\n\t\t} else if(oldPos === -1) {\n\t\t\t// neither one was present\n\t\t\tif(value) {\n\t\t\t\tlistContents.push(value);\n\t\t\t\thasChanged = true;\n\t\t\t} else {\n\t\t\t\t// value unspecified? then leave list unchanged\n\t\t\t}\n\t\t} else if(newPos === -1) {\n\t\t\t// old value present, new value absent\n\t\t\tif(value) {\n\t\t\t\tlistContents[oldPos] = value;\n\t\t\t\thasChanged = true;\n\t\t\t} else {\n\t\t\t\tlistContents.splice(oldPos, 1)\n\t\t\t\thasChanged = true;\n\t\t\t}\n\t\t} else {\n\t\t\t// both were present: just remove the old one, leave new alone\n\t\t\tlistContents.splice(oldPos, 1)\n\t\t\thasChanged = true;\n\t\t}\n\t\tif(this.checkboxListField) {\n\t\t\tnewFields[this.checkboxListField] = $tw.utils.stringifyList(listContents);\n\t\t}\n\t\t// The listIndex case will be handled in the if(hasChanged) block below\n\t}\n\tif(hasChanged) {\n\t\tif(this.checkboxIndex) {\n\t\t\tthis.wiki.setText(this.checkboxTitle,\"\",this.checkboxIndex,value);\n\t\t} else if(this.checkboxListIndex) {\n\t\t\tvar listIndexValue = (listContents && listContents.length) ? $tw.utils.stringifyList(listContents) : undefined;\n\t\t\tthis.wiki.setText(this.checkboxTitle,\"\",this.checkboxListIndex,listIndexValue);\n\t\t} else {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));\n\t\t}\n\t}\n\t// Trigger actions\n\tif(this.checkboxActions) {\n\t\tthis.invokeActionString(this.checkboxActions,this,event);\n\t}\n\tif(this.checkboxCheckActions && checked) {\n\t\tthis.invokeActionString(this.checkboxCheckActions,this,event);\n\t}\n\tif(this.checkboxUncheckActions && !checked) {\n\t\tthis.invokeActionString(this.checkboxUncheckActions,this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCheckboxWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.checkboxActions = this.getAttribute(\"actions\");\n\tthis.checkboxCheckActions = this.getAttribute(\"checkactions\");\n\tthis.checkboxUncheckActions = this.getAttribute(\"uncheckactions\");\n\tthis.checkboxTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.checkboxTag = this.getAttribute(\"tag\");\n\tthis.checkboxField = this.getAttribute(\"field\");\n\tthis.checkboxIndex = this.getAttribute(\"index\");\n\tthis.checkboxListField = this.getAttribute(\"listField\");\n\tthis.checkboxListIndex = this.getAttribute(\"listIndex\");\n\tthis.checkboxFilter = this.getAttribute(\"filter\");\n\tthis.checkboxChecked = this.getAttribute(\"checked\");\n\tthis.checkboxUnchecked = this.getAttribute(\"unchecked\");\n\tthis.checkboxDefault = this.getAttribute(\"default\");\n\tthis.checkboxIndeterminate = this.getAttribute(\"indeterminate\",\"no\");\n\tthis.checkboxClass = this.getAttribute(\"class\",\"\");\n\tthis.checkboxInvertTag = this.getAttribute(\"invertTag\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCheckboxWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.invertTag || changedAttributes.field || changedAttributes.index || changedAttributes.listField || changedAttributes.listIndex || changedAttributes.filter || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\"default\"] || changedAttributes.indeterminate || changedAttributes[\"class\"] || changedAttributes.disabled) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.checkboxTitle]) {\n\t\t\tvar isChecked = this.getValue();\n\t\t\tthis.inputDomNode.checked = !!isChecked;\n\t\t\tthis.inputDomNode.indeterminate = (isChecked === undefined);\n\t\t\trefreshed = true;\n\t\t\tif(isChecked) {\n\t\t\t\t$tw.utils.addClass(this.labelDomNode,\"tc-checkbox-checked\");\n\t\t\t} else {\n\t\t\t\t$tw.utils.removeClass(this.labelDomNode,\"tc-checkbox-checked\");\n\t\t\t}\n\t\t}\n\t\tthis.assignAttributes(this.inputDomNode,{\n\t\t\tchangedAttributes: changedAttributes,\n\t\t\tsourcePrefix: \"data-\",\n\t\t\tdestPrefix: \"data-\"\n\t\t});\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.checkbox = CheckboxWidget;\n\n})();\n\t","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/codeblock.js":{"title":"$:/core/modules/widgets/codeblock.js","text":"/*\\\ntitle: $:/core/modules/widgets/codeblock.js\ntype: application/javascript\nmodule-type: widget\n\nCode block node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CodeBlockWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCodeBlockWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCodeBlockWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar codeNode = this.document.createElement(\"code\"),\n\t\tdomNode = this.document.createElement(\"pre\");\n\tcodeNode.appendChild(this.document.createTextNode(this.getAttribute(\"code\")));\n\tdomNode.appendChild(codeNode);\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCodeBlockWidget.prototype.execute = function() {\n\tthis.language = this.getAttribute(\"language\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCodeBlockWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.code || changedAttributes.language) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.codeblock = CodeBlockWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/count.js":{"title":"$:/core/modules/widgets/count.js","text":"/*\\\ntitle: $:/core/modules/widgets/count.js\ntype: application/javascript\nmodule-type: widget\n\nCount widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CountWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCountWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCountWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.currentCount);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCountWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Execute the filter\n\tif(this.filter) {\n\t\tthis.currentCount = this.wiki.filterTiddlers(this.filter,this).length;\n\t} else {\n\t\tthis.currentCount = \"0\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCountWidget.prototype.refresh = function(changedTiddlers) {\n\t// Re-execute the filter to get the count\n\tthis.computeAttributes();\n\tvar oldCount = this.currentCount;\n\tthis.execute();\n\tif(this.currentCount !== oldCount) {\n\t\t// Regenerate and rerender the widget and replace the existing DOM node\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n\n};\n\nexports.count = CountWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/data.js":{"title":"$:/core/modules/widgets/data.js","text":"/*\\\ntitle: $:/core/modules/widgets/data.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to dynamically represent one or more tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DataWidget = function(parseTreeNode,options) {\n\tthis.dataWidgetTag = parseTreeNode.type;\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDataWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDataWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.dataPayload = this.computeDataTiddlerValues(); // Array of $tw.Tiddler objects\n\tthis.domNode = this.document.createTextNode(this.readDataTiddlerValuesAsJson());\n\tparent.insertBefore(this.domNode,nextSibling);\n\tthis.domNodes.push(this.domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nDataWidget.prototype.execute = function() {\n\t// Nothing to do here\n};\n\n/*\nRead the tiddler value(s) from a data widget as an array of tiddler field objects (not $tw.Tiddler objects)\n*/\nDataWidget.prototype.readDataTiddlerValues = function() {\n\tvar results = [];\n\t$tw.utils.each(this.dataPayload,function(tiddler,index) {\n\t\tresults.push(tiddler.getFieldStrings());\n\t});\n\treturn results;\n};\n\n/*\nRead the tiddler value(s) from a data widget as an array of tiddler field objects (not $tw.Tiddler objects)\n*/\nDataWidget.prototype.readDataTiddlerValuesAsJson = function() {\n\treturn JSON.stringify(this.readDataTiddlerValues(),null,4);\n};\n\n/*\nCompute list of tiddlers from a data widget\n*/\nDataWidget.prototype.computeDataTiddlerValues = function() {\n\tvar self = this;\n\t// Read any attributes not prefixed with $\n\tvar item = Object.create(null);\n\t$tw.utils.each(this.attributes,function(value,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\titem[name] = value;\t\n\t\t}\n\t});\n\t// Deal with $tiddler, $filter or $compound-tiddler attributes\n\tvar tiddlers = [],\n\t\tcompoundTiddlers,\n\t\ttitle;\n\tif(this.hasAttribute(\"$tiddler\")) {\n\t\ttitle = this.getAttribute(\"$tiddler\");\n\t\tif(title) {\n\t\t\tvar tiddler = this.wiki.getTiddler(title);\n\t\t\tif(tiddler) {\n\t\t\t\ttiddlers.push(tiddler);\n\t\t\t}\n\t\t}\n\t}\n\tif(this.hasAttribute(\"$filter\")) {\n\t\tvar filter = this.getAttribute(\"$filter\");\n\t\tif(filter) {\n\t\t\tvar titles = this.wiki.filterTiddlers(filter);\n\t\t\t$tw.utils.each(titles,function(title) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\tif(tiddler) {\n\t\t\t\t\ttiddlers.push(tiddler);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\tif(this.hasAttribute(\"$compound-tiddler\")) {\n\t\ttitle = this.getAttribute(\"$compound-tiddler\");\n\t\tif(title) {\n\t\t\ttiddlers.push.apply(tiddlers,this.extractCompoundTiddler(title));\n\t\t}\n\t}\n\tif(this.hasAttribute(\"$compound-filter\")) {\n\t\tfilter = this.getAttribute(\"$compound-filter\");\n\t\tif(filter) {\n\t\t\tcompoundTiddlers = this.wiki.filterTiddlers(filter);\n\t\t\t$tw.utils.each(compoundTiddlers, function(title){\n\t\t\t\ttiddlers.push.apply(tiddlers,self.extractCompoundTiddler(title));\n\t\t\t});\n\t\t}\n\t}\n\t// Return the literal item if none of the special attributes were used\n\tif(!this.hasAttribute(\"$tiddler\") && !this.hasAttribute(\"$filter\") && !this.hasAttribute(\"$compound-tiddler\") && !this.hasAttribute(\"$compound-filter\")) {\n\t\tif(Object.keys(item).length > 0 && !!item.title) {\n\t\t\treturn [new $tw.Tiddler(item)];\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t} else {\n\t\t// Apply the item fields to each of the tiddlers\n\t\tif(Object.keys(item).length > 0) {\n\t\t\t$tw.utils.each(tiddlers,function(tiddler,index) {\n\t\t\t\ttiddlers[index] = new $tw.Tiddler(tiddler,item);\n\t\t\t});\n\t\t}\n\t\treturn tiddlers;\n\t}\n};\n\n/*\nHelper to extract tiddlers from text/vnd.tiddlywiki-multiple tiddlers\n*/\nDataWidget.prototype.extractCompoundTiddler = function(title) {\n\tvar tiddler = this.wiki.getTiddler(title);\n\tif(tiddler && tiddler.fields.type === \"text/vnd.tiddlywiki-multiple\") {\n\t\tvar text = tiddler.fields.text || \"\",\n\t\t\trawTiddlers = text.split(/\\r?\\n\\+\\r?\\n/),\n\t\t\ttiddlers = [];\n\t\t$tw.utils.each(rawTiddlers,function(rawTiddler) {\n\t\t\tvar fields = Object.create(null),\n\t\t\t\tsplit = rawTiddler.split(/\\r?\\n\\r?\\n/mg);\n\t\t\tif(split.length >= 1) {\n\t\t\t\tfields = $tw.utils.parseFields(split[0],fields);\n\t\t\t}\n\t\t\tif(split.length >= 2) {\n\t\t\t\tfields.text = split.slice(1).join(\"\\n\\n\");\n\t\t\t}\n\t\t\ttiddlers.push(new $tw.Tiddler(fields));\n\t\t});\n\t\treturn tiddlers;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDataWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tvar newPayload = this.computeDataTiddlerValues();\n\tif(hasPayloadChanged(this.dataPayload,newPayload)) {\n\t\tthis.dataPayload = newPayload;\n\t\tthis.domNode.textContent = this.readDataTiddlerValuesAsJson();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nCompare two arrays of tiddlers and return true if they are different\n*/\nfunction hasPayloadChanged(a,b) {\n\tif(a.length === b.length) {\n\t\tfor(var t=0; t<a.length; t++) {\n\t\t\tif(!(a[t].isEqual(b[t]))) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t} else {\n\t\treturn true;\n\t}\n}\n\nexports.data = DataWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/diff-text.js":{"title":"$:/core/modules/widgets/diff-text.js","text":"/*\\\ntitle: $:/core/modules/widgets/diff-text.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display a diff between two texts\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget,\n\tdmp = require(\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\");\n\nvar DiffTextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDiffTextWidget.prototype = new Widget();\n\nDiffTextWidget.prototype.invisibleCharacters = {\n\t\"\\n\": \"↩︎\\n\",\n\t\"\\r\": \"⇠\",\n\t\"\\t\": \"⇥\\t\"\n};\n\n/*\nRender this widget into the DOM\n*/\nDiffTextWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create the diff\n\tvar dmpObject = new dmp.diff_match_patch(),\n\t\tdiffs = dmpObject.diff_main(this.getAttribute(\"source\",\"\"),this.getAttribute(\"dest\",\"\"));\n\t// Apply required cleanup\n\tswitch(this.getAttribute(\"cleanup\",\"semantic\")) {\n\t\tcase \"none\":\n\t\t\t// No cleanup\n\t\t\tbreak;\n\t\tcase \"efficiency\":\n\t\t\tdmpObject.diff_cleanupEfficiency(diffs);\n\t\t\tbreak;\n\t\tdefault: // case \"semantic\"\n\t\t\tdmpObject.diff_cleanupSemantic(diffs);\n\t\t\tbreak;\n\t}\n\t// Create the elements\n\tvar domContainer = this.document.createElement(\"div\"), \n\t\tdomDiff = this.createDiffDom(diffs);\n\tparent.insertBefore(domContainer,nextSibling);\n\t// Set variables\n\tthis.setVariable(\"diff-count\",diffs.reduce(function(acc,diff) {\n\t\tif(diff[0] !== dmp.DIFF_EQUAL) {\n\t\t\tacc++;\n\t\t}\n\t\treturn acc;\n\t},0).toString());\n\t// Render child widgets\n\tthis.renderChildren(domContainer,null);\n\t// Render the diff\n\tdomContainer.appendChild(domDiff);\n\t// Save our container\n\tthis.domNodes.push(domContainer);\n};\n\n/*\nCreate DOM elements representing a list of diffs\n*/\nDiffTextWidget.prototype.createDiffDom = function(diffs) {\n\tvar self = this;\n\t// Create the element and assign the attributes\n\tvar domPre = this.document.createElement(\"pre\"),\n\t\tdomCode = this.document.createElement(\"code\");\n\t$tw.utils.each(diffs,function(diff) {\n\t\tvar tag = diff[0] === dmp.DIFF_INSERT ? \"ins\" : (diff[0] === dmp.DIFF_DELETE ? \"del\" : \"span\"),\n\t\t\tclassName = diff[0] === dmp.DIFF_INSERT ? \"tc-diff-insert\" : (diff[0] === dmp.DIFF_DELETE ? \"tc-diff-delete\" : \"tc-diff-equal\"),\n\t\t\tdom = self.document.createElement(tag),\n\t\t\ttext = diff[1],\n\t\t\tcurrPos = 0,\n\t\t\tre = /([\\x00-\\x1F])/mg,\n\t\t\tmatch = re.exec(text),\n\t\t\tspan,\n\t\t\tprintable;\n\t\tdom.className = className;\n\t\twhile(match) {\n\t\t\tif(currPos < match.index) {\n\t\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos,match.index)));\n\t\t\t}\n\t\t\tspan = self.document.createElement(\"span\");\n\t\t\tspan.className = \"tc-diff-invisible\";\n\t\t\tprintable = self.invisibleCharacters[match[0]] || (\"[0x\" + match[0].charCodeAt(0).toString(16) + \"]\");\n\t\t\tspan.appendChild(self.document.createTextNode(printable));\n\t\t\tdom.appendChild(span);\n\t\t\tcurrPos = match.index + match[0].length;\n\t\t\tmatch = re.exec(text);\n\t\t}\n\t\tif(currPos < text.length) {\n\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos)));\n\t\t}\n\t\tdomCode.appendChild(dom);\n\t});\n\tdomPre.appendChild(domCode);\n\treturn domPre;\n};\n\n/*\nCompute the internal state of the widget\n*/\nDiffTextWidget.prototype.execute = function() {\n\t// Make child widgets\n\tvar parseTreeNodes;\n\tif(this.parseTreeNode && this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\tparseTreeNodes = this.parseTreeNode.children;\n\t} else {\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: \"$:/language/Diffs/CountMessage\"}\n\t\t\t}\n\t\t}];\n\t}\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDiffTextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.dest || changedAttributes.cleanup) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports[\"diff-text\"] = DiffTextWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/draggable.js":{"title":"$:/core/modules/widgets/draggable.js","text":"/*\\\ntitle: $:/core/modules/widgets/draggable.js\ntype: application/javascript\nmodule-type: widget\n\nDraggable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DraggableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDraggableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDraggableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this,\n\t\ttag,\n\t\tdomNode,\n\t\tclasses = [];\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Sanitise the specified tag\n\ttag = this.draggableTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"div\";\n\t}\n\t// Create our element\n\tdomNode = this.document.createElement(tag);\n\t// Assign classes\n\tif(this.draggableClasses) {\n\t\tclasses.push(this.draggableClasses);\n\t}\n\tif(!this.dragHandleSelector && this.dragEnable) {\n\t\tclasses.push(\"tc-draggable\");\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Assign data- attributes and style. attributes\n\tthis.assignAttributes(domNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\n\t// Insert the node into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\t// Add event handlers\n\tif(this.dragEnable) {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.getAttribute(\"tiddler\");},\n\t\t\tdragFilterFn: function() {return self.getAttribute(\"filter\");},\n\t\t\tstartActions: self.startActions,\n\t\t\tendActions: self.endActions,\n\t\t\tdragImageType: self.dragImageType,\n\t\t\twidget: this,\n\t\t\tselector: self.dragHandleSelector\n\t\t});\n\t}\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nDraggableWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.draggableTag = this.getAttribute(\"tag\",\"div\");\n\tthis.draggableClasses = this.getAttribute(\"class\");\n\tthis.startActions = this.getAttribute(\"startactions\");\n\tthis.endActions = this.getAttribute(\"endactions\");\n\tthis.dragImageType = this.getAttribute(\"dragimagetype\");\n\tthis.dragHandleSelector = this.getAttribute(\"selector\");\n\tthis.dragEnable = this.getAttribute(\"enable\",\"yes\") === \"yes\";\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n\nDraggableWidget.prototype.updateDomNodeClasses = function() {\n\tvar domNodeClasses = this.domNodes[0].className.split(\" \"),\n\t\toldClasses = this.draggableClasses.split(\" \");\n\tthis.draggableClasses = this.getAttribute(\"class\");\n\t//Remove classes assigned from the old value of class attribute\n\t$tw.utils.each(oldClasses,function(oldClass){\n\t\tvar i = domNodeClasses.indexOf(oldClass);\n\t\tif(i !== -1) {\n\t\t\tdomNodeClasses.splice(i,1);\n\t\t}\n\t});\n\t//Add new classes from updated class attribute.\n\t$tw.utils.pushTop(domNodeClasses,this.draggableClasses);\n\tthis.domNodes[0].setAttribute(\"class\",domNodeClasses.join(\" \"))\n}\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDraggableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes.selector || changedAttributes.dragimagetype || changedAttributes.enable || changedAttributes.startactions || changedAttributes.endactions) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tif(changedAttributes[\"class\"]) {\n\t\t\tthis.updateDomNodeClasses();\n\t\t}\n\t\tthis.assignAttributes(this.domNodes[0],{\n\t\t\tchangedAttributes: changedAttributes,\n\t\t\tsourcePrefix: \"data-\",\n\t\t\tdestPrefix: \"data-\"\n\t\t});\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.draggable = DraggableWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/droppable.js":{"title":"$:/core/modules/widgets/droppable.js","text":"/*\\\ntitle: $:/core/modules/widgets/droppable.js\ntype: application/javascript\nmodule-type: widget\n\nDroppable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DroppableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDroppableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDroppableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this,\n\t\ttag = this.parseTreeNode.isBlock ? \"div\" : \"span\",\n\t\tdomNode;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.droppableTag && $tw.config.htmlUnsafeElements.indexOf(this.droppableTag) === -1) {\n\t\ttag = this.droppableTag;\n\t}\n\t// Create element and assign classes\n\tdomNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\n\t// Assign data- attributes and style. attributes\n\tthis.assignAttributes(domNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\n\t// Add event handlers\n\tif(this.droppableEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"}\n\t\t]);\n\t} else {\n\t\t$tw.utils.addClass(this.domNode,this.disabledClass);\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDroppableWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDroppableWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally. The hacky second condition is to resolve a problem with Firefox whereby there is an erroneous dragenter event if the node being dragged is within the dropzone\n\tif(this.currentlyEntered.length === 0 || (this.currentlyEntered.length === 1 && this.currentlyEntered[0] === $tw.dragInProgress)) {\n\t\tthis.currentlyEntered = [];\n\t\tif(this.domNodes[0]) {\n\t\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t\t}\n\t}\n};\n\nDroppableWidget.prototype.handleDragEnterEvent  = function(event) {\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragOverEvent  = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\t// Set the drop effect\n\tevent.dataTransfer.dropEffect = this.droppableEffect;\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragLeaveEvent  = function(event) {\n\tthis.leaveDrag(event);\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDropEvent  = function(event) {\n\tvar self = this;\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\tvar dataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Try to import the various data types we understand\n\tif(this.droppableActions) {\n\t\t$tw.utils.importDataTransfer(dataTransfer,null,function(fieldsArray) {\n\t\t\tfieldsArray.forEach(function(fields) {\n\t\t\t\tself.performActions(fields.title || fields.text,event);\n\t\t\t});\n\t\t});\n\t}\n\t// Send a TitleList to performListActions\n\tif(this.droppableListActions) {\n\t\t$tw.utils.importDataTransfer(dataTransfer,null,function(fieldsArray) {\n\t\t\tvar titleList = [];\n\t\t\tfieldsArray.forEach(function(fields) {\n\t\t\t\ttitleList.push(fields.title || fields.text);\n\t\t\t});\n\t\t\tself.performListActions($tw.utils.stringifyList(titleList),event);\n\t\t});\n\t}\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.performListActions = function(titleList,event) {\n\tif(this.droppableListActions) {\n\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\tthis.invokeActionString(this.droppableListActions,this,event,{actionTiddlerList: titleList, modifier: modifierKey});\n\t}\n};\n\nDroppableWidget.prototype.performActions = function(title,event) {\n\tif(this.droppableActions) {\n\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\tthis.invokeActionString(this.droppableActions,this,event,{actionTiddler: title, modifier: modifierKey});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDroppableWidget.prototype.execute = function() {\n\tthis.droppableActions = this.getAttribute(\"actions\");\n\tthis.droppableListActions = this.getAttribute(\"listActions\");\n\tthis.droppableEffect = this.getAttribute(\"effect\",\"copy\");\n\tthis.droppableTag = this.getAttribute(\"tag\");\n\tthis.droppableEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\tthis.disabledClass = this.getAttribute(\"disabledClass\",\"\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nDroppableWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-droppable\");\n\tthis.domNode.className = classes.join(\" \");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDroppableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes.enable || changedAttributes.disabledClass ||\n\t\tchangedAttributes.actions|| changedAttributes.listActions || changedAttributes.effect) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tif(changedAttributes[\"class\"]) {\n\t\t\tthis.assignDomNodeClasses();\n\t\t}\n\t\tthis.assignAttributes(this.domNodes[0],{\n\t\t\tchangedAttributes: changedAttributes,\n\t\t\tsourcePrefix: \"data-\",\n\t\t\tdestPrefix: \"data-\"\n\t\t});\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.droppable = DroppableWidget;\n\n})();","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/dropzone.js":{"title":"$:/core/modules/widgets/dropzone.js","text":"/*\\\ntitle: $:/core/modules/widgets/dropzone.js\ntype: application/javascript\nmodule-type: widget\n\nDropzone widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DropZoneWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDropZoneWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDropZoneWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\tthis.domNode = domNode;\n\tdomNode.className = this.dropzoneClass || \"tc-dropzone\";\n\t// Add event handlers\n\tif(this.dropzoneEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"},\n\t\t\t{name: \"paste\", handlerObject: this, handlerMethod: \"handlePasteEvent\"},\n\t\t\t{name: \"dragend\", handlerObject: this, handlerMethod: \"handleDragEndEvent\"}\n\t\t]);\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\n// Handler for transient event listeners added when the dropzone has an active drag in progress\nDropZoneWidget.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\tif(this.currentlyEntered.length) {\n\t\t\tthis.resetState();\n\t\t}\n\t} else if(event.type === \"dragenter\") {\n\t\tif(event.target && event.target !== this.domNode && !$tw.utils.domContains(this.domNode,event.target)) {\n\t\t\tthis.resetState();\n\t\t}\n\t} else if(event.type === \"dragleave\") {\n\t\t// Check if drag left the window\n\t\tif(event.relatedTarget === null || (event.relatedTarget && event.relatedTarget.nodeName === \"HTML\")) {\n\t\t\tthis.resetState();\n\t\t}\n\t}\n};\n\n// Reset the state of the dropzone after a drag has ended\nDropZoneWidget.prototype.resetState = function() {\n\t$tw.utils.removeClass(this.domNode,\"tc-dragover\");\n\tthis.currentlyEntered = [];\n\tthis.document.body.removeEventListener(\"click\",this,true);\n\tthis.document.body.removeEventListener(\"dragenter\",this,true);\n\tthis.document.body.removeEventListener(\"dragleave\",this,true);\n\tthis.dragInProgress = false;\n};\n\nDropZoneWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\tif(!this.dragInProgress) {\n\t\tthis.dragInProgress = true;\n\t\t// If we're entering for the first time we need to apply highlighting\n\t\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n\t\tthis.document.body.addEventListener(\"click\",this,true);\n\t\tthis.document.body.addEventListener(\"dragenter\",this,true);\n\t\tthis.document.body.addEventListener(\"dragleave\",this,true);\n\t}\n};\n\nDropZoneWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally\n\tif(this.currentlyEntered.length === 0) {\n\t\tthis.resetState();\n\t}\n};\n\nDropZoneWidget.prototype.handleDragEnterEvent  = function(event) {\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tif(this.filesOnly && !$tw.utils.dragEventContainsFiles(event)) {\n\t\treturn false;\n\t}\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handleDragOverEvent  = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\t// Check if this is a synthetic event, IE does not allow accessing dropEffect outside of original event handler\n\tif(event.isTrusted) {\n\t\tevent.dataTransfer.dropEffect = \"copy\"; // Explicitly show this is a copy\n\t}\n};\n\nDropZoneWidget.prototype.handleDragLeaveEvent  = function(event) {\n\tthis.leaveDrag(event);\n};\n\nDropZoneWidget.prototype.handleDragEndEvent = function(event) {\n\tthis.resetState();\n};\n\nDropZoneWidget.prototype.filterByContentTypes = function(tiddlerFieldsArray) {\n\tvar filteredTypes,\n\t\tfiltered = [],\n\t\ttypes = [];\n\t$tw.utils.each(tiddlerFieldsArray,function(tiddlerFields) {\n\t\ttypes.push(tiddlerFields.type || \"\");\n\t});\n\tfilteredTypes = this.wiki.filterTiddlers(this.contentTypesFilter,this,this.wiki.makeTiddlerIterator(types));\n\t$tw.utils.each(tiddlerFieldsArray,function(tiddlerFields) {\n\t\tif(filteredTypes.indexOf(tiddlerFields.type) !== -1) {\n\t\t\tfiltered.push(tiddlerFields);\n\t\t}\n\t});\n\treturn filtered;\n};\n\nDropZoneWidget.prototype.readFileCallback = function(tiddlerFieldsArray) {\n\tif(this.contentTypesFilter) {\n\t\ttiddlerFieldsArray = this.filterByContentTypes(tiddlerFieldsArray);\n\t}\n\tif(tiddlerFieldsArray.length) {\n\t\tthis.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: this.autoOpenOnImport, importTitle: this.importTitle});\n\t\tif(this.actions) {\n\t\t\tthis.invokeActionString(this.actions,this,event,{importTitle: this.importTitle});\n\t\t}\n\t}\n};\n\nDropZoneWidget.prototype.handleDropEvent  = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.readFileCallback(tiddlerFieldsArray);\n\t\t};\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\tthis.resetState();\n\t// Import any files in the drop\n\tvar numFiles = 0;\n\t// If we have type text/vnd.tiddlywiki then skip trying to import files\n\tif(dataTransfer.files && !$tw.utils.dragEventContainsType(event,\"text/vnd.tiddler\")) {\n\t\tnumFiles = this.wiki.readFiles(dataTransfer.files,{\n\t\t\tcallback: readFileCallback,\n\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t});\n\t}\n\t// Try to import the various data types we understand\n\tif(numFiles === 0) {\n\t\tvar fallbackTitle = self.wiki.generateNewTitle(\"Untitled\");\n\t\t//Use the deserializer specified if any\n\t\tif(this.dropzoneDeserializer) {\n\t\t\tfor(var t= 0; t<dataTransfer.items.length; t++) {\n\t\t\t\tvar item = dataTransfer.items[t];\n\t\t\t\tif(item.kind === \"string\") {\n\t\t\t\t\titem.getAsString(function(str){\n\t\t\t\t\t\tvar tiddlerFields = self.wiki.deserializeTiddlers(null,str,{title: fallbackTitle},{deserializer:self.dropzoneDeserializer});\n\t\t\t\t\t\tif(tiddlerFields && tiddlerFields.length) {\n\t\t\t\t\t\t\treadFileCallback(tiddlerFields);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t$tw.utils.importDataTransfer(dataTransfer,fallbackTitle,readFileCallback);\n\t\t}\n\t}\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handlePasteEvent  = function(event) {\n\tvar self = this;\n\tvar\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.readFileCallback(tiddlerFieldsArray);\n\t\t};\n\tvar getItem = function(type) {\n\t\t\ttype = type || \"text/plain\";\n\t\t\treturn function(str) {\n\t\t\t\t// Use the deserializer specified if any\n\t\t\t\tif(self.dropzoneDeserializer) {\n\t\t\t\t\ttiddlerFields = self.wiki.deserializeTiddlers(null,str,{title: self.wiki.generateNewTitle(\"Untitled \" + type)},{deserializer:self.dropzoneDeserializer});\n\t\t\t\t\tif(tiddlerFields && tiddlerFields.length) {\n\t\t\t\t\t\treadFileCallback(tiddlerFields);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttiddlerFields = {\n\t\t\t\t\t\ttitle: self.wiki.generateNewTitle(\"Untitled \" + type),\n\t\t\t\t\t\ttext: str,\n\t\t\t\t\t\ttype: type\n\t\t\t\t\t};\n\t\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\t\tconsole.log(\"Importing string '\" + str + \"', type: '\" + type + \"'\");\n\t\t\t\t\t}\n\t\t\t\t\treadFileCallback([tiddlerFields]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Let the browser handle it if we're in a textarea or input box\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) == -1 && !event.target.isContentEditable && !event.twEditor) {\n\t\tvar self = this,\n\t\t\titems = event.clipboardData.items;\n\t\t// Enumerate the clipboard items\n\t\tfor(var t = 0; t<items.length; t++) {\n\t\t\tvar item = items[t];\n\t\t\tif(item.kind === \"file\") {\n\t\t\t\t// Import any files\n\t\t\t\tthis.wiki.readFile(item.getAsFile(),{\n\t\t\t\t\tcallback: readFileCallback,\n\t\t\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t\t\t});\n\t\t\t} else if(item.kind === \"string\" && ![\"text/html\", \"text/plain\", \"Text\"].includes(item.type) && $tw.utils.itemHasValidDataType(item)) {\n\t\t\t\t// Try to import the various data types we understand\n\t\t\t\tvar fallbackTitle = self.wiki.generateNewTitle(\"Untitled\");\n\t\t\t\t//Use the deserializer specified if any\n\t\t\t\tif(this.dropzoneDeserializer) {\n\t\t\t\t\titem.getAsString(function(str){\n\t\t\t\t\t\tvar tiddlerFields = self.wiki.deserializeTiddlers(null,str,{title: fallbackTitle},{deserializer:self.dropzoneDeserializer});\n\t\t\t\t\t\tif(tiddlerFields && tiddlerFields.length) {\n\t\t\t\t\t\t\treadFileCallback(tiddlerFields);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t$tw.utils.importPaste(item,fallbackTitle,readFileCallback);\n\t\t\t\t}\n\t\t\t} else if(item.kind === \"string\") {\n\t\t\t\t// Create tiddlers from string items\n\t\t\t\tvar tiddlerFields;\n\t\t\t\t// It's important to give getAsString a closure with the right type\n\t\t\t\t// So it can be added to the import queue\n\t\t\t\titem.getAsString(getItem(item.type));\n\t\t\t}\n\t\t}\n\t\t// Tell the browser that we've handled the paste\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDropZoneWidget.prototype.execute = function() {\n\tthis.dropzoneClass = this.getAttribute(\"class\");\n\tthis.dropzoneDeserializer = this.getAttribute(\"deserializer\");\n\tthis.dropzoneEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\tthis.autoOpenOnImport = this.getAttribute(\"autoOpenOnImport\");\n\tthis.importTitle = this.getAttribute(\"importTitle\",IMPORT_TITLE);\n\tthis.actions = this.getAttribute(\"actions\");\n\tthis.contentTypesFilter = this.getAttribute(\"contentTypesFilter\");\n\tthis.filesOnly = this.getAttribute(\"filesOnly\",\"no\") === \"yes\";\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDropZoneWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.dropzone = DropZoneWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/edit-binary.js":{"title":"$:/core/modules/widgets/edit-binary.js","text":"/*\\\ntitle: $:/core/modules/widgets/edit-binary.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-binary widget; placeholder for editing binary tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBinaryWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBinaryWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBinaryWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBinaryWidget.prototype.execute = function() {\n\t// Get our parameters\n\tvar editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tvar tiddler = this.wiki.getTiddler(editTitle);\n\tvar type = tiddler.fields.type;\n\tvar text = tiddler.fields.text;\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on draft tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!draft.title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!draft.title\"}\n\t\t},\n\t\tchildren: [{\n\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to internal data URI (no external)\n\tif(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets([element]);\n};\n\n/*\nRefresh by refreshing our child widget\n*/\nEditBinaryWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"edit-binary\"] = EditBinaryWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/edit-bitmap.js":{"title":"$:/core/modules/widgets/edit-bitmap.js","text":"/*\\\ntitle: $:/core/modules/widgets/edit-bitmap.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-bitmap widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Default image sizes\nvar DEFAULT_IMAGE_WIDTH = 600,\n\tDEFAULT_IMAGE_HEIGHT = 370,\n\tDEFAULT_IMAGE_TYPE = \"image/png\";\n\n// Configuration tiddlers\nvar LINE_WIDTH_TITLE = \"$:/config/BitmapEditor/LineWidth\",\n\tLINE_COLOUR_TITLE = \"$:/config/BitmapEditor/Colour\",\n\tLINE_OPACITY_TITLE = \"$:/config/BitmapEditor/Opacity\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBitmapWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBitmapWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBitmapWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Initialise the editor operations if they've not been done already\n\tif(!this.editorOperations) {\n\t\tEditBitmapWidget.prototype.editorOperations = {};\n\t\t$tw.modules.applyMethods(\"bitmapeditoroperation\",this.editorOperations);\n\t}\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create the wrapper for the toolbar and render its content\n\tthis.toolbarNode = this.document.createElement(\"div\");\n\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\tparent.insertBefore(this.toolbarNode,nextSibling);\n\tthis.domNodes.push(this.toolbarNode);\n\t// Create the on-screen canvas\n\tthis.canvasDomNode = $tw.utils.domMaker(\"canvas\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor\",\n\t\teventListeners: [{\n\t\t\tname: \"touchstart\", handlerObject: this, handlerMethod: \"handleTouchStartEvent\"\n\t\t},{\n\t\t\tname: \"touchmove\", handlerObject: this, handlerMethod: \"handleTouchMoveEvent\"\n\t\t},{\n\t\t\tname: \"touchend\", handlerObject: this, handlerMethod: \"handleTouchEndEvent\"\n\t\t},{\n\t\t\tname: \"mousedown\", handlerObject: this, handlerMethod: \"handleMouseDownEvent\"\n\t\t},{\n\t\t\tname: \"mousemove\", handlerObject: this, handlerMethod: \"handleMouseMoveEvent\"\n\t\t},{\n\t\t\tname: \"mouseup\", handlerObject: this, handlerMethod: \"handleMouseUpEvent\"\n\t\t}]\n\t});\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Render toolbar child widgets\n\tthis.renderChildren(this.toolbarNode,null);\n\t// // Insert the elements into the DOM\n\tparent.insertBefore(this.canvasDomNode,nextSibling);\n\tthis.domNodes.push(this.canvasDomNode);\n\t// Load the image into the canvas\n\tif($tw.browser) {\n\t\tthis.loadCanvas();\n\t}\n\t// Add widget message listeners\n\tthis.addEventListeners([\n\t\t{type: \"tm-edit-bitmap-operation\", handler: \"handleEditBitmapOperationMessage\"}\n\t]);\n};\n\n/*\nHandle an edit bitmap operation message from the toolbar\n*/\nEditBitmapWidget.prototype.handleEditBitmapOperationMessage = function(event) {\n\t// Invoke the handler\n\tvar handler = this.editorOperations[event.param];\n\tif(handler) {\n\t\thandler.call(this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBitmapWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nJust refresh the toolbar\n*/\nEditBitmapWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nSet the bitmap size variables and refresh the toolbar\n*/\nEditBitmapWidget.prototype.refreshToolbar = function() {\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Refresh each of our child widgets\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\tchildWidget.refreshSelf();\n\t});\n};\n\nEditBitmapWidget.prototype.loadCanvas = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle),\n\t\tcurrImage = new Image();\n\t// Set up event handlers for loading the image\n\tvar self = this;\n\tcurrImage.onload = function() {\n\t\t// Copy the image to the on-screen canvas\n\t\tself.initCanvas(self.canvasDomNode,currImage.width,currImage.height,currImage);\n\t\t// And also copy the current bitmap to the off-screen canvas\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,currImage.width,currImage.height,currImage);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\tcurrImage.onerror = function() {\n\t\t// Set the on-screen canvas size and clear it\n\t\tself.initCanvas(self.canvasDomNode,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the off-screen canvas size and clear it\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\t// Get the current bitmap into an image object\n\tif(tiddler && tiddler.fields.type && tiddler.fields.text) {\n\t\tcurrImage.src = \"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text;\n\t} else {\n\t\tcurrImage.width = DEFAULT_IMAGE_WIDTH;\n\t\tcurrImage.height = DEFAULT_IMAGE_HEIGHT;\n\t\tcurrImage.onerror();\n\t}\n};\n\nEditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) {\n\tcanvas.width = width;\n\tcanvas.height = height;\n\tvar ctx = canvas.getContext(\"2d\");\n\tif(image) {\n\t\tctx.drawImage(image,0,0);\n\t} else {\n\t\tctx.fillStyle = \"#fff\";\n\t\tctx.fillRect(0,0,canvas.width,canvas.height);\n\t}\n};\n\n/*\n** Change the size of the canvas, preserving the current image\n*/\nEditBitmapWidget.prototype.changeCanvasSize = function(newWidth,newHeight) {\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\");\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\n/*\n** Rotate the canvas left by 90 degrees\n*/\nEditBitmapWidget.prototype.rotateCanvasLeft = function() {\n\t// Get the current size of the image\n\tvar origWidth = this.currCanvas.width,\n\t\torigHeight = this.currCanvas.height;\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\"),\n\t\tnewWidth = origHeight,\n\t\tnewHeight = origWidth;\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.save();\n\tctx.translate(newWidth / 2,newHeight / 2);\n\tctx.rotate(-Math.PI / 2);\n\tctx.drawImage(this.currCanvas,-origWidth / 2,-origHeight / 2);\n\tctx.restore();\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\nEditBitmapWidget.prototype.handleTouchStartEvent = function(event) {\n\tthis.brushDown = true;\n\tthis.strokeStart(event.touches[0].clientX,event.touches[0].clientY);\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.touches[0].clientX,event.touches[0].clientY);\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchEndEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.strokeStart(event.clientX,event.clientY);\n\tthis.brushDown = true;\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.clientX,event.clientY);\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.handleMouseUpEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.adjustCoordinates = function(x,y) {\n\tvar canvasRect = this.canvasDomNode.getBoundingClientRect(),\n\t\tscale = this.canvasDomNode.width/canvasRect.width;\n\treturn {x: (x - canvasRect.left) * scale, y: (y - canvasRect.top) * scale};\n};\n\nEditBitmapWidget.prototype.strokeStart = function(x,y) {\n\t// Start off a new stroke\n\tthis.stroke = [this.adjustCoordinates(x,y)];\n};\n\nEditBitmapWidget.prototype.strokeMove = function(x,y) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\"),\n\t\tt;\n\t// Add the new position to the end of the stroke\n\tthis.stroke.push(this.adjustCoordinates(x,y));\n\t// Redraw the previous image\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Render the stroke\n\tctx.globalAlpha = parseFloat(this.wiki.getTiddlerText(LINE_OPACITY_TITLE,\"1.0\"));\n\tctx.strokeStyle = this.wiki.getTiddlerText(LINE_COLOUR_TITLE,\"#ff0\");\n\tctx.lineWidth = parseFloat(this.wiki.getTiddlerText(LINE_WIDTH_TITLE,\"3\"));\n\tctx.lineCap = \"round\";\n\tctx.lineJoin = \"round\";\n\tctx.beginPath();\n\tctx.moveTo(this.stroke[0].x,this.stroke[0].y);\n\tfor(t=1; t<this.stroke.length-1; t++) {\n\t\tvar s1 = this.stroke[t],\n\t\t\ts2 = this.stroke[t-1],\n\t\t\ttx = (s1.x + s2.x)/2,\n\t\t\tty = (s1.y + s2.y)/2;\n\t\tctx.quadraticCurveTo(s2.x,s2.y,tx,ty);\n\t}\n\tctx.stroke();\n};\n\nEditBitmapWidget.prototype.strokeEnd = function() {\n\t// Copy the bitmap to the off-screen canvas\n\tvar ctx = this.currCanvas.getContext(\"2d\");\n\tctx.drawImage(this.canvasDomNode,0,0);\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\nEditBitmapWidget.prototype.saveChanges = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle) || new $tw.Tiddler({title: this.editTitle,type: DEFAULT_IMAGE_TYPE});\n\t// data URIs look like \"data:<type>;base64,<text>\"\n\tvar dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type),\n\t\tposColon = dataURL.indexOf(\":\"),\n\t\tposSemiColon = dataURL.indexOf(\";\"),\n\t\tposComma = dataURL.indexOf(\",\"),\n\t\ttype = dataURL.substring(posColon+1,posSemiColon),\n\t\ttext = dataURL.substring(posComma+1);\n\tvar update = {type: type, text: text};\n\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getModificationFields(),tiddler,update,this.wiki.getCreationFields()));\n};\n\nexports[\"edit-bitmap\"] = EditBitmapWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/edit-shortcut.js":{"title":"$:/core/modules/widgets/edit-shortcut.js","text":"/*\\\ntitle: $:/core/modules/widgets/edit-shortcut.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display an editable keyboard shortcut\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditShortcutWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditShortcutWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditShortcutWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.inputNode = this.document.createElement(\"input\");\n\t// Assign classes\n\tif(this.shortcutClass) {\n\t\tthis.inputNode.className = this.shortcutClass;\n\t}\n\t// Assign other attributes\n\tif(this.shortcutStyle) {\n\t\tthis.inputNode.setAttribute(\"style\",this.shortcutStyle);\n\t}\n\tif(this.shortcutTooltip) {\n\t\tthis.inputNode.setAttribute(\"title\",this.shortcutTooltip);\n\t}\n\tif(this.shortcutPlaceholder) {\n\t\tthis.inputNode.setAttribute(\"placeholder\",this.shortcutPlaceholder);\n\t}\n\tif(this.shortcutAriaLabel) {\n\t\tthis.inputNode.setAttribute(\"aria-label\",this.shortcutAriaLabel);\n\t}\n\t// Assign the current shortcut\n\tthis.updateInputNode();\n\t// Add event handlers\n\t$tw.utils.addEventListeners(this.inputNode,[\n\t\t{name: \"keydown\", handlerObject: this, handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Link into the DOM\n\tparent.insertBefore(this.inputNode,nextSibling);\n\tthis.domNodes.push(this.inputNode);\n\t// Focus the input Node if focus === \"yes\" or focus === \"true\"\n\tif(this.shortcutFocus === \"yes\" || this.shortcutFocus === \"true\") {\n\t\tthis.focus();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditShortcutWidget.prototype.execute = function() {\n\tthis.shortcutTiddler = this.getAttribute(\"tiddler\");\n\tthis.shortcutField = this.getAttribute(\"field\");\n\tthis.shortcutIndex = this.getAttribute(\"index\");\n\tthis.shortcutPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.shortcutDefault = this.getAttribute(\"default\",\"\");\n\tthis.shortcutClass = this.getAttribute(\"class\");\n\tthis.shortcutStyle = this.getAttribute(\"style\");\n\tthis.shortcutTooltip = this.getAttribute(\"tooltip\");\n\tthis.shortcutAriaLabel = this.getAttribute(\"aria-label\");\n\tthis.shortcutFocus = this.getAttribute(\"focus\");\n};\n\n/*\nUpdate the value of the input node\n*/\nEditShortcutWidget.prototype.updateInputNode = function() {\n\tif(this.shortcutField) {\n\t\tvar tiddler = this.wiki.getTiddler(this.shortcutTiddler);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,this.shortcutField)) {\n\t\t\tthis.inputNode.value = tiddler.getFieldString(this.shortcutField);\n\t\t} else {\n\t\t\tthis.inputNode.value = this.shortcutDefault;\n\t\t}\n\t} else if(this.shortcutIndex) {\n\t\tthis.inputNode.value = this.wiki.extractTiddlerDataItem(this.shortcutTiddler,this.shortcutIndex,this.shortcutDefault);\n\t} else {\n\t\tthis.inputNode.value = this.wiki.getTiddlerText(this.shortcutTiddler,this.shortcutDefault);\n\t}\n};\n\n/*\nHandle a dom \"keydown\" event\n*/\nEditShortcutWidget.prototype.handleKeydownEvent = function(event) {\n\t// Ignore shift, ctrl, meta, alt\n\tif(event.keyCode && $tw.keyboardManager.getModifierKeys().indexOf(event.keyCode) === -1) {\n\t\t// Get the shortcut text representation\n\t\tvar value = $tw.keyboardManager.getPrintableShortcuts([{\n\t\t\tctrlKey: event.ctrlKey,\n\t\t\tshiftKey: event.shiftKey,\n\t\t\taltKey: event.altKey,\n\t\t\tmetaKey: event.metaKey,\n\t\t\tkeyCode: event.keyCode\n\t\t}]);\n\t\tif(value.length > 0) {\n\t\t\tthis.wiki.setText(this.shortcutTiddler,this.shortcutField,this.shortcutIndex,value[0]);\n\t\t}\n\t\t// Ignore the keydown if it was already handled\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nfocus the input node\n*/\nEditShortcutWidget.prototype.focus = function() {\n\tif(this.inputNode.focus && this.inputNode.select) {\n\t\tthis.inputNode.focus();\n\t\tthis.inputNode.select();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget needed re-rendering\n*/\nEditShortcutWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.placeholder || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.style || changedAttributes.tooltip || changedAttributes[\"aria-label\"] || changedAttributes.focus) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.shortcutTiddler]) {\n\t\tthis.updateInputNode();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports[\"edit-shortcut\"] = EditShortcutWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/edit-text.js":{"title":"$:/core/modules/widgets/edit-text.js","text":"/*\\\ntitle: $:/core/modules/widgets/edit-text.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tFramedEngine = require(\"$:/core/modules/editor/engines/framed.js\").FramedEngine,\n\tSimpleEngine = require(\"$:/core/modules/editor/engines/simple.js\").SimpleEngine;\n\nexports[\"edit-text\"] = editTextWidgetFactory(FramedEngine,SimpleEngine);\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/edit.js":{"title":"$:/core/modules/widgets/edit.js","text":"/*\\\ntitle: $:/core/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\nEdit widget is a meta-widget chooses the appropriate actual editting widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n// Mappings from content type to editor type are stored in tiddlers with this prefix\nvar EDITOR_MAPPING_PREFIX = \"$:/config/EditorTypeMappings/\";\n\n/*\nCompute the internal state of the widget\n*/\nEditWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\tthis.editFocus = this.getAttribute(\"focus\",\"\");\n\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"\");\n\tthis.editInputActions = this.getAttribute(\"inputActions\");\n\tthis.editRefreshTitle = this.getAttribute(\"refreshTitle\");\n\tthis.editAutoComplete = this.getAttribute(\"autocomplete\");\n\t// Choose the appropriate edit widget\n\tthis.editorType = this.getEditorType();\n\t// Make the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"edit-\" + this.editorType,\n\t\tattributes: this.parseTreeNode.attributes,\n\t\tchildren: this.parseTreeNode.children\n\t}]);\n};\n\nEditWidget.prototype.getEditorType = function() {\n\t// Get the content type of the thing we're editing\n\tvar type;\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\ttype = tiddler.fields.type;\n\t\t}\n\t}\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar editorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\n\tif(!editorType) {\n\t\tvar typeInfo = $tw.config.contentTypeInfo[type];\n\t\tif(typeInfo && typeInfo.encoding === \"base64\") {\n\t\t\teditorType = \"binary\";\n\t\t} else {\n\t\t\teditorType = \"text\";\n\t\t}\n\t}\n\treturn editorType;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the type associated with the target tiddler has changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || (this.getEditorType() !== this.editorType)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.edit = EditWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/element.js":{"title":"$:/core/modules/widgets/element.js","text":"/*\\\ntitle: $:/core/modules/widgets/element.js\ntype: application/javascript\nmodule-type: widget\n\nElement widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ElementWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nElementWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nElementWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\t// Neuter blacklisted elements\n\tthis.tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(this.tag) !== -1) {\n\t\tthis.tag = \"safe-\" + this.tag;\n\t}\n\t// Restrict tag name to digits, letts and dashes\n\tthis.tag = this.tag.replace(/[^0-9a-zA-Z\\-]/mg,\"\");\n\t// Default to a span\n\tthis.tag = this.tag || \"span\";\n\t// Adjust headings by the current base level\n\tvar headingLevel = [\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"].indexOf(this.tag);\n\tif(headingLevel !== -1) {\n\t\tvar baseLevel = parseInt(this.getVariable(\"tv-adjust-heading-level\",\"0\"),10) || 0;\n\t\theadingLevel = Math.min(Math.max(headingLevel + 1 + baseLevel,1),6);\n\t\tthis.tag = \"h\" + headingLevel;\n\t}\n\t// Select the namespace for the tag\n\tvar XHTML_NAMESPACE = \"http://www.w3.org/1999/xhtml\",\n\t\ttagNamespaces = {\n\t\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\t\tmath: \"http://www.w3.org/1998/Math/MathML\",\n\t\t\tbody: XHTML_NAMESPACE\n\t\t};\n\tthis.namespace = tagNamespaces[this.tag];\n\tif(this.namespace) {\n\t\tthis.setVariable(\"namespace\",this.namespace);\n\t} else {\n\t\tif(this.hasAttribute(\"xmlns\")) {\n\t\t\tthis.namespace = this.getAttribute(\"xmlns\");\n\t\t\tthis.setVariable(\"namespace\",this.namespace);\n\t\t} else {\n\t\t\tthis.namespace = this.getVariable(\"namespace\",{defaultValue: XHTML_NAMESPACE});\n\t\t}\n\t}\n\t// Invoke the th-rendering-element hook\n\tvar parseTreeNodes = $tw.hooks.invokeHook(\"th-rendering-element\",null,this);\n\tthis.isReplaced = !!parseTreeNodes;\n\tif(parseTreeNodes) {\n\t\t// Use the parse tree nodes provided by the hook\n\t\tthis.makeChildWidgets(parseTreeNodes);\n\t\tthis.renderChildren(this.parentDomNode,null);\n\t\treturn;\n\t}\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n\t// Create the DOM node and render children\n\tvar domNode = this.document.createElementNS(this.namespace,this.tag);\n\tthis.assignAttributes(domNode,{excludeEventAttributes: true});\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nElementWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\thasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n\tif(hasChangedAttributes) {\n\t\tif(!this.isReplaced) {\n\t\t\t// Update our attributes\n\t\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\n\t\t} else {\n\t\t\t// If we were replaced then completely refresh ourselves\n\t\t\treturn this.refreshSelf();\n\t\t}\n\t}\n\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\nexports.element = ElementWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/encrypt.js":{"title":"$:/core/modules/widgets/encrypt.js","text":"/*\\\ntitle: $:/core/modules/widgets/encrypt.js\ntype: application/javascript\nmodule-type: widget\n\nEncrypt widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EncryptWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEncryptWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEncryptWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.encryptedText);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEncryptWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\",\"[!is[system]]\");\n\t// Encrypt the filtered tiddlers\n\tvar tiddlers = this.wiki.filterTiddlers(this.filter),\n\t\tjson = {},\n\t\tself = this;\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title),\n\t\t\tjsonTiddler = {};\n\t\tfor(var f in tiddler.fields) {\n\t\t\tjsonTiddler[f] = tiddler.getFieldString(f);\n\t\t}\n\t\tjson[title] = jsonTiddler;\n\t});\n\tthis.encryptedText = $tw.utils.htmlEncode($tw.crypto.encrypt(JSON.stringify(json)));\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEncryptWidget.prototype.refresh = function(changedTiddlers) {\n\t// We don't need to worry about refreshing because the encrypt widget isn't for interactive use\n\treturn false;\n};\n\nexports.encrypt = EncryptWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/entity.js":{"title":"$:/core/modules/widgets/entity.js","text":"/*\\\ntitle: $:/core/modules/widgets/entity.js\ntype: application/javascript\nmodule-type: widget\n\nHTML entity widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EntityWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEntityWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEntityWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar entityString = this.getAttribute(\"entity\",this.parseTreeNode.entity || \"\"),\n\t\ttextNode = this.document.createTextNode($tw.utils.entityDecode(entityString));\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEntityWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEntityWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.entity) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.entity = EntityWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/error.js":{"title":"$:/core/modules/widgets/error.js","text":"/*\\\ntitle: $:/core/modules/widgets/error.js\ntype: application/javascript\nmodule-type: widget\n\nError widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ErrorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nErrorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nErrorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar message = this.getAttribute(\"$message\",\"Unknown error\"),\n\t\tdomNode = this.document.createElement(\"span\");\n\tdomNode.appendChild(this.document.createTextNode(message));\n\tdomNode.className = \"tc-error\";\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nErrorWidget.prototype.execute = function() {\n\t// Nothing to do for a text node\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nErrorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$message\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.error = ErrorWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/eventcatcher.js":{"title":"$:/core/modules/widgets/eventcatcher.js","text":"/*\\\ntitle: $:/core/modules/widgets/eventcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nEvent handler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EventWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEventWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEventWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.elementTag && $tw.config.htmlUnsafeElements.indexOf(this.elementTag) === -1) {\n\t\ttag = this.elementTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\t// Assign classes\n\tthis.assignDomNodeClasses();\n\t// Add our event handler\n\t$tw.utils.each(this.types,function(type) {\n\t\tdomNode.addEventListener(type,function(event) {\n\t\t\tvar selector = self.getAttribute(\"selector\"),\n\t\t\t\tmatchSelector = self.getAttribute(\"matchSelector\"),\n\t\t\t\tactions = self.getAttribute(\"$\"+type) || self.getAttribute(\"actions-\"+type),\n\t\t\t\tstopPropagation = self.getAttribute(\"stopPropagation\",\"onaction\"),\n\t\t\t\tselectedNode = event.target,\n\t\t\t\tselectedNodeRect,\n\t\t\t\tcatcherNodeRect,\n\t\t\t\tvariables = {};\n\t\t\t// Firefox can fire dragover and dragenter events on text nodes instead of their parents\n\t\t\tif(selectedNode.nodeType === 3) {\n\t\t\t\tselectedNode = selectedNode.parentNode;\n\t\t\t}\n\t\t\t// Check that the selected node matches any matchSelector\n\t\t\tif(matchSelector && !$tw.utils.domMatchesSelector(selectedNode,matchSelector)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif(selector) {\n\t\t\t\t// Search ancestors for a node that matches the selector\n\t\t\t\twhile(!$tw.utils.domMatchesSelector(selectedNode,selector) && selectedNode !== domNode) {\n\t\t\t\t\tselectedNode = selectedNode.parentNode;\n\t\t\t\t}\n\t\t\t\t// Exit if we didn't find one\n\t\t\t\tif(selectedNode === domNode) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Only set up variables if we have actions to invoke\n\t\t\t\tif(actions) {\n\t\t\t\t\tvariables = $tw.utils.collectDOMVariables(selectedNode,self.domNode,event);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Execute our actions with the variables\n\t\t\tif(actions) {\n\t\t\t\t// Add a variable for the modifier key\n\t\t\t\tvariables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\t\t// Add a variable for the mouse button\n\t\t\t\tif(\"button\" in event) {\n\t\t\t\t\tif(event.button === 0) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"left\";\n\t\t\t\t\t} else if(event.button === 1) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"middle\";\n\t\t\t\t\t} else if(event.button === 2) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"right\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvariables[\"event-type\"] = event.type.toString();\n\t\t\t\tif(typeof event.detail === \"object\" && !!event.detail) {\n\t\t\t\t\t$tw.utils.each(event.detail,function(detailValue,detail) {\n\t\t\t\t\t\tvariables[\"event-detail-\" + detail] = detailValue.toString();\n\t\t\t\t\t});\n\t\t\t\t} else if(!!event.detail) {\n\t\t\t\t\tvariables[\"event-detail\"] = event.detail.toString();\n\t\t\t\t}\n\t\t\t\tself.invokeActionString(actions,self,event,variables);\n\t\t\t}\n\t\t\tif((actions && stopPropagation === \"onaction\") || stopPropagation === \"always\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},false);\n\t});\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEventWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes that require a refresh on change\n\tthis.types = [];\n\t$tw.utils.each(this.attributes,function(value,key) {\n\t\tif(key.charAt(0) === \"$\") {\n\t\t\tself.types.push(key.slice(1));\n\t\t}\n\t});\n\tif(!this.types.length) {\n\t\tthis.types = this.getAttribute(\"events\",\"\").split(\" \");\n\t}\n\tthis.elementTag = this.getAttribute(\"tag\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nEventWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-eventcatcher\");\n\tthis.domNode.className = classes.join(\" \");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEventWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tchangedAttributesCount = $tw.utils.count(changedAttributes);\n\tif(changedAttributesCount === 1 && changedAttributes[\"class\"]) {\n\t\tthis.assignDomNodeClasses();\n\t} else if(changedAttributesCount > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.eventcatcher = EventWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/fieldmangler.js":{"title":"$:/core/modules/widgets/fieldmangler.js","text":"/*\\\ntitle: $:/core/modules/widgets/fieldmangler.js\ntype: application/javascript\nmodule-type: widget\n\nField mangler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldManglerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.addEventListeners([\n\t\t{type: \"tm-remove-field\", handler: \"handleRemoveFieldEvent\"},\n\t\t{type: \"tm-add-field\", handler: \"handleAddFieldEvent\"},\n\t\t{type: \"tm-remove-tag\", handler: \"handleRemoveTagEvent\"},\n\t\t{type: \"tm-add-tag\", handler: \"handleAddTagEvent\"}\n\t]);\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nFieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tdeletion = {};\n\tdeletion[event.param] = undefined;\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion));\n\treturn false;\n};\n\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\taddition = this.wiki.getModificationFields(),\n\t\taddField = function(name,value) {\n\t\t\tvar trimmedName = name.trim();\n\t\t\tif(!value && tiddler) {\n\t\t\t\tvalue = tiddler.fields[trimmedName];\n\t\t\t}\n\t\t\taddition[trimmedName] = value || \"\";\n\t\t\treturn;\n\t\t};\n\taddition.title = this.mangleTitle;\n\tif(typeof event.param === \"string\") {\n\t\taddField(event.param,\"\");\n\t}\n\tif(typeof event.paramObject === \"object\") {\n\t\tfor(var name in event.paramObject) {\n\t\t\taddField(name,event.paramObject[name]);\n\t\t}\n\t}\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,addition));\n\treturn false;\n};\n\nFieldManglerWidget.prototype.handleRemoveTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && tiddler.fields.tags) {\n\t\tvar p = tiddler.fields.tags.indexOf(event.param);\n\t\tif(p !== -1) {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\tmodification.tags.splice(p,1);\n\t\t\tif(modification.tags.length === 0) {\n\t\t\t\tmodification.tags = undefined;\n\t\t\t}\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t}\n\t}\n\treturn false;\n};\n\nFieldManglerWidget.prototype.handleAddTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && typeof event.param === \"string\") {\n\t\tvar tag = event.param.trim();\n\t\tif(tag !== \"\") {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\t$tw.utils.pushTop(modification.tags,tag);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t}\n\t} else if(typeof event.param === \"string\" && event.param.trim() !== \"\" && this.mangleTitle.trim() !== \"\") {\n\t\tvar tag = [];\n\t\ttag.push(event.param.trim());\n\t\tthis.wiki.addTiddler(new $tw.Tiddler({title: this.mangleTitle, tags: tag},modification));\n\t}\n\treturn false;\n};\n\nexports.fieldmangler = FieldManglerWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/fields.js":{"title":"$:/core/modules/widgets/fields.js","text":"/*\\\ntitle: $:/core/modules/widgets/fields.js\ntype: application/javascript\nmodule-type: widget\n\nFields widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldsWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.template = this.getAttribute(\"template\");\n\tthis.sort = this.getAttribute(\"sort\",\"yes\") === \"yes\";\n\tthis.sortReverse = this.getAttribute(\"sortReverse\",\"no\") === \"yes\";\n\tthis.exclude = this.getAttribute(\"exclude\");\n\tthis.include = this.getAttribute(\"include\",null);\n\tthis.stripTitlePrefix = this.getAttribute(\"stripTitlePrefix\",\"no\") === \"yes\";\n\t// Get the value to display\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\n\t// Get the inclusion and exclusion list\n\tvar excludeArr = (this.exclude) ? this.exclude.split(\" \") : [\"text\"];\n\t// Include takes precedence\n\tvar includeArr = (this.include) ? this.include.split(\" \") : null;\n\n\t// Compose the template\n\tvar text = [];\n\tif(this.template && tiddler) {\n\t\tvar fields = [];\n\t\tif (includeArr) { // Include takes precedence\n\t\t\tfor(var i=0; i<includeArr.length; i++) {\n\t\t\t\tif(tiddler.fields[includeArr[i]]) {\n\t\t\t\t\tfields.push(includeArr[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor(var fieldName in tiddler.fields) {\n\t\t\t\tif(excludeArr.indexOf(fieldName) === -1) {\n\t\t\t\t\tfields.push(fieldName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.sort) fields.sort();\n\t\tif (this.sortReverse) fields.reverse();\n\t\tfor(var f=0, fmax=fields.length; f<fmax; f++) {\n\t\t\tfieldName = fields[f];\n\t\t\tvar row = this.template,\n\t\t\t\tvalue = tiddler.getFieldString(fieldName);\n\t\t\tif(this.stripTitlePrefix && fieldName === \"title\") {\n\t\t\t\tvar reStrip = /^\\{[^\\}]+\\}(.+)/mg,\n\t\t\t\t\treMatch = reStrip.exec(value);\n\t\t\t\tif(reMatch) {\n\t\t\t\t\tvalue = reMatch[1];\n\t\t\t\t}\n\t\t\t}\n\t\t\trow = $tw.utils.replaceString(row,\"$name$\",fieldName);\n\t\t\trow = $tw.utils.replaceString(row,\"$value$\",value);\n\t\t\trow = $tw.utils.replaceString(row,\"$encoded_value$\",$tw.utils.htmlEncode(value));\n\t\t\ttext.push(row);\n\t\t}\n\t}\n\tthis.text = text.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif( changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude ||\n\t\tchangedAttributes.include || changedAttributes.sort || changedAttributes.sortReverse ||\n\t\tchangedTiddlers[this.tiddlerTitle] || changedAttributes.stripTitlePrefix) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.fields = FieldsWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/fill.js":{"title":"$:/core/modules/widgets/fill.js","text":"/*\\\ntitle: $:/core/modules/widgets/fill.js\ntype: application/javascript\nmodule-type: widget\n\nSub-widget used by the transclude widget for specifying values for slots within transcluded content. It doesn't do anything by itself because the transclude widget only ever deals with the parse tree nodes, and doesn't instantiate the widget itself\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FillWidget = function(parseTreeNode,options) {\n\t// Initialise\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFillWidget.prototype = new Widget();\n\nexports.fill = FillWidget;\n\n})();\n\t","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/genesis.js":{"title":"$:/core/modules/widgets/genesis.js","text":"/*\\\ntitle: $:/core/modules/widgets/genesis.js\ntype: application/javascript\nmodule-type: widget\n\nGenesis widget for dynamically creating widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar GenesisWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nGenesisWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nGenesisWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes({filterFn: function(name) {\n\t\t// Only compute our own attributes which start with a single dollar\n\t\treturn name.charAt(0) === \"$\" && name.charAt(1) !== \"$\";\n\t}});\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nGenesisWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Collect attributes\n\tthis.genesisType = this.getAttribute(\"$type\");\n\tthis.genesisRemappable = this.getAttribute(\"$remappable\",\"yes\") === \"yes\";\n\tthis.genesisNames = this.getAttribute(\"$names\",\"\");\n\tthis.genesisValues = this.getAttribute(\"$values\",\"\");\n\tthis.genesisIsBlock = this.getAttribute(\"$mode\",this.parseTreeNode.isBlock && \"block\") === \"block\";\n\t// Do not create a child widget if the $type attribute is missing or blank\n\tif(!this.genesisType) {\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\treturn;\n\t}\n\t// Construct parse tree\n\tvar isElementWidget = this.genesisType.charAt(0) !== \"$\",\n\t\tnodeType = isElementWidget ? \"element\" : this.genesisType.substr(1),\n\t\tnodeTag = isElementWidget ? this.genesisType : undefined;\n\tvar parseTreeNodes = [{\n\t\ttype: nodeType,\n\t\ttag: nodeTag,\n\t\tattributes: {},\n\t\torderedAttributes: [],\n\t\tisBlock: this.genesisIsBlock,\n\t\tchildren: this.parseTreeNode.children || [],\n\t\tisNotRemappable: !this.genesisRemappable\n\t}];\n\t// Apply attributes in $names/$values\n\tthis.attributeNames = [];\n\tthis.attributeValues = [];\n\tif(this.genesisNames && this.genesisValues) {\n\t\tthis.attributeNames = this.wiki.filterTiddlers(self.genesisNames,this);\n\t\tthis.attributeValues = this.wiki.filterTiddlers(self.genesisValues,this);\n\t\t$tw.utils.each(this.attributeNames,function(varname,index) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],varname,self.attributeValues[index] || \"\");\n\t\t});\n\t}\n\t// Apply explicit attributes\n\t$tw.utils.each($tw.utils.getOrderedAttributesFromParseTreeNode(this.parseTreeNode),function(attribute) {\n\t\tvar name = attribute.name;\n\t\tif(name.charAt(0) === \"$\") {\n\t\t\tif(name.charAt(1) === \"$\") {\n\t\t\t\t// Double $$ is changed to a single $\n\t\t\t\tname = name.substr(1);\n\t\t\t} else {\n\t\t\t\t// Single dollar is ignored\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],$tw.utils.extend({},attribute,{name: name}));\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nGenesisWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tfilterNames = this.getAttribute(\"$names\",\"\"),\n\t\tfilterValues = this.getAttribute(\"$values\",\"\"),\n\t\tattributeNames = this.wiki.filterTiddlers(filterNames,this),\n\t\tattributeValues = this.wiki.filterTiddlers(filterValues,this);\n\tif($tw.utils.count(changedAttributes) > 0 || !$tw.utils.isArrayEqual(this.attributeNames,attributeNames) || !$tw.utils.isArrayEqual(this.attributeValues,attributeValues)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.genesis = GenesisWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/image.js":{"title":"$:/core/modules/widgets/image.js","text":"/*\\\ntitle: $:/core/modules/widgets/image.js\ntype: application/javascript\nmodule-type: widget\n\nThe image widget displays an image referenced with an external URI or with a local tiddler title.\n\n```\n<$image src=\"TiddlerTitle\" width=\"320\" height=\"400\" class=\"classnames\">\n```\n\nThe image source can be the title of an existing tiddler or the URL of an external image.\n\nExternal images always generate an HTML `<img>` tag.\n\nTiddlers that have a _canonical_uri field generate an HTML `<img>` tag with the src attribute containing the URI.\n\nTiddlers that contain image data generate an HTML `<img>` tag with the src attribute containing a base64 representation of the image.\n\nTiddlers that contain wikitext could be rendered to a DIV of the usual size of a tiddler, and then transformed to the size requested.\n\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \"px\" suffix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\t// Determine what type of image it is\n\tvar tag = \"img\", src = \"\",\n\t\ttiddler = this.wiki.getTiddler(this.imageSource);\n\tif(!tiddler) {\n\t\t// The source isn't the title of a tiddler, so we'll assume it's a URL\n\t\tsrc = this.getVariable(\"tv-get-export-image-link\",{params: [{name: \"src\",value: this.imageSource}],defaultValue: this.imageSource});\n\t} else {\n\t\t// Check if it is an image tiddler\n\t\tif(this.wiki.isImageTiddler(this.imageSource)) {\n\t\t\tvar type = tiddler.fields.type,\n\t\t\t\ttext = tiddler.fields.text,\n\t\t\t\t_canonical_uri = tiddler.fields._canonical_uri,\n\t\t\t\ttypeInfo = $tw.config.contentTypeInfo[type] || {},\n\t\t\t\tdeserializerType = typeInfo.deserializerType || type;\n\t\t\t// If the tiddler has body text then it doesn't need to be lazily loaded\n\t\t\tif(text) {\n\t\t\t\t// Render the appropriate element for the image type by looking up the encoding in the content type info\n\t\t\t\tvar encoding = typeInfo.encoding || \"utf8\";\n\t\t\t\tif (encoding === \"base64\") {\n\t\t\t\t\t// .pdf .png .jpg etc.\n\t\t\t\t\tsrc = \"data:\" + deserializerType + \";base64,\" + text;\n\t\t\t\t\tif (deserializerType === \"application/pdf\") {\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// .svg .tid .xml etc.\n\t\t\t\t\tsrc = \"data:\" + deserializerType + \",\" + encodeURIComponent(text);\n\t\t\t\t}\n\t\t\t} else if(_canonical_uri) {\n\t\t\t\tswitch(deserializerType) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Just trigger loading of the tiddler\n\t\t\t\tthis.wiki.getTiddlerText(this.imageSource);\n\t\t\t}\n\t\t}\n\t}\n\t// Create the element and assign the attributes\n\tvar domNode = this.document.createElement(tag);\n\tdomNode.setAttribute(\"src\",src);\n\tif(this.imageClass) {\n\t\tdomNode.setAttribute(\"class\",this.imageClass);\n\t}\n\tif(this.imageUsemap) {\n\t    \tdomNode.setAttribute(\"usemap\",this.imageUsemap);\n\t}\n\tif(this.imageWidth) {\n\t\tdomNode.setAttribute(\"width\",this.imageWidth);\n\t}\n\tif(this.imageHeight) {\n\t\tdomNode.setAttribute(\"height\",this.imageHeight);\n\t}\n\tif(this.imageTooltip) {\n\t\tdomNode.setAttribute(\"title\",this.imageTooltip);\n\t}\n\tif(this.imageAlt) {\n\t\tdomNode.setAttribute(\"alt\",this.imageAlt);\n\t}\n\tif(this.lazyLoading && tag === \"img\") {\n\t\tdomNode.setAttribute(\"loading\",this.lazyLoading);\n\t}\n\t// Add classes when the image loads or fails\n\t$tw.utils.addClass(domNode,\"tc-image-loading\");\n\tdomNode.addEventListener(\"load\",function() {\n\t\t$tw.utils.removeClass(domNode,\"tc-image-loading\");\n\t\t$tw.utils.addClass(domNode,\"tc-image-loaded\");\n\t},false);\n\tdomNode.addEventListener(\"error\",function() {\n\t\t$tw.utils.removeClass(domNode,\"tc-image-loading\");\n\t\t$tw.utils.addClass(domNode,\"tc-image-error\");\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImageWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.imageSource = this.getAttribute(\"source\");\n\tthis.imageWidth = this.getAttribute(\"width\");\n\tthis.imageHeight = this.getAttribute(\"height\");\n\tthis.imageClass = this.getAttribute(\"class\");\n    \tthis.imageUsemap = this.getAttribute(\"usemap\");\n\tthis.imageTooltip = this.getAttribute(\"tooltip\");\n\tthis.imageAlt = this.getAttribute(\"alt\");\n\tthis.lazyLoading = this.getAttribute(\"loading\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes[\"class\"] || changedAttributes.usemap || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.image = ImageWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/importvariables.js":{"title":"$:/core/modules/widgets/importvariables.js","text":"/*\\\ntitle: $:/core/modules/widgets/importvariables.js\ntype: application/javascript\nmodule-type: widget\n\nImport variable definitions from other tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImportVariablesWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImportVariablesWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImportVariablesWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImportVariablesWidget.prototype.execute = function(tiddlerList) {\n\tvar widgetPointer = this;\n\t// Got to flush all the accumulated variables\n\tthis.variables = Object.create(null);\n\tif(this.parentWidget) {\n\t\tObject.setPrototypeOf(this.variables,this.parentWidget.variables);\n\t}\n\t// Get our parameters\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Compute the filter\n\tthis.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);\n\t// Accumulate the <$set> widgets from each tiddler\n\t$tw.utils.each(this.tiddlerList,function(title) {\n\t\tvar parser = widgetPointer.wiki.parseTiddler(title,{parseAsInline:true, configTrimWhiteSpace:false});\n\t\tif(parser) {\n\t\t\tvar parseTreeNode = parser.tree[0];\n\t\t\twhile(parseTreeNode && [\"setvariable\",\"set\",\"parameters\"].indexOf(parseTreeNode.type) !== -1) {\n\t\t\t\tvar node = {\n\t\t\t\t\ttype: \"set\",\n\t\t\t\t\tattributes: parseTreeNode.attributes,\n\t\t\t\t\tparams: parseTreeNode.params,\n\t\t\t\t\tisMacroDefinition: parseTreeNode.isMacroDefinition,\n\t\t\t\t\tisFunctionDefinition: parseTreeNode.isFunctionDefinition,\n\t\t\t\t\tisProcedureDefinition: parseTreeNode.isProcedureDefinition,\n\t\t\t\t\tisWidgetDefinition: parseTreeNode.isWidgetDefinition,\n\t\t\t\t\tconfigTrimWhiteSpace: parseTreeNode.configTrimWhiteSpace\n\t\t\t\t};\n\t\t\t\tif(parseTreeNode.type === \"set\" || parseTreeNode.type === \"setvariable\") {\n\t\t\t\t\tif(parseTreeNode.isMacroDefinition || parseTreeNode.isProcedureDefinition || parseTreeNode.isWidgetDefinition || parseTreeNode.isFunctionDefinition) {\n\t\t\t\t\t\t// Macro definitions can be folded into\n\t\t\t\t\t\t// current widget instead of adding\n\t\t\t\t\t\t// another link to the chain.\n\t\t\t\t\t\tvar widget = widgetPointer.makeChildWidget(node);\n\t\t\t\t\t\twidget.computeAttributes();\n\t\t\t\t\t\twidget.execute();\n\t\t\t\t\t\t// We SHALLOW copy over all variables\n\t\t\t\t\t\t// in widget. We can't use\n\t\t\t\t\t\t// $tw.utils.assign, because that copies\n\t\t\t\t\t\t// up the prototype chain, which we\n\t\t\t\t\t\t// don't want.\n\t\t\t\t\t\t$tw.utils.each(Object.keys(widget.variables), function(key) {\n\t\t\t\t\t\t\twidgetPointer.variables[key] = widget.variables[key];\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\twidgetPointer.children = [widgetPointer.makeChildWidget(node)];\n\t\t\t\t\t\t// No more regenerating children for\n\t\t\t\t\t\t// this widget. If it needs to refresh,\n\t\t\t\t\t\t// it'll do so along with the the whole\n\t\t\t\t\t\t// importvariable tree.\n\t\t\t\t\t\tif (widgetPointer != this) {\n\t\t\t\t\t\t\twidgetPointer.makeChildWidgets = function(){};\n\t\t\t\t\t\t}\n\t\t\t\t\t\twidgetPointer = widgetPointer.children[0];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tparseTreeNode = parseTreeNode.children && parseTreeNode.children[0];\n\t\t\t}\n\t\t} \n\t});\n\n\tif (widgetPointer != this) {\n\t\twidgetPointer.parseTreeNode.children = this.parseTreeNode.children;\n\t} else {\n\t\twidgetPointer.makeChildWidgets();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImportVariablesWidget.prototype.refresh = function(changedTiddlers) {\n\t// Recompute our attributes and the filter list\n\tvar changedAttributes = this.computeAttributes(),\n\t\ttiddlerList = this.wiki.filterTiddlers(this.getAttribute(\"filter\"),this);\n\t// Refresh if the filter has changed, or the list of tiddlers has changed, or any of the tiddlers in the list has changed\n\tfunction haveListedTiddlersChanged() {\n\t\tvar changed = false;\n\t\ttiddlerList.forEach(function(title) {\n\t\t\tif(changedTiddlers[title]) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t});\n\t\treturn changed;\n\t}\n\tif(changedAttributes.filter || !$tw.utils.isArrayEqual(this.tiddlerList,tiddlerList) || haveListedTiddlersChanged()) {\n\t\t// Compute the filter\n\t\tthis.removeChildDomNodes();\n\t\tthis.execute(tiddlerList);\n\t\tthis.renderChildren(this.parentDomNode,this.findNextSiblingDomNode());\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.importvariables = ImportVariablesWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/jsontiddler.js":{"title":"$:/core/modules/widgets/jsontiddler.js","text":"/*\\\ntitle: $:/core/modules/widgets/jsontiddler.js\ntype: application/javascript\nmodule-type: widget\n\nRender a tiddler as JSON text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar JSONTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nJSONTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nJSONTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Collect the fields from the optional base tiddler\n\tvar fields = this.getTiddlerFields();\n\t// Add custom fields specified in attributes starting with $\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) === \"$\") {\n\t\t\tfields[name.slice(1)] = attribute;\n\t\t}\n\t});\n\t// JSONify\n\tvar json = JSON.stringify(fields);\n\t// Escape unsafe script characters\n\tif(this.attEscapeUnsafeScriptChars) {\n\t\tjson = json.replace(/</g,\"\\\\u003C\");\n\t}\n\t// Update the DOM\n\tvar textNode = this.document.createTextNode(json);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nJSONTiddlerWidget.prototype.execute = function() {\n\tthis.attTiddler = this.getAttribute(\"tiddler\");\n\tthis.attExclude = this.getAttribute(\"exclude\",\"\");\n\tthis.attEscapeUnsafeScriptChars = this.getAttribute(\"escapeUnsafeScriptChars\",\"no\") === \"yes\";\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nJSONTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0 || (this.attTiddler && changedTiddlers[this.attTiddler])) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nJSONTiddlerWidget.prototype.getTiddlerFields = function() {\n\tvar fields = {};\n\tif(this.attTiddler) {\n\t\tvar tiddler = this.wiki.getTiddler(this.attTiddler);\n\t\tif(tiddler) {\n\t\t\tfields = tiddler.getFieldStrings({exclude: this.attExclude.split(\" \")});\n\t\t} else {\n\t\t\tfields = {title: this.attTiddler};\n\t\t}\n\t}\n\treturn fields;\n};\n\nexports.jsontiddler = JSONTiddlerWidget;\n\n})();","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/keyboard.js":{"title":"$:/core/modules/widgets/keyboard.js","text":"/*\\\ntitle: $:/core/modules/widgets/keyboard.js\ntype: application/javascript\nmodule-type: widget\n\nKeyboard shortcut widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar KeyboardWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nKeyboardWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nKeyboardWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.tag && $tw.config.htmlUnsafeElements.indexOf(this.tag) === -1) {\n\t\ttag = this.tag;\n\t}\n\t// Create element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\n\t// Add a keyboard event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"keydown\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nKeyboardWidget.prototype.handleChangeEvent = function(event) {\n\tif ($tw.keyboardManager.handleKeydownEvent(event, {onlyPriority: true})) {\n\t\treturn true;\n\t}\n\n\tvar keyInfo = $tw.keyboardManager.getMatchingKeyDescriptor(event,this.keyInfoArray);\n\tif(keyInfo) {\n\t\tvar handled = this.invokeActions(this,event);\n\t\tif(this.actions) {\n\t\t\tvar variables = {\n\t\t\t\t\t\"event-key\": event.key,\n\t\t\t\t\t\"event-code\": event.code,\n\t\t\t\t\t\"modifier\": $tw.keyboardManager.getEventModifierKeyDescriptor(event)\n\t\t\t\t};\n\t\t\tif(keyInfo.keyDescriptor) {\n\t\t\t\tvariables[\"event-key-descriptor\"] = keyInfo.keyDescriptor;\n\t\t\t}\n\t\t\tthis.invokeActionString(this.actions,this,event,variables);\n\t\t}\n\t\tthis.dispatchMessage(event);\n\t\tif(handled || this.actions || this.message) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nKeyboardWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\n/*\nCompute the internal state of the widget\n*/\nKeyboardWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\",\"\");\n\tthis.message = this.getAttribute(\"message\",\"\");\n\tthis.param = this.getAttribute(\"param\",\"\");\n\tthis.key = this.getAttribute(\"key\",\"\");\n\tthis.tag = this.getAttribute(\"tag\",\"\");\n\tif($tw.keyboardManager) {\n\t\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\t\tif(this.key.substr(0,2) === \"((\" && this.key.substr(-2,2) === \"))\") {\n\t\t\tthis.shortcutTiddlers = [];\n\t\t\tvar name = this.key.substring(2,this.key.length -2);\n\t\t\t$tw.utils.each($tw.keyboardManager.lookupNames,function(platformDescriptor) {\n\t\t\t\tself.shortcutTiddlers.push(\"$:/config/\" + platformDescriptor + \"/\" + name);\n\t\t\t});\n\t\t}\t\n\t}\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nKeyboardWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-keyboard\");\n\tthis.domNode.className = classes.join(\" \");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nKeyboardWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes.tag) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.assignDomNodeClasses();\n\t}\n\t// Update the keyInfoArray if one of its shortcut-config-tiddlers has changed\n\tif(this.shortcutTiddlers && $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers) && $tw.keyboardManager) {\n\t\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.keyboard = KeyboardWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/let.js":{"title":"$:/core/modules/widgets/let.js","text":"/*\\\ntitle: $:/core/modules/widgets/let.js\ntype: application/javascript\nmodule-type: widget\n\nThis widget allows defining multiple variables at once, while allowing\nthe later variables to depend upon the earlier ones.\n\n```\n\\define helloworld() Hello world!\n<$let currentTiddler=\"target\" value={{!!value}} currentTiddler=\"different\">\n  {{!!value}} will be different from <<value>>\n</$let>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LetWidget = function(parseTreeNode,options) {\n\t// Initialise\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLetWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLetWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\nLetWidget.prototype.computeAttributes = function() {\n\t// Before computing attributes, we must make clear that none of the\n\t// existing attributes are staged for lookup, even on a refresh\n\tvar changedAttributes = {},\n\t\tself = this;\n\tthis.currentValueFor = Object.create(null);\n\t$tw.utils.each($tw.utils.getOrderedAttributesFromParseTreeNode(this.parseTreeNode),function(attribute) {\n\t\tvar value = self.computeAttribute(attribute),\n\t\t\tname = attribute.name;\n\t\t// Now that it's prepped, we're allowed to look this variable up\n\t\t// when defining later variables\n\t\tif(value !== undefined) {\n\t\t\tself.currentValueFor[name] = value;\n\t\t}\n\t});\n\t// Run through again, setting variables and looking for differences\n\t$tw.utils.each(this.currentValueFor,function(value,name) {\n\t\tif (self.attributes[name] !== value) {\n\t\t\tself.attributes[name] = value;\n\t\t\tself.setVariable(name,value);\n\t\t\tchangedAttributes[name] = true;\n\t\t}\n\t});\n\treturn changedAttributes;\n};\n\nLetWidget.prototype.getVariableInfo = function(name,options) {\n\t// Special handling: If this variable exists in this very $let, we can\n\t// use it, but only if it's been staged.\n\tif ($tw.utils.hop(this.currentValueFor,name)) {\n\t\treturn {\n\t\t\ttext: this.currentValueFor[name]\n\t\t};\n\t}\n\treturn Widget.prototype.getVariableInfo.call(this,name,options);\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nLetWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"let\"] = LetWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/link.js":{"title":"$:/core/modules/widgets/link.js","text":"/*\\\ntitle: $:/core/modules/widgets/link.js\ntype: application/javascript\nmodule-type: widget\n\nLink widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the value of the tv-wikilinks configuration macro\n\tvar wikiLinksMacro = this.getVariable(\"tv-wikilinks\"),\n\t\tuseWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== \"no\") : true,\n\t\tmissingLinksEnabled = !(this.hideMissingLinks && this.isMissing && !this.isShadow);\n\t// Render the link if required\n\tif(useWikiLinks && missingLinksEnabled) {\n\t\tthis.renderLink(parent,nextSibling);\n\t} else {\n\t\t// Just insert the link text\n\t\tvar domNode = this.document.createElement(\"span\");\n\t\t// Assign data- attributes\n\t\tthis.assignAttributes(domNode,{\n\t\t\tsourcePrefix: \"data-\",\n\t\t\tdestPrefix: \"data-\"\n\t\t});\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tthis.renderChildren(domNode,null);\n\t\tthis.domNodes.push(domNode);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.renderLink = function(parent,nextSibling) {\n\tvar self = this;\n\t// Sanitise the specified tag\n\tvar tag = this.linkTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"a\";\n\t}\n\t// Create our element\n\tvar namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"}),\n\t\tdomNode = this.document.createElementNS(namespace,tag);\n\t// Assign classes\n\tvar classes = [];\n\tif(this.overrideClasses === undefined) {\n\t\tclasses.push(\"tc-tiddlylink\");\n\t\tif(this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-shadow\");\n\t\t}\n\t\tif(this.isMissing && !this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-missing\");\n\t\t} else {\n\t\t\tif(!this.isMissing) {\n\t\t\t\tclasses.push(\"tc-tiddlylink-resolves\");\n\t\t\t}\n\t\t}\n\t\tif(this.linkClasses) {\n\t\t\tclasses.push(this.linkClasses);\n\t\t}\n\t} else if(this.overrideClasses !== \"\") {\n\t\tclasses.push(this.overrideClasses)\n\t}\n\tif(classes.length > 0) {\n\t\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t}\n\t// Set an href\n\tvar wikilinkTransformFilter = this.getVariable(\"tv-filter-export-link\"),\n\t\twikiLinkText;\n\tif(wikilinkTransformFilter) {\n\t\t// Use the filter to construct the href\n\t\twikiLinkText = this.wiki.filterTiddlers(wikilinkTransformFilter,this,function(iterator) {\n\t\t\titerator(self.wiki.getTiddler(self.to),self.to)\n\t\t})[0];\n\t} else {\n\t\t// Expand the tv-wikilink-template variable to construct the href\n\t\tvar wikiLinkTemplateMacro = this.getVariable(\"tv-wikilink-template\"),\n\t\t\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \"#$uri_encoded$\";\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkTemplate,\"$uri_encoded$\",$tw.utils.encodeURIComponentExtended(this.to));\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkText,\"$uri_doubleencoded$\",$tw.utils.encodeURIComponentExtended($tw.utils.encodeURIComponentExtended(this.to)));\n\t}\n\t// Override with the value of tv-get-export-link if defined\n\twikiLinkText = this.getVariable(\"tv-get-export-link\",{params: [{name: \"to\",value: this.to}],defaultValue: wikiLinkText});\n\tif(tag === \"a\") {\n\t\tvar namespaceHref = (namespace === \"http://www.w3.org/2000/svg\") ? \"http://www.w3.org/1999/xlink\" : undefined;\n\t\tdomNode.setAttributeNS(namespaceHref,\"href\",wikiLinkText);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\t// Set the tooltip\n\t// HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to \"<$transclude field='tooltip'><$transclude field='title'/></$transclude>\"\n\tvar tooltipWikiText = this.tooltip || this.getVariable(\"tv-wikilink-tooltip\");\n\tif(tooltipWikiText) {\n\t\tvar tooltipText = this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",tooltipWikiText,{\n\t\t\t\tparseAsInline: true,\n\t\t\t\tvariables: {\n\t\t\t\t\tcurrentTiddler: this.to\n\t\t\t\t},\n\t\t\t\tparentWidget: this\n\t\t\t});\n\t\tdomNode.setAttribute(\"title\",tooltipText);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"click\", handlerObject: this, handlerMethod: \"handleClickEvent\"},\n\t]);\n\t// Make the link draggable if required\n\tif(this.draggable === \"yes\") {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.to;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Assign data- attributes\n\tthis.assignAttributes(domNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nLinkWidget.prototype.handleClickEvent = function(event) {\n\t// Send the click on its way as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateFromClientTop: bounds.top,\n\t\tnavigateFromClientLeft: bounds.left,\n\t\tnavigateFromClientWidth: bounds.width,\n\t\tnavigateFromClientRight: bounds.right,\n\t\tnavigateFromClientBottom: bounds.bottom,\n\t\tnavigateFromClientHeight: bounds.height,\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tmetaKey: event.metaKey,\n\t\tctrlKey: event.ctrlKey,\n\t\taltKey: event.altKey,\n\t\tshiftKey: event.shiftKey,\n\t\tevent: event\n\t});\n\tif(this.domNodes[0].hasAttribute(\"href\")) {\n\t\tevent.preventDefault();\n\t}\n\tevent.stopPropagation();\n\treturn false;\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.to = this.getAttribute(\"to\",this.getVariable(\"currentTiddler\"));\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.linkClasses = this.getAttribute(\"class\");\n\tthis.overrideClasses = this.getAttribute(\"overrideClass\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.draggable = this.getAttribute(\"draggable\",\"yes\");\n\tthis.linkTag = this.getAttribute(\"tag\",\"a\");\n\t// Determine the link characteristics\n\tthis.isMissing = !this.wiki.tiddlerExists(this.to);\n\tthis.isShadow = this.wiki.isShadowTiddler(this.to);\n\tthis.hideMissingLinks = (this.getVariable(\"tv-show-missing-links\") || \"yes\") === \"no\";\n\t// Make the child widgets\n\tvar templateTree;\n\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\ttemplateTree = this.parseTreeNode.children;\n\t} else {\n\t\t// Default template is a link to the title\n\t\ttemplateTree = [{type: \"text\", text: this.to}];\n\t}\n\tthis.makeChildWidgets(templateTree);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0 || changedTiddlers[this.to]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.link = LinkWidget;\n\n})();\n\t","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/linkcatcher.js":{"title":"$:/core/modules/widgets/linkcatcher.js","text":"/*\\\ntitle: $:/core/modules/widgets/linkcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nLinkcatcher widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkCatcherWidget.prototype.render = function(parent,nextSibling) {\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkCatcherWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.catchTo = this.getAttribute(\"to\");\n\tthis.catchMessage = this.getAttribute(\"message\");\n\tthis.catchSet = this.getAttribute(\"set\");\n\tthis.catchSetTo = this.getAttribute(\"setTo\");\n\tthis.catchActions = this.getAttribute(\"actions\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n\t// When executing actions we avoid trapping navigate events, so that we don't trigger ourselves recursively\n\tthis.executingActions = false;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkCatcherWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.set || changedAttributes.setTo) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\n/*\nHandle a tm-navigate event\n*/\nLinkCatcherWidget.prototype.handleNavigateEvent = function(event) {\n\tif(!this.executingActions) {\n\t\t// Execute the actions\n\t\tif(this.catchTo) {\n\t\t\tthis.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable(\"currentTiddler\"));\n\t\t}\n\t\tif(this.catchMessage && this.parentWidget) {\n\t\t\tthis.parentWidget.dispatchEvent({\n\t\t\t\ttype: this.catchMessage,\n\t\t\t\tparam: event.navigateTo,\n\t\t\t\tnavigateTo: event.navigateTo\n\t\t\t});\n\t\t}\n\t\tif(this.catchSet) {\n\t\t\tvar tiddler = this.wiki.getTiddler(this.catchSet);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo}));\n\t\t}\n\t\tif(this.catchActions) {\n\t\t\tthis.executingActions = true;\n\t\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\tthis.invokeActionString(this.catchActions,this,event,{navigateTo: event.navigateTo, modifier: modifierKey});\n\t\t\tthis.executingActions = false;\n\t\t}\n\t} else {\n\t\t\t// This is a navigate event generated by the actions of this linkcatcher,\n\t\t\t// so we don't trap it again, but just pass it to the parent\n\t\t\tthis.parentWidget.dispatchEvent(event);\n\t}\n\treturn false;\n};\n\nexports.linkcatcher = LinkCatcherWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/list.js":{"title":"$:/core/modules/widgets/list.js","text":"/*\\\ntitle: $:/core/modules/widgets/list.js\ntype: application/javascript\nmodule-type: widget\n\nList and list item widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/*\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\n*/\n\nvar ListWidget = function(parseTreeNode,options) {\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListWidget.prototype = new Widget();\n\nListWidget.prototype.initialise = function(parseTreeNode,options) {\n\t// Bail if parseTreeNode is undefined, meaning that the ListWidget constructor was called without any arguments so that it can be subclassed\n\tif(parseTreeNode === undefined) {\n\t\treturn;\n\t}\n\t// First call parent constructor to set everything else up\n\tWidget.prototype.initialise.call(this,parseTreeNode,options);\n\t// Now look for <$list-template> and <$list-empty> widgets as immediate child widgets\n\t// This is safe to do during initialization because parse trees never change after creation\n\tthis.findExplicitTemplates();\n}\n\n/*\nRender this widget into the DOM\n*/\nListWidget.prototype.render = function(parent,nextSibling) {\n\t// Initialise the storyviews if they've not been done already\n\tif(!this.storyViews) {\n\t\tListWidget.prototype.storyViews = {};\n\t\t$tw.modules.applyMethods(\"storyview\",this.storyViews);\n\t}\n\tthis.parentDomNode = parent;\n\tvar changedAttributes = this.computeAttributes();\n\tthis.execute(changedAttributes);\n\tthis.renderChildren(parent,nextSibling);\n\t// Construct the storyview\n\tvar StoryView = this.storyViews[this.storyViewName];\n\tif(this.storyViewName && !StoryView) {\n\t\tStoryView = this.storyViews[\"classic\"];\n\t}\n\tif(StoryView && !this.document.isTiddlyWikiFakeDom) {\n\t\tthis.storyview = new StoryView(this);\n\t} else {\n\t\tthis.storyview = null;\n\t}\n\tif(this.storyview && this.storyview.renderEnd) {\n\t\tthis.storyview.renderEnd();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nListWidget.prototype.execute = function(changedAttributes) {\n\tvar self = this;\n\t// Get our attributes\n\tthis.template = this.getAttribute(\"template\");\n\tthis.editTemplate = this.getAttribute(\"editTemplate\");\n\tthis.variableName = this.getAttribute(\"variable\",\"currentTiddler\");\n\tthis.counterName = this.getAttribute(\"counter\");\n\tthis.storyViewName = this.getAttribute(\"storyview\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Create join template only if needed\n\tif(this.join === undefined || (changedAttributes && changedAttributes.join)) {\n\t\tthis.join = this.makeJoinTemplate();\n\t}\n\t// Compose the list elements\n\tthis.list = this.getTiddlerList();\n\tvar members = [],\n\t\tself = this;\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\tmembers = this.getEmptyMessage();\n\t} else {\n\t\t$tw.utils.each(this.list,function(title,index) {\n\t\t\tmembers.push(self.makeItemTemplate(title,index));\n\t\t});\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(members);\n\t// Clear the last history\n\tthis.history = [];\n};\n\nListWidget.prototype.findExplicitTemplates = function() {\n\tvar self = this;\n\tthis.explicitListTemplate = null;\n\tthis.explicitEmptyTemplate = null;\n\tthis.explicitJoinTemplate = null;\n\tthis.hasTemplateInBody = false;\n\tvar searchChildren = function(childNodes) {\n\t\tvar foundInlineTemplate = false;\n\t\t$tw.utils.each(childNodes,function(node) {\n\t\t\tif(node.type === \"list-template\") {\n\t\t\t\tself.explicitListTemplate = node.children;\n\t\t\t} else if(node.type === \"list-empty\") {\n\t\t\t\tself.explicitEmptyTemplate = node.children;\n\t\t\t} else if(node.type === \"list-join\") {\n\t\t\t\tself.explicitJoinTemplate = node.children;\n\t\t\t} else if(node.type === \"element\" && node.tag === \"p\") {\n\t\t\t\tsearchChildren(node.children);\n\t\t\t\tfoundInlineTemplate = true;\n\t\t\t} else {\n\t\t\t\tfoundInlineTemplate = true;\n\t\t\t}\n\t\t});\n\t\treturn foundInlineTemplate;\n\t};\n\tthis.hasTemplateInBody = searchChildren(this.parseTreeNode.children);\n}\n\nListWidget.prototype.getTiddlerList = function() {\n\tvar limit = $tw.utils.getInt(this.getAttribute(\"limit\",\"\"),undefined);\n\tvar defaultFilter = \"[!is[system]sort[title]]\";\n\tvar results = this.wiki.filterTiddlers(this.getAttribute(\"filter\",defaultFilter),this);\n\tif(limit !== undefined) {\n\t\tif(limit >= 0) {\n\t\t\tresults = results.slice(0,limit);\n\t\t} else {\n\t\t\tresults = results.slice(limit);\n\t\t}\n\t}\n\treturn results;\n};\n\nListWidget.prototype.getEmptyMessage = function() {\n\tvar parser,\n\t\temptyMessage = this.getAttribute(\"emptyMessage\");\n\t// If emptyMessage attribute is not present or empty then look for an explicit empty template\n\tif(!emptyMessage) {\n\t\tif(this.explicitEmptyTemplate) {\n\t\t\treturn this.explicitEmptyTemplate;\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t}\n\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",emptyMessage,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nCompose the template for a join between list items\n*/\nListWidget.prototype.makeJoinTemplate = function() {\n\tvar parser,\n\t\tjoin = this.getAttribute(\"join\",\"\");\n\tif(join) {\n\t\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",join,{parseAsInline:true})\n\t\tif(parser) {\n\t\t\treturn parser.tree;\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t} else {\n\t\treturn this.explicitJoinTemplate; // May be null, and that's fine\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nListWidget.prototype.makeItemTemplate = function(title,index) {\n\t// Check if the tiddler is a draft\n\tvar tiddler = this.wiki.getTiddler(title),\n\t\tisDraft = tiddler && tiddler.hasField(\"draft.of\"),\n\t\ttemplate = this.template,\n\t\tjoin = this.join,\n\t\ttemplateTree;\n\tif(isDraft && this.editTemplate) {\n\t\ttemplate = this.editTemplate;\n\t}\n\t// Compose the transclusion of the template\n\tif(template) {\n\t\ttemplateTree = [{type: \"transclude\", attributes: {tiddler: {type: \"string\", value: template}}}];\n\t} else {\n\t\t// Check for child nodes of the list widget\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\t// Check for a <$list-item> widget\n\t\t\tif(this.explicitListTemplate) {\n\t\t\t\ttemplateTree = this.explicitListTemplate;\n\t\t\t} else if(this.hasTemplateInBody) {\n\t\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t\t}\n\t\t}\n\t\tif(!templateTree || templateTree.length === 0) {\n\t\t\t// Default template is a link to the title\n\t\t\ttemplateTree = [{type: \"element\", tag: this.parseTreeNode.isBlock ? \"div\" : \"span\", children: [{type: \"link\", attributes: {to: {type: \"string\", value: title}}, children: [\n\t\t\t\t{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\tvar parseTreeNode = {type: \"listitem\", itemTitle: title, variableName: this.variableName, children: templateTree, join: join};\n\tparseTreeNode.isLast = index === this.list.length - 1;\n\tif(this.counterName) {\n\t\tparseTreeNode.counter = (index + 1).toString();\n\t\tparseTreeNode.counterName = this.counterName;\n\t\tparseTreeNode.isFirst = index === 0;\n\t}\n\treturn parseTreeNode;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tresult;\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshStart) {\n\t\tthis.storyview.refreshStart(changedTiddlers,changedAttributes);\n\t}\n\t// Completely refresh if any of our attributes have changed\n\tif(changedAttributes.filter || changedAttributes.variable || changedAttributes.counter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.join || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\tresult = true;\n\t} else {\n\t\t// Handle any changes to the list\n\t\tresult = this.handleListChanges(changedTiddlers);\n\t\t// Handle any changes to the history stack\n\t\tif(this.historyTitle && changedTiddlers[this.historyTitle]) {\n\t\t\tthis.handleHistoryChanges();\n\t\t}\n\t}\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshEnd) {\n\t\tthis.storyview.refreshEnd(changedTiddlers,changedAttributes);\n\t}\n\treturn result;\n};\n\n/*\nHandle any changes to the history list\n*/\nListWidget.prototype.handleHistoryChanges = function() {\n\t// Get the history data\n\tvar newHistory = this.wiki.getTiddlerDataCached(this.historyTitle,[]);\n\t// Ignore any entries of the history that match the previous history\n\tvar entry = 0;\n\twhile(entry < newHistory.length && entry < this.history.length && newHistory[entry].title === this.history[entry].title) {\n\t\tentry++;\n\t}\n\t// Navigate forwards to each of the new tiddlers\n\twhile(entry < newHistory.length) {\n\t\tif(this.storyview && this.storyview.navigateTo) {\n\t\t\tthis.storyview.navigateTo(newHistory[entry]);\n\t\t}\n\t\tentry++;\n\t}\n\t// Update the history\n\tthis.history = newHistory;\n};\n\n/*\nProcess any changes to the list\n*/\nListWidget.prototype.handleListChanges = function(changedTiddlers) {\n\t// Get the new list\n\tvar prevList = this.list;\n\tthis.list = this.getTiddlerList();\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\t// Check if it was empty before\n\t\tif(prevList.length === 0) {\n\t\t\t// If so, just refresh the empty message\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\t// Replace the previous content with the empty message\n\t\t\tfor(t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\t\tthis.makeChildWidgets(this.getEmptyMessage());\n\t\t\tthis.renderChildren(this.parentDomNode,nextSibling);\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\t// If the list was empty then we need to remove the empty message\n\t\tif(prevList.length === 0) {\n\t\t\tthis.removeChildDomNodes();\n\t\t\tthis.children = [];\n\t\t}\n\t\t// If we are providing an counter variable then we must refresh the items, otherwise we can rearrange them\n\t\tvar hasRefreshed = false,t;\n\t\tif(this.counterName) {\n\t\t\tvar mustRefreshOldLast = false;\n\t\t\tvar oldLength = this.children.length;\n\t\t\t// Cycle through the list and remove and re-insert the first item that has changed, and all the remaining items\n\t\t\tfor(t=0; t<this.list.length; t++) {\n\t\t\t\tif(hasRefreshed || !this.children[t] || this.children[t].parseTreeNode.itemTitle !== this.list[t]) {\n\t\t\t\t\tif(this.children[t]) {\n\t\t\t\t\t\tthis.removeListItem(t);\n\t\t\t\t\t}\n\t\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\t\tif(!hasRefreshed && t === oldLength) {\n\t\t\t\t\t\tmustRefreshOldLast = true;\n\t\t\t\t\t}\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t} else {\n\t\t\t\t\t// Refresh the item we're reusing\n\t\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If items were inserted then we must recreate the item that used to be at the last position as it is no longer last\n\t\t\tif(mustRefreshOldLast && oldLength > 0) {\n\t\t\t\tvar oldLastIdx = oldLength-1;\n\t\t\t\tthis.removeListItem(oldLastIdx);\n\t\t\t\tthis.insertListItem(oldLastIdx,this.list[oldLastIdx]);\n\t\t\t}\n\t\t\t// If there are items to remove and we have not refreshed then recreate the item that will now be at the last position\n\t\t\tif(!hasRefreshed && this.children.length > this.list.length) {\n\t\t\t\tthis.removeListItem(this.list.length-1);\n\t\t\t\tthis.insertListItem(this.list.length-1,this.list[this.list.length-1]);\n\t\t\t}\n\t\t} else {\n\t\t\t// Cycle through the list, inserting and removing list items as needed\n\t\t\tvar mustRecreateLastItem = false;\n\t\t\tif(this.join && this.join.length) {\n\t\t\t\tif(this.children.length !== this.list.length) {\n\t\t\t\t\t\tmustRecreateLastItem = true;\n\t\t\t\t} else if(prevList[prevList.length-1] !== this.list[this.list.length-1]) {\n\t\t\t\t\t\tmustRecreateLastItem = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar isLast = false, wasLast = false;\n\t\t\tfor(t=0; t<this.list.length; t++) {\n\t\t\t\tisLast = t === this.list.length-1;\n\t\t\t\tvar index = this.findListItem(t,this.list[t]);\n\t\t\t\twasLast = index === this.children.length-1;\n\t\t\t\tif(wasLast && (index !== t || this.children.length !== this.list.length)) {\n\t\t\t\t\tmustRecreateLastItem = !!(this.join && this.join.length);\n\t\t\t\t}\n\t\t\t\tif(index === undefined) {\n\t\t\t\t\t// The list item must be inserted\n\t\t\t\t\tif(isLast && mustRecreateLastItem && t>0) {\n\t\t\t\t\t\t// First re-create previosly-last item that will no longer be last\n\t\t\t\t\t\tthis.removeListItem(t-1);\n\t\t\t\t\t\tthis.insertListItem(t-1,this.list[t-1]);\n\t\t\t\t\t}\n\t\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t} else {\n\t\t\t\t\t// There are intervening list items that must be removed\n\t\t\t\t\tfor(var n=index-1; n>=t; n--) {\n\t\t\t\t\t\tthis.removeListItem(n);\n\t\t\t\t\t\thasRefreshed = true;\n\t\t\t\t\t}\n\t\t\t\t\t// Refresh the item we're reusing, or recreate if necessary\n\t\t\t\t\tif(mustRecreateLastItem && (isLast || wasLast)) {\n\t\t\t\t\t\tthis.removeListItem(t);\n\t\t\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\t\t\thasRefreshed = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Remove any left over items\n\t\tfor(t=this.children.length-1; t>=this.list.length; t--) {\n\t\t\tthis.removeListItem(t);\n\t\t\thasRefreshed = true;\n\t\t}\n\t\treturn hasRefreshed;\n\t}\n};\n\n/*\nFind the list item with a given title, starting from a specified position\n*/\nListWidget.prototype.findListItem = function(startIndex,title) {\n\twhile(startIndex < this.children.length) {\n\t\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\n\t\t\treturn startIndex;\n\t\t}\n\t\tstartIndex++;\n\t}\n\treturn undefined;\n};\n\n/*\nInsert a new list item at the specified index\n*/\nListWidget.prototype.insertListItem = function(index,title) {\n\t// Create, insert and render the new child widgets\n\tvar widget = this.makeChildWidget(this.makeItemTemplate(title,index));\n\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\n\tthis.children.splice(index,0,widget);\n\tvar nextSibling = widget.findNextSiblingDomNode();\n\twidget.render(this.parentDomNode,nextSibling);\n\t// Animate the insertion if required\n\tif(this.storyview && this.storyview.insert) {\n\t\tthis.storyview.insert(widget);\n\t}\n\treturn true;\n};\n\n/*\nRemove the specified list item\n*/\nListWidget.prototype.removeListItem = function(index) {\n\tvar widget = this.children[index];\n\t// Animate the removal if required\n\tif(this.storyview && this.storyview.remove) {\n\t\tthis.storyview.remove(widget);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n\t// Remove the child widget\n\tthis.children.splice(index,1);\n};\n\nexports.list = ListWidget;\n\nvar ListItemWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListItemWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListItemWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nListItemWidget.prototype.execute = function() {\n\t// Set the current list item title\n\tthis.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle);\n\tif(this.parseTreeNode.counterName) {\n\t\tthis.setVariable(this.parseTreeNode.counterName,this.parseTreeNode.counter);\n\t\tthis.setVariable(this.parseTreeNode.counterName + \"-first\",this.parseTreeNode.isFirst ? \"yes\" : \"no\");\n\t\tthis.setVariable(this.parseTreeNode.counterName + \"-last\",this.parseTreeNode.isLast ? \"yes\" : \"no\");\n\t}\n\t// Add join if needed\n\tvar children = this.parseTreeNode.children,\n\t\tjoin = this.parseTreeNode.join;\n\tif(join && join.length && !this.parseTreeNode.isLast) {\n\t\tchildren = children.slice(0);\n\t\t$tw.utils.each(join,function(joinNode) {\n\t\t\tchildren.push(joinNode);\n\t\t})\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(children);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListItemWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.listitem = ListItemWidget;\n\n/*\nMake <$list-template> and <$list-empty> widgets that do nothing\n*/\nvar ListTemplateWidget = function(parseTreeNode,options) {\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\nListTemplateWidget.prototype = new Widget();\nListTemplateWidget.prototype.render = function() {}\nListTemplateWidget.prototype.refresh = function() { return false; }\n\nexports[\"list-template\"] = ListTemplateWidget;\n\nvar ListEmptyWidget = function(parseTreeNode,options) {\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\nListEmptyWidget.prototype = new Widget();\nListEmptyWidget.prototype.render = function() {}\nListEmptyWidget.prototype.refresh = function() { return false; }\n\nexports[\"list-empty\"] = ListEmptyWidget;\n\nvar ListJoinWidget = function(parseTreeNode,options) {\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\nListJoinWidget.prototype = new Widget();\nListJoinWidget.prototype.render = function() {}\nListJoinWidget.prototype.refresh = function() { return false; }\n\nexports[\"list-join\"] = ListJoinWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/log.js":{"title":"$:/core/modules/widgets/log.js","text":"/*\\\ntitle: $:/core/modules/widgets/log.js\ntype: application/javascript\nmodule-type: widget-subclass\n\nWidget to log debug messages\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.baseClass = \"action-log\";\n\nexports.name = \"log\";\n\nexports.constructor = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n}\n\nexports.prototype = {};\n\nexports.prototype.render = function(event) {\n\tObject.getPrototypeOf(Object.getPrototypeOf(this)).render.call(this,event);\n\tObject.getPrototypeOf(Object.getPrototypeOf(this)).log.call(this);\n}\n\n})();","type":"application/javascript","module-type":"widget-subclass"},"$:/core/modules/widgets/macrocall.js":{"title":"$:/core/modules/widgets/macrocall.js","text":"/*\\\ntitle: $:/core/modules/widgets/macrocall.js\ntype: application/javascript\nmodule-type: widget\n\nMacrocall widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar MacroCallWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMacroCallWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMacroCallWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMacroCallWidget.prototype.execute = function() {\n\tthis.macroName = this.parseTreeNode.name || this.getAttribute(\"$name\"),\n\tthis.parseType = this.getAttribute(\"$type\",\"text/vnd.tiddlywiki\");\n\tthis.renderOutput = this.getAttribute(\"$output\",\"text/html\");\n\t// Merge together the parameters specified in the parse tree with the specified attributes\n\tvar params = this.parseTreeNode.params ? this.parseTreeNode.params.slice(0) : [];\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparams.push({name: name, value: attribute});\n\t\t}\n\t});\n\t// Make a transclude widget\n\tvar positionalName = 0,\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"transclude\",\n\t\t\tisBlock: this.parseTreeNode.isBlock,\n\t\t\tchildren: this.parseTreeNode.children\n\t\t}];\n\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\"$variable\",this.macroName);\n\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\"$type\",this.parseType);\n\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\"$output\",this.renderOutput);\n\t$tw.utils.each(params,function(param) {\n\t\tvar name = param.name;\n\t\tif(name) {\n\t\t\tif(name.charAt(0) === \"$\") {\n\t\t\t\tname = \"$\" + name;\n\t\t\t}\n\t\t\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],name,param.value);\n\t\t} else {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],(positionalName++) + \"\",param.value);\n\t\t}\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMacroCallWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\t// Rerender ourselves\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.macrocall = MacroCallWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/messagecatcher.js":{"title":"$:/core/modules/widgets/messagecatcher.js","text":"/*\\\ntitle: $:/core/modules/widgets/messagecatcher.js\ntype: application/javascript\nmodule-type: widget\n\nMessage catcher widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar MessageCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMessageCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMessageCatcherWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Helper to add an event handler\n\tvar addEventHandler = function(type,actions) {\n\t\tif(type && actions) {\n\t\t\tvar isActionStringExecuting = false;\n\t\t\tself.addEventListener(\n\t\t\t\ttype,\n\t\t\t\tfunction(event) {\n\t\t\t\t\t// Don't trap the event if it came from one of our action handlers\n\t\t\t\t\tif(isActionStringExecuting) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t// Collect all the event properties into variables\n\t\t\t\t\tvar collectProps = function(obj,prefix) {\n\t\t\t\t\t\tprefix = prefix || \"\";\n\t\t\t\t\t\tvar props = {},\n\t\t\t\t\t\t\tnames = [];\n\t\t\t\t\t\t$tw.utils.each(obj,function(value,name) {\n\t\t\t\t\t\t\tif([\"string\",\"boolean\",\"number\"].indexOf(typeof value) !== -1) {\n\t\t\t\t\t\t\t\tnames.push(name);\n\t\t\t\t\t\t\t\tprops[prefix + \"-\" + name] = value.toString();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tprops[\"list-\" + prefix] = $tw.utils.stringifyList(names);\n\t\t\t\t\t\treturn props;\n\t\t\t\t\t};\n\t\t\t\t\tvar variables = $tw.utils.extend(\n\t\t\t\t\t\t{},\n\t\t\t\t\t\tcollectProps(event.paramObject,\"event-paramObject\"),\n\t\t\t\t\t\tcollectProps(event,\"event\"),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmodifier: $tw.keyboardManager.getEventModifierKeyDescriptor(event)\n\t\t\t\t\t\t});\n\t\t\t\t\tisActionStringExecuting = true;\n\t\t\t\t\tself.invokeActionString(actions,self,event,variables);\n\t\t\t\t\tisActionStringExecuting = false;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t}\n\t// Add the main event handler\n\taddEventHandler(this.getAttribute(\"type\"),this.getAttribute(\"actions\"));\n\t// Add any other event handlers\n\t$tw.utils.each(this.attributes,function(value,key) {\n\t\tif(key.charAt(0) === \"$\") {\n\t\t\taddEventHandler(key.slice(1),value);\n\t\t}\n\t});\n\t// Render children\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMessageCatcherWidget.prototype.execute = function() {\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMessageCatcherWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.messagecatcher = MessageCatcherWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/navigator.js":{"title":"$:/core/modules/widgets/navigator.js","text":"/*\\\ntitle: $:/core/modules/widgets/navigator.js\ntype: application/javascript\nmodule-type: widget\n\nNavigator widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigatorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"},\n\t\t{type: \"tm-fold-tiddler\", handler: \"handleFoldTiddlerEvent\"},\n\t\t{type: \"tm-fold-other-tiddlers\", handler: \"handleFoldOtherTiddlersEvent\"},\n\t\t{type: \"tm-fold-all-tiddlers\", handler: \"handleFoldAllTiddlersEvent\"},\n\t\t{type: \"tm-unfold-all-tiddlers\", handler: \"handleUnfoldAllTiddlersEvent\"}\n\t]);\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\tthis.setVariable(\"tv-story-list\",this.storyTitle);\n\tthis.setVariable(\"tv-history-list\",this.historyTitle);\n\tthis.story = new $tw.Story({\n\t\twiki: this.wiki,\n\t\tstoryTitle: this.storyTitle,\n\t\thistoryTitle: this.historyTitle\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.story || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nNavigatorWidget.prototype.getStoryList = function() {\n\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\n};\n\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\n\tif(this.storyTitle) {\n\t\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t\t{title: this.storyTitle},\n\t\t\tstoryTiddler,\n\t\t\t{list: storyList}\n\t\t));\n\t}\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tif(storyList) {\n\t\tvar p = storyList.indexOf(title);\n\t\twhile(p !== -1) {\n\t\t\tstoryList.splice(p,1);\n\t\t\tp = storyList.indexOf(title);\n\t\t}\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tif(storyList) {\n\t\tvar pos = storyList.indexOf(oldTitle);\n\t\tif(pos !== -1) {\n\t\t\tstoryList[pos] = newTitle;\n\t\t\tdo {\n\t\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\t\tif(pos !== -1) {\n\t\t\t\t\tstoryList.splice(pos,1);\n\t\t\t\t}\n\t\t\t} while(pos !== -1);\n\t\t} else {\n\t\t\tstoryList.splice(0,0,newTitle);\n\t\t}\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tif(this.storyTitle) {\n\t\tthis.story.addToStory(title,fromTitle,{\n\t\t\topenLinkFromInsideRiver: this.getAttribute(\"openLinkFromInsideRiver\",\"top\"),\n\t\t\topenLinkFromOutsideRiver: this.getAttribute(\"openLinkFromOutsideRiver\",\"top\")\n\t\t});\n\t}\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\n*/\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\n\tthis.story.addToHistory(title,fromPageRect,this.historyTitle);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-navigating\",event);\n\tif(event.navigateTo) {\n\t\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\n\t\tif(!event.navigateSuppressNavigation) {\n\t\t\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\n\t\t}\n\t}\n\treturn false;\n};\n\n// Close a specified tiddler\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-closing-tiddler\",event);\n\tvar title = event.param || event.tiddlerTitle,\n\t\tstoryList = this.getStoryList();\n\t// Look for tiddlers with this title to close\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Close all tiddlers\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\n\tthis.saveStoryList([]);\n\treturn false;\n};\n\n// Close other tiddlers\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle;\n\tthis.saveStoryList([title]);\n\treturn false;\n};\n\n// Place a tiddler in edit mode\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\n\tvar editTiddler = $tw.hooks.invokeHook(\"th-editing-tiddler\",event),\n\t\twin = event.event && event.event.view ? event.event.view : window;\n\tif(!editTiddler) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tfunction isUnmodifiedShadow(title) {\n\t\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\n\t}\n\tfunction confirmEditShadow(title) {\n\t\treturn win.confirm($tw.language.getString(\n\t\t\t\"ConfirmEditShadowTiddler\",\n\t\t\t{variables:\n\t\t\t\t{title: title}\n\t\t\t}\n\t\t));\n\t}\n\tvar title = event.param || event.tiddlerTitle;\n\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\n\t\treturn false;\n\t}\n\t// Replace the specified tiddler with a draft in edit mode\n\tvar draftTiddler = this.makeDraftTiddler(title);\n\t// Update the story and history if required\n\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\tvar draftTitle = draftTiddler.fields.title,\n\t\t\tstoryList = this.getStoryList();\n\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\tthis.saveStoryList(storyList);\n\t\treturn false;\n\t}\n};\n\n// Delete a tiddler\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\n\t// Get the tiddler we're deleting\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\toriginalTitle = tiddler ? tiddler.fields[\"draft.of\"] : \"\",\n\t\toriginalTiddler = originalTitle ? this.wiki.getTiddler(originalTitle) : undefined,\n\t\tconfirmationTitle,\n\t\twin = event.event && event.event.view ? event.event.view : window;\n\t// Check if the tiddler we're deleting is in draft mode\n\tif(originalTitle) {\n\t\t// If so, we'll prompt for confirmation referencing the original tiddler\n\t\tconfirmationTitle = originalTitle;\n\t} else {\n\t\t// If not a draft, then prompt for confirmation referencing the specified tiddler\n\t\tconfirmationTitle = title;\n\t}\n\t// Seek confirmation\n\tif(((originalTitle && this.wiki.getTiddler(originalTitle)) || (tiddler && ((tiddler.fields.text || \"\") !== \"\"))) && !win.confirm($tw.language.getString(\n\t\t\t\t\"ConfirmDeleteTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: confirmationTitle}\n\t\t\t\t}\n\t\t\t))) {\n\t\treturn false;\n\t}\n\t// Delete the original tiddler\n\tif(originalTitle) {\n\t\tif(originalTiddler) {\n\t\t\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",originalTiddler);\n\t\t}\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Invoke the hook function and delete this tiddler\n\tif(tiddler) {\n\t\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",tiddler);\n\t\tthis.wiki.deleteTiddler(title);\t\n\t}\n\t// Remove the closed tiddler from the story\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\treturn false;\n};\n\n/*\nCreate/reuse the draft tiddler for a given title\n*/\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\n\t// See if there is already a draft tiddler for this tiddler\n\tvar draftTitle = this.wiki.findDraft(targetTitle);\n\tif(draftTitle) {\n\t\treturn this.wiki.getTiddler(draftTitle);\n\t}\n\t// Get the current value of the tiddler we're editing\n\tvar tiddler = this.wiki.getTiddler(targetTitle);\n\t// Save the initial value of the draft tiddler\n\tdraftTitle = this.generateDraftTitle(targetTitle);\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\t\ttext: \"\",\n\t\t\t},\n\t\t\ttiddler,\n\t\t\t{\n\t\t\t\ttitle: draftTitle,\n\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\"draft.of\": targetTitle\n\t\t\t},\n\t\t\tthis.wiki.getModificationFields()\n\t\t);\n\tthis.wiki.addTiddler(draftTiddler);\n\treturn draftTiddler;\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\n\treturn this.wiki.generateDraftTitle(title);\n};\n\n// Take a tiddler out of edit mode, saving the changes\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\twin = event.event && event.event.view ? event.event.view : window;\n\t// Replace the original tiddler with the draft\n\tif(tiddler) {\n\t\tvar draftTitle = (tiddler.fields[\"draft.title\"] || \"\").trim(),\n\t\t\tdraftOf = (tiddler.fields[\"draft.of\"] || \"\").trim();\n\t\tif(draftTitle) {\n\t\t\tvar isRename = draftOf !== draftTitle,\n\t\t\t\tisConfirmed = true;\n\t\t\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\n\t\t\t\tisConfirmed = win.confirm($tw.language.getString(\n\t\t\t\t\t\"ConfirmOverwriteTiddler\",\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{title: draftTitle}\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t}\n\t\t\tif(isConfirmed) {\n\t\t\t\t// Create the new tiddler and pass it through the th-saving-tiddler hook\n\t\t\t\tvar newTiddler = new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": undefined,\n\t\t\t\t\t\"draft.of\": undefined\n\t\t\t\t},this.wiki.getModificationFields());\n\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-saving-tiddler\",newTiddler,tiddler);\n\t\t\t\tthis.wiki.addTiddler(newTiddler);\n\t\t\t\t// If enabled, relink references to renamed tiddler\n\t\t\t\tvar shouldRelink = this.getAttribute(\"relinkOnRename\",\"no\").toLowerCase().trim() === \"yes\";\n\t\t\t\tif(isRename && shouldRelink && this.wiki.tiddlerExists(draftOf)) {\n\t\t\t\t\tthis.wiki.relinkTiddler(draftOf,draftTitle);\n\t\t\t\t}\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\t// #2381 always remove new title & old\n\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\tthis.removeTitleFromStory(storyList,draftOf);\n\t\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Trigger an autosave\n\t\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Take a tiddler out of edit mode without saving the changes\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-cancelling-tiddler\", event);\n\tvar win = event.event && event.event.view ? event.event.view : window;\n\t// Flip the specified tiddler from draft back to the original\n\tvar draftTitle = event.param || event.tiddlerTitle,\n\t\tdraftTiddler = this.wiki.getTiddler(draftTitle),\n\t\toriginalTitle = draftTiddler && draftTiddler.fields[\"draft.of\"];\n\tif(draftTiddler && originalTitle) {\n\t\t// Ask for confirmation if the tiddler text has changed\n\t\tvar isConfirmed = true,\n\t\t\toriginalTiddler = this.wiki.getTiddler(originalTitle),\n\t\t\tstoryList = this.getStoryList();\n\t\tif(this.wiki.isDraftModified(draftTitle)) {\n\t\t\tisConfirmed = win.confirm($tw.language.getString(\n\t\t\t\t\"ConfirmCancelTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: draftTitle}\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\t\t// Remove the draft tiddler\n\t\tif(isConfirmed) {\n\t\t\tthis.wiki.deleteTiddler(draftTitle);\n\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\tif(originalTiddler) {\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t\t} else {\n\t\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\t}\n\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Create a new draft tiddler\n// event.param can either be the title of a template tiddler, or a hashmap of fields.\n//\n// The title of the newly created tiddler follows these rules:\n// * If a hashmap was used and a title field was specified, use that title\n// * If a hashmap was used without a title field, use a default title, if necessary making it unique with a numeric suffix\n// * If a template tiddler was used, use the title of the template, if necessary making it unique with a numeric suffix\n//\n// If a draft of the target tiddler already exists then it is reused\nNavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-new-tiddler\", event);\n\t// Get the story details\n\tvar storyList = this.getStoryList(),\n\t\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler,\n\t\ttemplateHasTags = false;\n\t// Get the template tiddler (if any)\n\tif(typeof event.param === \"string\") {\n\t\t// Get the template tiddler\n\t\ttemplateTiddler = this.wiki.getTiddler(event.param);\n\t\t// Generate a new title\n\t\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t}\n\t// Get the specified additional fields\n\tif(typeof event.paramObject === \"object\") {\n\t\tadditionalFields = event.paramObject;\n\t}\n\tif(typeof event.param === \"object\") { // Backwards compatibility with 5.1.3\n\t\tadditionalFields = event.param;\n\t}\n\tif(additionalFields && additionalFields.title) {\n\t\ttitle = additionalFields.title;\n\t}\n\t// Make a copy of the additional fields excluding any blank ones\n\tvar filteredAdditionalFields = $tw.utils.extend({},additionalFields);\n\tObject.keys(filteredAdditionalFields).forEach(function(fieldName) {\n\t\tif(filteredAdditionalFields[fieldName] === \"\") {\n\t\t\tdelete filteredAdditionalFields[fieldName];\n\t\t}\n\t});\n\t// Generate a title if we don't have one\n\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t// Find any existing draft for this tiddler\n\tdraftTitle = this.wiki.findDraft(title);\n\t// Pull in any existing tiddler\n\tif(draftTitle) {\n\t\texistingTiddler = this.wiki.getTiddler(draftTitle);\n\t} else {\n\t\tdraftTitle = this.generateDraftTitle(title);\n\t\texistingTiddler = this.wiki.getTiddler(title);\n\t}\n\t// Merge the tags\n\tvar mergedTags = [];\n\tif(existingTiddler && existingTiddler.fields.tags) {\n\t\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags);\n\t}\n\tif(additionalFields && additionalFields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\n\t}\n\tvar additionalFieldsHasTags = !!(additionalFields && (additionalFields.tags === \"\"));\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\ttemplateHasTags = true;\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\n\t}\n\t// Save the draft tiddler\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\ttext: \"\",\n\t\t\t\"draft.title\": title\n\t\t},\n\t\ttemplateTiddler,\n\t\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\texistingTiddler,\n\t\tfilteredAdditionalFields,\n\t\t{\n\t\t\ttitle: draftTitle,\n\t\t\t\"draft.of\": title,\n\t\t\t// If template or additionalFields have \"tags\" even if empty a tags field will be created.\n\t\t\ttags: ((mergedTags.length > 0) || templateHasTags || additionalFieldsHasTags) ? mergedTags : undefined\n\t\t},this.wiki.getModificationFields());\n\tthis.wiki.addTiddler(draftTiddler);\n\t// Update the story to insert the new draft at the top and remove any existing tiddler\n\tif(storyList && storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tif(slot === -1) {\n\t\t\tslot = this.getAttribute(\"openLinkFromOutsideRiver\",\"top\") === \"bottom\" ? storyList.length - 1 : slot;\n\t\t}\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList && storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\n\t}\n\tthis.saveStoryList(storyList);\n\t// Add a new record to the top of the history stack\n\tthis.addToHistory(draftTitle);\n\treturn false;\n};\n\n// Import JSON tiddlers into a pending import tiddler\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\n\t// Get the tiddlers\n\tvar tiddlers = $tw.utils.parseJSONSafe(event.param,[]);\n\t// Get the current $:/Import tiddler\n\tvar paramObject = event.paramObject || {},\n\t\timportTitle = event.importTitle || paramObject.importTitle || IMPORT_TITLE,\n\t\timportTiddler = this.wiki.getTiddler(importTitle),\n\t\timportData = this.wiki.getTiddlerData(importTitle,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: importTitle,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\ttiddlerFields.title = $tw.utils.trim(tiddlerFields.title);\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\t// Give the active upgrader modules a chance to process the incoming tiddlers\n\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\n\t// Deselect any disabled, but _not_ suppressed tiddlers\n\tvar systemMessage = $tw.language.getString(\"Import/Upgrader/Tiddler/Unselected\");\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t\tif(message.indexOf(systemMessage) !== -1) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t}\n\t});\n\t// Deselect suppressed tiddlers ... they have been removed and can't be selected anymore\n\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\n\t\tif($tw.utils.count(tiddler) === 0) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t\tnewFields[\"suppressed-\" + title] = \"yes\";\n\t\t}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tvar autoOpenOnImport = event.autoOpenOnImport || paramObject.autoOpenOnImport || this.getVariable(\"tv-auto-open-on-import\");\n\tif(autoOpenOnImport !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList && storyList.indexOf(importTitle) === -1) {\n\t\t\tstoryList.unshift(importTitle);\n\t\t}\n\t\t// And to history\n\t\thistory.push(importTitle);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\n\t}\n\treturn false;\n};\n\n//\nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\n\tvar self = this,\n\t\timportTiddler = this.wiki.getTiddler(event.param),\n\t\timportData,\n\t\timportReport = [];\n\timportReport.push($tw.language.getString(\"Import/Imported/Hint\") + \"\\n\");\n\t// If you need to modify the import tiddler payload then consider th-importing-tiddler instead\n\timportTiddler = $tw.hooks.invokeHook(\"th-before-importing\",importTiddler);\n\timportData = this.wiki.getTiddlerDataCached(event.param,{tiddlers: {}}),\n\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title && importTiddler && importTiddler.fields[\"selection-\" + title] !== \"unchecked\") {\n\t\t\tif($tw.utils.hop(importTiddler.fields,[\"rename-\" + title])) {\n\t\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields,{title : importTiddler.fields[\"rename-\" + title]});\n\t\t\t} else {\n\t\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\t\t\t}\n\t\t\t// th-importing-tiddler doesn't allow user interaction by default\n\t\t\t// If you want to use the default UI then use: $:/core/modules/upgraders/ instead\n\t\t\ttiddler = $tw.hooks.invokeHook(\"th-importing-tiddler\",tiddler);\n\t\t\t// Add the tiddlers to the store\n\t\t\tself.wiki.addTiddler(tiddler);\n\t\t\timportReport.push(\"# [[\" + tiddler.fields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: event.param,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([event.param]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nNavigatorWidget.prototype.handleFoldTiddlerEvent = function(event) {\n\tvar paramObject = event.paramObject || {};\n\tif(paramObject.foldedState) {\n\t\tvar foldedState = this.wiki.getTiddlerText(paramObject.foldedState,\"show\") === \"show\" ? \"hide\" : \"show\";\n\t\tthis.wiki.setText(paramObject.foldedState,\"text\",null,foldedState);\n\t}\n};\n\nNavigatorWidget.prototype.handleFoldOtherTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,event.param === title ? \"show\" : \"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleFoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix || \"$:/state/folded/\";\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"show\");\n\t});\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/parameters.js":{"title":"$:/core/modules/widgets/parameters.js","text":"/*\\\ntitle: $:/core/modules/widgets/parameters.js\ntype: application/javascript\nmodule-type: widget\n\nWidget for definition of transclusion parameters\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget,\n\tTranscludeWidget = require(\"$:/core/modules/widgets/transclude.js\").transclude;\n\nvar ParametersWidget = function(parseTreeNode,options) {\n\t// Initialise\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nParametersWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nParametersWidget.prototype.render = function(parent,nextSibling) {\n\t// Call the constructor\n\tWidget.call(this);\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nParametersWidget.prototype.execute = function() {\n\tvar self = this;\n\tthis.parametersDepth = Math.max(parseInt(this.getAttribute(\"$depth\",\"1\"),10) || 1,1);\n\t// Find the parent transclusions\n\tvar pointer = this.parentWidget,\n\t\tdepth = this.parametersDepth;\n\twhile(pointer) {\n\t\tif(pointer instanceof TranscludeWidget) {\n\t\t\tdepth--;\n\t\t\tif(depth <= 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tpointer = pointer.parentWidget;\n\t}\n\t// Process each parameter\n\tif(pointer instanceof TranscludeWidget) {\n\t\t// Get the value for each defined parameter\n\t\t$tw.utils.each($tw.utils.getOrderedAttributesFromParseTreeNode(self.parseTreeNode),function(attr,index) {\n\t\t\tvar name = attr.name;\n\t\t\t// If the attribute name starts with $$ then reduce to a single dollar\n\t\t\tif(name.substr(0,2) === \"$$\") {\n\t\t\t\tname = name.substr(1);\n\t\t\t}\n\t\t\tvar value = pointer.getTransclusionParameter(name,index,self.getAttribute(attr.name,\"\"));\n\t\t\tself.setVariable(name,value);\n\t\t});\n\t\t// Assign any metaparameters\n\t\t$tw.utils.each(pointer.getTransclusionMetaParameters(),function(getValue,name) {\n\t\t\tvar variableName = self.getAttribute(\"$\" + name);\n\t\t\tif(variableName) {\n\t\t\t\tself.setVariable(variableName,getValue(name));\n\t\t\t}\n\t\t});\n\t} else {\n\t\t// There is no parent transclude. i.e. direct rendering.\n\t\t// We use default values only.\n\t\t$tw.utils.each($tw.utils.getOrderedAttributesFromParseTreeNode(self.parseTreeNode),function(attr,index) {\n\t\t\tvar name = attr.name;\n\t\t\t// If the attribute name starts with $$ then reduce to a single dollar\n\t\t\tif(name.substr(0,2) === \"$$\") {\n\t\t\t\tname = name.substr(1);\n\t\t\t}\n\t\t\tvar value = self.getAttribute(attr.name,\"\");\n\t\t\tself.setVariable(name,value);\n\t\t});\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nParametersWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.parameters = ParametersWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/password.js":{"title":"$:/core/modules/widgets/password.js","text":"/*\\\ntitle: $:/core/modules/widgets/password.js\ntype: application/javascript\nmodule-type: widget\n\nPassword widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar PasswordWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nPasswordWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nPasswordWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the current password\n\tvar password = $tw.browser ? $tw.utils.getPassword(this.passwordName) || \"\" : \"\";\n\t// Create our element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"password\");\n\tdomNode.setAttribute(\"value\",password);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nPasswordWidget.prototype.handleChangeEvent = function(event) {\n\tvar password = this.domNodes[0].value;\n\treturn $tw.utils.savePassword(this.passwordName,password);\n};\n\n/*\nCompute the internal state of the widget\n*/\nPasswordWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.passwordName = this.getAttribute(\"name\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nPasswordWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.password = PasswordWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/qualify.js":{"title":"$:/core/modules/widgets/qualify.js","text":"/*\\\ntitle: $:/core/modules/widgets/qualify.js\ntype: application/javascript\nmodule-type: widget\n\nQualify text to a variable \n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar QualifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nQualifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nQualifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nQualifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.qualifyName = this.getAttribute(\"name\");\n\tthis.qualifyTitle = this.getAttribute(\"title\");\n\t// Set context variable\n\tif(this.qualifyName) {\n\t\tthis.setVariable(this.qualifyName,this.qualifyTitle + \"-\" + this.getStateQualifier());\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nQualifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.title) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.qualify = QualifyWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/radio.js":{"title":"$:/core/modules/widgets/radio.js","text":"/*\\\ntitle: $:/core/modules/widgets/radio.js\ntype: application/javascript\nmodule-type: widget\n\nSet a field or index at a given tiddler via radio buttons\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar RadioWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRadioWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRadioWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tvar isChecked = this.getValue() === this.radioValue;\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",\n\t\t\"tc-radio \" + this.radioClass + (isChecked ? \" tc-radio-selected\" : \"\")\n\t);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"radio\");\n\tthis.assignAttributes(this.inputDomNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\n\tif(isChecked) {\n\t\tthis.inputDomNode.checked = true;\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nRadioWidget.prototype.getValue = function() {\n\tvar value,\n\t\ttiddler = this.wiki.getTiddler(this.radioTitle);\n\tif(tiddler) {\n\t\tif(this.radioIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex,this.radioDefault);\n\t\t} else {\n\t\t\tvalue = tiddler.getFieldString(this.radioField,this.radioDefault);\n\t\t}\n\t} else {\n\t\tvalue = this.radioDefault;\n\t}\n\treturn value;\n};\n\nRadioWidget.prototype.setValue = function() {\n\tif(this.radioIndex) {\n\t\tthis.wiki.setText(this.radioTitle,\"\",this.radioIndex,this.radioValue);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.radioTitle),\n\t\t\taddition = {};\n\t\taddition[this.radioField] = this.radioValue;\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),{title: this.radioTitle},tiddler,addition,this.wiki.getModificationFields()));\n\t}\n};\n\nRadioWidget.prototype.handleChangeEvent = function(event) {\n\tif(this.inputDomNode.checked) {\n\t\tthis.setValue();\n\t}\n\t// Trigger actions\n\tif(this.radioActions) {\n\t\tthis.invokeActionString(this.radioActions,this,event,{\"actionValue\": this.radioValue});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRadioWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.radioTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.radioField = this.getAttribute(\"field\",\"text\");\n\tthis.radioIndex = this.getAttribute(\"index\");\n\tthis.radioValue = this.getAttribute(\"value\");\n\tthis.radioClass = this.getAttribute(\"class\",\"\");\n\tthis.radioDefault = this.getAttribute(\"default\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\tthis.radioActions = this.getAttribute(\"actions\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRadioWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(($tw.utils.count(changedAttributes) > 0)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.radioTitle]) {\n\t\tthis.inputDomNode.checked = this.getValue() === this.radioValue;\n\t\t$tw.utils.toggleClass(this.labelDomNode,\"tc-radio-selected\",this.inputDomNode.checked);\n\t\treturn this.refreshChildren(changedTiddlers);\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.radio = RadioWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/range.js":{"title":"$:/core/modules/widgets/range.js","text":"/*\\\ntitle: $:/core/modules/widgets/range.js\ntype: application/javascript\nmodule-type: widget\n\nRange widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RangeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRangeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRangeWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"range\");\n\tthis.inputDomNode.setAttribute(\"class\",this.elementClass);\n\tif(this.minValue){\n\t\tthis.inputDomNode.setAttribute(\"min\", this.minValue);\n\t}\n\tif(this.maxValue){\n\t\tthis.inputDomNode.setAttribute(\"max\", this.maxValue);\n\t}\n\tif(this.increment){\n\t\tthis.inputDomNode.setAttribute(\"step\", this.increment);\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.inputDomNode.value = this.getValue();\n\tthis.assignAttributes(this.inputDomNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name:\"mousedown\", handlerObject:this, handlerMethod:\"handleMouseDownEvent\"},\n\t\t{name:\"mouseup\",   handlerObject:this, handlerMethod:\"handleMouseUpEvent\"},\n\t\t{name:\"change\",    handlerObject:this, handlerMethod:\"handleChangeEvent\"},\n\t\t{name:\"input\",     handlerObject:this, handlerMethod:\"handleInputEvent\"},\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.inputDomNode,nextSibling);\n\tthis.domNodes.push(this.inputDomNode);\n};\n\nRangeWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle),\n\t\tfieldName = this.tiddlerField,\n\t\tvalue = this.defaultValue;\n\tif(tiddler) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(tiddler,this.tiddlerIndex,this.defaultValue);\n\t\t} else {\n\t\t\tif($tw.utils.hop(tiddler.fields,fieldName)) {\n\t\t\t\tvalue = tiddler.fields[fieldName] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.defaultValue;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nRangeWidget.prototype.getActionVariables = function(options) {\n\toptions = options || {};\n\tvar hasChanged = (this.startValue !== this.inputDomNode.value) ? \"yes\" : \"no\";\n\t// Trigger actions. Use variables = {key:value, key:value ...}\n\t// the \"value\" is needed.\n\treturn $tw.utils.extend({\"actionValue\": this.inputDomNode.value, \"actionValueHasChanged\": hasChanged}, options);\n}\n\n// actionsStart\nRangeWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.mouseDown = true; // TODO remove once IE is gone.\n\tthis.startValue = this.inputDomNode.value; // TODO remove this line once IE is gone!\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsMouseDown) {\n\t\tvar variables = this.getActionVariables() // TODO this line will go into the function call below.\n\t\tthis.invokeActionString(this.actionsMouseDown,this,event,variables);\n\t}\n}\n\n// actionsStop\nRangeWidget.prototype.handleMouseUpEvent = function(event) {\n\tthis.mouseDown = false; // TODO remove once IE is gone.\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsMouseUp) {\n\t\tvar variables = this.getActionVariables()\n\t\tthis.invokeActionString(this.actionsMouseUp,this,event,variables);\n\t}\n\t// TODO remove the following if() once IE is gone!\n\tif ($tw.browser.isIE) {\n\t\tif (this.startValue !== this.inputDomNode.value) {\n\t\t\tthis.handleChangeEvent(event);\n\t\t\tthis.startValue = this.inputDomNode.value;\n\t\t}\n\t}\n}\n\nRangeWidget.prototype.handleChangeEvent = function(event) {\n\tif (this.mouseDown) {  // TODO refactor this function once IE is gone.\n\t\tthis.handleInputEvent(event);\n\t}\n};\n\nRangeWidget.prototype.handleInputEvent = function(event) {\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsInput) {\n\t\t// \"tiddler\" parameter may be missing. See .execute() below\n\t\tvar variables = this.getActionVariables({\"actionValueHasChanged\": \"yes\"}) // TODO this line will go into the function call below.\n\t\tthis.invokeActionString(this.actionsInput,this,event,variables);\n\t}\n};\n\nRangeWidget.prototype.handleEvent = function(event) {\n\tif(this.getValue() !== this.inputDomNode.value) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,\"\",this.tiddlerIndex,this.inputDomNode.value);\n\t\t} else {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,this.tiddlerField,null,this.inputDomNode.value);\n\t\t}\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRangeWidget.prototype.execute = function() {\n\t// TODO remove the next 1 lines once IE is gone!\n\tthis.mouseUp = true; // Needed for IE10\n\t// Get the parameters from the attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.tiddlerField = this.getAttribute(\"field\",\"text\");\n\tthis.tiddlerIndex = this.getAttribute(\"index\");\n\tthis.minValue = this.getAttribute(\"min\");\n\tthis.maxValue = this.getAttribute(\"max\");\n\tthis.increment = this.getAttribute(\"increment\");\n\tthis.defaultValue = this.getAttribute(\"default\",\"\");\n\tthis.elementClass = this.getAttribute(\"class\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Actions since 5.1.23\n\t// Next 2 only fire once!\n\tthis.actionsMouseDown = this.getAttribute(\"actionsStart\",\"\");\n\tthis.actionsMouseUp = this.getAttribute(\"actionsStop\",\"\");\n\t// Input fires very often!\n\tthis.actionsInput = this.getAttribute(\"actions\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRangeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.tiddlerTitle]) {\n\t\t\tvar value = this.getValue();\n\t\t\tif(this.inputDomNode.value !== value) {\n\t\t\t\tthis.inputDomNode.value = value;\n\t\t\t}\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.range = RangeWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/raw.js":{"title":"$:/core/modules/widgets/raw.js","text":"/*\\\ntitle: $:/core/modules/widgets/raw.js\ntype: application/javascript\nmodule-type: widget\n\nRaw widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RawWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRawWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRawWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar div = this.document.createElement(\"div\");\n\tdiv.innerHTML=this.parseTreeNode.html;\n\tparent.insertBefore(div,nextSibling);\n\tthis.domNodes.push(div);\n};\n\n/*\nCompute the internal state of the widget\n*/\nRawWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRawWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.raw = RawWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/reveal.js":{"title":"$:/core/modules/widgets/reveal.js","text":"/*\\\ntitle: $:/core/modules/widgets/reveal.js\ntype: application/javascript\nmodule-type: widget\n\nReveal widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar Popup = require(\"$:/core/modules/utils/dom/popup.js\");\n\nvar RevealWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRevealWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRevealWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.revealTag && $tw.config.htmlUnsafeElements.indexOf(this.revealTag) === -1) {\n\t\ttag = this.revealTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(!this.isOpen) {\n\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t}\n\tthis.domNodes.push(domNode);\n};\n\nRevealWidget.prototype.positionPopup = function(domNode) {\n\tdomNode.style.position = \"absolute\";\n\tdomNode.style.zIndex = \"1000\";\n\tvar left,top;\n\tswitch(this.position) {\n\t\tcase \"left\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"above\":\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"aboveright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"belowright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t\tcase \"right\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"belowleft\":\n\t\t\tleft = this.popup.left + this.popup.width - domNode.offsetWidth;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t\tcase \"aboveleft\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tdefault: // Below\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t}\n\tif(!this.positionAllowNegative) {\n\t\tleft = Math.max(0,left);\n\t\ttop = Math.max(0,top);\n\t}\n\tif (this.popup.absolute) {\n\t\t// Traverse the offsetParent chain and correct the offset to make it relative to the parent node.\n\t\tfor (var offsetParentDomNode = domNode.offsetParent; offsetParentDomNode; offsetParentDomNode = offsetParentDomNode.offsetParent) {\n\t\t\tleft -= offsetParentDomNode.offsetLeft;\n\t\t\ttop -= offsetParentDomNode.offsetTop;\n\t\t}\n\t}\n\tdomNode.style.left = left + \"px\";\n\tdomNode.style.top = top + \"px\";\n};\n\n/*\nCompute the internal state of the widget\n*/\nRevealWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.state = this.getAttribute(\"state\");\n\tthis.revealTag = this.getAttribute(\"tag\");\n\tthis.type = this.getAttribute(\"type\");\n\tthis.text = this.getAttribute(\"text\");\n\tthis.position = this.getAttribute(\"position\");\n\tthis.positionAllowNegative = this.getAttribute(\"positionAllowNegative\") === \"yes\";\n\t// class attribute handled in assignDomNodeClasses()\n\tthis.style = this.getAttribute(\"style\",\"\");\n\tthis[\"default\"] = this.getAttribute(\"default\",\"\");\n\tthis.animate = this.getAttribute(\"animate\",\"no\");\n\tthis.retain = this.getAttribute(\"retain\",\"no\");\n\tthis.openAnimation = this.animate === \"no\" ? undefined : \"open\";\n\tthis.closeAnimation = this.animate === \"no\" ? undefined : \"close\";\n\tthis.updatePopupPosition = this.getAttribute(\"updatePopupPosition\",\"no\") === \"yes\";\n\t// Compute the title of the state tiddler and read it\n\tthis.stateTiddlerTitle = this.state;\n\tthis.stateTitle = this.getAttribute(\"stateTitle\");\n\tthis.stateField = this.getAttribute(\"stateField\");\n\tthis.stateIndex = this.getAttribute(\"stateIndex\");\n\tthis.readState();\n\t// Construct the child widgets\n\tvar childNodes = this.isOpen ? this.parseTreeNode.children : [];\n\tthis.hasChildNodes = this.isOpen;\n\tthis.makeChildWidgets(childNodes);\n};\n\n/*\nRead the state tiddler\n*/\nRevealWidget.prototype.readState = function() {\n\t// Read the information from the state tiddler\n\tvar state,\n\t    defaultState = this[\"default\"];\n\tif(this.stateTitle) {\n\t\tvar stateTitleTiddler = this.wiki.getTiddler(this.stateTitle);\n\t\tif(this.stateField) {\n\t\t\tstate = stateTitleTiddler ? stateTitleTiddler.getFieldString(this.stateField) || defaultState : defaultState;\n\t\t} else if(this.stateIndex) {\n\t\t\tstate = stateTitleTiddler ? this.wiki.extractTiddlerDataItem(this.stateTitle,this.stateIndex) || defaultState : defaultState;\n\t\t} else if(stateTitleTiddler) {\n\t\t\tstate = this.wiki.getTiddlerText(this.stateTitle) || defaultState;\n\t\t} else {\n\t\t\tstate = defaultState;\n\t\t}\n\t} else {\n\t\tstate = this.stateTiddlerTitle ? this.wiki.getTextReference(this.state,this[\"default\"],this.getVariable(\"currentTiddler\")) : this[\"default\"];\n\t}\n\tif(state === null) {\n\t\tstate = this[\"default\"];\n\t}\n\tswitch(this.type) {\n\t\tcase \"popup\":\n\t\t\tthis.readPopupState(state);\n\t\t\tbreak;\n\t\tcase \"match\":\n\t\t\tthis.isOpen = this.text === state;\n\t\t\tbreak;\n\t\tcase \"nomatch\":\n\t\t\tthis.isOpen = this.text !== state;\n\t\t\tbreak;\n\t\tcase \"lt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t\tcase \"gt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"lteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"gteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t}\n};\n\nRevealWidget.prototype.compareStateText = function(state) {\n\treturn state.localeCompare(this.text,undefined,{numeric: true,sensitivity: \"case\"});\n};\n\nRevealWidget.prototype.readPopupState = function(state) {\n\tthis.popup = Popup.parseCoordinates(state);\n\t// Check if the state matches the location regexp\n\tif(this.popup) {\n\t\t// If so, we're open\n\t\tthis.isOpen = true;\n\t} else {\n\t\t// If not, we're closed\n\t\tthis.isOpen = false;\n\t}\n};\n\nRevealWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-reveal\");\n\tthis.domNode.className = classes.join(\" \");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRevealWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes.positionAllowNegative || changedAttributes[\"default\"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar currentlyOpen = this.isOpen;\n\t\tthis.readState();\n\t\tif(this.isOpen !== currentlyOpen) {\n\t\t\tif(this.retain === \"yes\") {\n\t\t\t\tthis.updateState();\n\t\t\t} else {\n\t\t\t\tthis.refreshSelf();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if(this.type === \"popup\" && this.isOpen && this.updatePopupPosition && (changedTiddlers[this.state] || changedTiddlers[this.stateTitle])) {\n\t\t\tthis.positionPopup(this.domNode);\n\t\t}\n\t\tif(changedAttributes.style) {\n\t\t\tthis.domNode.style = this.getAttribute(\"style\",\"\");\n\t\t}\n\t\tif(changedAttributes[\"class\"]) {\n\t\t\tthis.assignDomNodeClasses();\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\n/*\nCalled by refresh() to dynamically show or hide the content\n*/\nRevealWidget.prototype.updateState = function() {\n\tvar self = this;\n\t// Read the current state\n\tthis.readState();\n\t// Construct the child nodes if needed\n\tvar domNode = this.domNodes[0];\n\tif(this.isOpen && !this.hasChildNodes) {\n\t\tthis.hasChildNodes = true;\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\tthis.renderChildren(domNode,null);\n\t}\n\t// Animate our DOM node\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\n\t}\n\tif(this.isOpen) {\n\t\tdomNode.removeAttribute(\"hidden\");\n        $tw.anim.perform(this.openAnimation,domNode);\n\t} else {\n\t\t$tw.anim.perform(this.closeAnimation,domNode,{callback: function() {\n\t\t\t//make sure that the state hasn't changed during the close animation\n\t\t\tself.readState()\n\t\t\tif(!self.isOpen) {\n\t\t\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t\t\t}\n\t\t}});\n\t}\n};\n\nexports.reveal = RevealWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/scrollable.js":{"title":"$:/core/modules/widgets/scrollable.js","text":"/*\\\ntitle: $:/core/modules/widgets/scrollable.js\ntype: application/javascript\nmodule-type: widget\n\nScrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEBOUNCE_INTERVAL = 100; // Delay after last scroll event before updating the bound tiddler\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ScrollableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nScrollableWidget.prototype = new Widget();\n\nScrollableWidget.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle a scroll event\n*/\nScrollableWidget.prototype.handleScrollEvent = function(event) {\n\t// Pass the scroll event through if our offsetsize is larger than our scrollsize\n\tif(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === \"yes\") {\n\t\treturn true;\n\t}\n\tvar options = {};\n\tif($tw.utils.hop(event.paramObject,\"animationDuration\")) {\n\t\toptions.animationDuration = event.paramObject.animationDuration;\n\t}\n\tif(event.paramObject && event.paramObject.selector) {\n\t\tthis.scrollSelectorIntoView(null,event.paramObject.selector,null,options);\n\t} else {\n\t\tthis.scrollIntoView(event.target,null,options);\n\t}\n\treturn false; // Handled event\n};\n\n/*\nScroll an element into view\n*/\nScrollableWidget.prototype.scrollIntoView = function(element,callback,options) {\n\tvar duration = $tw.utils.hop(options,\"animationDuration\") ? parseInt(options.animationDuration) : $tw.utils.getAnimationDuration(),\n\t\tsrcWindow = element ? element.ownerDocument.defaultView : window;\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = {\n\t\tx: this.outerDomNode.scrollLeft,\n\t\ty: this.outerDomNode.scrollTop\n\t};\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar scrollableBounds = this.outerDomNode.getBoundingClientRect(),\n\t\tclientTargetBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientTargetBounds.left + scrollPosition.x - scrollableBounds.left,\n\t\t\ttop: clientTargetBounds.top + scrollPosition.y - scrollableBounds.top,\n\t\t\twidth: clientTargetBounds.width,\n\t\t\theight: clientTargetBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is already visible then stay where we are\n\t\t\tif(targetPos >= currentPos && (targetPos + targetSize) <= (currentPos + currentSize)) {\n\t\t\t\treturn currentPos;\n\t\t\t// If the target is above/left of the current view, then scroll to its top/left\n\t\t\t} else if(targetPos <= currentPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\treturn targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\treturn currentPos;\n\t\t\t}\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,this.outerDomNode.offsetWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,this.outerDomNode.offsetHeight);\n\t// Only scroll if necessary\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tself.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t;\n\t\t\tself.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t;\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\nScrollableWidget.prototype.scrollSelectorIntoView = function(baseElement,selector,callback,options) {\n\tbaseElement = baseElement || document;\n\tvar element = $tw.utils.querySelectorSafe(selector,baseElement);\n\tif(element) {\n\t\tthis.scrollIntoView(element,callback,options);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\tthis.scaleFactor = 1;\n\tthis.addEventListeners([\n\t\t{type: \"tm-scroll\", handler: \"handleScrollEvent\"}\n\t]);\n\tif($tw.browser) {\n\t\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t\t};\n\t\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\t\twindow.mozCancelAnimationFrame ||\n\t\t\twindow.mozCancelRequestAnimationFrame ||\n\t\t\tfunction(id) {\n\t\t\t\twindow.clearTimeout(id);\n\t\t\t};\n\t}\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create elements\n\tthis.outerDomNode = this.document.createElement(\"div\");\n\t$tw.utils.setStyle(this.outerDomNode,[\n\t\t{overflowY: \"auto\"},\n\t\t{overflowX: \"auto\"},\n\t\t{webkitOverflowScrolling: \"touch\"}\n\t]);\n\tthis.innerDomNode = this.document.createElement(\"div\");\n\tthis.outerDomNode.appendChild(this.innerDomNode);\n\t// Assign classes\n\tthis.outerDomNode.className = this[\"class\"] || \"\";\n\t// Insert element\n\tparent.insertBefore(this.outerDomNode,nextSibling);\n\tthis.renderChildren(this.innerDomNode,null);\n\tthis.domNodes.push(this.outerDomNode);\n\t// If the scroll position is bound to a tiddler\n\tif(this.scrollableBind) {\n\t\t// After a delay for rendering, scroll to the bound position\n\t\tthis.updateScrollPositionFromBoundTiddler();\n\t\t// Set up event listener\n\t\tthis.currentListener = this.listenerFunction.bind(this);\n\t\tthis.outerDomNode.addEventListener(\"scroll\", this.currentListener);\n\t}\n};\n\nScrollableWidget.prototype.listenerFunction = function(event) {\n\tself = this;\n\tclearTimeout(this.timeout);\n\tthis.timeout = setTimeout(function() {\n\t\tvar existingTiddler = self.wiki.getTiddler(self.scrollableBind),\n\t\t\tnewTiddlerFields = {\n\t\t\t\ttitle: self.scrollableBind,\n\t\t\t\t\"scroll-left\": self.outerDomNode.scrollLeft.toString(),\n\t\t\t\t\"scroll-top\": self.outerDomNode.scrollTop.toString()\n\t\t\t};\n\t\tif(!existingTiddler || (existingTiddler.fields[\"title\"] !== newTiddlerFields[\"title\"]) || (existingTiddler.fields[\"scroll-left\"] !== newTiddlerFields[\"scroll-left\"] || existingTiddler.fields[\"scroll-top\"] !== newTiddlerFields[\"scroll-top\"])) {\n\t\t\tself.wiki.addTiddler(new $tw.Tiddler(existingTiddler,newTiddlerFields));\n\t\t}\n\t}, DEBOUNCE_INTERVAL);\n}\n\nScrollableWidget.prototype.updateScrollPositionFromBoundTiddler = function() {\n\t// Bail if we're running on the fakedom\n\tif(!this.outerDomNode.scrollTo) {\n\t\treturn;\n\t}\n\tvar tiddler = this.wiki.getTiddler(this.scrollableBind);\n\tif(tiddler) {\n\t\tvar scrollLeftTo = this.outerDomNode.scrollLeft;\n\t\tif(parseFloat(tiddler.fields[\"scroll-left\"]).toString() === tiddler.fields[\"scroll-left\"]) {\n\t\t\tscrollLeftTo = parseFloat(tiddler.fields[\"scroll-left\"]);\n\t\t}\n\t\tvar scrollTopTo = this.outerDomNode.scrollTop;\n\t\tif(parseFloat(tiddler.fields[\"scroll-top\"]).toString() === tiddler.fields[\"scroll-top\"]) {\n\t\t\tscrollTopTo = parseFloat(tiddler.fields[\"scroll-top\"]);\n\t\t}\n\t\tthis.outerDomNode.scrollTo({\n\t\t\ttop: scrollTopTo,\n\t\t\tleft: scrollLeftTo,\n\t\t\tbehavior: \"instant\"\n\t\t})\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nScrollableWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.scrollableBind = this.getAttribute(\"bind\");\n\tthis.fallthrough = this.getAttribute(\"fallthrough\",\"yes\");\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nScrollableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\t// If the bound tiddler has changed, update the eventListener and update scroll position\n\tif(changedAttributes[\"bind\"]) {\n\t\tif(this.currentListener) {\n\t\t\tthis.outerDomNode.removeEventListener(\"scroll\", this.currentListener, false);\n\t\t}\n\t\tthis.scrollableBind = this.getAttribute(\"bind\");\n\t\tthis.currentListener = this.listenerFunction.bind(this);\n\t\tthis.outerDomNode.addEventListener(\"scroll\", this.currentListener);\n\t}\n\t// Refresh children\n\tvar result = this.refreshChildren(changedTiddlers);\n\t// If the bound tiddler has changed, update scroll position\n\tif(changedAttributes[\"bind\"] || changedTiddlers[this.getAttribute(\"bind\")]) {\n\t\tthis.updateScrollPositionFromBoundTiddler();\n\t}\n\treturn result;\n};\n\nexports.scrollable = ScrollableWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/select.js":{"title":"$:/core/modules/widgets/select.js","text":"/*\\\ntitle: $:/core/modules/widgets/select.js\ntype: application/javascript\nmodule-type: widget\n\nSelect widget:\n\n```\n<$select tiddler=\"MyTiddler\" field=\"text\">\n<$list filter=\"[tag[chapter]]\">\n<option value=<<currentTiddler>>>\n<$view field=\"description\"/>\n</option>\n</$list>\n</$select>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SelectWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSelectWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSelectWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t//Create element\n\tvar domNode = this.document.createElement(\"select\");\n\tif(this.selectClass) {\n\t\tdomNode.className = this.selectClass;\n\t}\n\t// Assign data- attributes\n\tthis.assignAttributes(domNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\n\tif(this.selectMultiple) {\n\t\tdomNode.setAttribute(\"multiple\",\"multiple\");\n\t}\n\tif(this.selectSize) {\n\t\tdomNode.setAttribute(\"size\",this.selectSize);\n\t}\n\tif(this.selectTabindex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.selectTabindex);\n\t}\n\tif(this.selectTooltip) {\n\t\tdomNode.setAttribute(\"title\",this.selectTooltip);\n\t}\n\tthis.parentDomNode.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\tthis.setSelectValue();\n\tif(this.selectFocus == \"yes\") {\n\t\tthis.getSelectDomNode().focus();\n\t}\n\t$tw.utils.addEventListeners(this.getSelectDomNode(),[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n};\n\n/*\nHandle a change event\n*/\nSelectWidget.prototype.handleChangeEvent = function(event) {\n\t// Get the new value and assign it to the tiddler\n\tif(this.selectMultiple == false) {\n\t\tvar value = this.getSelectDomNode().value;\n\t} else {\n\t\tvar value = this.getSelectValues()\n\t\t\t\tvalue = $tw.utils.stringifyList(value);\n\t}\n\tthis.wiki.setText(this.selectTitle,this.selectField,this.selectIndex,value);\n\t// Trigger actions\n\tif(this.selectActions) {\n\t\tthis.invokeActionString(this.selectActions,this,event);\n\t}\n};\n\n/*\nIf necessary, set the value of the select element to the current value\n*/\nSelectWidget.prototype.setSelectValue = function() {\n\tvar value = this.selectDefault;\n\t// Get the value\n\tif(this.selectIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.selectTitle,this.selectIndex,value);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.selectTitle);\n\t\tif(tiddler) {\n\t\t\tif(this.selectField === \"text\") {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.selectTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.selectField)) {\n\t\t\t\t\tvalue = tiddler.getFieldString(this.selectField);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.selectField === \"title\") {\n\t\t\t\tvalue = this.selectTitle;\n\t\t\t}\n\t\t}\n\t}\n\t// Assign it to the select element if it's different than the current value\n\tif (this.selectMultiple) {\n\t\tvalue = value === undefined ? \"\" : value;\n\t\tvar select = this.getSelectDomNode();\n\t\tvar values = Array.isArray(value) ? value : $tw.utils.parseStringArray(value);\n\t\tfor(var i=0; i < select.children.length; i++){\n\t\t\tselect.children[i].selected = values.indexOf(select.children[i].value) !== -1\n\t\t}\n\t} else {\n\t\tvar domNode = this.getSelectDomNode();\n\t\tif(domNode.value !== value) {\n\t\t\tdomNode.value = value;\n\t\t}\n\t}\n};\n\n/*\nGet the DOM node of the select element\n*/\nSelectWidget.prototype.getSelectDomNode = function() {\n\treturn this.domNodes[0];\n};\n\n// Return an array of the selected opion values\n// select is an HTML select element\nSelectWidget.prototype.getSelectValues = function() {\n\tvar select, result, options, opt;\n\tselect = this.getSelectDomNode();\n\tresult = [];\n\toptions = select && select.options;\n\tfor (var i=0; i<options.length; i++) {\n\t\topt = options[i];\n\t\tif (opt.selected) {\n\t\t\tresult.push(opt.value || opt.text);\n\t\t}\n\t}\n\treturn result;\n}\n\n/*\nCompute the internal state of the widget\n*/\nSelectWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.selectActions = this.getAttribute(\"actions\");\n\tthis.selectTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.selectField = this.getAttribute(\"field\",\"text\");\n\tthis.selectIndex = this.getAttribute(\"index\");\n\tthis.selectClass = this.getAttribute(\"class\");\n\tthis.selectDefault = this.getAttribute(\"default\");\n\tthis.selectMultiple = this.getAttribute(\"multiple\", false);\n\tthis.selectSize = this.getAttribute(\"size\");\n\tthis.selectTabindex = this.getAttribute(\"tabindex\");\n\tthis.selectTooltip = this.getAttribute(\"tooltip\");\n\tthis.selectFocus = this.getAttribute(\"focus\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSelectWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// If we're using a different tiddler/field/index then completely refresh ourselves\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tooltip || changedAttributes.tabindex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tif(changedAttributes.class) {\n\t\t\tthis.selectClass = this.getAttribute(\"class\");\n\t\t\tthis.getSelectDomNode().setAttribute(\"class\",this.selectClass); \n\t\t}\n\t\tthis.assignAttributes(this.getSelectDomNode(),{\n\t\t\tchangedAttributes: changedAttributes,\n\t\t\tsourcePrefix: \"data-\",\n\t\t\tdestPrefix: \"data-\"\n\t\t});\n\t\tvar childrenRefreshed = this.refreshChildren(changedTiddlers);\n\t\t// If the target tiddler value has changed, just update setting and refresh the children\n\t\tif(changedTiddlers[this.selectTitle] || childrenRefreshed) {\n\t\t\tthis.setSelectValue();\n\t\t} \n\t\treturn childrenRefreshed;\n\t}\n};\n\nexports.select = SelectWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/setmultiplevariables.js":{"title":"$:/core/modules/widgets/setmultiplevariables.js","text":"/*\\\ntitle: $:/core/modules/widgets/setmultiplevariables.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to set multiple variables at once from a list of names and a list of values\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetMultipleVariablesWidget = function(parseTreeNode,options) {\n    this.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetMultipleVariablesWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetMultipleVariablesWidget.prototype.render = function(parent,nextSibling) {\n    this.parentDomNode = parent;\n    this.computeAttributes();\n    this.execute();\n    this.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetMultipleVariablesWidget.prototype.execute = function() {\n    // Setup our variables\n    this.setVariables();\n    // Construct the child widgets\n    this.makeChildWidgets();\n};\n\n\nSetMultipleVariablesWidget.prototype.setVariables = function() {\n    // Set the variables\n    var self = this,\n        filterNames = this.getAttribute(\"$names\",\"\"),\n        filterValues = this.getAttribute(\"$values\",\"\");\n    this.variableNames = [];\n    this.variableValues = [];\n    if(filterNames && filterValues) {\n        this.variableNames = this.wiki.filterTiddlers(filterNames,this);\n        this.variableValues = this.wiki.filterTiddlers(filterValues,this);\n        $tw.utils.each(this.variableNames,function(varname,index) {\n            self.setVariable(varname,self.variableValues[index]);\n        });\n    }\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetMultipleVariablesWidget.prototype.refresh = function(changedTiddlers) {\n    var filterNames = this.getAttribute(\"$names\",\"\"),\n        filterValues = this.getAttribute(\"$values\",\"\"),\n        variableNames = this.wiki.filterTiddlers(filterNames,this),\n        variableValues = this.wiki.filterTiddlers(filterValues,this);\n    if(!$tw.utils.isArrayEqual(this.variableNames,variableNames) || !$tw.utils.isArrayEqual(this.variableValues,variableValues)) {\n        this.refreshSelf();\n        return true;\n    }\n    return this.refreshChildren(changedTiddlers);\n};\n\nexports[\"setmultiplevariables\"] = SetMultipleVariablesWidget;\n\n})();\n        ","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/set.js":{"title":"$:/core/modules/widgets/set.js","text":"/*\\\ntitle: $:/core/modules/widgets/set.js\ntype: application/javascript\nmodule-type: widget\n\nSet variable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.setName = this.getAttribute(\"name\",\"currentTiddler\");\n\tthis.setFilter = this.getAttribute(\"filter\");\n\tthis.setSelect = this.getAttribute(\"select\");\n\tthis.setTiddler = this.getAttribute(\"tiddler\");\n\tthis.setSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.setField = this.getAttribute(\"field\");\n\tthis.setIndex = this.getAttribute(\"index\");\n\tthis.setValue = this.getAttribute(\"value\");\n\tthis.setEmptyValue = this.getAttribute(\"emptyValue\");\n\t// Set context variable\n\tif(this.parseTreeNode.isMacroDefinition) {\n\t\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,true);\n\t} else if(this.parseTreeNode.isFunctionDefinition) {\n\t\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,undefined,{isFunctionDefinition: true});\n\t} else if(this.parseTreeNode.isProcedureDefinition) {\n\t\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,undefined,{isProcedureDefinition: true, configTrimWhiteSpace: this.parseTreeNode.configTrimWhiteSpace});\n\t} else if(this.parseTreeNode.isWidgetDefinition) {\n\t\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,undefined,{isWidgetDefinition: true, configTrimWhiteSpace: this.parseTreeNode.configTrimWhiteSpace});\n\t} else {\n\t\tthis.setVariable(this.setName,this.getValue());\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nGet the value to be assigned\n*/\nSetWidget.prototype.getValue = function() {\n\tvar value = this.setValue;\n\tif(this.setTiddler) {\n\t\tvar tiddler;\n\t\tif(this.setSubTiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.setTiddler,this.setSubTiddler);\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.setTiddler);\n\t\t}\n\t\tif(!tiddler) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t} else if(this.setField) {\n\t\t\tvalue = tiddler.getFieldString(this.setField) || this.setEmptyValue;\n\t\t} else if(this.setIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.setTiddler,this.setIndex,this.setEmptyValue);\n\t\t} else {\n\t\t\tvalue = tiddler.fields.text || this.setEmptyValue ;\n\t\t}\n\t} else if(this.setFilter) {\n\t\tvar results = this.wiki.filterTiddlers(this.setFilter,this);\n\t\tif(this.setValue == null) {\n\t\t\tvar select;\n\t\t\tif(this.setSelect) {\n\t\t\t\tselect = parseInt(this.setSelect,10);\n\t\t\t}\n\t\t\tif(select !== undefined) {\n\t\t\t\tvalue = results[select] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = $tw.utils.stringifyList(results);\n\t\t\t}\n\t\t}\n\t\tif(results.length === 0 && this.setEmptyValue !== undefined) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t}\n\t} else if(!value && this.setEmptyValue) {\n\t\tvalue = this.setEmptyValue;\n\t}\n\treturn value || \"\";\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSetWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.filter || changedAttributes.select || changedAttributes.tiddler || (this.setTiddler && changedTiddlers[this.setTiddler]) || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes.emptyValue ||\n\t   (this.setFilter && this.getValue() != this.variables[this.setName].value)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.setvariable = SetWidget;\nexports.set = SetWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/slot.js":{"title":"$:/core/modules/widgets/slot.js","text":"/*\\\ntitle: $:/core/modules/widgets/slot.js\ntype: application/javascript\nmodule-type: widget\n\nWidget for definition of slots within transcluded content. The values provided by the translusion are passed to the slot.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget,\n\tTranscludeWidget = require(\"$:/core/modules/widgets/transclude.js\").transclude;\n\nvar SlotWidget = function(parseTreeNode,options) {\n\t// Initialise\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSlotWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSlotWidget.prototype.render = function(parent,nextSibling) {\n\t// Call the constructor\n\tWidget.call(this);\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nSlotWidget.prototype.execute = function() {\n\tvar self = this;\n\tthis.slotName = this.getAttribute(\"$name\");\n\tthis.slotDepth = parseInt(this.getAttribute(\"$depth\",\"1\"),10) || 1;\n\t// Find the parent transclusions\n\tvar pointer = this.parentWidget,\n\t\tdepth = this.slotDepth;\n\twhile(pointer) {\n\t\tif(pointer instanceof TranscludeWidget && pointer.hasVisibleSlots()) {\n\t\t\tdepth--;\n\t\t\tif(depth <= 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tpointer = pointer.parentWidget;\n\t}\n\tvar parseTreeNodes = [{type: \"text\", attributes: {text: {type: \"string\", value: \"Missing slot reference!\"}}}];\n\tif(pointer instanceof TranscludeWidget) {\n\t\t// Get the parse tree nodes comprising the slot contents\n\t\tparseTreeNodes = pointer.getTransclusionSlotFill(this.slotName,this.parseTreeNode.children);\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSlotWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$name\"] || changedAttributes[\"$depth\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.slot = SlotWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/testcase.js":{"title":"$:/core/modules/widgets/testcase.js","text":"/*\\\ntitle: $:/core/modules/widgets/testcase.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display a test case\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TestCaseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTestCaseWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTestCaseWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create container DOM node\n\tvar domNode = this.document.createElement(\"div\");\n\tthis.domNodes.push(domNode);\n\tparent.insertBefore(domNode,nextSibling);\n\t// Render the children into a hidden DOM node\n\tvar parser = {\n\t\ttree: [{\n\t\t\ttype: \"widget\",\n\t\t\tattributes: {},\n\t\t\torderedAttributes: [],\n\t\t\tchildren: this.parseTreeNode.children || []\n\t\t}]\n\t};\n\tthis.contentRoot = this.wiki.makeWidget(parser,{\n\t\tdocument: $tw.fakeDocument,\n\t\tparentWidget: this\n\t});\n\tthis.contentContainer = $tw.fakeDocument.createElement(\"div\");\n\tthis.contentRoot.render(this.contentContainer,null);\n\t// Create a wiki\n\tthis.testcaseWiki = new $tw.Wiki();\n\t// Always load the core plugin\n\tvar loadTiddler = function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tself.testcaseWiki.addTiddler(tiddler);\n\t\t}\n\t}\n\tloadTiddler(\"$:/core\");\n\tloadTiddler(\"$:/plugins/tiddlywiki/codemirror\");\n\t// Load tiddlers from child data widgets\n\tvar tiddlers = [];\n\tthis.findChildrenDataWidgets(this.contentRoot.children,\"data\",function(widget) {\n\t\tArray.prototype.push.apply(tiddlers,widget.readDataTiddlerValues());\n\t});\n\tvar jsonPayload = JSON.stringify(tiddlers);\n\tthis.testcaseWiki.addTiddlers(tiddlers);\n\t// Unpack plugin tiddlers\n\tthis.testcaseWiki.readPluginInfo();\n\tthis.testcaseWiki.registerPluginTiddlers(\"plugin\");\n\tthis.testcaseWiki.unpackPluginTiddlers();\n\tthis.testcaseWiki.addIndexersToWiki();\n\t// Generate a `transclusion` variable that depends on the values of the payload tiddlers so that the template can easily make unique state tiddlers\n\tthis.setVariable(\"transclusion\",$tw.utils.hashString(jsonPayload));\n\t// Generate a `payloadTiddlers` variable that contains the payload in JSON format\n\tthis.setVariable(\"payloadTiddlers\",jsonPayload);\n\t// Only run the tests if the testcase output and expected results were specified, and those tiddlers actually exist in the wiki\n\tvar shouldRunTests = false;\n\tif(this.testcaseTestOutput && this.testcaseWiki.tiddlerExists(this.testcaseTestOutput) && this.testcaseTestExpectedResult && this.testcaseWiki.tiddlerExists(this.testcaseTestExpectedResult)) {\n\t\tshouldRunTests = true;\n\t}\n\t// Render the test rendering if required\n\tif(shouldRunTests) {\n\t\tvar testcaseOutputContainer = $tw.fakeDocument.createElement(\"div\");\n\t\tvar testcaseOutputWidget = this.testcaseWiki.makeTranscludeWidget(this.testcaseTestOutput,{\n\t\t\tdocument: $tw.fakeDocument,\n\t\t\tparseAsInline: false,\n\t\t\tparentWidget: this,\n\t\t\tvariables: {\n\t\t\t\tcurrentTiddler: this.testcaseTestOutput\n\t\t\t}\n\t\t});\n\t\ttestcaseOutputWidget.render(testcaseOutputContainer);\n\t}\n\t// Clear changes queue\n\tthis.testcaseWiki.clearTiddlerEventQueue();\n\t// Run the actions if provided\n\tif(this.testcaseWiki.tiddlerExists(this.testcaseTestActions)) {\n\t\ttestcaseOutputWidget.invokeActionString(this.testcaseWiki.getTiddlerText(this.testcaseTestActions));\n\t\ttestcaseOutputWidget.refresh(this.testcaseWiki.changedTiddlers,testcaseOutputContainer);\n\t}\n\t// Set up the test result variables\n\tvar testResult = \"\",\n\t\toutputHTML = \"\",\n\t\texpectedHTML = \"\";\n\tif(shouldRunTests) {\n\t\toutputHTML = testcaseOutputContainer.children[0].innerHTML;\n\t\texpectedHTML = this.testcaseWiki.getTiddlerText(this.testcaseTestExpectedResult);\n\t\tif(outputHTML === expectedHTML) {\n\t\t\ttestResult = \"pass\";\n\t\t} else {\n\t\t\ttestResult = \"fail\";\n\t\t}\n\t\tthis.setVariable(\"outputHTML\",outputHTML);\n\t\tthis.setVariable(\"expectedHTML\",expectedHTML);\n\t\tthis.setVariable(\"testResult\",testResult);\n\t\tthis.setVariable(\"currentTiddler\",this.testcaseTestOutput);\n\t}\n\t// Don't display anything if testHideIfPass is \"yes\" and the tests have passed\n\tif(this.testcaseHideIfPass === \"yes\" && testResult !== \"fail\") {\n\t\treturn;\n\t}\n\t// Render the page root template of the subwiki\n\tvar rootWidget = this.testcaseWiki.makeTranscludeWidget(this.testcaseTemplate,{\n\t\tdocument: this.document,\n\t\tparseAsInline: false,\n\t\tparentWidget: this\n\t});\n\trootWidget.render(domNode);\n\t// Trap changes in the wiki and refresh the rendering\n\tthis.testcaseWiki.addEventListener(\"change\",function(changes) {\n\t\trootWidget.refresh(changes,domNode);\n\t});\n};\n\n/*\nCompute the internal state of the widget\n*/\nTestCaseWidget.prototype.execute = function() {\n\tthis.testcaseTemplate = this.getAttribute(\"template\",\"$:/core/ui/testcases/DefaultTemplate\");\n\tthis.testcaseTestOutput = this.getAttribute(\"testOutput\");\n\tthis.testcaseTestActions = this.getAttribute(\"testActions\");\n\tthis.testcaseTestExpectedResult = this.getAttribute(\"testExpectedResult\");\n\tthis.testcaseHideIfPass = this.getAttribute(\"testHideIfPass\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTestCaseWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.contentRoot.refresh(changedTiddlers);\n\t}\n};\n\nexports[\"testcase\"] = TestCaseWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/text.js":{"title":"$:/core/modules/widgets/text.js","text":"/*\\\ntitle: $:/core/modules/widgets/text.js\ntype: application/javascript\nmodule-type: widget\n\nText node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TextNodeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTextNodeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTextNodeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar text = this.getAttribute(\"text\",this.parseTreeNode.text || \"\");\n\ttext = text.replace(/\\r/mg,\"\");\n\tvar textNode = this.document.createTextNode(text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTextNodeWidget.prototype.execute = function() {\n\t// Nothing to do for a text node\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTextNodeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.text) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.text = TextNodeWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/tiddler.js":{"title":"$:/core/modules/widgets/tiddler.js","text":"/*\\\ntitle: $:/core/modules/widgets/tiddler.js\ntype: application/javascript\nmodule-type: widget\n\nTiddler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTiddlerWidget.prototype.execute = function() {\n\tthis.tiddlerState = this.computeTiddlerState();\n\tthis.setVariable(\"currentTiddler\",this.tiddlerState.currentTiddler);\n\tthis.setVariable(\"missingTiddlerClass\",this.tiddlerState.missingTiddlerClass);\n\tthis.setVariable(\"shadowTiddlerClass\",this.tiddlerState.shadowTiddlerClass);\n\tthis.setVariable(\"systemTiddlerClass\",this.tiddlerState.systemTiddlerClass);\n\tthis.setVariable(\"tiddlerTagClasses\",this.tiddlerState.tiddlerTagClasses);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nCompute the tiddler state flags\n*/\nTiddlerWidget.prototype.computeTiddlerState = function() {\n\t// Get our parameters\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Compute the state\n\tvar state = {\n\t\tcurrentTiddler: this.tiddlerTitle || \"\",\n\t\tmissingTiddlerClass: (this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? \"tc-tiddler-exists\" : \"tc-tiddler-missing\",\n\t\tshadowTiddlerClass: this.wiki.isShadowTiddler(this.tiddlerTitle) ? \"tc-tiddler-shadow\" : \"\",\n\t\tsystemTiddlerClass: this.wiki.isSystemTiddler(this.tiddlerTitle) ? \"tc-tiddler-system\" : \"\",\n\t\ttiddlerTagClasses: this.getTagClasses()\n\t};\n\t// Compute a simple hash to make it easier to detect changes\n\tstate.hash = state.currentTiddler + state.missingTiddlerClass + state.shadowTiddlerClass + state.systemTiddlerClass + state.tiddlerTagClasses;\n\treturn state;\n};\n\n/*\nCreate a string of CSS classes derived from the tags of the current tiddler\n*/\nTiddlerWidget.prototype.getTagClasses = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\tif(tiddler) {\n\t\tvar tags = [];\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\ttags.push(\"tc-tagged-\" + encodeURIComponent(tag));\n\t\t});\n\t\treturn tags.join(\" \");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tnewTiddlerState = this.computeTiddlerState();\n\tif(changedAttributes.tiddler || newTiddlerState.hash !== this.tiddlerState.hash) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.tiddler = TiddlerWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/transclude.js":{"title":"$:/core/modules/widgets/transclude.js","text":"/*\\\ntitle: $:/core/modules/widgets/transclude.js\ntype: application/javascript\nmodule-type: widget\n\nTransclude widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TranscludeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTranscludeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTranscludeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\ttry {\n\t\tthis.renderChildren(parent,nextSibling);\n\t} catch(error) {\n\t\tif(error instanceof $tw.utils.TranscludeRecursionError) {\n\t\t\t// We were infinite looping.\n\t\t\t// We need to try and abort as much of the loop as we can, so we will keep \"throwing\" upward until we find a transclusion that has a different signature.\n\t\t\t// Hopefully that will land us just outside where the loop began. That's where we want to issue an error.\n\t\t\t// Rendering widgets beneath this point may result in a freezing browser if they explode exponentially.\n\t\t\tvar transcludeSignature = this.getVariable(\"transclusion\");\n\t\t\tif(this.getAncestorCount() > $tw.utils.TranscludeRecursionError.MAX_WIDGET_TREE_DEPTH - 50) {\n\t\t\t\t// For the first fifty transcludes we climb up, we simply collect signatures.\n\t\t\t\t// We're assuming that those first 50 will likely include all transcludes involved in the loop.\n\t\t\t\terror.signatures[transcludeSignature] = true;\n\t\t\t} else if(!error.signatures[transcludeSignature]) {\n\t\t\t\t// Now that we're past the first 50, let's look for the first signature that wasn't in the loop. That'll be where we print the error and resume rendering.\n\t\t\t\tthis.children = [this.makeChildWidget({type: \"error\", attributes: {\n\t\t\t\t\t\"$message\": {type: \"string\", value: $tw.language.getString(\"Error/RecursiveTransclusion\")}\n\t\t\t\t}})];\n\t\t\t\tthis.renderChildren(parent,nextSibling);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthrow error;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nTranscludeWidget.prototype.execute = function() {\n\t// Get our attributes, string parameters, and slot values into properties of the widget object\n\tthis.collectAttributes();\n\tthis.collectStringParameters();\n\tthis.collectSlotFillParameters();\n\t// Determine whether we're being used in inline or block mode\n\tvar parseAsInline = !this.parseTreeNode.isBlock;\n\tif(this.transcludeMode === \"inline\") {\n\t\tparseAsInline = true;\n\t} else if(this.transcludeMode === \"block\") {\n\t\tparseAsInline = false;\n\t}\n\t// Set 'thisTiddler'\n\tthis.setVariable(\"thisTiddler\",this.transcludeTitle);\n\tvar parseTreeNodes, target;\n\t// Process the transclusion according to the output type\n\tswitch(this.transcludeOutput || \"text/html\") {\n\t\tcase \"text/html\":\n\t\t\t// Return the parse tree nodes of the target\n\t\t\ttarget = this.parseTransclusionTarget(parseAsInline);\n\t\t\tthis.parseAsInline = target.parseAsInline;\n\t\t\tparseTreeNodes = target.parseTreeNodes;\n\t\t\tbreak;\n\t\tcase \"text/raw\":\n\t\t\t// Just return the raw text\n\t\t\ttarget = this.getTransclusionTarget();\n\t\t\tparseTreeNodes = [{type: \"text\", text: target.text}];\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t// \"text/plain\" is the plain text result of wikifying the text\n\t\t\ttarget = this.parseTransclusionTarget(parseAsInline);\n\t\t\tvar widgetNode = this.wiki.makeWidget(target.parser,{\n\t\t\t\tparentWidget: this,\n\t\t\t\tdocument: $tw.fakeDocument\n\t\t\t});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\t\twidgetNode.render(container,null);\n\t\t\tparseTreeNodes = [{type: \"text\", text: container.textContent}];\n\t\t\tbreak;\n\t}\n\tthis.sourceText = target.text;\n\tthis.parserType = target.type;\n\t// Set the legacy transclusion context variables only if we're not transcluding a variable\n\tif(!this.transcludeVariable) {\n\t\tvar recursionMarker = this.makeRecursionMarker();\n\t\tthis.setVariable(\"transclusion\",recursionMarker);\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nCollect the attributes we need, in the process determining whether we're being used in legacy mode\n*/\nTranscludeWidget.prototype.collectAttributes = function() {\n\tvar self = this;\n\t// Detect legacy mode\n\tthis.legacyMode = true;\n\t$tw.utils.each(this.attributes,function(value,name) {\n\t\tif(name.charAt(0) === \"$\") {\n\t\t\tself.legacyMode = false;\n\t\t}\n\t});\n\t// Get the attributes for the appropriate mode\n\tif(this.legacyMode) {\n\t\tthis.transcludeTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t\tthis.transcludeSubTiddler = this.getAttribute(\"subtiddler\");\n\t\tthis.transcludeField = this.getAttribute(\"field\");\n\t\tthis.transcludeIndex = this.getAttribute(\"index\");\n\t\tthis.transcludeMode = this.getAttribute(\"mode\");\n\t\tthis.recursionMarker = this.getAttribute(\"recursionMarker\",\"yes\");\n\t} else {\n\t\tthis.transcludeVariable = this.getAttribute(\"$variable\");\n\t\tthis.transcludeVariableIsFunction = false;\n\t\tthis.transcludeType = this.getAttribute(\"$type\");\n\t\tthis.transcludeOutput = this.getAttribute(\"$output\",\"text/html\");\n\t\tthis.transcludeTitle = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\t\tthis.transcludeSubTiddler = this.getAttribute(\"$subtiddler\");\n\t\tthis.transcludeField = this.getAttribute(\"$field\");\n\t\tthis.transcludeIndex = this.getAttribute(\"$index\");\n\t\tthis.transcludeMode = this.getAttribute(\"$mode\");\n\t\tthis.recursionMarker = this.getAttribute(\"$recursionMarker\",\"yes\");\n\t}\n};\n\n/*\nCollect string parameters\n*/\nTranscludeWidget.prototype.collectStringParameters = function() {\n\tvar self = this;\n\tthis.stringParametersByName = Object.create(null);\n\tif(!this.legacyMode) {\n\t\t$tw.utils.each(this.attributes,function(value,name) {\n\t\t\tif(name.charAt(0) === \"$\") {\n\t\t\t\tif(name.charAt(1) === \"$\") {\n\t\t\t\t\t// Attributes starting $$ represent parameters starting with a single $\n\t\t\t\t\tname = name.slice(1);\n\t\t\t\t} else {\n\t\t\t\t\t// Attributes starting with a single $ are reserved for the widget\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tself.stringParametersByName[name] = value;\n\t\t});\n\t}\n};\n\n/*\nCollect slot value parameters\n*/\nTranscludeWidget.prototype.collectSlotFillParameters = function() {\n\tvar self = this;\n\tthis.slotFillParseTrees = Object.create(null);\n\tif(this.legacyMode) {\n\t\tthis.slotFillParseTrees[\"ts-missing\"] = this.parseTreeNode.children;\n\t} else {\n\t\tthis.slotFillParseTrees[\"ts-raw\"] = this.parseTreeNode.children;\n\t\tvar noFillWidgetsFound = true,\n\t\t\tsearchParseTreeNodes = function(nodes) {\n\t\t\t\t$tw.utils.each(nodes,function(node) {\n\t\t\t\t\tif(node.type === \"fill\") {\n\t\t\t\t\t\tif(node.attributes[\"$name\"] && node.attributes[\"$name\"].type === \"string\") {\n\t\t\t\t\t\t\tvar slotValueName = node.attributes[\"$name\"].value;\n\t\t\t\t\t\t\tself.slotFillParseTrees[slotValueName] = node.children || [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnoFillWidgetsFound = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsearchParseTreeNodes(node.children);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\tsearchParseTreeNodes(this.parseTreeNode.children);\n\t\tif(noFillWidgetsFound) {\n\t\t\tthis.slotFillParseTrees[\"ts-missing\"] = this.parseTreeNode.children;\n\t\t}\n\t}\n};\n\n/*\nGet transcluded details as an object {text:,type:}\n*/\nTranscludeWidget.prototype.getTransclusionTarget = function() {\n\tvar self = this;\n\tvar text;\n\t// Return the text and type of the target\n\tif(this.hasAttribute(\"$variable\")) {\n\t\tif(this.transcludeVariable) {\n\t\t\t// Transcluding a variable\n\t\t\tvar variableInfo = this.getVariableInfo(this.transcludeVariable,{params: this.getOrderedTransclusionParameters()});\n\t\t\tthis.transcludeVariableIsFunction = variableInfo.srcVariable && variableInfo.srcVariable.isFunctionDefinition;\n\t\t\ttext = variableInfo.text;\n\t\t\tthis.transcludeFunctionResult = text;\n\t\t\treturn {\n\t\t\t\ttext: variableInfo.text,\n\t\t\t\ttype: this.transcludeType\n\t\t\t};\n\t\t}\n\t} else {\n\t\t// Transcluding a text reference\n\t\tvar parserInfo = this.wiki.getTextReferenceParserInfo(\n\t\t\t\t\t\tthis.transcludeTitle,\n\t\t\t\t\t\tthis.transcludeField,\n\t\t\t\t\t\tthis.transcludeIndex,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsubTiddler: this.transcludeSubTiddler,\n\t\t\t\t\t\t\tdefaultType: this.transcludeType\n\t\t\t\t\t\t});\n\t\treturn {\n\t\t\ttext: parserInfo.text,\n\t\t\ttype: parserInfo.type\n\t\t};\n\t}\n};\n\n/*\nGet transcluded parse tree nodes as an object {text:,type:,parseTreeNodes:,parseAsInline:}\n*/\nTranscludeWidget.prototype.parseTransclusionTarget = function(parseAsInline) {\n\tvar self = this;\n\tvar parser;\n\t// Get the parse tree\n\tif(this.hasAttribute(\"$variable\")) {\n\t\tif(this.transcludeVariable) {\n\t\t\t// Transcluding a variable\n\t\t\tvar variableInfo = this.getVariableInfo(this.transcludeVariable,{params: this.getOrderedTransclusionParameters()}),\n\t\t\t\tsrcVariable = variableInfo && variableInfo.srcVariable;\n\t\t\tif(srcVariable && srcVariable.isFunctionDefinition) {\n\t\t\t\tthis.transcludeVariableIsFunction = true;\n\t\t\t\tthis.transcludeFunctionResult = (variableInfo.resultList ? variableInfo.resultList[0] : variableInfo.text) || \"\";\n\t\t\t}\n\t\t\tif(variableInfo.text) {\n\t\t\t\tif(srcVariable && srcVariable.isFunctionDefinition) {\n\t\t\t\t\tparser = {\n\t\t\t\t\t\ttree: [{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: this.transcludeFunctionResult\n\t\t\t\t\t\t}],\n\t\t\t\t\t\tsource: this.transcludeFunctionResult,\n\t\t\t\t\t\ttype: \"text/vnd.tiddlywiki\"\n\t\t\t\t\t};\n\t\t\t\t\tif(parseAsInline) {\n\t\t\t\t\t\tparser.tree[0] = {\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: this.transcludeFunctionResult\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tparser.tree[0] = {\n\t\t\t\t\t\t\ttype: \"element\",\n\t\t\t\t\t\t\ttag: \"p\",\n\t\t\t\t\t\t\tchildren: [{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: this.transcludeFunctionResult\n\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tvar cacheKey = (parseAsInline ? \"inlineParser\" : \"blockParser\") + (this.transcludeType || \"\");\n\t\t\t\t\tif(variableInfo.isCacheable && srcVariable[cacheKey]) {\n\t\t\t\t\t\tparser = srcVariable[cacheKey];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tparser = this.wiki.parseText(this.transcludeType,variableInfo.text || \"\",{parseAsInline: parseAsInline, configTrimWhiteSpace: srcVariable && srcVariable.configTrimWhiteSpace});\n\t\t\t\t\t\tif(variableInfo.isCacheable) {\n\t\t\t\t\t\t\tsrcVariable[cacheKey] = parser;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(parser) {\n\t\t\t\t\t// Add parameters widget for procedures and custom widgets\n\t\t\t\t\tif(srcVariable && (srcVariable.isProcedureDefinition || srcVariable.isWidgetDefinition)) {\n\t\t\t\t\t\tparser = {\n\t\t\t\t\t\t\ttree: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"parameters\",\n\t\t\t\t\t\t\t\t\tchildren: parser.tree\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tsource: parser.source,\n\t\t\t\t\t\t\ttype: parser.type\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$tw.utils.each(srcVariable.params,function(param) {\n\t\t\t\t\t\t\tvar name = param.name;\n\t\t\t\t\t\t\t// Parameter names starting with dollar must be escaped to double dollars\n\t\t\t\t\t\t\tif(name.charAt(0) === \"$\") {\n\t\t\t\t\t\t\t\tname = \"$\" + name;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(parser.tree[0],name,param[\"default\"])\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if(srcVariable && !srcVariable.isFunctionDefinition) {\n\t\t\t\t\t\t// For macros and ordinary variables, wrap the parse tree in a vars widget assigning the parameters to variables named \"__paramname__\"\n\t\t\t\t\t\tparser = {\n\t\t\t\t\t\t\ttree: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"vars\",\n\t\t\t\t\t\t\t\t\tchildren: parser.tree\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tsource: parser.source,\n\t\t\t\t\t\t\ttype: parser.type\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$tw.utils.each(variableInfo.params,function(param) {\n\t\t\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(parser.tree[0],\"__\" + param.name + \"__\",param.value)\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Transcluding a text reference\n\t\tparser = this.wiki.parseTextReference(\n\t\t\t\t\t\tthis.transcludeTitle,\n\t\t\t\t\t\tthis.transcludeField,\n\t\t\t\t\t\tthis.transcludeIndex,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparseAsInline: parseAsInline,\n\t\t\t\t\t\t\tsubTiddler: this.transcludeSubTiddler,\n\t\t\t\t\t\t\tdefaultType: this.transcludeType\n\t\t\t\t\t\t});\n\t}\n\t// Return the parse tree\n\treturn {\n\t\tparser: parser,\n\t\tparseTreeNodes: parser ? parser.tree : (this.slotFillParseTrees[\"ts-missing\"] || []),\n\t\tparseAsInline: parseAsInline,\n\t\ttext: parser && parser.source,\n\t\ttype: parser && parser.type\n\t};\n};\n\n/*\nFetch all the string parameters as an ordered array of {name:, value:} where the name is optional\n*/\nTranscludeWidget.prototype.getOrderedTransclusionParameters = function() {\n\tvar result = [];\n\t// Collect the parameters\n\tfor(var name in this.stringParametersByName) {\n\t\tvar value = this.stringParametersByName[name];\n\t\tresult.push({name: name, value: value});\n\t}\n\t// Sort numerical parameter names first\n\tresult.sort(function(a,b) {\n\t\tvar aIsNumeric = !isNaN(a.name),\n\t\t\tbIsNumeric = !isNaN(b.name);\n\t\tif(aIsNumeric && bIsNumeric) {\n\t\t\treturn a.name - b.name;\n\t\t} else if(aIsNumeric) {\n\t\t\treturn -1;\n\t\t} else if(bIsNumeric) {\n\t\t\treturn 1;\n\t\t} else {\n\t\t\treturn a.name === b.name ? 0 : (a.name < b.name ? -1 : 1);\n\t\t}\n\t});\n\t// Remove names from numerical parameters\n\t$tw.utils.each(result,function(param,index) {\n\t\tif(!isNaN(param.name)) {\n\t\t\tdelete param.name;\n\t\t}\n\t});\n\treturn result;\n};\n\n/*\nFetch the value of a parameter\n*/\nTranscludeWidget.prototype.getTransclusionParameter = function(name,index,defaultValue) {\n\tif(name in this.stringParametersByName) {\n\t\treturn this.stringParametersByName[name];\n\t} else {\n\t\tvar name = \"\" + index;\n\t\tif(name in this.stringParametersByName) {\n\t\t\treturn this.stringParametersByName[name];\n\t\t}\n\t}\n\treturn defaultValue;\n};\n\n/*\nGet one of the special parameters to be provided by the parameters widget\n*/\nTranscludeWidget.prototype.getTransclusionMetaParameters = function() {\n\tvar self = this;\n\treturn {\n\t\t\"parseMode\": function() {\n\t\t\treturn self.parseAsInline ? \"inline\" : \"block\";\n\t\t},\n\t\t\"parseTreeNodes\": function() {\n\t\t\treturn JSON.stringify(self.parseTreeNode.children || []);\n\t\t},\n\t\t\"slotFillParseTreeNodes\": function() {\n\t\t\treturn JSON.stringify(self.slotFillParseTrees);\n\t\t},\n\t\t\"params\": function() {\n\t\t\treturn JSON.stringify(self.stringParametersByName);\n\t\t}\n\t};\n};\n\n/*\nFetch the value of a slot\n*/\nTranscludeWidget.prototype.getTransclusionSlotFill = function(name,defaultParseTreeNodes) {\n\tif(name && this.slotFillParseTrees[name] && this.slotFillParseTrees[name].length > 0) {\n\t\treturn this.slotFillParseTrees[name];\n\t} else {\n\t\treturn defaultParseTreeNodes || [];\n\t}\n};\n\n/*\nReturn whether this transclusion should be visible to the slot widget\n*/\nTranscludeWidget.prototype.hasVisibleSlots = function() {\n\treturn this.getAttribute(\"$fillignore\",\"no\") === \"no\";\n}\n\n/*\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\n*/\nTranscludeWidget.prototype.makeRecursionMarker = function() {\n\tvar output = [];\n\toutput.push(\"{\");\n\toutput.push(this.getVariable(\"currentTiddler\",{defaultValue: \"\"}));\n\toutput.push(\"|\");\n\toutput.push(this.transcludeTitle || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeField || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeIndex || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeSubTiddler || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\nTranscludeWidget.prototype.parserNeedsRefresh = function() {\n\t// Doesn't need to consider transcluded variables because a parent variable can't change once a widget has been created\n\tvar parserInfo = this.wiki.getTextReferenceParserInfo(this.transcludeTitle,this.transcludeField,this.transcludeIndex,{subTiddler:this.transcludeSubTiddler});\n\treturn (this.sourceText === undefined || parserInfo.sourceText !== this.sourceText || parserInfo.parserType !== this.parserType)\n};\n\nTranscludeWidget.prototype.functionNeedsRefresh = function() {\n\tvar oldResult = this.transcludeFunctionResult;\n\tvar variableInfo = this.getVariableInfo(this.transcludeVariable,{params: this.getOrderedTransclusionParameters()});\n\tvar newResult = (variableInfo.resultList ? variableInfo.resultList[0] : variableInfo.text) || \"\";\n\treturn oldResult !== newResult;\n}\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(($tw.utils.count(changedAttributes) > 0) || (this.transcludeVariableIsFunction && this.functionNeedsRefresh()) || (!this.transcludeVariable && changedTiddlers[this.transcludeTitle] && this.parserNeedsRefresh())) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.transclude = TranscludeWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/vars.js":{"title":"$:/core/modules/widgets/vars.js","text":"/*\\\ntitle: $:/core/modules/widgets/vars.js\ntype: application/javascript\nmodule-type: widget\n\nThis widget allows multiple variables to be set in one go:\n\n```\n\\define helloworld() Hello world!\n<$vars greeting=\"Hi\" me={{!!title}} sentence=<<helloworld>>>\n  <<greeting>>! I am <<me>> and I say: <<sentence>>\n</$vars>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar VarsWidget = function(parseTreeNode,options) {\n\t// Initialise\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nVarsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nVarsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nVarsWidget.prototype.execute = function() {\n\t// Parse variables\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(val,key) {\n\t\tif(key.charAt(0) !== \"$\") {\n\t\t\tself.setVariable(key,val);\n\t\t}\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nVarsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"vars\"] = VarsWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/view.js":{"title":"$:/core/modules/widgets/view.js","text":"/*\\\ntitle: $:/core/modules/widgets/view.js\ntype: application/javascript\nmodule-type: widget\n\nView widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ViewWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nViewWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nViewWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.text) {\n\t\tvar textNode = this.document.createTextNode(this.text);\n\t\tparent.insertBefore(textNode,nextSibling);\n\t\tthis.domNodes.push(textNode);\n\t} else {\n\t\tthis.makeChildWidgets();\n\t\tthis.renderChildren(parent,nextSibling);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nViewWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.viewTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.viewSubtiddler = this.getAttribute(\"subtiddler\");\n\tthis.viewField = this.getAttribute(\"field\",\"text\");\n\tthis.viewIndex = this.getAttribute(\"index\");\n\tthis.viewFormat = this.getAttribute(\"format\",\"text\");\n\tthis.viewTemplate = this.getAttribute(\"template\",\"\");\n\tthis.viewMode = this.getAttribute(\"mode\",\"block\");\n\tswitch(this.viewFormat) {\n\t\tcase \"htmlwikified\":\n\t\t\tthis.text = this.getValueAsHtmlWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"plainwikified\":\n\t\t\tthis.text = this.getValueAsPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencodedplainwikified\":\n\t\t\tthis.text = this.getValueAsHtmlEncodedPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencoded\":\n\t\t\tthis.text = this.getValueAsHtmlEncoded();\n\t\t\tbreak;\n\t\tcase \"htmltextencoded\":\n\t\t\tthis.text = this.getValueAsHtmlTextEncoded();\n\t\t\tbreak;\n\t\tcase \"urlencoded\":\n\t\t\tthis.text = this.getValueAsUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"doubleurlencoded\":\n\t\t\tthis.text = this.getValueAsDoubleUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"date\":\n\t\t\tthis.text = this.getValueAsDate(this.viewTemplate);\n\t\t\tbreak;\n\t\tcase \"relativedate\":\n\t\t\tthis.text = this.getValueAsRelativeDate();\n\t\t\tbreak;\n\t\tcase \"stripcomments\":\n\t\t\tthis.text = this.getValueAsStrippedComments();\n\t\t\tbreak;\n\t\tcase \"jsencoded\":\n\t\t\tthis.text = this.getValueAsJsEncoded();\n\t\t\tbreak;\n\t\tdefault: // \"text\"\n\t\t\tthis.text = this.getValueAsText();\n\t\t\tbreak;\n\t}\n};\n\n/*\nThe various formatter functions are baked into this widget for the moment. Eventually they will be replaced by macro functions\n*/\n\n/*\nRetrieve the value of the widget. Options are:\nasString: Optionally return the value as a string\n*/\nViewWidget.prototype.getValue = function(options) {\n\toptions = options || {};\n\tvar value = options.asString ? \"\" : undefined;\n\tif(this.viewIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.viewTitle,this.viewIndex);\n\t} else {\n\t\tvar tiddler;\n\t\tif(this.viewSubtiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler);\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.viewTitle);\n\t\t}\n\t\tif(tiddler) {\n\t\t\tif(this.viewField === \"text\" && !this.viewSubtiddler) {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.viewTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.viewField)) {\n\t\t\t\t\tif(options.asString) {\n\t\t\t\t\t\tvalue = tiddler.getFieldString(this.viewField);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = tiddler.fields[this.viewField];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.viewField === \"title\") {\n\t\t\t\tvalue = this.viewTitle;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nViewWidget.prototype.getValueAsText = function() {\n\treturn this.getValue({asString: true});\n};\n\nViewWidget.prototype.getValueAsHtmlWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/html\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsPlainWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsHtmlEncodedPlainWikified = function(mode) {\n\treturn $tw.utils.htmlEncode(this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t}));\n};\n\nViewWidget.prototype.getValueAsHtmlEncoded = function() {\n\treturn $tw.utils.htmlEncode(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsHtmlTextEncoded = function() {\n\treturn $tw.utils.htmlTextEncode(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsUrlEncoded = function() {\n\treturn $tw.utils.encodeURIComponentExtended(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsDoubleUrlEncoded = function() {\n\treturn $tw.utils.encodeURIComponentExtended($tw.utils.encodeURIComponentExtended(this.getValueAsText()));\n};\n\nViewWidget.prototype.getValueAsDate = function(format) {\n\tformat = format || \"YYYY MM DD 0hh:0mm\";\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.formatDateString(value,format);\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsRelativeDate = function(format) {\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.getRelativeDate((new Date()) - (new Date(value))).description;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsStrippedComments = function() {\n\tvar lines = this.getValueAsText().split(\"\\n\"),\n\t\tout = [];\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar text = lines[line];\n\t\tif(!/^\\s*\\/\\/#/.test(text)) {\n\t\t\tout.push(text);\n\t\t}\n\t}\n\treturn out.join(\"\\n\");\n};\n\nViewWidget.prototype.getValueAsJsEncoded = function() {\n\treturn $tw.utils.stringify(this.getValueAsText());\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nViewWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.template || changedAttributes.format || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.view = ViewWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/widget.js":{"title":"$:/core/modules/widgets/widget.js","text":"/*\\\ntitle: $:/core/modules/widgets/widget.js\ntype: application/javascript\nmodule-type: widget\n\nWidget base class\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate a widget object for a parse tree node\n\tparseTreeNode: reference to the parse tree node to be rendered\n\toptions: see below\nOptions include:\n\twiki: mandatory reference to wiki associated with this render tree\n\tparentWidget: optional reference to a parent renderer node for the context chain\n\tdocument: optional document object to use instead of global document\n*/\nvar Widget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInitialise widget properties. These steps are pulled out of the constructor so that we can reuse them in subclasses\n*/\nWidget.prototype.initialise = function(parseTreeNode,options) {\n\t// Bail if parseTreeNode is undefined, meaning  that the widget constructor was called without any arguments so that it can be subclassed\n\tif(parseTreeNode === undefined) {\n\t\treturn;\n\t}\n\toptions = options || {};\n\t// Save widget info\n\tthis.parseTreeNode = parseTreeNode;\n\tthis.wiki = options.wiki;\n\tthis.parentWidget = options.parentWidget;\n\tthis.variables = Object.create(this.parentWidget ? this.parentWidget.variables : null);\n\tthis.document = options.document;\n\tthis.attributes = {};\n\tthis.children = [];\n\tthis.domNodes = [];\n\tthis.eventListeners = {};\n\t// Hashmap of the widget classes\n\tif(!this.widgetClasses) {\n\t\t// Get widget classes\n\t\tWidget.prototype.widgetClasses = $tw.modules.applyMethods(\"widget\");\n\t\t// Process any subclasses\n\t\t$tw.modules.forEachModuleOfType(\"widget-subclass\",function(title,module) {\n\t\t\tif(module.baseClass) {\n\t\t\t\tvar baseClass = Widget.prototype.widgetClasses[module.baseClass];\n\t\t\t\tif(!baseClass) {\n\t\t\t\t\tthrow \"Module '\" + title + \"' is attemping to extend a non-existent base class '\" + module.baseClass + \"'\";\n\t\t\t\t}\n\t\t\t\tvar subClass = module.constructor;\n\t\t\t\tsubClass.prototype = new baseClass();\n\t\t\t\t$tw.utils.extend(subClass.prototype,module.prototype);\n\t\t\t\tWidget.prototype.widgetClasses[module.name || module.baseClass] = subClass;\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWidget.prototype.execute = function() {\n\tthis.makeChildWidgets();\n};\n\n/*\nSet the value of a context variable\nname: name of the variable\nvalue: value of the variable\nparams: array of {name:, default:} for each parameter\nisMacroDefinition: true if the variable is set via a \\define macro pragma (and hence should have variable substitution performed)\noptions includes:\n\tisProcedureDefinition: true if the variable is set via a \\procedure pragma (and hence should not have variable substitution performed)\n\tisFunctionDefinition: true if the variable is set via a \\function pragma (and hence should not have variable substitution performed)\n\tisWidgetDefinition: true if the variable is set via a \\widget pragma (and hence should not have variable substitution performed)\n*/\nWidget.prototype.setVariable = function(name,value,params,isMacroDefinition,options) {\n\toptions = options || {};\n\tthis.variables[name] = {\n\t\tvalue: value,\n\t\tparams: params,\n\t\tisMacroDefinition: !!isMacroDefinition,\n\t\tisFunctionDefinition: !!options.isFunctionDefinition,\n\t\tisProcedureDefinition: !!options.isProcedureDefinition,\n\t\tisWidgetDefinition: !!options.isWidgetDefinition,\n\t\tconfigTrimWhiteSpace: !!options.configTrimWhiteSpace\n\t};\n};\n\n/*\nGet the prevailing value of a context variable\nname: name of variable\noptions: see below\nOptions include\n\nparams: array of {name:, value:} for each parameter\ndefaultValue: default value if the variable is not defined\nsource: optional source iterator for evaluating function invocations\nallowSelfAssigned: if true, includes the current widget in the context chain instead of just the parent\n\nReturns an object with the following fields:\n\nparams: array of {name:,value:} or {value:} of parameters to be applied\ntext: text of variable, with parameters properly substituted\nresultList: result of variable evaluation as an array\nsrcVariable: reference to the object defining the variable\n*/\nWidget.prototype.getVariableInfo = function(name,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tactualParams = options.params || [],\n\t\tvariable;\n\tif(options.allowSelfAssigned) {\n\t\tvariable = this.variables[name];\n\t} else {\n\t\tvariable = this.parentWidget && this.parentWidget.variables[name];\n\t}\n\t// Check for the variable defined in the parent widget (or an ancestor in the prototype chain)\n\tif(variable) {\n\t\tvar originalValue = variable.value,\n\t\t\tvalue = originalValue,\n\t\t\tparams = [],\n\t\t\tresultList = [value];\n\t\t// Only substitute parameter and variable references if this variable was defined with the \\define pragma\n\t\tif(variable.isMacroDefinition) {\n\t\t\tparams = self.resolveVariableParameters(variable.params,actualParams);\n\t\t\t// Substitute any parameters specified in the definition\n\t\t\t$tw.utils.each(params,function(param) {\n\t\t\t\tvalue = $tw.utils.replaceString(value,new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(param.name) + \"\\\\$\",\"mg\"),param.value);\n\t\t\t});\n\t\t\tvalue = self.substituteVariableReferences(value,options);\n\t\t\tresultList = [value];\n\t\t} else if(variable.isFunctionDefinition) {\n\t\t\t// Function evaluations\n\t\t\tparams = self.resolveVariableParameters(variable.params,actualParams);\n\t\t\tvar variables = options.variables || Object.create(null);\n\t\t\t// Apply default parameter values\n\t\t\t$tw.utils.each(variable.params,function(param,index) {\n\t\t\t\tif(param[\"default\"]) {\n\t\t\t\t\tvariables[param.name] = param[\"default\"];\n\t\t\t\t}\n\t\t\t});\n\t\t\t// Parameters are an array of {value:} or {name:, value:} pairs\n\t\t\t$tw.utils.each(params,function(param) {\n\t\t\t\tvariables[param.name] = param.value;\n\t\t\t});\n\t\t\tresultList = this.wiki.filterTiddlers(value,this.makeFakeWidgetWithVariables(variables),options.source);\n\t\t\tvalue = resultList[0] || \"\";\n\t\t} else {\n\t\t\tparams = variable.params;\n\t\t}\n\t\treturn {\n\t\t\ttext: value,\n\t\t\tparams: params,\n\t\t\tresultList: resultList,\n\t\t\tsrcVariable: variable,\n\t\t\tisCacheable: originalValue === value\n\t\t};\n\t}\n\t// If the variable doesn't exist in the parent widget then look for a macro module\n\tvar text = this.evaluateMacroModule(name,actualParams);\n\tif(text === undefined) {\n\t\ttext = options.defaultValue;\n\t}\n\treturn {\n\t\ttext: text,\n\t\tresultList: [text]\n\t};\n};\n\n/*\nSimplified version of getVariableInfo() that just returns the text\n*/\nWidget.prototype.getVariable = function(name,options) {\n\treturn this.getVariableInfo(name,options).text;\n};\n\n/*\nMaps actual parameters onto formal parameters, returning an array of {name:,value:} objects\nformalParams - Array of {name:,default:} (default value is optional)\nactualParams - Array of string values or {name:,value:} (name is optional)\n*/\nWidget.prototype.resolveVariableParameters = function(formalParams,actualParams) {\n\tformalParams = formalParams || [];\n\tactualParams = actualParams || [];\n\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\tparamInfo, paramValue,\n\t\tresults = [];\n\t// Step through each of the parameters in the macro definition\n\tfor(var p=0; p<formalParams.length; p++) {\n\t\t// Check if we've got a macro call parameter with the same name\n\t\tparamInfo = formalParams[p];\n\t\tparamValue = undefined;\n\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\tif(typeof actualParams[m] !== \"string\" && actualParams[m].name === paramInfo.name) {\n\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t}\n\t\t}\n\t\t// If not, use the next available anonymous macro call parameter\n\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\tnextAnonParameter++;\n\t\t}\n\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\tvar param = actualParams[nextAnonParameter++];\n\t\t\tparamValue = typeof param === \"string\" ? param : param.value;\n\t\t}\n\t\t// If we've still not got a value, use the default, if any\n\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t// Store the parameter name and value\n\t\tresults.push({name: paramInfo.name, value: paramValue});\n\t}\n\treturn results;\n};\n\nWidget.prototype.substituteVariableReferences = function(text,options) {\n\tvar self = this;\n\treturn (text || \"\").replace(/\\$\\(([^\\)\\$]+)\\)\\$/g,function(match,p1,offset,string) {\n\t\treturn options.variables && options.variables[p1] || (self.getVariable(p1,{defaultValue: \"\"}));\n\t});\n};\n\nWidget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue) {\n\tif($tw.utils.hop($tw.macros,name)) {\n\t\tvar macro = $tw.macros[name],\n\t\t\targs = [];\n\t\tif(macro.params.length > 0) {\n\t\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\t\tparamInfo, paramValue;\n\t\t\t// Step through each of the parameters in the macro definition\n\t\t\tfor(var p=0; p<macro.params.length; p++) {\n\t\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\t\tparamInfo = macro.params[p];\n\t\t\t\tparamValue = undefined;\n\t\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\t\tnextAnonParameter++;\n\t\t\t\t}\n\t\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t\t}\n\t\t\t\t// If we've still not got a value, use the default, if any\n\t\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t\t// Save the parameter\n\t\t\t\targs.push(paramValue);\n\t\t\t}\n\t\t}\n\t\telse for(var i=0; i<actualParams.length; ++i) {\n\t\t\targs.push(actualParams[i].value);\n\t\t}\n\t\treturn (macro.run.apply(this,args) || \"\").toString();\n\t} else {\n\t\treturn defaultValue;\n\t}\n};\n\n/*\nCheck whether a given context variable value exists in the parent chain\n*/\nWidget.prototype.hasVariable = function(name,value) {\n\tvar node = this;\n\twhile(node) {\n\t\tif($tw.utils.hop(node.variables,name) && node.variables[name].value === value) {\n\t\t\treturn true;\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn false;\n};\n\n/*\nConstruct a qualifying string based on a hash of concatenating the values of a given variable in the parent chain\n*/\nWidget.prototype.getStateQualifier = function(name) {\n\tthis.qualifiers = this.qualifiers || Object.create(null);\n\tname = name || \"transclusion\";\n\tif(this.qualifiers[name]) {\n\t\treturn this.qualifiers[name];\n\t} else {\n\t\tvar output = [],\n\t\t\tnode = this;\n\t\twhile(node && node.parentWidget) {\n\t\t\tif($tw.utils.hop(node.parentWidget.variables,name)) {\n\t\t\t\toutput.push(node.getVariable(name));\n\t\t\t}\n\t\t\tnode = node.parentWidget;\n\t\t}\n\t\tvar value = $tw.utils.hashString(output.join(\"\"));\n\t\tthis.qualifiers[name] = value;\n\t\treturn value;\n\t}\n};\n\n/*\nMake a fake widget with specified variables, suitable for variable lookup in filters\n*/\nWidget.prototype.makeFakeWidgetWithVariables = function(variables) {\n\tvar self = this,\n\t\tvariables = variables || {};\n\treturn {\n\t\tgetVariable: function(name,opts) {\n\t\t\tif($tw.utils.hop(variables,name)) {\n\t\t\t\treturn variables[name];\n\t\t\t} else {\n\t\t\t\topts = opts || {};\n\t\t\t\topts.variables = variables;\n\t\t\t\treturn self.getVariable(name,opts);\n\t\t\t};\n\t\t},\n\t\tgetVariableInfo: function(name,opts) {\n\t\t\tif($tw.utils.hop(variables,name)) {\n\t\t\t\treturn {\n\t\t\t\t\ttext: variables[name]\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\topts = opts || {};\n\t\t\t\topts.variables = $tw.utils.extend({},variables,opts.variables);\n\t\t\t\treturn self.getVariableInfo(name,opts);\n\t\t\t};\n\t\t},\n\t\tmakeFakeWidgetWithVariables: self.makeFakeWidgetWithVariables,\n\t\tresolveVariableParameters: self.resolveVariableParameters,\n\t\twiki: self.wiki\n\t};\n};\n\n/*\nCompute the current values of the attributes of the widget. Returns a hashmap of the names of the attributes that have changed.\nOptions include:\nfilterFn: only include attributes where filterFn(name) returns true\n*/\nWidget.prototype.computeAttributes = function(options) {\n\toptions = options || {};\n\tvar changedAttributes = {},\n\t\tself = this;\n\t$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {\n\t\tif(options.filterFn) {\n\t\t\tif(!options.filterFn(name)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tvar value = self.computeAttribute(attribute);\n\t\tif(self.attributes[name] !== value) {\n\t\t\tself.attributes[name] = value;\n\t\t\tchangedAttributes[name] = true;\n\t\t}\n\t});\n\treturn changedAttributes;\n};\n\nWidget.prototype.computeAttribute = function(attribute) {\n\tvar self = this,\n\t\tvalue;\n\tif(attribute.type === \"filtered\") {\n\t\tvalue = this.wiki.filterTiddlers(attribute.filter,this)[0] || \"\";\n\t} else if(attribute.type === \"indirect\") {\n\t\tvalue = this.wiki.getTextReference(attribute.textReference,\"\",this.getVariable(\"currentTiddler\")) || \"\";\n\t} else if(attribute.type === \"macro\") {\n\t\tvar variableInfo = this.getVariableInfo(attribute.value.name,{params: attribute.value.params});\n\t\tvalue = variableInfo.text;\n\t} else if(attribute.type === \"substituted\") {\n\t\tvalue = this.wiki.getSubstitutedText(attribute.rawValue,this) || \"\";\n\t} else { // String attribute\n\t\tvalue = attribute.value;\n\t}\n\treturn value;\n};\n\n/*\nCheck for the presence of an evaluated attribute on the widget. Note that attributes set to a missing variable (ie attr=<<missing>>) will be treated as missing\n*/\nWidget.prototype.hasAttribute = function(name) {\n\treturn $tw.utils.hop(this.attributes,name);\n};\n\n/*\nCheck for the presence of a raw attribute on the widget parse tree node. Note that attributes set to a missing variable (ie attr=<<missing>>) will NOT be treated as missing\n*/\nWidget.prototype.hasParseTreeNodeAttribute = function(name) {\n\treturn $tw.utils.hop(this.parseTreeNode.attributes,name);\n};\n\n/*\nGet the value of an attribute\n*/\nWidget.prototype.getAttribute = function(name,defaultText) {\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\treturn this.attributes[name];\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nAssign the common attributes of the widget to a domNode\noptions include:\nsourcePrefix: prefix of attributes that are to be directly assigned (defaults to the empty string meaning all attributes)\ndestPrefix: prefix to be applied to attribute names that are to be directly assigned (defaults to the emtpy string which means no prefix is added)\nchangedAttributes: hashmap by attribute name of attributes to process (if missing, process all attributes)\nexcludeEventAttributes: ignores attributes whose name would begin with \"on\"\n*/\nWidget.prototype.assignAttributes = function(domNode,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tchangedAttributes = options.changedAttributes || this.attributes,\n\t\tsourcePrefix = options.sourcePrefix || \"\",\n\t\tdestPrefix = options.destPrefix || \"\",\n\t\tEVENT_ATTRIBUTE_PREFIX = \"on\";\n\tvar assignAttribute = function(name,value) {\n\t\t// Process any CSS custom properties\n\t\tif(name.substr(0,2) === \"--\" && name.length > 2) {\n\t\t\tdomNode.style.setProperty(name,value);\n\t\t\treturn;\n\t\t}\n\t\t// Process any style attributes before considering sourcePrefix and destPrefix\n\t\tif(name.substr(0,6) === \"style.\" && name.length > 6) {\n\t\t\tdomNode.style[$tw.utils.unHyphenateCss(name.substr(6))] = value;\n\t\t\treturn;\n\t\t}\n\t\t// Check if the sourcePrefix is a match\n\t\tif(name.substr(0,sourcePrefix.length) === sourcePrefix) {\n\t\t\tname = destPrefix + name.substr(sourcePrefix.length);\n\t\t} else {\n\t\t\tvalue = undefined;\n\t\t}\n\t\t// Check for excluded attribute names\n\t\tif(options.excludeEventAttributes && name.substr(0,2).toLowerCase() === EVENT_ATTRIBUTE_PREFIX) {\n\t\t\tvalue = undefined;\n\t\t}\n\t\tif(value !== undefined) {\n\t\t\t// Handle the xlink: namespace\n\t\t\tvar namespace = null;\n\t\t\tif(name.substr(0,6) === \"xlink:\" && name.length > 6) {\n\t\t\t\tnamespace = \"http://www.w3.org/1999/xlink\";\n\t\t\t\tname = name.substr(6);\n\t\t\t}\n\t\t\t// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)\n\t\t\ttry {\n\t\t\t\tdomNode.setAttributeNS(namespace,name,value);\n\t\t\t} catch(e) {\n\t\t\t}\n\t\t}\n\t};\n\t// If the parse tree node has the orderedAttributes property then use that order\n\tif(this.parseTreeNode.orderedAttributes) {\n\t\t$tw.utils.each(this.parseTreeNode.orderedAttributes,function(attribute,index) {\n\t\t\tif(attribute.name in changedAttributes) {\n\t\t\t\tassignAttribute(attribute.name,self.getAttribute(attribute.name));\n\t\t\t}\n\t\t});\n\t// Otherwise update each changed attribute irrespective of order\n\t} else {\n\t\t$tw.utils.each(changedAttributes,function(value,name) {\n\t\t\tassignAttribute(name,self.getAttribute(name));\n\t\t});\t\n\t}\n};\n\n/*\nGet the number of ancestor widgets for this widget\n*/\nWidget.prototype.getAncestorCount = function() {\n\tif(this.ancestorCount === undefined) {\n\t\tif(this.parentWidget) {\n\t\t\tthis.ancestorCount = this.parentWidget.getAncestorCount() + 1;\n\t\t} else {\n\t\t\tthis.ancestorCount = 0;\n\t\t}\n\t}\n\treturn this.ancestorCount;\n};\n\n/*\nMake child widgets correspondng to specified parseTreeNodes\n*/\nWidget.prototype.makeChildWidgets = function(parseTreeNodes,options) {\n\toptions = options || {};\n\tthis.children = [];\n\tvar self = this;\n\t// Check for too much recursion\n\tif(this.getAncestorCount() > $tw.utils.TranscludeRecursionError.MAX_WIDGET_TREE_DEPTH) {\n\t\tthrow new $tw.utils.TranscludeRecursionError();\n\t} else {\n\t\t// Create set variable widgets for each variable\n\t\t$tw.utils.each(options.variables,function(value,name) {\n\t\t\tvar setVariableWidget = {\n\t\t\t\ttype: \"set\",\n\t\t\t\tattributes: {\n\t\t\t\t\tname: {type: \"string\", value: name},\n\t\t\t\t\tvalue: {type: \"string\", value: value}\n\t\t\t\t},\n\t\t\t\tchildren: parseTreeNodes\n\t\t\t};\n\t\t\tparseTreeNodes = [setVariableWidget];\n\t\t});\n\t\t// Create the child widgets\n\t\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\n\t\t\tself.children.push(self.makeChildWidget(childNode));\n\t\t});\n\t}\n};\n\n/*\nConstruct the widget object for a parse tree node\noptions include:\n\tvariables: optional hashmap of variables to wrap around the widget\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode,options) {\n\tvar self = this;\n\toptions = options || {};\n\t// Check whether this node type is defined by a custom widget definition\n\tvar variableDefinitionName = \"$\" + parseTreeNode.type;\n\tif(this.variables[variableDefinitionName]) {\n\t\tvar isOverrideable = function() {\n\t\t\t\t// Widget is overrideable if its name contains a period, or if it is an existing JS widget and we're not in safe mode\n\t\t\t\treturn parseTreeNode.type.indexOf(\".\") !== -1 || (!!self.widgetClasses[parseTreeNode.type] && !$tw.safeMode);\n\t\t\t};\n\t\tif(!parseTreeNode.isNotRemappable && isOverrideable()) { \n\t\t\tvar variableInfo = this.getVariableInfo(variableDefinitionName,{allowSelfAssigned: true});\n\t\t\tif(variableInfo && variableInfo.srcVariable && variableInfo.srcVariable.value && variableInfo.srcVariable.isWidgetDefinition) {\n\t\t\t\tvar newParseTreeNode = {\n\t\t\t\t\ttype: \"transclude\",\n\t\t\t\t\tchildren: parseTreeNode.children,\n\t\t\t\t\tisBlock: parseTreeNode.isBlock\n\t\t\t\t};\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(newParseTreeNode,\"$variable\",variableDefinitionName);\n\t\t\t\t$tw.utils.each(parseTreeNode.attributes,function(attr,name) {\n\t\t\t\t\t// If the attribute starts with a dollar then add an extra dollar so that it doesn't clash with the $xxx attributes of transclude\n\t\t\t\t\tname = name.charAt(0) === \"$\" ? \"$\" + name : name;\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(newParseTreeNode,$tw.utils.extend({},attr,{name: name}));\n\t\t\t\t});\n\t\t\t\tparseTreeNode = newParseTreeNode;\n\t\t\t}\n\t\t}\n\t}\n\t// Get the widget class for this node type\n\tvar WidgetClass = this.widgetClasses[parseTreeNode.type];\n\tif(!WidgetClass) {\n\t\tWidgetClass = this.widgetClasses.text;\n\t\tparseTreeNode = {type: \"text\", text: \"Undefined widget '\" + parseTreeNode.type + \"'\"};\n\t}\n\t// Create set variable widgets for each variable\n\t$tw.utils.each(options.variables,function(value,name) {\n\t\tvar setVariableWidget = {\n\t\t\ttype: \"set\",\n\t\t\tattributes: {\n\t\t\t\tname: {type: \"string\", value: name},\n\t\t\t\tvalue: {type: \"string\", value: value}\n\t\t\t},\n\t\t\tchildren: [\n\t\t\t\tparseTreeNode\n\t\t\t]\n\t\t};\n\t\tparseTreeNode = setVariableWidget;\n\t});\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\n\t\tparentWidget: this,\n\t\tdocument: this.document\n\t});\n};\n\n/*\nGet the next sibling of this widget\n*/\nWidget.prototype.nextSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index < this.parentWidget.children.length-1) {\n\t\t\treturn this.parentWidget.children[index+1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the previous sibling of this widget\n*/\nWidget.prototype.previousSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index > 0) {\n\t\t\treturn this.parentWidget.children[index-1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRender the children of this widget into the DOM\n*/\nWidget.prototype.renderChildren = function(parent,nextSibling) {\n\tvar children = this.children;\n\tfor(var i = 0; i < children.length; i++) {\n\t\tchildren[i].render(parent,nextSibling);\n\t};\n};\n\n/*\nAdd a list of event listeners from an array [{type:,handler:},...]\n*/\nWidget.prototype.addEventListeners = function(listeners) {\n\tvar self = this;\n\t$tw.utils.each(listeners,function(listenerInfo) {\n\t\tself.addEventListener(listenerInfo.type,listenerInfo.handler);\n\t});\n};\n\n/*\nAdd an event listener\n*/\nWidget.prototype.addEventListener = function(type,handler) {\n\tvar self = this;\n\tif(typeof handler === \"string\") { // The handler is a method name on this widget\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn self[handler].call(self,event);\n\t\t};\n\t} else { // The handler is a function\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn handler.call(self,event);\n\t\t};\n\t}\n};\n\n/*\nDispatch an event to a widget. If the widget doesn't handle the event then it is also dispatched to the parent widget\n*/\nWidget.prototype.dispatchEvent = function(event) {\n\tevent.widget = event.widget || this;\n\t// Dispatch the event if this widget handles it\n\tvar listener = this.eventListeners[event.type];\n\tif(listener) {\n\t\t// Don't propagate the event if the listener returned false\n\t\tif(!listener(event)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Dispatch the event to the parent widget\n\tif(this.parentWidget) {\n\t\treturn this.parentWidget.dispatchEvent(event);\n\t}\n\treturn true;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nRebuild a previously rendered widget\n*/\nWidget.prototype.refreshSelf = function() {\n\tvar nextSibling = this.findNextSiblingDomNode();\n\tthis.removeChildDomNodes();\n\tthis.render(this.parentDomNode,nextSibling);\n};\n\n/*\nRefresh all the children of a widget\n*/\nWidget.prototype.refreshChildren = function(changedTiddlers) {\n\tvar children = this.children,\n\t\trefreshed = false;\n\tfor (var i = 0; i < children.length; i++) {\n\t\trefreshed = children[i].refresh(changedTiddlers) || refreshed;\n\t}\n\treturn refreshed;\n};\n\n/*\nFind the next sibling in the DOM to this widget. This is done by scanning the widget tree through all next siblings and their descendents that share the same parent DOM node\n*/\nWidget.prototype.findNextSiblingDomNode = function(startIndex) {\n\t// Refer to this widget by its index within its parents children\n\tvar parent = this.parentWidget,\n\t\tindex = startIndex !== undefined ? startIndex : parent.children.indexOf(this);\nif(index === -1) {\n\tthrow \"node not found in parents children\";\n}\n\t// Look for a DOM node in the later siblings\n\twhile(++index < parent.children.length) {\n\t\tvar domNode = parent.children[index].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\t// Go back and look for later siblings of our parent if it has the same parent dom node\n\tvar grandParent = parent.parentWidget;\n\tif(grandParent && parent.parentDomNode === this.parentDomNode) {\n\t\tindex = grandParent.children.indexOf(parent);\n\t\tif(index !== -1) {\n\t\t\treturn parent.findNextSiblingDomNode(index);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nFind the first DOM node generated by a widget or its children\n*/\nWidget.prototype.findFirstDomNode = function() {\n\t// Return the first dom node of this widget, if we've got one\n\tif(this.domNodes.length > 0) {\n\t\treturn this.domNodes[0];\n\t}\n\t// Otherwise, recursively call our children\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar domNode = this.children[t].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRemove any DOM nodes created by this widget or its children\n*/\nWidget.prototype.removeChildDomNodes = function() {\n\t// If this widget has directly created DOM nodes, delete them and exit. This assumes that any child widgets are contained within the created DOM nodes, which would normally be the case\n\tif(this.domNodes.length > 0) {\n\t\t$tw.utils.each(this.domNodes,function(domNode) {\n\t\t\tdomNode.parentNode.removeChild(domNode);\n\t\t});\n\t\tthis.domNodes = [];\n\t} else {\n\t\t// Otherwise, ask the child widgets to delete their DOM nodes\n\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\tchildWidget.removeChildDomNodes();\n\t\t});\n\t}\n};\n\n/*\nInvoke the action widgets that are descendents of the current widget.\n*/\nWidget.prototype.invokeActions = function(triggeringWidget,event) {\n\tvar handled = false;\n\t// For each child widget\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar child = this.children[t],\n\t\t\tchildIsActionWidget = !!child.invokeAction,\n\t\t\tactionRefreshPolicy = child.getVariable(\"tv-action-refresh-policy\"); // Default is \"once\"\n\t\t// Refresh the child if required\n\t\tif(childIsActionWidget || actionRefreshPolicy === \"always\") {\n\t\t\tchild.refreshSelf();\n\t\t}\n\t\t// Invoke the child if it is an action widget\n\t\tif(childIsActionWidget) {\n\t\t\tif(child.invokeAction(triggeringWidget,event)) {\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t}\n\t\t// Propagate through through the child if it permits it\n\t\tif(child.allowActionPropagation() && child.invokeActions(triggeringWidget,event)) {\n\t\t\thandled = true;\n\t\t}\n\t}\n\treturn handled;\n};\n\n/*\nInvoke the action widgets defined in a string\n*/\nWidget.prototype.invokeActionString = function(actions,triggeringWidget,event,variables) {\n\tactions = actions || \"\";\n\tvar parser = this.wiki.parseText(\"text/vnd.tiddlywiki\",actions,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document\n\t\t}),\n\t\twidgetNode = this.wiki.makeWidget(parser,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document,\n\t\t\tvariables: variables\n\t\t});\n\tvar container = this.document.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn widgetNode.invokeActions(this,event);\n};\n\n/*\nExecute action tiddlers by tag\n*/\nWidget.prototype.invokeActionsByTag = function(tag,event,variables) {\n\tvar self = this;\n\t$tw.utils.each(self.wiki.filterTiddlers(\"[all[shadows+tiddlers]tag[\" + tag + \"]!has[draft.of]]\"),function(title) {\n\t\tself.invokeActionString(self.wiki.getTiddlerText(title),self,event,variables);\n\t});\n};\n\nWidget.prototype.allowActionPropagation = function() {\n\treturn true;\n};\n\n/*\nFind child <$data> widgets recursively. The tag name allows aliased versions of the widget to be found too\n*/\nWidget.prototype.findChildrenDataWidgets = function(children,tag,callback) {\n\tvar self = this;\n\t$tw.utils.each(children,function(child) {\n\t\tif(child.dataWidgetTag === tag) {\n\t\t\tcallback(child);\n\t\t}\n\t\tif(child.children) {\n\t\t\tself.findChildrenDataWidgets(child.children,tag,callback);\n\t\t}\n\t});\n};\n\n/*\nEvaluate a variable with parameters. This is a static convenience method that attempts to evaluate a variable as a function, returning an array of strings\n*/\nWidget.evaluateVariable  = function(widget,name,options) {\n\tvar result;\n\tif(widget.getVariableInfo) {\n\t\tvar variableInfo = widget.getVariableInfo(name,options);\n\t\tresult = variableInfo.resultList || [variableInfo.text];\n\t} else {\n\t\tresult = [widget.getVariable(name)];\n\t}\n\treturn result;\n};\n\nexports.widget = Widget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/wikify.js":{"title":"$:/core/modules/widgets/wikify.js","text":"/*\\\ntitle: $:/core/modules/widgets/wikify.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to wikify text into a variable\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar WikifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nWikifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nWikifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWikifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.wikifyName = this.getAttribute(\"name\");\n\tthis.wikifyText = this.getAttribute(\"text\");\n\tthis.wikifyType = this.getAttribute(\"type\");\n\tthis.wikifyMode = this.getAttribute(\"mode\",\"block\");\n\tthis.wikifyOutput = this.getAttribute(\"output\",\"text\");\n\t// Create the parse tree\n\tthis.wikifyParser = this.wiki.parseText(this.wikifyType,this.wikifyText,{\n\t\t\tparseAsInline: this.wikifyMode === \"inline\"\n\t\t});\n\t// Create the widget tree \n\tthis.wikifyWidgetNode = this.wiki.makeWidget(this.wikifyParser,{\n\t\t\tdocument: $tw.fakeDocument,\n\t\t\tparentWidget: this\n\t\t});\n\t// Render the widget tree to the container\n\tthis.wikifyContainer = $tw.fakeDocument.createElement(\"div\");\n\tthis.wikifyWidgetNode.render(this.wikifyContainer,null);\n\tthis.wikifyResult = this.getResult();\n\t// Set context variable\n\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nReturn the result string\n*/\nWikifyWidget.prototype.getResult = function() {\n\tvar result;\n\tswitch(this.wikifyOutput) {\n\t\tcase \"text\":\n\t\t\tresult = this.wikifyContainer.textContent;\n\t\t\tbreak;\n\t\tcase \"formattedtext\":\n\t\t\tresult = this.wikifyContainer.formattedTextContent;\n\t\t\tbreak;\n\t\tcase \"html\":\n\t\t\tresult = this.wikifyContainer.innerHTML;\n\t\t\tbreak;\n\t\tcase \"parsetree\":\n\t\t\tresult = JSON.stringify(this.wikifyParser.tree,0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t\tcase \"widgettree\":\n\t\t\tresult = JSON.stringify(this.getWidgetTree(),0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t}\n\treturn result;\n};\n\n/*\nReturn a string of the widget tree\n*/\nWikifyWidget.prototype.getWidgetTree = function() {\n\tvar copyNode = function(widgetNode,resultNode) {\n\t\t\tvar type = widgetNode.parseTreeNode.type;\n\t\t\tresultNode.type = type;\n\t\t\tswitch(type) {\n\t\t\t\tcase \"element\":\n\t\t\t\t\tresultNode.tag = widgetNode.parseTreeNode.tag;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"text\":\n\t\t\t\t\tresultNode.text = widgetNode.parseTreeNode.text;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.attributes || {}).length > 0) {\n\t\t\t\tresultNode.attributes = {};\n\t\t\t\t$tw.utils.each(widgetNode.attributes,function(attr,attrName) {\n\t\t\t\t\tresultNode.attributes[attrName] = widgetNode.getAttribute(attrName);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.children || {}).length > 0) {\n\t\t\t\tresultNode.children = [];\n\t\t\t\t$tw.utils.each(widgetNode.children,function(widgetChildNode) {\n\t\t\t\t\tvar node = {};\n\t\t\t\t\tresultNode.children.push(node);\n\t\t\t\t\tcopyNode(widgetChildNode,node);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresults = {};\n\tcopyNode(this.wikifyWidgetNode,results);\n\treturn results;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWikifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh ourselves entirely if any of our attributes have changed\n\tif(changedAttributes.name || changedAttributes.text || changedAttributes.type || changedAttributes.mode || changedAttributes.output) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\t// Refresh the widget tree\n\t\tif(this.wikifyWidgetNode.refresh(changedTiddlers)) {\n\t\t\t// Check if there was any change\n\t\t\tvar result = this.getResult();\n\t\t\tif(result !== this.wikifyResult) {\n\t\t\t\t// If so, save the change\n\t\t\t\tthis.wikifyResult = result;\n\t\t\t\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t\t\t\t// Refresh each of our child widgets\n\t\t\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\t\t\tchildWidget.refreshSelf();\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t// Just refresh the children\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.wikify = WikifyWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/wiki-bulkops.js":{"title":"$:/core/modules/wiki-bulkops.js","text":"/*\\\ntitle: $:/core/modules/wiki-bulkops.js\ntype: application/javascript\nmodule-type: wikimethod\n\nBulk tiddler operations such as rename.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRename a tiddler, and relink any tags or lists that reference it.\n*/\nfunction renameTiddler(fromTitle,toTitle,options) {\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\t// Rename the tiddler itself\n\t\tvar oldTiddler = this.getTiddler(fromTitle),\n\t\t\tnewTiddler = new $tw.Tiddler(oldTiddler,{title: toTitle},this.getModificationFields());\n\t\tnewTiddler = $tw.hooks.invokeHook(\"th-renaming-tiddler\",newTiddler,oldTiddler);\n\t\tthis.addTiddler(newTiddler);\n\t\tthis.deleteTiddler(fromTitle);\n\t\t// Rename any tags or lists that reference it\n\t\tthis.relinkTiddler(fromTitle,toTitle,options)\n\t}\n}\n\n/*\nRelink any tags or lists that reference a given tiddler\n*/\nfunction relinkTiddler(fromTitle,toTitle,options) {\n\tvar self = this;\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\tthis.each(function(tiddler,title) {\n\t\t\tvar type = tiddler.fields.type || \"\";\n\t\t\t// Don't touch plugins or JavaScript modules\n\t\t\tif(!tiddler.fields[\"plugin-type\"] && type !== \"application/javascript\") {\n\t\t\t\tvar tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,\n\t\t\t\t\tlist = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,\n\t\t\t\t\tisModified = false,\n\t\t\t\t\tprocessList = function(listField) {\n\t\t\t\t\t\tif(listField && listField.indexOf(fromTitle) !== -1) {\n\t\t\t\t\t\t\t// Remove any existing instances of the toTitle\n\t\t\t\t\t\t\tvar p = listField.indexOf(toTitle);\n\t\t\t\t\t\t\twhile(p !== -1) {\n\t\t\t\t\t\t\t\tlistField.splice(p,1);\n\t\t\t\t\t\t\t\tp = listField.indexOf(toTitle);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Replace the fromTitle with toTitle\n\t\t\t\t\t\t\t$tw.utils.each(listField,function (title,index) {\n\t\t\t\t\t\t\t\tif(title === fromTitle) {\n\t\t\t\t\t\t\t\t\tlistField[index] = toTitle;\n\t\t\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\tif(!options.dontRenameInTags) {\n\t\t\t\t\t// Rename tags\n\t\t\t\t\tprocessList(tags);\n\t\t\t\t}\n\t\t\t\tif(!options.dontRenameInLists) {\n\t\t\t\t\t// Rename lists\n\t\t\t\t\tprocessList(list);\n\t\t\t\t}\n\t\t\t\tif(isModified) {\n\t\t\t\t\tvar newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},self.getModificationFields())\n\t\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-relinking-tiddler\",newTiddler,tiddler);\n\t\t\t\t\tself.addTiddler(newTiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\nexports.renameTiddler = renameTiddler;\nexports.relinkTiddler = relinkTiddler;\n\n})();\n","type":"application/javascript","module-type":"wikimethod"},"$:/core/modules/wiki.js":{"title":"$:/core/modules/wiki.js","text":"/*\\\ntitle: $:/core/modules/wiki.js\ntype: application/javascript\nmodule-type: wikimethod\n\nExtension methods for the $tw.Wiki object\n\nAdds the following properties to the wiki object:\n\n* `eventListeners` is a hashmap by type of arrays of listener functions\n* `changedTiddlers` is a hashmap describing changes to named tiddlers since wiki change events were last dispatched. Each entry is a hashmap containing two fields:\n\tmodified: true/false\n\tdeleted: true/false\n* `changeCount` is a hashmap by tiddler title containing a numerical index that starts at zero and is incremented each time a tiddler is created changed or deleted\n* `caches` is a hashmap by tiddler title containing a further hashmap of named cache objects. Caches are automatically cleared when a tiddler is modified or deleted\n* `globalCache` is a hashmap by cache name of cache objects that are cleared whenever any tiddler change occurs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar USER_NAME_TITLE = \"$:/status/UserName\",\n\tTIMESTAMP_DISABLE_TITLE = \"$:/config/TimestampDisable\";\n\n/*\nAdd available indexers to this wiki\n*/\nexports.addIndexersToWiki = function() {\n\tvar self = this;\n\t$tw.utils.each($tw.modules.applyMethods(\"indexer\"),function(Indexer,name) {\n\t\tself.addIndexer(new Indexer(self),name);\n\t});\n};\n\n/*\nGet the value of a text reference. Text references can have any of these forms:\n\t<tiddlertitle>\n\t<tiddlertitle>!!<fieldname>\n\t!!<fieldname> - specifies a field of the current tiddlers\n\t<tiddlertitle>##<index>\n*/\nexports.getTextReference = function(textRef,defaultText,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tif(tr.field) {\n\t\tvar tiddler = this.getTiddler(title);\n\t\tif(tr.field === \"title\") { // Special case so we can return the title of a non-existent tiddler\n\t\t\treturn title || defaultText;\n\t\t} else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\treturn tiddler.getFieldString(tr.field);\n\t\t} else {\n\t\t\treturn defaultText;\n\t\t}\n\t} else if(tr.index) {\n\t\treturn this.extractTiddlerDataItem(title,tr.index,defaultText);\n\t} else {\n\t\treturn this.getTiddlerText(title,defaultText);\n\t}\n};\n\nexports.setTextReference = function(textRef,value,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tthis.setText(title,tr.field,tr.index,value);\n};\n\nexports.setText = function(title,field,index,value,options) {\n\toptions = options || {};\n\tvar creationFields = options.suppressTimestamp ? {} : this.getCreationFields(),\n\t\tmodificationFields = options.suppressTimestamp ? {} : this.getModificationFields();\n\t// Check if it is a reference to a tiddler field\n\tif(index) {\n\t\tvar data = this.getTiddlerData(title,Object.create(null));\n\t\tif(value !== undefined) {\n\t\t\tdata[index] = value;\n\t\t} else {\n\t\t\tdelete data[index];\n\t\t}\n\t\tthis.setTiddlerData(title,data,{},{suppressTimestamp: options.suppressTimestamp});\n\t} else {\n\t\tvar tiddler = this.getTiddler(title),\n\t\t\tfields = {title: title};\n\t\tfields[field || \"text\"] = value;\n\t\tthis.addTiddler(new $tw.Tiddler(creationFields,tiddler,fields,modificationFields));\n\t}\n};\n\nexports.deleteTextReference = function(textRef,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle,tiddler,fields;\n\t// Check if it is a reference to a tiddler\n\tif(tr.title && !tr.field) {\n\t\tthis.deleteTiddler(tr.title);\n\t// Else check for a field reference\n\t} else if(tr.field) {\n\t\ttitle = tr.title || currTiddlerTitle;\n\t\ttiddler = this.getTiddler(title);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\tfields = Object.create(null);\n\t\t\tfields[tr.field] = undefined;\n\t\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t\t}\n\t}\n};\n\nexports.addEventListener = function(type,listener) {\n\tthis.eventListeners = this.eventListeners || {};\n\tthis.eventListeners[type] = this.eventListeners[type]  || [];\n\tthis.eventListeners[type].push(listener);\n};\n\nexports.removeEventListener = function(type,listener) {\n\tvar listeners = this.eventListeners[type];\n\tif(listeners) {\n\t\tvar p = listeners.indexOf(listener);\n\t\tif(p !== -1) {\n\t\t\tlisteners.splice(p,1);\n\t\t}\n\t}\n};\n\nexports.dispatchEvent = function(type /*, args */) {\n\tvar args = Array.prototype.slice.call(arguments,1),\n\t\tlisteners = this.eventListeners[type];\n\tif(listeners) {\n\t\tfor(var p=0; p<listeners.length; p++) {\n\t\t\tvar listener = listeners[p];\n\t\t\tlistener.apply(listener,args);\n\t\t}\n\t}\n};\n\n/*\nCauses a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.\nThis method should be called after the changes it describes have been made to the wiki.tiddlers[] array.\n\ttitle: Title of tiddler\n\tisDeleted: defaults to false (meaning the tiddler has been created or modified),\n\t\ttrue if the tiddler has been deleted\n*/\nexports.enqueueTiddlerEvent = function(title,isDeleted) {\n\t// Record the touch in the list of changed tiddlers\n\tthis.changedTiddlers = this.changedTiddlers || Object.create(null);\n\tthis.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);\n\tthis.changedTiddlers[title][isDeleted ? \"deleted\" : \"modified\"] = true;\n\t// Increment the change count\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\tthis.changeCount[title]++;\n\t} else {\n\t\tthis.changeCount[title] = 1;\n\t}\n\t// Trigger events\n\tthis.eventListeners = this.eventListeners || {};\n\tif(!this.eventsTriggered) {\n\t\tvar self = this;\n\t\t$tw.utils.nextTick(function() {\n\t\t\tvar changes = self.changedTiddlers;\n\t\t\tself.changedTiddlers = Object.create(null);\n\t\t\tself.eventsTriggered = false;\n\t\t\tif($tw.utils.count(changes) > 0) {\n\t\t\t\tself.dispatchEvent(\"change\",changes);\n\t\t\t}\n\t\t});\n\t\tthis.eventsTriggered = true;\n\t}\n};\n\nexports.getSizeOfTiddlerEventQueue = function() {\n\treturn $tw.utils.count(this.changedTiddlers);\n};\n\nexports.clearTiddlerEventQueue = function() {\n\tthis.changedTiddlers = Object.create(null);\n\tthis.changeCount = Object.create(null);\n};\n\nexports.getChangeCount = function(title) {\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\treturn this.changeCount[title];\n\t} else {\n\t\treturn 0;\n\t}\n};\n\n/*\nGenerate an unused title from the specified base\noptions.prefix must be a string\n*/\nexports.generateNewTitle = function(baseTitle,options) {\n\toptions = options || {};\n\tvar title = baseTitle,\n\t\ttemplate = options.template || \"\",\n\t\t// test if .startCount is a positive integer. If not set to 0\n\t\tc = (parseInt(options.startCount,10) > 0) ? parseInt(options.startCount,10) : 0,\n\t\tprefix = (typeof(options.prefix) === \"string\") ? options.prefix : \" \";\n\n\tif (template) {\n\t\t// \"count\" is important to avoid an endless loop in while(...)!!\n\t\ttemplate = (/\\$count:?(\\d+)?\\$/i.test(template)) ? template : template + \"$count$\";\n\t\t// .formatTitleString() expects strings as input\n\t\ttitle = $tw.utils.formatTitleString(template,{\"base\":baseTitle,\"separator\":prefix,\"counter\":c+\"\"});\n\t\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\t\ttitle = $tw.utils.formatTitleString(template,{\"base\":baseTitle,\"separator\":prefix,\"counter\":(++c)+\"\"});\n\t\t}\n\t} else {\n\t\tif (c > 0) {\n\t\t\ttitle = baseTitle + prefix + c;\n\t\t}\n\t\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\t\ttitle = baseTitle + prefix + (++c);\n\t\t}\n\t}\n\treturn title;\n};\n\nexports.isSystemTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/\") === 0;\n};\n\nexports.isTemporaryTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/temp/\") === 0;\n};\n\nexports.isVolatileTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/temp/volatile/\") === 0;\n};\n\nexports.isImageTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.flags.indexOf(\"image\") !== -1;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.isBinaryTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.encoding === \"base64\";\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLike addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported\n*/\nexports.importTiddler = function(tiddler) {\n\tvar existingTiddler = this.getTiddler(tiddler.fields.title);\n\t// Check if we're dealing with a plugin\n\tif(tiddler && tiddler.hasField(\"plugin-type\") && tiddler.hasField(\"version\") && existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t// Reject the incoming plugin if it is older\n\t\tif(!$tw.utils.checkVersions(tiddler.fields.version,existingTiddler.fields.version)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Fall through to adding the tiddler\n\tthis.addTiddler(tiddler);\n\treturn true;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is created\n*/\nexports.getCreationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = {\n\t\t\t\tcreated: new Date()\n\t\t\t},\n\t\t\tcreator = this.getTiddlerText(USER_NAME_TITLE);\n\t\tif(creator) {\n\t\t\tfields.creator = creator;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is modified\n*/\nexports.getModificationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = Object.create(null),\n\t\t\tmodifier = this.getTiddlerText(USER_NAME_TITLE);\n\t\tfields.modified = new Date();\n\t\tif(modifier) {\n\t\t\tfields.modifier = modifier;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a sorted array of tiddler titles.  Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.getTiddlers = function(options) {\n\toptions = options || Object.create(null);\n\tvar self = this,\n\t\tsortField = options.sortField || \"title\",\n\t\ttiddlers = [], t, titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tif(options.includeSystem || !self.isSystemTiddler(title)) {\n\t\t\tif(!options.excludeTag || !tiddler.hasTag(options.excludeTag)) {\n\t\t\t\ttiddlers.push(tiddler);\n\t\t\t}\n\t\t}\n\t});\n\ttiddlers.sort(function(a,b) {\n\t\tvar aa = a.fields[sortField].toLowerCase() || \"\",\n\t\t\tbb = b.fields[sortField].toLowerCase() || \"\";\n\t\tif(aa < bb) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(aa > bb) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n\tfor(t=0; t<tiddlers.length; t++) {\n\t\ttitles.push(tiddlers[t].fields.title);\n\t}\n\treturn titles;\n};\n\nexports.countTiddlers = function(excludeTag) {\n\tvar tiddlers = this.getTiddlers({excludeTag: excludeTag});\n\treturn $tw.utils.count(tiddlers);\n};\n\n/*\nReturns a function iterator(callback) that iterates through the specified titles, and invokes the callback with callback(tiddler,title)\n*/\nexports.makeTiddlerIterator = function(titles) {\n\tvar self = this;\n\tif(!$tw.utils.isArray(titles)) {\n\t\ttitles = Object.keys(titles);\n\t} else {\n\t\ttitles = titles.slice(0);\n\t}\n\treturn function(callback) {\n\t\ttitles.forEach(function(title) {\n\t\t\tcallback(self.getTiddler(title),title);\n\t\t});\n\t};\n};\n\n/*\nSort an array of tiddler titles by a specified field\n\ttitles: array of titles (sorted in place)\n\tsortField: name of field to sort by\n\tisDescending: true if the sort should be descending\n\tisCaseSensitive: true if the sort should consider upper and lower case letters to be different\n*/\nexports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric,isAlphaNumeric) {\n\tvar self = this;\n\tif(sortField === \"title\") {\n\t\tif(!isNumeric && !isAlphaNumeric) {\n\t\t\tif(isCaseSensitive) {\n\t\t\t\tif(isDescending) {\n\t\t\t\t\ttitles.sort(function(a,b) {\n\t\t\t\t\t\treturn b.localeCompare(a);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\ttitles.sort(function(a,b) {\n\t\t\t\t\t\treturn a.localeCompare(b);\n\t\t\t\t\t});\n\t\t\t\t}\t\n\t\t\t} else {\n\t\t\t\tif(isDescending) {\n\t\t\t\t\ttitles.sort(function(a,b) {\n\t\t\t\t\t\treturn b.toLowerCase().localeCompare(a.toLowerCase());\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\ttitles.sort(function(a,b) {\n\t\t\t\t\t\treturn a.toLowerCase().localeCompare(b.toLowerCase());\n\t\t\t\t\t});\n\t\t\t\t}\t\n\t\t\t}\n\t\t} else {\n\t\t\ttitles.sort(function(a,b) {\n\t\t\t\tvar x,y;\n\t\t\t\tif(isNumeric) {\n\t\t\t\t\tx = Number(a);\n\t\t\t\t\ty = Number(b);\n\t\t\t\t\tif(isNaN(x)) {\n\t\t\t\t\t\tif(isNaN(y)) {\n\t\t\t\t\t\t\t// If neither value is a number then fall through to a textual comparison\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn isDescending ? -1 : 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(isNaN(y)) {\n\t\t\t\t\t\t\treturn isDescending ? 1 : -1;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn isDescending ? y - x :  x - y;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(isAlphaNumeric) {\n\t\t\t\t\treturn isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \"base\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \"base\"});\n\t\t\t\t}\n\t\t\t\tif(!isCaseSensitive) {\n\t\t\t\t\ta = a.toLowerCase();\n\t\t\t\t\tb = b.toLowerCase();\n\t\t\t\t}\n\t\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t\t});\n\t\t}\n\t} else {\n\t\ttitles.sort(function(a,b) {\n\t\t\tvar x,y;\n\t\t\tif(sortField !== \"title\") {\n\t\t\t\tvar tiddlerA = self.getTiddler(a),\n\t\t\t\t\ttiddlerB = self.getTiddler(b);\n\t\t\t\tif(tiddlerA) {\n\t\t\t\t\ta = tiddlerA.fields[sortField] || \"\";\n\t\t\t\t} else {\n\t\t\t\t\ta = \"\";\n\t\t\t\t}\n\t\t\t\tif(tiddlerB) {\n\t\t\t\t\tb = tiddlerB.fields[sortField] || \"\";\n\t\t\t\t} else {\n\t\t\t\t\tb = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(isNumeric) {\n\t\t\t\tx = Number(a);\n\t\t\t\ty = Number(b);\n\t\t\t\tif(isNaN(x)) {\n\t\t\t\t\tif(isNaN(y)) {\n\t\t\t\t\t\t// If neither value is a number then fall through to a textual comparison\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn isDescending ? -1 : 1;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif(isNaN(y)) {\n\t\t\t\t\t\treturn isDescending ? 1 : -1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn isDescending ? y - x :  x - y;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(Object.prototype.toString.call(a) === \"[object Date]\" && Object.prototype.toString.call(b) === \"[object Date]\") {\n\t\t\t\treturn isDescending ? b - a : a - b;\n\t\t\t}\n\t\t\ta = String(a);\n\t\t\tb = String(b);\n\t\t\tif(isAlphaNumeric) {\n\t\t\t\treturn isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \"base\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \"base\"});\n\t\t\t}\n\t\t\tif(!isCaseSensitive) {\n\t\t\t\ta = a.toLowerCase();\n\t\t\t\tb = b.toLowerCase();\n\t\t\t}\n\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t});\n\t}\n};\n\n/*\nFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.forEachTiddler = function(/* [options,]callback */) {\n\tvar arg = 0,\n\t\toptions = arguments.length >= 2 ? arguments[arg++] : {},\n\t\tcallback = arguments[arg++],\n\t\ttitles = this.getTiddlers(options),\n\t\tt, tiddler;\n\tfor(t=0; t<titles.length; t++) {\n\t\ttiddler = this.getTiddler(titles[t]);\n\t\tif(tiddler) {\n\t\t\tcallback.call(this,tiddler.fields.title,tiddler);\n\t\t}\n\t}\n};\n\n/*\nReturn an array of tiddler titles that are directly linked within the given parse tree\n */\nexports.extractLinks = function(parseTreeRoot) {\n\t// Count up the links\n\tvar links = [],\n\t\tcheckParseTree = function(parseTree) {\n\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcheckParseTree(parseTreeRoot);\n\treturn links;\n};\n\n/*\nReturn an array of tiddler titles that are directly linked from the specified tiddler\n*/\nexports.getTiddlerLinks = function(title) {\n\tvar self = this;\n\t// We'll cache the links so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"links\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\tif(parser) {\n\t\t\treturn self.extractLinks(parser.tree);\n\t\t}\n\t\treturn [];\n\t});\n};\n\n/*\nReturn an array of tiddler titles that link to the specified tiddler\n*/\nexports.getTiddlerBacklinks = function(targetTitle) {\n\tvar self = this,\n\t\tbackIndexer = this.getIndexer(\"BackIndexer\"),\n\t\tbacklinks = backIndexer && backIndexer.subIndexers.link.lookup(targetTitle);\n\n\tif(!backlinks) {\n\t\tbacklinks = [];\n\t\tthis.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self.getTiddlerLinks(title);\n\t\t\tif(links.indexOf(targetTitle) !== -1) {\n\t\t\t\tbacklinks.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn backlinks;\n};\n\n\n/*\nReturn an array of tiddler titles that are directly transcluded within the given parse tree. `title` is the tiddler being parsed, we will ignore its self-referential transclusions, only return\n */\nexports.extractTranscludes = function(parseTreeRoot, title) {\n\t// Count up the transcludes\n\tvar transcludes = [],\n\t\tcheckParseTree = function(parseTree, parentNode) {\n\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\tif(parseTreeNode.type === \"transclude\") {\n\t\t\t\t\tif(parseTreeNode.attributes.$tiddler) {\n\t\t\t\t\t\tif(parseTreeNode.attributes.$tiddler.type === \"string\") {\n\t\t\t\t\t\t\tvar value;\n\t\t\t\t\t\t\t// if it is Transclusion with Templates like `{{Index||$:/core/ui/TagTemplate}}`, the `$tiddler` will point to the template. We need to find the actual target tiddler from parent node\n\t\t\t\t\t\t\tif(parentNode && parentNode.type === \"tiddler\" && parentNode.attributes.tiddler && parentNode.attributes.tiddler.type === \"string\") {\n\t\t\t\t\t\t\t\t// Empty value (like `{{!!field}}`) means self-referential transclusion.\n\t\t\t\t\t\t\t\tvalue = parentNode.attributes.tiddler.value || title;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tvalue = parseTreeNode.attributes.$tiddler.value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if(parseTreeNode.attributes.tiddler) {\n\t\t\t\t\t\tif (parseTreeNode.attributes.tiddler.type === \"string\") {\n\t\t\t\t\t\t\t// Old transclude widget usage\n\t\t\t\t\t\t\tvalue = parseTreeNode.attributes.tiddler.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if(parseTreeNode.attributes.$field && parseTreeNode.attributes.$field.type === \"string\") {\n\t\t\t\t\t\t// Empty value (like `<$transclude $field='created'/>`) means self-referential transclusion. \n\t\t\t\t\t\tvalue = title;\n\t\t\t\t\t} else if(parseTreeNode.attributes.field && parseTreeNode.attributes.field.type === \"string\") {\n\t\t\t\t\t\t// Old usage with Empty value (like `<$transclude field='created'/>`)\n\t\t\t\t\t\tvalue = title;\n\t\t\t\t\t}\n\t\t\t\t\t// Deduplicate the result.\n\t\t\t\t\tif(value && transcludes.indexOf(value) === -1) {\n\t\t\t\t\t\t$tw.utils.pushTop(transcludes,value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\tcheckParseTree(parseTreeNode.children,parseTreeNode);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcheckParseTree(parseTreeRoot);\n\treturn transcludes;\n};\n\n\n/*\nReturn an array of tiddler titles that are transcluded from the specified tiddler\n*/\nexports.getTiddlerTranscludes = function(title) {\n\tvar self = this;\n\t// We'll cache the transcludes so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"transcludes\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\tif(parser) {\n\t\t\t// this will ignore self-referential transclusions from `title`\n\t\t\treturn self.extractTranscludes(parser.tree,title);\n\t\t}\n\t\treturn [];\n\t});\n};\n\n/*\nReturn an array of tiddler titles that transclude to the specified tiddler\n*/\nexports.getTiddlerBacktranscludes = function(targetTitle) {\n\tvar self = this,\n\t\tbackIndexer = this.getIndexer(\"BackIndexer\"),\n\t\tbacktranscludes = backIndexer && backIndexer.subIndexers.transclude.lookup(targetTitle);\n\n\tif(!backtranscludes) {\n\t\tbacktranscludes = [];\n\t}\n\treturn backtranscludes;\n};\n\n/*\nReturn a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced\n*/\nexports.getMissingTitles = function() {\n\tvar self = this,\n\t\tmissing = [];\n// We should cache the missing tiddler list, even if we recreate it every time any tiddler is modified\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tif((!self.tiddlerExists(link) && !self.isShadowTiddler(link)) && missing.indexOf(link) === -1) {\n\t\t\t\tmissing.push(link);\n\t\t\t}\n\t\t});\n\t});\n\treturn missing;\n};\n\nexports.getOrphanTitles = function() {\n\tvar self = this,\n\t\torphans = this.getTiddlers();\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tvar p = orphans.indexOf(link);\n\t\t\tif(p !== -1) {\n\t\t\t\torphans.splice(p,1);\n\t\t\t}\n\t\t});\n\t});\n\treturn orphans; // Todo\n};\n\n/*\nRetrieves a list of the tiddler titles that are tagged with a given tag\n*/\nexports.getTiddlersWithTag = function(tag) {\n\t// Try to use the indexer\n\tvar self = this,\n\t\ttagIndexer = this.getIndexer(\"TagIndexer\"),\n\t\tresults = tagIndexer && tagIndexer.subIndexers[3].lookup(tag);\n\tif(!results) {\n\t\t// If not available, perform a manual scan\n\t\tresults = this.getGlobalCache(\"taglist-\" + tag,function() {\n\t\t\tvar tagmap = self.getTagMap();\n\t\t\treturn self.sortByList(tagmap[tag],tag);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nGet a hashmap by tag of arrays of tiddler titles\n*/\nexports.getTagMap = function() {\n\tvar self = this;\n\treturn this.getGlobalCache(\"tagmap\",function() {\n\t\tvar tags = Object.create(null),\n\t\t\tstoreTags = function(tagArray,title) {\n\t\t\t\tif(tagArray) {\n\t\t\t\t\tfor(var index=0; index<tagArray.length; index++) {\n\t\t\t\t\t\tvar tag = tagArray[index];\n\t\t\t\t\t\tif($tw.utils.hop(tags,tag)) {\n\t\t\t\t\t\t\ttags[tag].push(title);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttags[tag] = [title];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\ttitle, tiddler;\n\t\t// Collect up all the tags\n\t\tself.eachShadow(function(tiddler,title) {\n\t\t\tif(!self.tiddlerExists(title)) {\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t\t}\n\t\t});\n\t\tself.each(function(tiddler,title) {\n\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t});\n\t\treturn tags;\n\t});\n};\n\n/*\nLookup a given tiddler and return a list of all the tiddlers that include it in the specified list field\n*/\nexports.findListingsOfTiddler = function(targetTitle,fieldName) {\n\tfieldName = fieldName || \"list\";\n\tvar wiki = this;\n\tvar listings = this.getGlobalCache(\"listings-\" + fieldName,function() {\n\t\tvar listings = Object.create(null);\n\t\twiki.each(function(tiddler,title) {\n\t\t\tvar list = $tw.utils.parseStringArray(tiddler.fields[fieldName]);\n\t\t\tif(list) {\n\t\t\t\tfor(var i = 0; i < list.length; i++) {\n\t\t\t\t\tvar listItem = list[i],\n\t\t\t\t\t\tlisting = listings[listItem] || [];\n\t\t\t\t\tif (listing.indexOf(title) === -1) {\n\t\t\t\t\t\tlisting.push(title);\n\t\t\t\t\t}\n\t\t\t\t\tlistings[listItem] = listing;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn listings;\n\t});\n\treturn listings[targetTitle] || [];\n};\n\n/*\nSorts an array of tiddler titles according to an ordered list\n*/\nexports.sortByList = function(array,listTitle) {\n\tvar self = this,\n\t\treplacedTitles = Object.create(null);\n\t// Given a title, this function will place it in the correct location\n\t// within titles.\n\tfunction moveItemInList(title) {\n\t\tif(!$tw.utils.hop(replacedTitles, title)) {\n\t\t\treplacedTitles[title] = true;\n\t\t\tvar newPos = -1,\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\tif(tiddler) {\n\t\t\t\tvar beforeTitle = tiddler.fields[\"list-before\"],\n\t\t\t\t\tafterTitle = tiddler.fields[\"list-after\"];\n\t\t\t\tif(beforeTitle === \"\") {\n\t\t\t\t\tnewPos = 0;\n\t\t\t\t} else if(afterTitle === \"\") {\n\t\t\t\t\tnewPos = titles.length;\n\t\t\t\t} else if(beforeTitle) {\n\t\t\t\t\t// if this title is placed relative\n\t\t\t\t\t// to another title, make sure that\n\t\t\t\t\t// title is placed before we place\n\t\t\t\t\t// this one.\n\t\t\t\t\tmoveItemInList(beforeTitle);\n\t\t\t\t\tnewPos = titles.indexOf(beforeTitle);\n\t\t\t\t} else if(afterTitle) {\n\t\t\t\t\t// Same deal\n\t\t\t\t\tmoveItemInList(afterTitle);\n\t\t\t\t\tnewPos = titles.indexOf(afterTitle);\n\t\t\t\t\tif(newPos >= 0) {\n\t\t\t\t\t\t++newPos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If a new position is specified, let's move it\n\t\t\t\tif (newPos !== -1) {\n\t\t\t\t\t// get its current Pos, and make sure\n\t\t\t\t\t// sure that it's _actually_ in the list\n\t\t\t\t\t// and that it would _actually_ move\n\t\t\t\t\t// (#4275) We don't bother calling\n\t\t\t\t\t//         indexOf unless we have a new\n\t\t\t\t\t//         position to work with\n\t\t\t\t\tvar currPos = titles.indexOf(title);\n\t\t\t\t\tif(currPos >= 0 && newPos !== currPos) {\n\t\t\t\t\t\t// move it!\n\t\t\t\t\t\ttitles.splice(currPos,1);\n\t\t\t\t\t\tif(newPos >= currPos) {\n\t\t\t\t\t\t\tnewPos--;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttitles.splice(newPos,0,title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tvar list = this.getTiddlerList(listTitle);\n\tif(!array || array.length === 0) {\n\t\treturn [];\n\t} else {\n\t\tvar titles = [], t, title;\n\t\t// First place any entries that are present in the list\n\t\tfor(t=0; t<list.length; t++) {\n\t\t\ttitle = list[t];\n\t\t\tif(array.indexOf(title) !== -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Then place any remaining entries\n\t\tfor(t=0; t<array.length; t++) {\n\t\t\ttitle = array[t];\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Finally obey the list-before and list-after fields of each tiddler in turn\n\t\tvar sortedTitles = titles.slice(0);\n\t\tfor(t=0; t<sortedTitles.length; t++) {\n\t\t\ttitle = sortedTitles[t];\n\t\t\tmoveItemInList(title);\n\t\t}\n\t\treturn titles;\n\t}\n};\n\nexports.getSubTiddler = function(title,subTiddlerTitle) {\n\tvar bundleInfo = this.getPluginInfo(title) || this.getTiddlerDataCached(title);\n\tif(bundleInfo && bundleInfo.tiddlers) {\n\t\tvar subTiddler = bundleInfo.tiddlers[subTiddlerTitle];\n\t\tif(subTiddler) {\n\t\t\treturn new $tw.Tiddler(subTiddler);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRetrieve a tiddler as a JSON string of the fields\n*/\nexports.getTiddlerAsJson = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\tvar fields = Object.create(null);\n\t\t$tw.utils.each(tiddler.fields,function(value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\treturn JSON.stringify(fields);\n\t} else {\n\t\treturn JSON.stringify({title: title});\n\t}\n};\n\nexports.getTiddlersAsJson = function(filter,spaces) {\n\tvar tiddlers = this.filterTiddlers(filter),\n\t\tspaces = (spaces === undefined) ? $tw.config.preferences.jsonSpaces : spaces,\n\t\tdata = [];\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\tvar tiddler = this.getTiddler(tiddlers[t]);\n\t\tif(tiddler) {\n\t\t\tvar fields = new Object();\n\t\t\tfor(var field in tiddler.fields) {\n\t\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t\t}\n\t\t\tdata.push(fields);\n\t\t}\n\t}\n\treturn JSON.stringify(data,null,spaces);\n};\n\n/*\nGet the content of a tiddler as a JavaScript object. How this is done depends on the type of the tiddler:\n\napplication/json: the tiddler JSON is parsed into an object\napplication/x-tiddler-dictionary: the tiddler is parsed as sequence of name:value pairs\n\nOther types currently just return null.\n\ntitleOrTiddler: string tiddler title or a tiddler object\ndefaultData: default data to be returned if the tiddler is missing or doesn't contain data\n\nNote that the same value is returned for repeated calls for the same tiddler data. The value is frozen to prevent modification; otherwise modifications would be visible to all callers\n*/\nexports.getTiddlerDataCached = function(titleOrTiddler,defaultData) {\n\tvar self = this,\n\t\ttiddler = titleOrTiddler;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\n\t}\n\tif(tiddler) {\n\t\treturn this.getCacheForTiddler(tiddler.fields.title,\"data\",function() {\n\t\t\t// Return the frozen value\n\t\t\tvar value = self.getTiddlerData(tiddler.fields.title,undefined);\n\t\t\t$tw.utils.deepFreeze(value);\n\t\t\treturn value;\n\t\t}) || defaultData;\n\t} else {\n\t\treturn defaultData;\n\t}\n};\n\n/*\nAlternative, uncached version of getTiddlerDataCached(). The return value can be mutated freely and reused\n*/\nexports.getTiddlerData = function(titleOrTiddler,defaultData) {\n\tvar tiddler = titleOrTiddler,\n\t\tdata;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\n\t}\n\tif(tiddler && tiddler.fields.text) {\n\t\tswitch(tiddler.fields.type) {\n\t\t\tcase \"application/json\":\n\t\t\t\t// JSON tiddler\n\t\t\t\treturn $tw.utils.parseJSONSafe(tiddler.fields.text,defaultData);\n\t\t\tcase \"application/x-tiddler-dictionary\":\n\t\t\t\treturn $tw.utils.parseFields(tiddler.fields.text);\n\t\t}\n\t}\n\treturn defaultData;\n};\n\n/*\nExtract an indexed field from within a data tiddler\n*/\nexports.extractTiddlerDataItem = function(titleOrTiddler,index,defaultText) {\n\tvar data = this.getTiddlerDataCached(titleOrTiddler,Object.create(null)),\n\t\ttext;\n\tif(data && $tw.utils.hop(data,index)) {\n\t\ttext = data[index];\n\t}\n\tif(typeof text === \"string\" || typeof text === \"number\") {\n\t\treturn text.toString();\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nSet a tiddlers content to a JavaScript object. Currently this is done by setting the tiddler's type to \"application/json\" and setting the text to the JSON text of the data.\ntitle: title of tiddler\ndata: object that can be serialised to JSON\nfields: optional hashmap of additional tiddler fields to be set\noptions: optional hashmap of options including:\n\tsuppressTimestamp: if true, don't set the creation/modification timestamps\n*/\nexports.setTiddlerData = function(title,data,fields,options) {\n\toptions = options || {};\n\tvar existingTiddler = this.getTiddler(title),\n\t\tcreationFields = options.suppressTimestamp ? {} : this.getCreationFields(),\n\t\tmodificationFields = options.suppressTimestamp ? {} : this.getModificationFields(),\n\t\tnewFields = {\n\t\t\ttitle: title\n\t\t};\n\tif(existingTiddler && existingTiddler.fields.type === \"application/x-tiddler-dictionary\") {\n\t\tnewFields.text = $tw.utils.makeTiddlerDictionary(data);\n\t} else {\n\t\tnewFields.type = \"application/json\";\n\t\tnewFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n\t}\n\tthis.addTiddler(new $tw.Tiddler(creationFields,existingTiddler,fields,newFields,modificationFields));\n};\n\n/*\nReturn the content of a tiddler as an array containing each line\n*/\nexports.getTiddlerList = function(title,field,index) {\n\tif(index) {\n\t\treturn $tw.utils.parseStringArray(this.extractTiddlerDataItem(title,index,\"\"));\n\t}\n\tfield = field || \"list\";\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\treturn ($tw.utils.parseStringArray(tiddler.fields[field]) || []).slice(0);\n\t}\n\treturn [];\n};\n\n// Return a named global cache object. Global cache objects are cleared whenever a tiddler change occurs\nexports.getGlobalCache = function(cacheName,initializer) {\n\tthis.globalCache = this.globalCache || Object.create(null);\n\tif($tw.utils.hop(this.globalCache,cacheName)) {\n\t\treturn this.globalCache[cacheName];\n\t} else {\n\t\tthis.globalCache[cacheName] = initializer();\n\t\treturn this.globalCache[cacheName];\n\t}\n};\n\nexports.clearGlobalCache = function() {\n\tthis.globalCache = Object.create(null);\n};\n\n// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it\nexports.getCacheForTiddler = function(title,cacheName,initializer) {\n\tthis.caches = this.caches || Object.create(null);\n\tvar caches = this.caches[title];\n\tif(caches && caches[cacheName] !== undefined) {\n\t\treturn caches[cacheName];\n\t} else {\n\t\tif(!caches) {\n\t\t\tcaches = Object.create(null);\n\t\t\tthis.caches[title] = caches;\n\t\t}\n\t\tcaches[cacheName] = initializer();\n\t\treturn caches[cacheName];\n\t}\n};\n\n// Clear all caches associated with a particular tiddler, or, if the title is null, clear all the caches for all the tiddlers\nexports.clearCache = function(title) {\n\tif(title) {\n\t\tthis.caches = this.caches || Object.create(null);\n\t\tif($tw.utils.hop(this.caches,title)) {\n\t\t\tdelete this.caches[title];\n\t\t}\n\t} else {\n\t\tthis.caches = Object.create(null);\n\t}\n};\n\nexports.initParsers = function(moduleType) {\n\t// Install the parser modules\n\t$tw.Wiki.parsers = {};\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(\"parser\",function(title,module) {\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\t$tw.Wiki.parsers[f] = module[f]; // Store the parser class\n\t\t\t}\n\t\t}\n\t});\n\t// Use the generic binary parser for any binary types not registered so far\n\tif($tw.Wiki.parsers[\"application/octet-stream\"]) {\n\t\tObject.keys($tw.config.contentTypeInfo).forEach(function(type) {\n\t\t\tif(!$tw.utils.hop($tw.Wiki.parsers,type) && $tw.config.contentTypeInfo[type].encoding === \"base64\") {\n\t\t\t\t$tw.Wiki.parsers[type] = $tw.Wiki.parsers[\"application/octet-stream\"];\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nParse a block of text of a specified MIME type\n\ttype: content type of text to be parsed\n\ttext: text\n\toptions: see below\nOptions include:\n\tparseAsInline: if true, the text of the tiddler will be parsed as an inline run\n\t_canonical_uri: optional string of the canonical URI of this content\n*/\nexports.parseText = function(type,text,options) {\n\ttext = text || \"\";\n\toptions = options || {};\n\t// Select a parser\n\tvar Parser = $tw.Wiki.parsers[type];\n\tif(!Parser && $tw.utils.getFileExtensionInfo(type)) {\n\t\tParser = $tw.Wiki.parsers[$tw.utils.getFileExtensionInfo(type).type];\n\t}\n\tif(!Parser) {\n\t\tParser = $tw.Wiki.parsers[options.defaultType || \"text/vnd.tiddlywiki\"];\n\t}\n\tif(!Parser) {\n\t\treturn null;\n\t}\n\t// Return the parser instance\n\treturn new Parser(type,text,{\n\t\tparseAsInline: options.parseAsInline,\n\t\twiki: this,\n\t\t_canonical_uri: options._canonical_uri,\n\t\tconfigTrimWhiteSpace: options.configTrimWhiteSpace\n\t});\n};\n\n/*\nParse a tiddler according to its MIME type\n*/\nexports.parseTiddler = function(title,options) {\n\toptions = $tw.utils.extend({},options);\n\tvar cacheType = options.parseAsInline ? \"inlineParseTree\" : \"blockParseTree\",\n\t\ttiddler = this.getTiddler(title),\n\t\tself = this;\n\treturn tiddler ? this.getCacheForTiddler(title,cacheType,function() {\n\t\t\tif(tiddler.hasField(\"_canonical_uri\")) {\n\t\t\t\toptions._canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t}\n\t\t\treturn self.parseText(tiddler.fields.type,tiddler.fields.text,options);\n\t\t}) : null;\n};\n\nexports.parseTextReference = function(title,field,index,options) {\n\tvar tiddler,\n\t\ttext,\n\t\tparserInfo;\n\tif(!options.subTiddler) {\n\t\ttiddler = this.getTiddler(title);\n\t\tif(field === \"text\" || (!field && !index)) {\n\t\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\t\treturn this.parseTiddler(title,options);\n\t\t}\n\t} \n\tparserInfo = this.getTextReferenceParserInfo(title,field,index,options);\n\tif(parserInfo.sourceText !== null) {\n\t\treturn this.parseText(parserInfo.parserType,parserInfo.sourceText,options);\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.getTextReferenceParserInfo = function(title,field,index,options) {\n\tvar defaultType = options.defaultType || \"text/vnd.tiddlywiki\",\n\t\ttiddler,\n\t\tparserInfo = {\n\t\t\tsourceText : null,\n\t\t\tparserType : defaultType\n\t\t};\n\tif(options.subTiddler) {\n\t\ttiddler = this.getSubTiddler(title,options.subTiddler);\n\t} else {\n\t\ttiddler = this.getTiddler(title);\n\t}\n\tif(field === \"text\" || (!field && !index)) {\n\t\tif(tiddler && tiddler.fields) {\n\t\t\tparserInfo.sourceText = tiddler.fields.text || \"\";\n\t\t\tif(tiddler.fields.type) {\n\t\t\t\tparserInfo.parserType = tiddler.fields.type;\n\t\t\t}\n\t\t}\n\t} else if(field) {\n\t\tif(field === \"title\") {\n\t\t\tparserInfo.sourceText = title;\n\t\t} else if(tiddler && tiddler.fields) {\n\t\t\tparserInfo.sourceText = tiddler.hasField(field) ? tiddler.fields[field].toString() : null;\n\t\t}\n\t} else if(index) {\n\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\tparserInfo.sourceText = this.extractTiddlerDataItem(tiddler,index,null);\n\t}\n\tif(parserInfo.sourceText === null) {\n\t\tparserInfo.parserType = null;\n\t}\n\treturn parserInfo;\n}\n\n/*\nParse a block of text of a specified MIME type\n\ttext: text on which to perform substitutions\n\twidget\n\toptions: see below\nOptions include:\n\tsubstitutions: an optional array of substitutions\n*/\nexports.getSubstitutedText = function(text,widget,options) {\n\toptions = options || {};\n\ttext = text || \"\";\n\tvar self = this,\n\t\tsubstitutions = options.substitutions || [],\n\t\toutput;\n\t// Evaluate embedded filters and substitute with first result\n\toutput = text.replace(/\\$\\{([\\S\\s]+?)\\}\\$/g, function(match,filter) {\n\t\treturn self.filterTiddlers(filter,widget)[0] || \"\";\n\t});\n\t// Process any substitutions provided in options\n\t$tw.utils.each(substitutions,function(substitute) {\n\t\toutput = $tw.utils.replaceString(output,new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(substitute.name) + \"\\\\$\",\"mg\"),substitute.value);\n\t});\n\t// Substitute any variable references with their values\n\treturn output.replace(/\\$\\(([^\\)\\$]+)\\)\\$/g, function(match,varname) {\n\t\treturn widget.getVariable(varname,{defaultValue: \"\"})\n\t});\n};\n\n/*\nMake a widget tree for a parse tree\nparser: parser object\noptions: see below\nOptions include:\ndocument: optional document to use\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.makeWidget = function(parser,options) {\n\toptions = options || {};\n\tvar widgetNode = {\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},\n\t\tcurrWidgetNode = widgetNode;\n\t// Create let variable widget for variables\n\tif($tw.utils.count(options.variables) > 0) {\n\t\tvar letVariableWidget = {\n\t\t\ttype: \"let\",\n\t\t\tattributes: {\n\t\t\t},\n\t\t\tchildren: []\n\t\t};\n\t\t$tw.utils.each(options.variables,function(value,name) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(letVariableWidget,name,\"\" + value);\n\t\t});\n\t\tcurrWidgetNode.children = [letVariableWidget];\n\t\tcurrWidgetNode = letVariableWidget;\n\t}\n\t// Add in the supplied parse tree nodes\n\tcurrWidgetNode.children = parser ? parser.tree : [];\n\t// Create the widget\n\treturn new widget.widget(widgetNode,{\n\t\twiki: this,\n\t\tdocument: options.document || $tw.fakeDocument,\n\t\tparentWidget: options.parentWidget\n\t});\n};\n\n/*\nMake a widget tree for transclusion\ntitle: target tiddler title\noptions: as for wiki.makeWidget() plus:\noptions.field: optional field to transclude (defaults to \"text\")\noptions.mode: transclusion mode \"inline\" or \"block\"\noptions.recursionMarker : optional flag to set a recursion marker, defaults to \"yes\"\noptions.children: optional array of children for the transclude widget\noptions.importVariables: optional importvariables filter string for macros to be included\noptions.importPageMacros: optional boolean; if true, equivalent to passing \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\" to options.importVariables\n*/\nexports.makeTranscludeWidget = function(title,options) {\n\toptions = options || {};\n\tvar parseTreeDiv = {tree: [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"div\",\n\t\t\tchildren: []}]},\n\t\tparseTreeImportVariables = {\n\t\t\ttype: \"importvariables\",\n\t\t\tattributes: {\n\t\t\t\tfilter: {\n\t\t\t\t\tname: \"filter\",\n\t\t\t\t\ttype: \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: false,\n\t\t\tchildren: []},\n\t\tparseTreeTransclude = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\trecursionMarker: {\n\t\t\t\t\tname: \"recursionMarker\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: options.recursionMarker || \"yes\"\n\t\t\t\t\t},\n\t\t\t\ttiddler: {\n\t\t\t\t\tname: \"tiddler\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: !options.parseAsInline};\n\tif(options.importVariables || options.importPageMacros) {\n\t\tif(options.importVariables) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = options.importVariables;\n\t\t} else if(options.importPageMacros) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = this.getTiddlerText(\"$:/core/config/GlobalImportFilter\");\n\t\t}\n\t\tparseTreeDiv.tree[0].children.push(parseTreeImportVariables);\n\t\tparseTreeImportVariables.children.push(parseTreeTransclude);\n\t} else {\n\t\tparseTreeDiv.tree[0].children.push(parseTreeTransclude);\n\t}\n\tif(options.field) {\n\t\tparseTreeTransclude.attributes.field = {type: \"string\", value: options.field};\n\t}\n\tif(options.mode) {\n\t\tparseTreeTransclude.attributes.mode = {type: \"string\", value: options.mode};\n\t}\n\tif(options.children) {\n\t\tparseTreeTransclude.children = options.children;\n\t}\n\treturn this.makeWidget(parseTreeDiv,options);\n};\n\n/*\nParse text in a specified format and render it into another format\n\toutputType: content type for the output\n\ttextType: content type of the input text\n\ttext: input text\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderText = function(outputType,textType,text,options) {\n\toptions = options || {};\n\tvar parser = this.parseText(textType,text,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : container.textContent;\n};\n\n/*\nParse text from a tiddler and render it into another format\n\toutputType: content type for the output\n\ttitle: title of the tiddler to be rendered\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderTiddler = function(outputType,title,options) {\n\toptions = options || {};\n\tvar parser = this.parseTiddler(title,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : (outputType === \"text/plain-formatted\" ? container.formattedTextContent : container.textContent);\n};\n\n/*\nReturn an array of tiddler titles that match a search string\n\ttext: The text string to search for\n\toptions: see below\nOptions available:\n\tsource: an iterator function for the source tiddlers, called source(iterator),\n\t\twhere iterator is called as iterator(tiddler,title)\n\texclude: An array of tiddler titles to exclude from the search\n\tinvert: If true returns tiddlers that do not contain the specified string\n\tcaseSensitive: If true forces a case sensitive search\n\tfield: If specified, restricts the search to the specified field, or an array of field names\n\tanchored: If true, forces all but regexp searches to be anchored to the start of text\n\texcludeField: If true, the field options are inverted to specify the fields that are not to be searched\n\n\tThe search mode is determined by the first of these boolean flags to be true\n\t\tliteral: searches for literal string\n\t\twhitespace: same as literal except runs of whitespace are treated as a single space\n\t\tregexp: treats the search term as a regular expression\n\t\twords: (default) treats search string as a list of tokens, and matches if all tokens are found, \n\t\t\tregardless of adjacency or ordering\n\t\tsome: treats search string as a list of tokens, and matches if at least ONE token is found\n*/\nexports.search = function(text,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tt,\n\t\tregExpStr=\"\",\n\t\tinvert = !!options.invert;\n\t// Convert the search string into a regexp for each term\n\tvar terms, searchTermsRegExps,\n\t\tflags = options.caseSensitive ? \"\" : \"i\",\n\t\tanchor = options.anchored ? \"^\" : \"\";\n\tif(options.literal) {\n\t\tif(text.length === 0) {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(text) + \")\",flags)];\n\t\t}\n\t} else if(options.whitespace) {\n\t\tterms = [];\n\t\t$tw.utils.each(text.split(/\\s+/g),function(term) {\n\t\t\tif(term) {\n\t\t\t\tterms.push($tw.utils.escapeRegExp(term));\n\t\t\t}\n\t\t});\n\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + terms.join(\"\\\\s+\") + \")\",flags)];\n\t} else if(options.regexp) {\n\t\ttry {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + text + \")\",flags)];\n\t\t} catch(e) {\n\t\t\tsearchTermsRegExps = null;\n\t\t\tconsole.log(\"Regexp error parsing /(\" + text + \")/\" + flags + \": \",e);\n\t\t}\n\t} else if(options.some) {\n\t\tterms = text.trim().split(/[^\\S\\xA0]+/);\n\t\tif(terms.length === 1 && terms[0] === \"\") {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [];\n\t\t\tfor(t=0; t<terms.length; t++) {\n\t\t\t\tregExpStr += (t===0) ? anchor + $tw.utils.escapeRegExp(terms[t]) : \"|\" + anchor + $tw.utils.escapeRegExp(terms[t]);\n\t\t\t}\n\t\t\tsearchTermsRegExps.push(new RegExp(\"(\" + regExpStr + \")\",flags));\n\t\t}\n\t} else { // default: words\n\t\tterms = text.split(/[^\\S\\xA0]+/);\n\t\tif(terms.length === 1 && terms[0] === \"\") {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [];\n\t\t\tfor(t=0; t<terms.length; t++) {\n\t\t\t\tsearchTermsRegExps.push(new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(terms[t]) + \")\",flags));\n\t\t\t}\n\t\t}\n\t}\n// Accumulate the array of fields to be searched or excluded from the search\n\tvar fields = [];\n\tif(options.field) {\n\t\tif($tw.utils.isArray(options.field)) {\n\t\t\t$tw.utils.each(options.field,function(fieldName) {\n\t\t\t\tif(fieldName) {\n\t\t\t\t\tfields.push(fieldName);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tfields.push(options.field);\n\t\t}\n\t}\n\t// Use default fields if none specified and we're not excluding fields (excluding fields with an empty field array is the same as searching all fields)\n\tif(fields.length === 0 && !options.excludeField) {\n\t\tfields.push(\"title\");\n\t\tfields.push(\"tags\");\n\t\tfields.push(\"text\");\n\t}\n\t// Function to check a given tiddler for the search term\n\tvar searchTiddler = function(title) {\n\t\tif(!searchTermsRegExps) {\n\t\t\treturn true;\n\t\t}\n\t\tvar notYetFound = searchTermsRegExps.slice();\n\n\t\tvar tiddler = self.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\ttiddler = new $tw.Tiddler({title: title, text: \"\", type: \"text/vnd.tiddlywiki\"});\n\t\t}\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type] || $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"],\n\t\t\tsearchFields;\n\t\t// Get the list of fields we're searching\n\t\tif(options.excludeField) {\n\t\t\tsearchFields = Object.keys(tiddler.fields);\n\t\t\t$tw.utils.each(fields,function(fieldName) {\n\t\t\t\tvar p = searchFields.indexOf(fieldName);\n\t\t\t\tif(p !== -1) {\n\t\t\t\t\tsearchFields.splice(p,1);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsearchFields = fields;\n\t\t}\n\t\tfor(var fieldIndex=0; notYetFound.length>0 && fieldIndex<searchFields.length; fieldIndex++) {\n\t\t\t// Don't search the text field if the content type is binary\n\t\t\tvar fieldName = searchFields[fieldIndex];\n\t\t\tif(fieldName === \"text\" && contentTypeInfo.encoding !== \"utf8\") {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvar str = tiddler.fields[fieldName],\n\t\t\t\tt;\n\t\t\tif(str) {\n\t\t\t\tif($tw.utils.isArray(str)) {\n\t\t\t\t\t// If the field value is an array, test each regexp against each field array entry and fail if each regexp doesn't match at least one field array entry\n\t\t\t\t\tfor(var s=0; s<str.length; s++) {\n\t\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\t\tif(notYetFound[t].test(str[s])) {\n\t\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// If the field isn't an array, force it to a string and test each regexp against it and fail if any do not match\n\t\t\t\t\tstr = tiddler.getFieldString(fieldName);\n\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\tif(notYetFound[t].test(str)) {\n\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn notYetFound.length == 0;\n\t};\n\t// Loop through all the tiddlers doing the search\n\tvar results = [],\n\t\tsource = options.source || this.each;\n\tsource(function(tiddler,title) {\n\t\tif(searchTiddler(title) !== invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\t// Remove any of the results we have to exclude\n\tif(options.exclude) {\n\t\tfor(t=0; t<options.exclude.length; t++) {\n\t\t\tvar p = results.indexOf(options.exclude[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tresults.splice(p,1);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nTrigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.\n*/\nexports.getTiddlerText = function(title,defaultText) {\n\tvar tiddler = this.getTiddler(title);\n\t// Return undefined if the tiddler isn't found\n\tif(!tiddler) {\n\t\treturn defaultText;\n\t}\n\tif(!tiddler.hasField(\"_is_skinny\")) {\n\t\t// Just return the text if we've got it\n\t\treturn tiddler.fields.text || \"\";\n\t} else {\n\t\t// Tell any listeners about the need to lazily load this tiddler\n\t\tthis.dispatchEvent(\"lazyLoad\",title);\n\t\t// Indicate that the text is being loaded\n\t\treturn null;\n\t}\n};\n\n/*\nCheck whether the text of a tiddler matches a given value. By default, the comparison is case insensitive, and any spaces at either end of the tiddler text is trimmed\n*/\nexports.checkTiddlerText = function(title,targetText,options) {\n\toptions = options || {};\n\tvar text = this.getTiddlerText(title,\"\");\n\tif(!options.noTrim) {\n\t\ttext = text.trim();\n\t}\n\tif(!options.caseSensitive) {\n\t\ttext = text.toLowerCase();\n\t\ttargetText = targetText.toLowerCase();\n\t}\n\treturn text === targetText;\n}\n\n/*\nExecute an action string without an associated context widget\n*/\nexports.invokeActionString = function(actions,event,variables,options) {\n\tvar widget = this.makeWidget(null,{parentWidget: options.parentWidget});\n\twidget.invokeActionString(actions,null,event,variables);\n};\n\n/*\nRead an array of browser File objects, invoking callback(tiddlerFieldsArray) once they're all read\n*/\nexports.readFiles = function(files,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\tvar result = [],\n\t\toutstanding = files.length,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tresult.push.apply(result,tiddlerFieldsArray);\n\t\t\tif(--outstanding === 0) {\n\t\t\t\tcallback(result);\n\t\t\t}\n\t\t};\n\tfor(var f=0; f<files.length; f++) {\n\t\tthis.readFile(files[f],$tw.utils.extend({},options,{callback: readFileCallback}));\n\t}\n\treturn files.length;\n};\n\n/*\nRead a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFile = function(file,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\t// Get the type, falling back to the filename extension\n\tvar self = this,\n\t\ttype = file.type;\n\tif(type === \"\" || !type) {\n\t\tvar dotPos = file.name.lastIndexOf(\".\");\n\t\tif(dotPos !== -1) {\n\t\t\tvar fileExtensionInfo = $tw.utils.getFileExtensionInfo(file.name.substr(dotPos));\n\t\t\tif(fileExtensionInfo) {\n\t\t\t\ttype = fileExtensionInfo.type;\n\t\t\t}\n\t\t}\n\t}\n\t// Figure out if we're reading a binary file\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[type],\n\t\tisBinary = contentTypeInfo ? contentTypeInfo.encoding === \"base64\" : false;\n\t// Log some debugging information\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Importing file '\" + file.name + \"', type: '\" + type + \"', isBinary: \" + isBinary);\n\t}\n\t// Give the hook a chance to process the drag\n\tif($tw.hooks.invokeHook(\"th-importing-file\",{\n\t\tfile: file,\n\t\ttype: type,\n\t\tisBinary: isBinary,\n\t\tcallback: callback\n\t}) !== true) {\n\t\tthis.readFileContent(file,type,isBinary,options.deserializer,callback);\n\t}\n};\n\n/*\nLower level utility to read the content of a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFileContent = function(file,type,isBinary,deserializer,callback) {\n\tvar self = this;\n\t// Create the FileReader\n\tvar reader = new FileReader();\n\t// Onload\n\treader.onload = function(event) {\n\t\tvar text = event.target.result,\n\t\t\ttiddlerFields = {title: file.name || \"Untitled\"};\n\t\tif(isBinary) {\n\t\t\tvar commaPos = text.indexOf(\",\");\n\t\t\tif(commaPos !== -1) {\n\t\t\t\ttext = text.substr(commaPos + 1);\n\t\t\t}\n\t\t}\n\t\t// Check whether this is an encrypted TiddlyWiki file\n\t\tvar encryptedJson = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedJson) {\n\t\t\t// If so, attempt to decrypt it with the current password\n\t\t\t$tw.utils.decryptStoreAreaInteractive(encryptedJson,function(tiddlers) {\n\t\t\t\tcallback(tiddlers);\n\t\t\t});\n\t\t} else {\n\t\t\t// Otherwise, just try to deserialise any tiddlers in the file\n\t\t\tcallback(self.deserializeTiddlers(type,text,tiddlerFields,{deserializer: deserializer}));\n\t\t}\n\t};\n\t// Kick off the read\n\tif(isBinary) {\n\t\treader.readAsDataURL(file);\n\t} else {\n\t\treader.readAsText(file);\n\t}\n};\n\n/*\nFind any existing draft of a specified tiddler\n*/\nexports.findDraft = function(targetTitle) {\n\tvar draftTitle = undefined;\n\tthis.forEachTiddler({includeSystem: true},function(title,tiddler) {\n\t\tif(tiddler.fields[\"draft.title\"] && tiddler.fields[\"draft.of\"] === targetTitle) {\n\t\t\tdraftTitle = title;\n\t\t}\n\t});\n\treturn draftTitle;\n}\n\n/*\nCheck whether the specified draft tiddler has been modified.\nIf the original tiddler doesn't exist, create  a vanilla tiddler variable,\nto check if additional fields have been added.\n*/\nexports.isDraftModified = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(!tiddler.isDraft()) {\n\t\treturn false;\n\t}\n\tvar ignoredFields = [\"created\", \"modified\", \"title\", \"draft.title\", \"draft.of\"],\n\t\torigTiddler = this.getTiddler(tiddler.fields[\"draft.of\"]) || new $tw.Tiddler({text:\"\", tags:[]}),\n\t\ttitleModified = tiddler.fields[\"draft.title\"] !== tiddler.fields[\"draft.of\"];\n\treturn titleModified || !tiddler.isEqual(origTiddler,ignoredFields);\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\nhistoryTitle: title of history tiddler (defaults to $:/HistoryList)\n*/\nexports.addToHistory = function(title,fromPageRect,historyTitle) {\n\tvar story = new $tw.Story({wiki: this, historyTitle: historyTitle});\n\tstory.addToHistory(title,fromPageRect);\n\tconsole.log(\"$tw.wiki.addToHistory() is deprecated since V5.1.23! Use the this.story.addToHistory() from the story-object!\")\n};\n\n/*\nAdd a new tiddler to the story river\ntitle: a title string or an array of title strings\nfromTitle: the title of the tiddler from which the navigation originated\nstoryTitle: title of story tiddler (defaults to $:/StoryList)\noptions: see story.js\n*/\nexports.addToStory = function(title,fromTitle,storyTitle,options) {\n\tvar story = new $tw.Story({wiki: this, storyTitle: storyTitle});\n\tstory.addToStory(title,fromTitle,options);\n\tconsole.log(\"$tw.wiki.addToStory() is deprecated since V5.1.23! Use the this.story.addToStory() from the story-object!\")\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nexports.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle,\n\t\tusername = this.getTiddlerText(\"$:/status/UserName\"),\n\t\tattribution = username ? \" by \" + username : \"\";\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\" + attribution;\n\t\tc++;\n\t} while(this.tiddlerExists(draftTitle));\n\treturn draftTitle;\n};\n\n/*\nInvoke the available upgrader modules\ntitles: array of tiddler titles to be processed\ntiddlers: hashmap by title of tiddler fields of pending import tiddlers. These can be modified by the upgraders. An entry with no fields indicates a tiddler that was pending import has been suppressed. When entries are added to the pending import the tiddlers hashmap may have entries that are not present in the titles array\nReturns a hashmap of messages keyed by tiddler title.\n*/\nexports.invokeUpgraders = function(titles,tiddlers) {\n\t// Collect up the available upgrader modules\n\tvar self = this;\n\tif(!this.upgraderModules) {\n\t\tthis.upgraderModules = [];\n\t\t$tw.modules.forEachModuleOfType(\"upgrader\",function(title,module) {\n\t\t\tif(module.upgrade) {\n\t\t\t\tself.upgraderModules.push(module);\n\t\t\t}\n\t\t});\n\t}\n\t// Invoke each upgrader in turn\n\tvar messages = {};\n\tfor(var t=0; t<this.upgraderModules.length; t++) {\n\t\tvar upgrader = this.upgraderModules[t],\n\t\t\tupgraderMessages = upgrader.upgrade(this,titles,tiddlers);\n\t\t$tw.utils.extend(messages,upgraderMessages);\n\t}\n\treturn messages;\n};\n\n// Determine whether a plugin by title is dynamically loadable\nexports.doesPluginRequireReload = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler && tiddler.fields.type === \"application/json\" && tiddler.fields[\"plugin-type\"]) {\n\t\tif(tiddler.fields[\"plugin-type\"] === \"import\") {\n\t\t\t// The import plugin never requires reloading\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn this.doesPluginInfoRequireReload(this.getPluginInfo(title) || this.getTiddlerDataCached(title));\n};\n\n// Determine whether a plugin info structure is dynamically loadable\nexports.doesPluginInfoRequireReload = function(pluginInfo) {\n\tif(pluginInfo) {\n\t\tvar foundModule = false;\n\t\t$tw.utils.each(pluginInfo.tiddlers,function(tiddler) {\n\t\t\tif(tiddler.type === \"application/javascript\" && $tw.utils.hop(tiddler,\"module-type\")) {\n\t\t\t\tfoundModule = true;\n\t\t\t}\n\t\t});\n\t\treturn foundModule;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.slugify = function(title,options) {\n\tvar tiddler = this.getTiddler(title),\n\t\tslug;\n\tif(tiddler && tiddler.fields.slug) {\n\t\tslug = tiddler.fields.slug;\n\t} else {\n\t\tslug = $tw.utils.transliterate(title.toString().toLowerCase()) // Replace diacritics with basic lowercase ASCII\n\t\t\t.replace(/\\s+/g,\"-\")                                       // Replace spaces with -\n\t\t\t.replace(/[^\\w\\-\\.]+/g,\"\")                                 // Remove all non-word chars except dash and dot\n\t\t\t.replace(/\\-\\-+/g,\"-\")                                     // Replace multiple - with single -\n\t\t\t.replace(/^-+/,\"\")                                         // Trim - from start of text\n\t\t\t.replace(/-+$/,\"\");                                        // Trim - from end of text\n\t}\n\t// If the resulting slug is blank (eg because the title is just punctuation characters)\n\tif(!slug) {\n\t\t// ...then just use the character codes of the title\n\t\tvar result = [];\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tresult.push(char.charCodeAt(0).toString());\n\t\t});\n\t\tslug = result.join(\"-\");\n\t}\n\treturn slug;\n};\n\n})();\n","type":"application/javascript","module-type":"wikimethod"},"$:/palettes/Blanca":{"title":"$:/palettes/Blanca","name":"Blanca","color-scheme":"light","description":"A clean white palette to let you focus","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","text":"alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #66cccc\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nfootnote-target-background: #ecf2ff\nforeground: #333333\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ffffff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #7897f3\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ccc\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ffffff\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #7897f3\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #eeeeee\ntab-border-selected: #cccccc\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffeedd\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: #eee\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #ff9900\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"},"$:/palettes/Blue":{"title":"$:/palettes/Blue","name":"Blue","color-scheme":"light","description":"A blue theme","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","text":"alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nfootnote-target-background: #ecf2ff\nforeground: #333353\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ddddff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #5959c0\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: #ccccdd\ntab-border-selected: #ccccdd\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #eeeeff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #666666\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #ffffff\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #ffffff\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #5959c0\ntoolbar-new-button: #5eb95e\ntoolbar-options-button: rgb(128, 88, 165)\ntoolbar-save-button: #0e90d2\ntoolbar-info-button: #0e90d2\ntoolbar-edit-button: rgb(243, 123, 29)\ntoolbar-close-button: #dd514c\ntoolbar-delete-button: #dd514c\ntoolbar-cancel-button: rgb(243, 123, 29)\ntoolbar-done-button: #5eb95e\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"},"$:/palettes/Muted":{"title":"$:/palettes/Muted","name":"Muted","color-scheme":"light","description":"Bright tiddlers on a muted background","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","text":"alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nfootnote-target-background: #ecf2ff\nforeground: #333333\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #6f6f70\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #29a6ee\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #c2c1c2\nsidebar-foreground-shadow: rgba(255,255,255,0)\nsidebar-foreground: #d3d2d4\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #6f6f70\nsidebar-tab-background: #666667\nsidebar-tab-border-selected: #999\nsidebar-tab-border: #515151\nsidebar-tab-divider: #999\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #999\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #d1d0d2\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #d5ad34\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"},"$:/palettes/ContrastDark":{"title":"$:/palettes/ContrastDark","name":"Contrast (Dark)","color-scheme":"dark","description":"High contrast and unambiguous (dark version)","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","text":"alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #000\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nfootnote-target-background: #4c4c4c\nforeground: #fff\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #fff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"},"$:/palettes/ContrastLight":{"title":"$:/palettes/ContrastLight","name":"Contrast (Light)","color-scheme":"light","description":"High contrast and unambiguous (light version)","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","text":"alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nfootnote-target-background: #e5e5e5\nforeground: #000\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #000\ntag-foreground: #fff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"},"$:/palettes/CupertinoDark":{"title":"$:/palettes/CupertinoDark","tags":"$:/tags/Palette","color-scheme":"dark","name":"Cupertino Dark","description":"A macOS inspired dark palette","type":"application/x-tiddler-dictionary","text":"alert-background: #FF453A\nalert-border: #FF453A\nalert-highlight: #FFD60A\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #282828\nblockquote-bar: <<colour page-background>>\nbutton-foreground: <<colour foreground>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #FF453A\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour tiddler-info-background>>\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: #3F638B\ndropdown-tab-background: #323232\ndropzone-background: #30D158\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #BF5AF2\nexternal-link-foreground: #32D74B\nfootnote-target-background: #747474\nforeground: #FFFFFF\nhighlight-background: #ffff78\nhighlight-foreground: #000000\nmenubar-background: #464646\nmenubar-foreground: #ffffff\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: #98989D\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #323232\npre-background: #464646\npre-border: transparent\nprimary: #0A84FF\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #FF9F0A\nsidebar-controls-foreground: #8E8E93\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: #3F638B\nsidebar-tab-background: <<colour background>>\nsidebar-tab-border-selected: <<colour background>>\nsidebar-tab-border: <<colour background>>\nsidebar-tab-divider: <<colour background>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: #ffffff\nstatic-alert-foreground: #B4B4B4\ntab-background-selected: #3F638B\ntab-background: <<colour page-background>>\ntab-border-selected: <<colour page-background>>\ntab-border: <<colour page-background>>\ntab-divider: <<colour page-background>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #464646\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #48484A\ntag-foreground: #323232\ntiddler-background: <<colour background>>\ntiddler-border: transparent\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: #48484A\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #1E1E1E\ntiddler-info-border: #1E1E1E\ntiddler-info-tab-background: #3F638B\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: #464646\nselection-background: #3F638B\nselection-foreground: #ffffff\nwikilist-background: <<colour page-background>>\nwikilist-button-background: #3F638B\nwikilist-button-foreground: <<colour foreground>>\nwikilist-button-open: #32D74B\nwikilist-button-open-hover: #32D74B\nwikilist-button-reveal: #0A84FF\nwikilist-button-reveal-hover: #0A84FF\nwikilist-button-remove: #FF453A\nwikilist-button-remove-hover: #FF453A\nwikilist-droplink-dragover: #32D74B\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour foreground>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-url: <<colour muted-foreground>>\n"},"$:/palettes/DarkPhotos":{"title":"$:/palettes/DarkPhotos","created":"20150402111612188","description":"Good with dark photo backgrounds","modified":"20150402112344080","name":"DarkPhotos","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","color-scheme":"light","text":"alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: \nbutton-foreground: \nbutton-border: \ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nfootnote-target-background: #ecf2ff\nforeground: #333333\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #ddd\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #336438\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #ccf\nsidebar-controls-foreground: #fff\nsidebar-foreground-shadow: rgba(0,0,0, 0.5)\nsidebar-foreground: #fff\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #eee\nsidebar-tab-background-selected: rgba(255,255,255, 0.8)\nsidebar-tab-background: rgba(255,255,255, 0.4)\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: rgba(255,255,255, 0.2)\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #aaf\nsidebar-tiddler-link-foreground: #ddf\nsite-title-foreground: #fff\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"},"$:/palettes/DesertSand":{"title":"$:/palettes/DesertSand","tags":"$:/tags/Palette","color-scheme":"light","name":"Desert Sand","description":"A desert sand palette","type":"application/x-tiddler-dictionary","text":"alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #E9E0C7\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour foreground>>\ncode-background: #F3EDDF\ncode-border: #C3BAA1\ncode-foreground: #ab3250\ndiff-delete-background: #bd8b8b\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #91c093\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ad3434\ndownload-background: #6ca16c\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #E9E0C7\ndropdown-tab-background: #BAB29C\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #313163\nexternal-link-foreground: #555592\nfootnote-target-background: #fff7d9\nforeground: #2D2A23\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmenubar-background: #CDC2A6\nmenubar-foreground: #5A5446\nmessage-background: #ECE5CF\nmessage-border: #D6CBAA\nmessage-foreground: #5f6e7d\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #8A8885\nmodal-footer-background: #CDC2A6\nmodal-footer-border: #9D998E\nmodal-header-border: #9D998E\nmuted-foreground: #9D998E\nnotification-background: #F0E9D7\nnotification-border: #939189\npage-background: #e0d3af\npre-background: #D6CBAA\npre-border: #CDC2A6\nprimary: #5B6F55\nselection-background: #9D947B\nselection-foreground: <<colour foreground>>\nselect-tag-background: #F0E9D7\nselect-tag-foreground: #2D2A23\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #2D2A23\nsidebar-controls-foreground: #867F69\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #867F69\nsidebar-muted-foreground-hover: #706A58\nsidebar-muted-foreground: #B3A98C\nsidebar-tab-background-selected: #e0d3af\nsidebar-tab-background: #A6A193\nsidebar-tab-border-selected: #C3BAA1\nsidebar-tab-border: #C3BAA1\nsidebar-tab-divider: #CDC2A6\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #2D2A23\nsidebar-tiddler-link-foreground-hover: #433F35\nsidebar-tiddler-link-foreground: #706A58\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #A6A193\ntab-background-selected: #E9E0C7\ntab-background: #A6A193\ntab-border-selected: #C3BAA1\ntab-border: #C3BAA1\ntab-divider: #CDC2A6\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #2D2A23\ntable-border: #9D998E\ntable-footer-background: #8A8885\ntable-header-background: #B0AA98\ntag-background: #706A58\ntag-foreground: #E3D7B7\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #9D947B\ntiddler-controls-foreground-selected: #706A58\ntiddler-controls-foreground: #C3BAA1\ntiddler-editor-background: #E9E0C7\ntiddler-editor-border-image: #A6A193\ntiddler-editor-border: #A6A193\ntiddler-editor-fields-even: #D6CBAA\ntiddler-editor-fields-odd: #C3BAA1\ntiddler-info-background: #E3D7B7\ntiddler-info-border: #BAB29C\ntiddler-info-tab-background: #E9E0C7\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #867F69\ntiddler-title-foreground: #374464\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #8A8885\nvery-muted-foreground: #CDC2A6\nwikilist-background: <<colour page-background>>\nwikilist-item: #CDC2A6\nwikilist-info: #161512\nwikilist-title: #433F35\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #706A58\nwikilist-button-open: #7db66a\nwikilist-button-open-hover: #56a556\nwikilist-button-reveal: #5a6c9e\nwikilist-button-reveal-hover: #454591\nwikilist-button-remove: #bc5972\nwikilist-button-remove-hover: #814040\nwikilist-toolbar-background: #CDC2A6\nwikilist-toolbar-foreground: #2D2A23\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #A6A193\nwikilist-button-foreground: #161512\n"},"$:/palettes/GruvboxDark":{"title":"$:/palettes/GruvboxDark","name":"Gruvbox Dark","color-scheme":"dark","description":"Retro groove color scheme","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","license":"https://github.com/morhetz/gruvbox","text":"alert-background: #cc241d\nalert-border: #cc241d\nalert-highlight: #d79921\nalert-muted-foreground: #504945\nbackground: #3c3836\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour foreground>>\ncode-background: #504945\ncode-border: #504945\ncode-foreground: #fb4934\ndiff-delete-background: #fb4934\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #b8bb26\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #fb4934\ndownload-background: #b8bb26\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #665c54\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ebdbb2\ndropdown-tab-background: #665c54\ndropzone-background: #98971a\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #d3869b\nexternal-link-foreground: #8ec07c\nfootnote-target-background: #665c54\nforeground: #fbf1c7\nhighlight-background: #ffff79\nhighlight-foreground: #000000\nmenubar-background: #504945\nmenubar-foreground: <<colour foreground>>\nmessage-background: #83a598\nmessage-border: #83a598\nmessage-foreground: #3c3836\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #504945\nmodal-footer-background: #3c3836\nmodal-footer-border: #3c3836\nmodal-header-border: #3c3836\nmuted-foreground: #d5c4a1\nnotification-background: <<colour primary>>\nnotification-border: <<colour primary>>\npage-background: #282828\npre-background: #504945\npre-border: #504945\nprimary: #d79921\nselect-tag-background: #665c54\nselect-tag-foreground: <<colour foreground>>\nselection-background: #458588\nselection-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #7c6f64\nsidebar-controls-foreground: #504945\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #fbf1c7\nsidebar-muted-foreground-hover: #7c6f64\nsidebar-muted-foreground: #504945\nsidebar-tab-background-selected: #bdae93\nsidebar-tab-background: #3c3836\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #bdae93\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #282828\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #458588\nsidebar-tiddler-link-foreground: #98971a\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstability-deprecated: #cc241d\nstability-experimental: #d79921\nstability-legacy: #458588\nstability-stable: #98971a\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ebdbb2\ntab-background: #665c54\ntab-border-selected: #665c54\ntab-border: #665c54\ntab-divider: #bdae93\ntab-foreground-selected: #282828\ntab-foreground: #ebdbb2\ntable-border: #7c6f64\ntable-footer-background: #665c54\ntable-header-background: #504945\ntag-background: #d3869b\ntag-foreground: #282828\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #7c6f64\ntiddler-controls-foreground-selected: <<colour primary>>\ntiddler-controls-foreground: #665c54\ntiddler-editor-background: #32302f\ntiddler-editor-border-image: #282828\ntiddler-editor-border: #282828\ntiddler-editor-fields-even: #504945\ntiddler-editor-fields-odd: #7c6f64\ntiddler-info-background: #32302f\ntiddler-info-border: #ebdbb2\ntiddler-info-tab-background: #ebdbb2\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #7c6f64\ntiddler-title-foreground: #a89984\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #504945\nvery-muted-foreground: #bdae93\nwikilist-background: <<colour page-background>>\nwikilist-button-background: #acacac\nwikilist-button-foreground: <<colour button-foreground>>\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: <<colour muted-foreground>>\nwikilist-button-open-hover: <<colour primary>>\nwikilist-button-open: <<colour dropzone-background>>\nwikilist-button-remove: <<colour dirty-indicator>>\nwikilist-button-remove-hover: <<colour alert-background>>\nwikilist-droplink-dragover: <<colour dropzone-background>>\nwikilist-button-reveal: <<colour sidebar-tiddler-link-foreground-hover>>\nwikilist-button-reveal-hover: <<colour message-background>>\n"},"$:/palettes/Nord":{"title":"$:/palettes/Nord","name":"Nord","color-scheme":"dark","description":"An arctic, north-bluish color palette.","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","license":"MIT, arcticicestudio, https://github.com/arcticicestudio/nord/blob/develop/LICENSE.md","text":"alert-background: #D08770\nalert-border: #D08770\nalert-highlight: #B48EAD\nalert-muted-foreground: #4C566A\nbackground: #3b4252\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour foreground>>\ncode-background: #2E3440\ncode-border: #2E3440\ncode-foreground: #BF616A\ndiff-delete-background: #BF616A\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #A3BE8C\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #BF616A\ndownload-background: #A3BE8C\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ECEFF4\ndropdown-tab-background: #4C566A\ndropzone-background: #A3BE8C\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #5E81AC\nexternal-link-foreground: #8FBCBB\nfootnote-target-background: #2E3440\nforeground: #d8dee9\nhighlight-background: #ffff78\nhighlight-foreground: #000000\nmenubar-background: #2E3440\nmenubar-foreground: #d8dee9\nmessage-background: #2E3440\nmessage-border: #2E3440\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #3b4252\nmodal-footer-background: #3b4252\nmodal-footer-border: #3b4252\nmodal-header-border: #3b4252\nmuted-foreground: #4C566A\nnotification-background: <<colour primary>>\nnotification-border: #EBCB8B\npage-background: #2e3440\npre-background: #2E3440\npre-border: #2E3440\nprimary: #5E81AC\nselect-tag-background: #3b4252\nselect-tag-foreground: <<colour foreground>>\nselection-background: #5E81AC\nselection-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #D8DEE9\nsidebar-controls-foreground: #4C566A\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #D8DEE9\nsidebar-muted-foreground-hover: #4C566A\nsidebar-muted-foreground: #4C566A\nsidebar-tab-background-selected: #ECEFF4\nsidebar-tab-background: #4C566A\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #4C566A\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #4C566A\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #A3BE8C\nsidebar-tiddler-link-foreground: #81A1C1\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstability-deprecated: #bf616a\nstability-experimental: #d08770\nstability-legacy: #88c0d0\nstability-stable: #a3be8c\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ECEFF4\ntab-background: #4C566A\ntab-border-selected: #4C566A\ntab-border: #4C566A\ntab-divider: #4C566A\ntab-foreground-selected: #4C566A\ntab-foreground: #D8DEE9\ntable-border: #4C566A\ntable-footer-background: #2e3440\ntable-header-background: #2e3440\ntag-background: #A3BE8C\ntag-foreground: #4C566A\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: \ntiddler-controls-foreground-selected: #EBCB8B\ntiddler-controls-foreground: #4C566A\ntiddler-editor-background: #2e3440\ntiddler-editor-border-image: #2e3440\ntiddler-editor-border: #3b4252\ntiddler-editor-fields-even: #2e3440\ntiddler-editor-fields-odd: #2e3440\ntiddler-info-background: #2e3440\ntiddler-info-border: #2e3440\ntiddler-info-tab-background: #2e3440\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #4C566A\ntiddler-title-foreground: #81A1C1\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #2d3038\nvery-muted-foreground: #2d3038\nwikilist-background: <<colour page-background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-item: <<colour background>>\nwikilist-title: <<colour foreground>>\nwikilist-info: <<colour muted-foreground>>\nwikilist-button-open: #A3BE8C\nwikilist-button-open-hover: #A3BE8C\nwikilist-button-reveal: #81A1C1\nwikilist-button-reveal-hover: #81A1C1\nwikilist-button-remove: #B48EAD\nwikilist-button-remove-hover: #B48EAD\n"},"$:/palettes/Rocker":{"title":"$:/palettes/Rocker","name":"Rocker","color-scheme":"dark","description":"A dark theme","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","text":"alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nfootnote-target-background: #ecf2ff\nforeground: #333333\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #cc0000\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.0)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #000\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #ffbb99\nsidebar-tiddler-link-foreground: #cc0000\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffbb99\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #cc0000\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"},"$:/palettes/SolarFlare":{"title":"$:/palettes/SolarFlare","name":"Solar Flare","color-scheme":"light","description":"Warm, relaxing earth colours","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","text":": Background Tones\n\nbase03: #002b36\nbase02: #073642\n\n: Content Tones\n\nbase01: #586e75\nbase00: #657b83\nbase0: #839496\nbase1: #93a1a1\n\n: Background Tones\n\nbase2: #eee8d5\nbase3: #fdf6e3\n\n: Accent Colors\n\nyellow: #b58900\norange: #cb4b16\nred: #dc322f\nmagenta: #d33682\nviolet: #6c71c4\nblue: #268bd2\ncyan: #2aa198\ngreen: #859900\n\n: Additional Tones (RA)\n\nbase10: #c0c4bb\nviolet-muted: #7c81b0\nblue-muted: #4e7baa\n\nyellow-hot: #ffcc44\norange-hot: #eb6d20\nred-hot: #ff2222\nblue-hot: #2298ee\ngreen-hot: #98ee22\n\n: Palette\n\n: Do not use colour macro for background and foreground\nbackground: #fdf6e3\n    download-foreground: <<colour background>>\n    dragger-foreground: <<colour background>>\n    dropdown-background: <<colour background>>\n    modal-background: <<colour background>>\n    sidebar-foreground-shadow: <<colour background>>\n    tiddler-background: <<colour background>>\n    tiddler-border: <<colour background>>\n    tiddler-link-background: <<colour background>>\n    tab-background-selected: <<colour background>>\n        dropdown-tab-background-selected: <<colour tab-background-selected>>\nforeground: #657b83\n    dragger-background: <<colour foreground>>\n    tab-foreground: <<colour foreground>>\n        tab-foreground-selected: <<colour tab-foreground>>\n            sidebar-tab-foreground-selected: <<colour tab-foreground-selected>>\n        sidebar-tab-foreground: <<colour tab-foreground>>\n    sidebar-button-foreground: <<colour foreground>>\n    sidebar-controls-foreground: <<colour foreground>>\n    sidebar-foreground: <<colour foreground>>\n: base03\n: base02\n: base01\n    alert-muted-foreground: <<colour base01>>\n: base00\n    code-foreground: <<colour base00>>\n    message-foreground: <<colour base00>>\n    tag-foreground: <<colour base00>>\n: base0\n    sidebar-tiddler-link-foreground: <<colour base0>>\n: base1\n    muted-foreground: <<colour base1>>\n        blockquote-bar: <<colour muted-foreground>>\n        dropdown-border: <<colour muted-foreground>>\n        sidebar-muted-foreground: <<colour muted-foreground>>\n        tiddler-title-foreground: <<colour muted-foreground>>\n            site-title-foreground: <<colour tiddler-title-foreground>>\n: base2\n    modal-footer-background: <<colour base2>>\n    page-background: <<colour base2>>\n        modal-backdrop: <<colour page-background>>\n        notification-background: <<colour page-background>>\n        code-background: <<colour page-background>>\n            code-border: <<colour code-background>>\n        pre-background: <<colour page-background>>\n            pre-border: <<colour pre-background>>\n        sidebar-tab-background-selected: <<colour page-background>>\n    table-header-background: <<colour base2>>\n    tag-background: <<colour base2>>\n    tiddler-editor-background: <<colour base2>>\n    tiddler-info-background: <<colour base2>>\n    tiddler-info-tab-background: <<colour base2>>\n    tab-background: <<colour base2>>\n        dropdown-tab-background: <<colour tab-background>>\n: base3\n    alert-background: <<colour base3>>\n    message-background: <<colour base3>>\n: yellow\n: orange\n: red\n: magenta\n    alert-highlight: <<colour magenta>>\n: violet\n    external-link-foreground: <<colour violet>>\n: blue\n: cyan\n: green\n: base10\n    tiddler-controls-foreground: <<colour base10>>\n: violet-muted\n    external-link-foreground-visited: <<colour violet-muted>>\n: blue-muted\n    primary: <<colour blue-muted>>\n        download-background: <<colour primary>>\n        tiddler-link-foreground: <<colour primary>>\n\nalert-border: #b99e2f\ndirty-indicator: #ff0000\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nfootnote-target-background: #ded8c5\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmessage-border: #cfd6e6\nmodal-border: #999999\nselect-tag-background:\nselect-tag-foreground:\nsidebar-controls-foreground-hover:\nsidebar-muted-foreground-hover:\nsidebar-tab-background: #ded8c5\nsidebar-tiddler-link-foreground-hover:\nstability-deprecated: <<colour red>>\nstability-experimental: <<colour yellow>>\nstability-legacy: <<colour blue>>\nstability-stable: <<colour green>>\nstatic-alert-foreground: #aaaaaa\ntab-border: #cccccc\n    modal-footer-border: <<colour tab-border>>\n    modal-header-border: <<colour tab-border>>\n    notification-border: <<colour tab-border>>\n    sidebar-tab-border: <<colour tab-border>>\n    tab-border-selected: <<colour tab-border>>\n        sidebar-tab-border-selected: <<colour tab-border-selected>>\ntab-divider: #d8d8d8\n    sidebar-tab-divider: <<colour tab-divider>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-border: #dddddd\ntiddler-subtitle-foreground: #c0c0c0\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"},"$:/palettes/SolarizedDark":{"title":"$:/palettes/SolarizedDark","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","description":"Precision dark colors for machines and people","license":"MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE","name":"SolarizedDark","color-scheme":"dark","text":"alert-background: #073642\nalert-border: #93a1a1\nalert-highlight: #d33682\nalert-muted-foreground: #d33682\nbackground: #073642\nblockquote-bar: #d33682\nbutton-background: #073642\nbutton-border: #586e75\nbutton-foreground: #93a1a1\ncode-background: #073642\ncode-border: #586e75\ncode-foreground: #93a1a1\ndirty-indicator: #dc322f\ndownload-background: #859900\ndownload-foreground: #073642\ndragger-background: #073642\ndragger-foreground: #839496\ndropdown-background: #073642\ndropdown-border: #93a1a1\ndropdown-tab-background: #002b36\ndropdown-tab-background-selected: #073642\ndropzone-background: #859900\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: #268bd2\nexternal-link-foreground-hover:\nexternal-link-foreground-visited: #268bd2\nfootnote-target-background: #073642\nforeground: #839496\nhighlight-background: #ffff78\nhighlight-foreground: #000000\nmessage-background: #002b36\nmessage-border: #586e75\nmessage-foreground: #839496\nmodal-backdrop: #657b83\nmodal-background: #002b36\nmodal-border: #586e75\nmodal-footer-background: #073642\nmodal-footer-border: #586e75\nmodal-header-border: #586e75\nmuted-foreground: #93a1a1\nnotification-background: #002b36\nnotification-border: #586e75\npage-background: #073642\npre-background: inherit\npre-border: #657b83\nprimary: #859900\nselect-tag-background: #002b36\nselect-tag-foreground: #839496\nsidebar-button-foreground: #93a1a1\nsidebar-controls-foreground: #93a1a1\nsidebar-controls-foreground-hover: #eee8d5\nsidebar-foreground: #93a1a1\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: #839496\nsidebar-muted-foreground-hover: #93a1a1\nsidebar-tab-background: #002b36\nsidebar-tab-background-selected: #073642\nsidebar-tab-border: #073642\nsidebar-tab-border-selected: #839496\nsidebar-tab-divider: #002b36\nsidebar-tab-foreground: #657b83\nsidebar-tab-foreground-selected: #93a1a1\nsidebar-tiddler-link-foreground: #2aa198\nsidebar-tiddler-link-foreground-hover: #eee8d5\nsite-title-foreground: #d33682\nstability-deprecated: #dc322f\nstability-experimental: #b58900\nstability-legacy: #268bd2\nstability-stable: #859900\nstatic-alert-foreground: #93a1a1\ntab-background: #073642\ntab-background-selected: #002b36\ntab-border: #586e75\ntab-border-selected: #93a1a1\ntab-divider: #93a1a1\ntab-foreground: #839496\ntab-foreground-selected: #93a1a1\ntable-border: #586e75\ntable-footer-background: #073642\ntable-header-background: #073642\ntag-background: #b58900\ntag-foreground: #002b36\ntiddler-background: #002b36\ntiddler-border: #586e75\ntiddler-controls-foreground: inherit\ntiddler-controls-foreground-hover: #d33682\ntiddler-controls-foreground-selected: #2aa198\ntiddler-editor-background: #002b36\ntiddler-editor-border: #073642\ntiddler-editor-border-image: #002b36\ntiddler-editor-fields-even: #002b36\ntiddler-editor-fields-odd: #073642\ntiddler-info-background: #073642\ntiddler-info-border: #657b83\ntiddler-info-tab-background: #002b36\ntiddler-link-background: #002b36\ntiddler-link-foreground: #2aa198\ntiddler-subtitle-foreground: #839496\ntiddler-title-foreground: #d33682\ntoolbar-cancel-button: #839496\ntoolbar-close-button: #839496\ntoolbar-delete-button: #dc322f\ntoolbar-done-button: #839496\ntoolbar-edit-button: #839496\ntoolbar-info-button: #839496\ntoolbar-new-button: #839496\ntoolbar-options-button: #839496\ntoolbar-save-button: inherit\nuntagged-background: #586e75\nvery-muted-foreground: #586e75\n"},"$:/palettes/SolarizedLight":{"title":"$:/palettes/SolarizedLight","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","description":"Precision colors for machines and people","license":"MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE","name":"SolarizedLight","color-scheme":"light","text":"alert-background: #eee8d5\nalert-border: #586e75\nalert-highlight: #d33682\nalert-muted-foreground: #d33682\nbackground: #eee8d5\nblockquote-bar: #d33682\nbutton-background: #eee8d5\nbutton-border: #93a1a1\nbutton-foreground: #586e75\ncode-background: #eee8d5\ncode-border: #93a1a1\ncode-foreground: #586e75\ndirty-indicator: #dc322f\ndownload-background: #859900\ndownload-foreground: #eee8d5\ndragger-background: #eee8d5\ndragger-foreground: #657b83\ndropdown-background: #eee8d5\ndropdown-border: #586e75\ndropdown-tab-background: #fdf6e3\ndropdown-tab-background-selected: #eee8d5\ndropzone-background: #859900\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: #268bd2\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #268bd2\nfootnote-target-background: #eee8d5\nforeground: #657b83\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmessage-background: #fdf6e3\nmessage-border: #93a1a1\nmessage-foreground: #657b83\nmodal-backdrop: #839496\nmodal-background: #fdf6e3\nmodal-border: #93a1a1\nmodal-footer-background: #eee8d5\nmodal-footer-border: #93a1a1\nmodal-header-border: #93a1a1\nmuted-foreground: #586e75\nnotification-background: #fdf6e3\nnotification-border: #93a1a1\npage-background: #eee8d5\npre-background: #eee8d5\npre-border: #839496\nprimary: #859900\nselect-tag-background: #fdf6e3\nselect-tag-foreground: #657b83\nsidebar-button-foreground: #586e75\nsidebar-controls-foreground: #586e75\nsidebar-controls-foreground-hover: #d33682\nsidebar-foreground: #586e75\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: #657b83\nsidebar-muted-foreground-hover: #586e75\nsidebar-tab-background: #fdf6e3\nsidebar-tab-background-selected: #eee8d5\nsidebar-tab-border: #eee8d5\nsidebar-tab-border-selected: #657b83\nsidebar-tab-divider: #fdf6e3\nsidebar-tab-foreground: #839496\nsidebar-tab-foreground-selected: #586e75\nsidebar-tiddler-link-foreground: #2aa198\nsidebar-tiddler-link-foreground-hover: #002b36\nsite-title-foreground: #d33682\nstability-deprecated: #dc322f\nstability-experimental: #b58900\nstability-legacy: #268bd2\nstability-stable: #859900\nstatic-alert-foreground: #586e75\ntab-background: #eee8d5\ntab-background-selected: #fdf6e3\ntab-border: #93a1a1\ntab-border-selected: #586e75\ntab-divider: #586e75\ntab-foreground: #657b83\ntab-foreground-selected: #586e75\ntable-border: #93a1a1\ntable-footer-background: #eee8d5\ntable-header-background: #eee8d5\ntag-background: #b58900\ntag-foreground: #fdf6e3\ntiddler-background: #fdf6e3\ntiddler-border: #93a1a1\ntiddler-controls-foreground: inherit\ntiddler-controls-foreground-hover: #d33682\ntiddler-controls-foreground-selected: #2aa198\ntiddler-editor-background: #fdf6e3\ntiddler-editor-border: #eee8d5\ntiddler-editor-border-image: #fdf6e3\ntiddler-editor-fields-even: #fdf6e3\ntiddler-editor-fields-odd: #eee8d5\ntiddler-info-background: #eee8d5\ntiddler-info-border: #839496\ntiddler-info-tab-background: #fdf6e3\ntiddler-link-background: #fdf6e3\ntiddler-link-foreground: #2aa198\ntiddler-subtitle-foreground: #657b83\ntiddler-title-foreground: #d33682\ntoolbar-cancel-button: #657b83\ntoolbar-close-button: #657b83\ntoolbar-delete-button: #dc322f\ntoolbar-done-button: #657b83\ntoolbar-edit-button: #657b83\ntoolbar-info-button: #657b83\ntoolbar-new-button: #657b83\ntoolbar-options-button: #657b83\ntoolbar-save-button: inherit\nuntagged-background: #586e75\nvery-muted-foreground: #93a1a1\n"},"$:/palettes/SpartanDay":{"title":"$:/palettes/SpartanDay","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","description":"Cold, spartan day colors","name":"Spartan Day","color-scheme":"light","text":"alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #FAFAFA\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: #ececec\ncode-border: #ececec\ncode-foreground: \ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #FFFFFF\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #F5F5F5\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: \nexternal-link-foreground: \nfootnote-target-background: #ececec\nforeground: rgba(0, 0, 0, 0.87)\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(0, 0, 0, 0.54)\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour very-muted-foreground>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(0, 0, 0, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #f4f4f4\npre-background: #ececec\npre-border: #ececec\nprimary: #3949ab\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #aeaeae\nsidebar-controls-foreground: #c6c6c6\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground-hover: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground: rgba(0, 0, 0, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(0, 0, 0, 0.87)\nsidebar-tab-foreground: rgba(0, 0, 0, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(0, 0, 0, 0.87)\nsidebar-tiddler-link-foreground: rgba(0, 0, 0, 0.54)\nsite-title-foreground: rgba(0, 0, 0, 0.87)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(0, 0, 0, 0.87)\ntab-foreground: rgba(0, 0, 0, 0.54)\ntable-border: #d8d8d8\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: #f9f9f9\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: #e8e7e7\ntiddler-editor-fields-even: rgba(0, 0, 0, 0.1)\ntiddler-editor-fields-odd: rgba(0, 0, 0, 0.04)\ntiddler-info-background: #F5F5F5\ntiddler-info-border: #F5F5F5\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #000000\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(0, 0, 0, 0.12)\n"},"$:/palettes/SpartanNight":{"title":"$:/palettes/SpartanNight","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","description":"Dark spartan colors","name":"Spartan Night","color-scheme":"dark","text":"alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #303030\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #424242\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #050505\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #7c318c\nexternal-link-foreground: #9e3eb3\nfootnote-target-background: #494949\nforeground: rgba(255, 255, 255, 0.7)\nhighlight-background: #ffff78\nhighlight-foreground: #000000\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(255, 255, 255, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #212121\npre-background: #2a2a2a\npre-border: transparent\nprimary: #5656f3\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #494949\nsidebar-controls-foreground: #5d5d5d\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: rgba(255, 255, 255, 0.7)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #3a3a3a\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: rgb(55,55,55)\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #454545\ntiddler-info-border: #454545\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(255, 255, 255, 0.12)\n"},"$:/palettes/Twilight":{"title":"$:/palettes/Twilight","tags":"$:/tags/Palette","author":"Thomas Elmiger","type":"application/x-tiddler-dictionary","name":"Twilight","description":"Delightful, soft darkness.","color-scheme":"dark","text":"alert-background: rgb(255, 255, 102)\nalert-border: rgb(232, 232, 125)\nalert-highlight: rgb(255, 51, 51)\nalert-muted-foreground: rgb(224, 82, 82)\nbackground: rgb(38, 38, 38)\nblockquote-bar: rgba(240, 196, 117, 0.7)\nbutton-background: rgb(63, 63, 63)\nbutton-border: rgb(127, 127, 127)\nbutton-foreground: rgb(179, 179, 179)\ncode-background: rgba(0,0,0,0.03)\ncode-border: rgba(0,0,0,0.08)\ncode-foreground: rgb(255, 94, 94)\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: rgb(255, 94, 94)\ndownload-background: #19a974\ndownload-foreground: rgb(38, 38, 38)\ndragger-background: rgb(179, 179, 179)\ndragger-foreground: rgb(38, 38, 38)\ndropdown-background: rgb(38, 38, 38)\ndropdown-border: rgb(255, 255, 255)\ndropdown-tab-background: rgba(0,0,0,.1)\ndropdown-tab-background-selected: rgba(255,255,255,1)\ndropzone-background: #9eebcf\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: rgb(179, 179, 255)\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: rgb(153, 153, 255)\nfootnote-target-background: <<colour tag-foreground>>\nforeground: rgb(179, 179, 179)\nhighlight-background: #ffff78\nhighlight-foreground: #000000\nmessage-background: <<colour tag-foreground>>\nmessage-border: #96ccff\nmessage-foreground: <<colour tag-background>>\nmodal-backdrop: rgb(179, 179, 179)\nmodal-background: rgb(38, 38, 38)\nmodal-border: rgba(0,0,0,.5)\nmodal-footer-background: #f4f4f4\nmodal-footer-border: rgba(0,0,0,.1)\nmodal-header-border: rgba(0,0,0,.2)\nmuted-foreground: rgb(255, 255, 255)\nnotification-background: <<colour tag-foreground>>\nnotification-border: <<colour tag-background>>\npage-background: rgb(26, 26, 26)\npre-background: rgb(25, 25, 25)\npre-border: rgba(0,0,0,.2)\nprimary: rgb(255, 201, 102)\nselect-tag-background: \nselect-tag-foreground: \nsidebar-button-foreground: rgb(179, 179, 179)\nsidebar-controls-foreground: rgb(153, 153, 153)\nsidebar-controls-foreground-hover: <<colour tiddler-controls-foreground-hover>>\nsidebar-foreground: rgb(141, 141, 141)\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: rgba(0, 0, 0, 0.5)\nsidebar-muted-foreground-hover: rgb(141, 141, 141)\nsidebar-tab-background: rgba(141, 141, 141, 0.2)\nsidebar-tab-background-selected: rgb(26, 26, 26)\nsidebar-tab-border: rgb(127, 127, 127)\nsidebar-tab-border-selected: rgb(127, 127, 127)\nsidebar-tab-divider: rgb(127, 127, 127)\nsidebar-tab-foreground: rgb(179, 179, 179)\nsidebar-tab-foreground-selected: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground-hover: rgb(115, 115, 115)\nsite-title-foreground: rgb(255, 201, 102)\nstatic-alert-foreground: rgba(0,0,0,.3)\ntab-background: rgba(0,0,0,0.125)\ntab-background-selected: rgb(38, 38, 38)\ntab-border: rgb(255, 201, 102)\ntab-border-selected: rgb(255, 201, 102)\ntab-divider: rgb(255, 201, 102)\ntab-foreground: rgb(179, 179, 179)\ntab-foreground-selected: rgb(179, 179, 179)\ntable-border: rgba(255,255,255,.3)\ntable-footer-background: rgba(0,0,0,.4)\ntable-header-background: rgba(0,0,0,.1)\ntag-background: rgb(255, 201, 102)\ntag-foreground: rgb(25, 25, 25)\ntiddler-background: rgb(38, 38, 38)\ntiddler-border: rgba(240, 196, 117, 0.7)\ntiddler-controls-foreground: rgb(128, 128, 128)\ntiddler-controls-foreground-hover: rgba(255, 255, 255, 0.8)\ntiddler-controls-foreground-selected: rgba(255, 255, 255, 0.9)\ntiddler-editor-background: rgb(33, 33, 33)\ntiddler-editor-border: rgb(63, 63, 63)\ntiddler-editor-border-image: rgb(25, 25, 25)\ntiddler-editor-fields-even: rgb(33, 33, 33)\ntiddler-editor-fields-odd: rgb(28, 28, 28)\ntiddler-info-background: rgb(43, 43, 43)\ntiddler-info-border: rgb(25, 25, 25)\ntiddler-info-tab-background: rgb(43, 43, 43)\ntiddler-link-background: rgb(38, 38, 38)\ntiddler-link-foreground: rgb(204, 204, 255)\ntiddler-subtitle-foreground: rgb(255, 255, 255)\ntiddler-title-foreground: rgb(255, 192, 76)\ntoolbar-cancel-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-done-button: \ntoolbar-edit-button: \ntoolbar-info-button: \ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \nuntagged-background: rgb(255, 255, 255)\nvery-muted-foreground: rgba(240, 196, 117, 0.7)\n"},"$:/palettes/Vanilla":{"title":"$:/palettes/Vanilla","name":"Vanilla","description":"Pale and unobtrusive","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","color-scheme":"light","text":"alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #ffffff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nfootnote-target-background: #ecf2ff\nforeground: #333333\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbbbbb\nnetwork-activity-foreground: #448844\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f4f4f4\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselection-background:\nselection-foreground:\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #f4f4f4\nsidebar-tab-background: #e0e0e0\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: #e4e4e4\nsidebar-tab-foreground-selected:\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstability-stable: #008000\nstability-experimental: #c07c00\nstability-deprecated: #ff0000\nstability-legacy: #0000ff\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #eecc66\ntag-foreground: #ffffff\ntestcase-accent-level-1: #c1eaff\ntestcase-accent-level-2: #E3B740\ntestcase-accent-level-3: #5FD564\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\nwikilist-background: #e5e5e5\nwikilist-item: #ffffff\nwikilist-info: #000000\nwikilist-title: #666666\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #aaaaaa\nwikilist-button-open: #4fb82b\nwikilist-button-open-hover: green\nwikilist-button-reveal: #5778d8\nwikilist-button-reveal-hover: blue\nwikilist-button-remove: #d85778\nwikilist-button-remove-hover: red\nwikilist-toolbar-background: #d3d3d3\nwikilist-toolbar-foreground: #888888\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #acacac\nwikilist-button-foreground: #000000\n"},"$:/core/readme":{"title":"$:/core/readme","text":"This plugin contains TiddlyWiki's core components, comprising:\n\n* JavaScript code modules\n* Icons\n* Templates needed to create TiddlyWiki's user interface\n* British English (''en-GB'') translations of the localisable strings used by the core\n"},"$:/library/sjcl.js/license":{"title":"$:/library/sjcl.js/license","type":"text/plain","text":"SJCL is open. You can use, modify and redistribute it under a BSD\nlicense or under the GNU GPL, version 2.0.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/BSD-2-Clause\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n1. Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/GPL-2.0\n\nThe Stanford Javascript Crypto Library (hosted here on GitHub) is a\nproject by the Stanford Computer Security Lab to build a secure,\npowerful, fast, small, easy-to-use, cross-browser library for\ncryptography in Javascript.\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University.\n\nThis program is free software; you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation; either version 2 of the License, or (at your\noption) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\nPublic License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"},"$:/core/templates/MOTW.html":{"title":"$:/core/templates/MOTW.html","text":"\\rules only filteredtranscludeinline transcludeinline entity\n<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->\n<!-- saved from url=(0021)https://tiddlywiki.com -->&#13;&#10;"},"$:/core/templates/alltiddlers.template.html":{"title":"$:/core/templates/alltiddlers.template.html","type":"text/vnd.tiddlywiki-html","text":"<!-- This template is provided for backwards compatibility with older versions of TiddlyWiki -->\n\n<$set name=\"exportFilter\" value=\"[!is[system]sort[title]]\">\n\n{{$:/core/templates/exporters/StaticRiver}}\n\n</$set>\n"},"$:/core/templates/canonical-uri-external-image":{"title":"$:/core/templates/canonical-uri-external-image","text":"<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external images.\n\nChange the `./images/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./images/<$view field=\"title\" format=\"doubleurlencoded\"/>"},"$:/core/templates/canonical-uri-external-raw":{"title":"$:/core/templates/canonical-uri-external-raw","text":"<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external raw files that are stored in the same directory\n\n-->\n<$view field=\"title\" format=\"doubleurlencoded\"/>"},"$:/core/templates/canonical-uri-external-text":{"title":"$:/core/templates/canonical-uri-external-text","text":"<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external text files.\n\nChange the `./text/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./text/<$view field=\"title\" format=\"doubleurlencoded\"/>.tid"},"$:/core/templates/css-tiddler":{"title":"$:/core/templates/css-tiddler","text":"<!--\n\nThis template is used for saving CSS tiddlers as a style tag with data attributes representing the tiddler fields.\n\n-->`<style`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/css\">`<$view field=\"text\" format=\"text\" />`</style>`"},"$:/core/templates/exporters/CsvFile":{"title":"$:/core/templates/exporters/CsvFile","tags":"$:/tags/Exporter","description":"{{$:/language/Exporters/CsvFile}}","extension":".csv","text":"<$macrocall $name=\"csvtiddlers\" filter=<<exportFilter>> format=\"quoted-comma-sep\" $output=\"text/raw\"/>\n"},"$:/core/templates/exporters/JsonFile":{"title":"$:/core/templates/exporters/JsonFile","tags":"$:/tags/Exporter","description":"{{$:/language/Exporters/JsonFile}}","extension":".json","text":"<$macrocall $name=\"jsontiddlers\" filter=<<exportFilter>> $output=\"text/raw\"/>\n"},"$:/core/templates/exporters/StaticRiver":{"title":"$:/core/templates/exporters/StaticRiver","tags":"$:/tags/Exporter","description":"{{$:/language/Exporters/StaticRiver}}","extension":".html","text":"\\define tv-config-static() yes\n\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n<section class=\"tc-story-river tc-static-story-river\">\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\n</section>\n</body>\n</html>\n"},"$:/core/templates/exporters/StaticRiver/Content":{"title":"$:/core/templates/exporters/StaticRiver/Content","text":"\\define renderContent()\n{{{ $(exportFilter)$ ||$:/core/templates/static-tiddler}}}\n\\end\n\\import [subfilter{$:/core/config/GlobalImportFilter}]\n<<renderContent>>\n"},"$:/core/templates/exporters/TidFile":{"title":"$:/core/templates/exporters/TidFile","tags":"$:/tags/Exporter","description":"{{$:/language/Exporters/TidFile}}","extension":".tid","condition":"[<count>compare:lte[1]]","text":"\\define renderContent()\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\n\\end\n\\import [subfilter{$:/core/config/GlobalImportFilter}]\n<<renderContent>>"},"$:/core/save/all-external-js":{"title":"$:/core/save/all-external-js","text":"\\whitespace trim\n\\import [subfilter{$:/core/config/GlobalImportFilter}]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/core]] -[[$:/boot/boot.css]] -[is[system]type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n\n<!-- Important: core library is provided by serving URI encoded $:/core/templates/tiddlywiki5.js -->\n\\define defaultCoreURL() %24%3A%2Fcore%2Ftemplates%2Ftiddlywiki5.js\n\n<$let coreURL={{{ [[coreURL]is[variable]then<coreURL>else<defaultCoreURL>] }}}>\n\t{{$:/core/templates/tiddlywiki5-external-js.html}}\n</$let>\n"},"$:/core/save/offline-external-js":{"title":"$:/core/save/offline-external-js","text":"\\whitespace trim\n\\import [subfilter{$:/core/config/GlobalImportFilter}]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/core]] -[[$:/plugins/tiddlywiki/filesystem]] -[[$:/plugins/tiddlywiki/tiddlyweb]] -[[$:/boot/boot.css]] -[is[system]type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n\\define defaultCoreURL() tiddlywikicore-$(version)$.js\n<$let coreURL={{{ [[coreURL]is[variable]then<coreURL>else<defaultCoreURL>] }}}>\n\t{{$:/core/templates/tiddlywiki5-external-js.html}}\n</$let>\n"},"$:/core/templates/tiddlywiki.js/load-tiddler":{"title":"$:/core/templates/tiddlywiki.js/load-tiddler","text":"_load(window,<$macrocall $name=\"jsontiddler\" $output=\"text/raw\"/>);"},"$:/core/templates/tiddlywiki5.js":{"title":"$:/core/templates/tiddlywiki5.js","text":"\\rules only filteredtranscludeinline transcludeinline codeinline\n\n`/*\n`{{ $:/core/copyright.txt ||$:/core/templates/plain-text-tiddler}}`\n*/\n\n$tw = (typeof $tw === 'undefined') ? Object.create(null) : $tw;\n\n$tw.preloadTiddlers = $tw.preloadTiddlers || [];\n\n_load = function(window,tiddler) {\n\t\"use strict\";\n\tvar f;\n\t$tw.preloadTiddlers.push(tiddler);\n\tif(tiddler.library === \"yes\") {\n\t\tvar module = { exports:{} };\n\t\tvar moduleName = function moduleName(path) {\n\t\t\tvar word = path.split(\"/\").pop();\n\t\t\tword = word.substring(0,word.indexOf(\".\")) || word;\n\t\t\treturn word;\n\t\t}\n\t\tf = new Function(\"module\",tiddler.text);\n\t\tf(module);\n\t\twindow[moduleName(tiddler.title)] = module.exports;\n\t} else {\n\t\tf = new Function(\"window\",tiddler.text);\n\t\tf(window);\n\t}\n}\n\n/* ~~ Library modules ~~ */\n\n`{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/tiddlywiki.js/load-tiddler}}}`\n\n/* ~~ Boot kernel prologue ~~ */\n\n`{{ $:/boot/bootprefix.js ||$:/core/templates/tiddlywiki.js/load-tiddler}}`\n\n/* ~~ Core tiddlers ~~ */\n\n`{{$:/core/templates/tiddlywiki5.js/tiddlers}}`\n\n/* ~~ Boot kernel ~~ */\n\n`{{ $:/boot/boot.js ||$:/core/templates/tiddlywiki.js/load-tiddler}}`\n"},"$:/core/templates/tiddlywiki5.js/tiddlers":{"title":"$:/core/templates/tiddlywiki5.js/tiddlers","text":"`\n$tw.preloadTiddlerArray(`<$text text=<<jsontiddlers \"[[$:/core]]\">>/>`);\n$tw.preloadTiddlerArray([{\n\ttitle: \"$:/config/SaveWikiButton/Template\",\n\ttext: \"$:/core/save/offline-external-js\"\n}]);\n`\n"},"$:/core/templates/tiddlywiki5-external-js.html":{"title":"$:/core/templates/tiddlywiki5-external-js.html","text":"<$set name=\"saveTiddlerAndShadowsFilter\" filter=\"[subfilter<saveTiddlerFilter>] [subfilter<saveTiddlerFilter>plugintiddlers[]]\">\n`<!doctype html>\n`{{$:/core/templates/MOTW.html}}`<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"`{{$:/core/copyright.txt}}`\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>`{{$:/core/wiki/title}}`</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/core/wiki/rawmarkup]] ||$:/core/templates/plain-text-tiddler}}}`\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}`\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}`\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}`\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n`{{$:/boot/boot.css||$:/core/templates/css-tiddler}}`\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n`{{$:/core/templates/static.area}}`\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n`{{$:/core/templates/store.area.template.html}}`\n<!--~~ Raw markup for the bottom of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}`\n<!--~~ Load external JavaScripts ~~-->\n<script src=\"`{{{ [<coreURL>] }}}`\" onerror=\"alert('Error: Cannot load `{{{ [<coreURL>] }}}`');\"></script>\n</body>\n</html>`\n</$set>"},"$:/core/templates/html-div-skinny-tiddler":{"title":"$:/core/templates/html-div-skinny-tiddler","text":"<!--\n\nThis template is a variant of $:/core/templates/html-div-tiddler used for saving skinny tiddlers (with no text field)\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre></pre>\n</div>`\n"},"$:/core/templates/html-div-tiddler":{"title":"$:/core/templates/html-div-tiddler","text":"<!--\n\nThis template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields.\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre>`<$view field=\"text\" format=\"htmltextencoded\" />`</pre>\n</div>`\n"},"$:/core/templates/html-json-skinny-tiddler":{"title":"$:/core/templates/html-json-skinny-tiddler","text":"<$text text=<<join>>/><$jsontiddler tiddler=<<currentTiddler>> exclude=\"text\" escapeUnsafeScriptChars=\"yes\"/>\n"},"$:/core/templates/html-json-tiddler":{"title":"$:/core/templates/html-json-tiddler","text":"<$jsontiddler tiddler=<<currentTiddler>> escapeUnsafeScriptChars=\"yes\"/>"},"$:/core/templates/html-tiddler":{"title":"$:/core/templates/html-tiddler","text":"<!--\n\nThis template is used for saving tiddlers as raw HTML\n\n--><$view field=\"text\" format=\"htmlwikified\" />"},"$:/core/templates/javascript-tiddler":{"title":"$:/core/templates/javascript-tiddler","text":"<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields.\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\">`<$view field=\"text\" format=\"text\" />`</script>`"},"$:/core/templates/json-tiddler":{"title":"$:/core/templates/json-tiddler","text":"<!--\n\nThis template is used for saving tiddlers as raw JSON\n\n--><$text text=<<jsontiddler>>/>"},"$:/core/templates/module-tiddler":{"title":"$:/core/templates/module-tiddler","text":"<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. The body of the tiddler is wrapped in a call to the `$tw.modules.define` function in order to define the body of the tiddler as a module\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\" data-module=\"yes\">$tw.modules.define(\"`<$view field=\"title\" format=\"jsencoded\" />`\",\"`<$view field=\"module-type\" format=\"jsencoded\" />`\",function(module,exports,require) {`<$view field=\"text\" format=\"text\" />`});\n</script>`"},"$:/core/templates/plain-text-tiddler":{"title":"$:/core/templates/plain-text-tiddler","text":"<$view field=\"text\" format=\"text\" />"},"$:/core/templates/raw-static-tiddler":{"title":"$:/core/templates/raw-static-tiddler","text":"<!--\n\nThis template is used for saving tiddlers as static HTML\n\n--><$view field=\"text\" format=\"plainwikified\" />"},"$:/core/save/all":{"title":"$:/core/save/all","text":"\\import [subfilter{$:/core/config/GlobalImportFilter}]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/boot/boot.css]] -[is[system]type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"},"$:/core/save/empty":{"title":"$:/core/save/empty","text":"\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[is[system]type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"},"$:/core/save/lazy-all":{"title":"$:/core/save/lazy-all","text":"\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[is[system]type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] [is[tiddler]type[application/javascript]] +[sort[title]]\n\\end\n\\define skinnySaveTiddlerFilter()\n[!is[system]] -[type[application/javascript]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"},"$:/core/save/lazy-images":{"title":"$:/core/save/lazy-images","text":"\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[is[system]type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[!is[system]is[image]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"},"$:/core/templates/server/static.sidebar.wikitext":{"title":"$:/core/templates/server/static.sidebar.wikitext","text":"\\whitespace trim\n<div class=\"tc-sidebar-scrollable\" style=\"overflow: auto;\" role=\"region\" aria-label={{$:/language/SideBar/Caption}}>\n<div class=\"tc-sidebar-header\">\n<h1 class=\"tc-site-title\">\n<$transclude tiddler=\"$:/SiteTitle\"/>\n</h1>\n<div class=\"tc-site-subtitle\">\n<$transclude tiddler=\"$:/SiteSubtitle\"/>\n</div>\n<h2>\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$list filter={{$:/DefaultTiddlers}}>\n<div class=\"tc-menu-list-subitem\">\n<$link><$text text=<<currentTiddler>>/></$link>\n</div>\n</$list>\n</div>\n<!-- Currently disabled the recent list as it is unweildy when the responsive narrow view kicks in\n<h2>\n{{$:/language/SideBar/Recent/Caption}}\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n</div>\n</div>\n</div>\n-->\n"},"$:/core/templates/server/static.tiddler.html":{"title":"$:/core/templates/server/static.tiddler.html","text":"\\whitespace trim\n\\define tv-config-static() yes\n\\define tv-wikilink-template() $uri_encoded$\n\\import [subfilter{$:/core/config/GlobalImportFilter}]\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content={{$:/core/templates/version}} />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"%24%3A%2Fcore%2Ftemplates%2Fstatic.template.css\">\n<title><$view field=\"caption\" format=\"plainwikified\"><$view field=\"title\"/></$view>: <$view tiddler=\"$:/core/wiki/title\" format=\"plainwikified\"/></title>\n</head>\n<body class=\"tc-body\">\n<$transclude tiddler=\"$:/core/templates/server/static.sidebar.wikitext\" mode=\"inline\"/>\n<section class=\"tc-story-river\" role=\"main\">\n<div class=\"tc-tiddler-frame\" role=\"article\">\n<$transclude tiddler=\"$:/core/templates/server/static.tiddler.wikitext\" mode=\"inline\"/>\n</div>\n</section>\n</body>\n</html>"},"$:/core/templates/server/static.tiddler.wikitext":{"title":"$:/core/templates/server/static.tiddler.wikitext","text":"\\whitespace trim\n<div class=\"tc-tiddler-title tc-clearfix\">\n<div class=\"tc-titlebar\">\n<h2><$text text=<<currentTiddler>>/></h2>\n</div>\n</div>\n<div class=\"tc-subtitle tc-clearfix\">\n<$link to={{!!modifier}}>\n<$view field=\"modifier\"/>\n</$link> <$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n<div class=\"tc-tags-wrapper\" tc-clearfix>\n<$list filter=\"[all[current]tags[]sort[title]]\">\n<a href={{{ [<currentTiddler>encodeuricomponent[]] }}}>\n<$macrocall $name=\"tag-pill\" tag=<<currentTiddler>>/>\n</a>\n</$list>\n</div>\n<div class=\"tc-tiddler-body tc-clearfix\">\n<$transclude mode=\"block\"/>\n</div>\n"},"$:/core/templates/single.tiddler.window":{"title":"$:/core/templates/single.tiddler.window","text":"\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [subfilter{$:/core/config/GlobalImportFilter}]\n\n<$vars\n\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\n\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\n\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\n\ttv-show-missing-links={{$:/config/MissingLinks}}\n\tstoryviewTitle={{$:/view}}\n\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$transclude tiddler=\"$:/core/ui/ViewTemplate/body\" mode=\"block\"/>\n\n</$navigator>\n\n</div>\n\n</$vars>\n"},"$:/core/templates/social-metadata":{"title":"$:/core/templates/social-metadata","tags":"$:/tags/RawMarkupWikified","text":"\\procedure meta-plain(name,source,name-attribute:\"name\")\n\\whitespace trim\n<%if [<source>has[text]] %>\n\t&lt;meta&#32;<$text text=<<name-attribute>>/>=\"<$text text=<<name>>/>\" content=\"<$text text={{{ [<source>get[text]encodehtml[]] }}}/>\"&gt;\n\t<$text text={{{ [charcode[10]] }}}/>\n<%endif%>\n\\end meta-plain\n\n\\procedure meta-wikified(name,source,name-attribute:\"name\")\n\\whitespace trim\n<%if [<source>has[text]] %>\n\t<$wikify name=\"html\" text={{{ [<source>get[text]] }}} output=\"text\">\n\t\t&lt;meta&#32;<$text text=<<name-attribute>>/>=\"<$text text=<<name>>/>\" content=\"<$text text={{{ [<html>encodehtml[]] }}}/>\"&gt;\n\t\t<$text text={{{ [charcode[10]] }}}/>\n\t</$wikify>\n<%endif%>\n\\end meta-wikified\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock conditional commentinline commentblock\n<<meta-wikified \"description\" \"$:/SiteSubtitle\">>\n\n<!-- Facebook Meta Tags -->\n<<meta-plain \"og:url\" \"$:/SiteUrl\" \"property\">>\n<<meta-plain \"og:type\" \"website\" \"property\">>\n<<meta-wikified \"og:title\" \"$:/SiteTitle\" \"property\">>\n<<meta-wikified \"og:description\" \"$:/SiteSubtitle\" \"property\">>\n<<meta-plain \"og:image\" \"$:/SitePreviewUrl\" \"property\">>\n\n<!-- Twitter Meta Tags -->\n<<meta-plain \"twitter:card\" \"summary_large_image\">>\n<<meta-plain \"twitter:domain\" \"$:/SiteDomain\" \"property\">>\n<<meta-plain \"twitter:url\" \"$:/SiteUrl\" \"property\">>\n<<meta-wikified \"twitter:title\" \"$:/SiteTitle\">>\n<<meta-wikified \"twitter:description\" \"$:/SiteSubtitle\">>\n<<meta-plain \"twitter:image\" \"$:/SitePreviewUrl\">>\n"},"$:/core/templates/split-recipe":{"title":"$:/core/templates/split-recipe","text":"<$list filter=\"[!is[system]]\">\ntiddler: <$view field=\"title\" format=\"urlencoded\"/>.tid\n</$list>\n"},"$:/core/templates/static-tiddler":{"title":"$:/core/templates/static-tiddler","text":"<a name=<<currentTiddler>>>\n<$transclude tiddler=\"$:/core/ui/ViewTemplate\"/>\n</a>"},"$:/core/templates/static.area":{"title":"$:/core/templates/static.area","text":"<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawStaticContent]!has[draft.of]] ||$:/core/templates/raw-static-tiddler}}}\n{{$:/core/templates/static.content||$:/core/templates/html-tiddler}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\nThis file contains an encrypted ~TiddlyWiki. Enable ~JavaScript and enter the decryption password when prompted.\n</$reveal>\n<!-- ensure splash screen isn't shown when JS is disabled -->\n`<style>\n.tc-remove-when-wiki-loaded {display: none;}\n</style>`\n"},"$:/core/templates/static.content":{"title":"$:/core/templates/static.content","text":"<!-- For Google, and people without JavaScript-->\nThis [[TiddlyWiki|https://tiddlywiki.com]] contains the following tiddlers:\n\n<ul>\n<$list filter=<<saveTiddlerFilter>>>\n<li><$view field=\"title\" format=\"text\"></$view></li>\n</$list>\n</ul>\n"},"$:/core/templates/static.template.css":{"title":"$:/core/templates/static.template.css","text":"{{$:/boot/boot.css||$:/core/templates/plain-text-tiddler}}\n\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n"},"$:/core/templates/static.template.html":{"title":"$:/core/templates/static.template.html","type":"text/vnd.tiddlywiki-html","text":"\\define tv-config-static() yes\n\\define tv-wikilink-template() static/$uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n{{$:/core/ui/PageTemplate||$:/core/templates/html-tiddler}}\n</body>\n</html>\n"},"$:/core/templates/static.tiddler.html":{"title":"$:/core/templates/static.tiddler.html","text":"\\define tv-wikilink-template() $uri_doubleencoded$.html\n\\define tv-config-static() yes\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\import [subfilter{$:/core/config/GlobalImportFilter}]\n`<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"static.css\">\n<title>`<$view field=\"caption\"><$view field=\"title\"/></$view>: {{$:/core/wiki/title}}`</title>\n</head>\n<body class=\"tc-body\">\n`{{$:/StaticBanner||$:/core/templates/html-tiddler}}`\n<section class=\"tc-story-river tc-static-story-river\">\n`<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>`\n</section>\n</body>\n</html>\n`\n"},"$:/core/templates/store.area.template.html":{"title":"$:/core/templates/store.area.template.html","text":"\\whitespace trim\n<!-- Unencrypted -->\n<$list filter=\"[[$:/isEncrypted]get[text]else[no]match[no]]\">\n    <$list filter=\"[[storeAreaFormat]is[variable]getvariable[]else[json]match[json]]\">\n        <!-- New-style JSON store area, with an old-style store area for compatibility with v5.1.x tooling -->\n        `<script class=\"tiddlywiki-tiddler-store\" type=\"application/json\">[`\n            <$let newline={{{ [charcode[10]] }}} join=`,$(newline)$`>\n                <$text text=<<newline>>/>\n                <$list filter=<<saveTiddlerFilter>> join=<<join>> template=\"$:/core/templates/html-json-tiddler\"/>\n                <$list filter=\"[subfilter<skinnySaveTiddlerFilter>]\"  template=\"$:/core/templates/html-json-skinny-tiddler\"/>\n                <$text text=<<newline>>/>\n            </$let>\n        `]</script>`\n        `<div id=\"storeArea\" style=\"display:none;\">`\n        `</div>`\n    </$list>\n    <$list filter=\"[[storeAreaFormat]is[variable]getvariable[]else[json]match[div]]\">\n        <!-- Old-style DIV/PRE-based store area -->\n        <$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n            `<div id=\"storeArea\" style=\"display:none;\">`\n                <$list filter={{{ [<saveTiddlerFilter>] }}} template=\"$:/core/templates/html-div-tiddler\"/>\n                <$list filter=\"[subfilter<skinnySaveTiddlerFilter>]\" template=\"$:/core/templates/html-div-skinny-tiddler\"/>\n            `</div>`\n        </$reveal>\n    </$list>\n</$list>\n<!-- Encrypted -->\n<$list filter=\"[[$:/isEncrypted]get[text]else[no]match[yes]]\">\n    `<!--~~ Encrypted tiddlers ~~-->`\n    `<pre id=\"encryptedStoreArea\" type=\"text/plain\" style=\"display:none;\">`\n        <$encrypt filter=<<saveTiddlerFilter>>/>\n    `</pre>`\n</$list>"},"$:/core/templates/tid-tiddler":{"title":"$:/core/templates/tid-tiddler","text":"<!--\n\nThis template is used for saving tiddlers in TiddlyWeb *.tid format\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>`\n`<$view field=\"text\" format=\"text\" />"},"$:/core/templates/tiddler-metadata":{"title":"$:/core/templates/tiddler-metadata","text":"<!--\n\nThis template is used for saving tiddler metadata *.meta files\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>"},"$:/core/templates/tiddlywiki5.html":{"title":"$:/core/templates/tiddlywiki5.html","text":"<$set name=\"saveTiddlerAndShadowsFilter\" filter=\"[subfilter<saveTiddlerFilter>] [subfilter<saveTiddlerFilter>plugintiddlers[]]\">\n`<!doctype html>\n`{{$:/core/templates/MOTW.html}}`<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"`{{$:/core/copyright.txt}}`\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>`{{$:/core/wiki/title}}`</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/core/wiki/rawmarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}`\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}`\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n`{{$:/boot/boot.css||$:/core/templates/css-tiddler}}`\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n`{{$:/core/templates/static.area}}`\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n`{{$:/core/templates/store.area.template.html}}`\n<!--~~ Library modules ~~-->\n<div id=\"libraryModules\" style=\"display:none;\">\n`{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/javascript-tiddler}}}`\n</div>\n<!--~~ Boot kernel prologue ~~-->\n<div id=\"bootKernelPrefix\" style=\"display:none;\">\n`{{ $:/boot/bootprefix.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Boot kernel ~~-->\n<div id=\"bootKernel\" style=\"display:none;\">\n`{{ $:/boot/boot.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Raw markup for the bottom of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}`\n</body>\n</html>`\n</$set>\n"},"$:/core/templates/version":{"title":"$:/core/templates/version","text":"<<version>>"},"$:/core/templates/wikified-tiddler":{"title":"$:/core/templates/wikified-tiddler","text":"<$transclude />"},"$:/core/ui/AboveStory/tw2-plugin-check":{"title":"$:/core/ui/AboveStory/tw2-plugin-check","tags":"$:/tags/AboveStory","text":"\\define lingo-base() $:/language/AboveStory/ClassicPlugin/\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]limit[1]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n<ul>\n\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]]\">\n\n<li>\n\n<$link><$view field=\"title\"/></$link>\n\n</li>\n\n</$list>\n\n</ul>\n\n</div>\n\n</$list>\n"},"$:/core/ui/Actions/new-image":{"title":"$:/core/ui/Actions/new-image","tags":"$:/tags/Actions","description":"create a new image tiddler","text":"\\whitespace trim\n<$action-sendmessage $message=\"tm-new-tiddler\" type={{{ [{$:/config/NewImageType}addprefix[image/]] }}}/>\n"},"$:/core/ui/Actions/new-journal":{"title":"$:/core/ui/Actions/new-journal","tags":"$:/tags/Actions","description":"create a new journal tiddler","text":"\\whitespace trim\n\\function get-tags() [<textFieldTags>] [<tagsFieldTags>] +[join[ ]]\n<$let journalTitleTemplate={{$:/config/NewJournal/Title}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}>\n<$wikify name=\"journalTitle\" text=\"<$transclude $variable='now' format=<<journalTitleTemplate>>/>\">\n<$reveal type=\"nomatch\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<get-tags>> text={{{ [<journalTitle>get[]] }}}/>\n</$reveal>\n<$reveal type=\"match\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<get-tags>> text=<<journalText>>/>\n</$reveal>\n</$wikify>\n</$let>\n"},"$:/core/ui/Actions/new-tiddler":{"title":"$:/core/ui/Actions/new-tiddler","tags":"$:/tags/Actions","description":"create a new empty tiddler","text":"\\whitespace trim\n\\function get-tags() [<textFieldTags>] [<tagsFieldTags>] +[join[ ]]\n<$let textFieldTags={{$:/config/NewTiddler/Tags}} tagsFieldTags={{$:/config/NewTiddler/Tags!!tags}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<get-tags>>/>\n</$let>\n"},"$:/core/ui/AdvancedSearch/Filter":{"title":"$:/core/ui/AdvancedSearch/Filter","tags":"$:/tags/AdvancedSearch","caption":"{{$:/language/Search/Filter/Caption}}","text":"\\procedure lingo-base() $:/language/Search/\n\\procedure set-next-input-tab()\n<$transclude $variable=\"change-input-tab\"\n\tstateTitle=\"$:/state/tab--1498284803\"\n\ttag=\"$:/tags/AdvancedSearch\"\n\tbeforeafter=\"after\"\n\tdefaultState=\"$:/core/ui/AdvancedSearch/System\"\n\tactions=\"<$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=<<nextTab>>/>\"\n/>\n\\end\n\n\\procedure set-previous-input-tab()\n<$transclude $variable=\"change-input-tab\"\n\tstateTitle=\"$:/state/tab--1498284803\"\n\ttag=\"$:/tags/AdvancedSearch\"\n\tbeforeafter=\"before\"\n\tdefaultState=\"$:/core/ui/AdvancedSearch/System\"\n\tactions=\"<$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=<<nextTab>>/>\"\n/>\n\\end\n\n\\procedure cancel-search-actions()\n\\whitespace trim\n<$list filter=\"[{$:/temp/advancedsearch/input}!match{$:/temp/advancedsearch}]\">\n\t<$list-empty>\n\t\t<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\"/>\n\t</$list-empty>\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/>\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/>\n</$list>\n\\end\n\n\\procedure input-accept-actions()\n\\whitespace trim\n<$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\">\n\t<$list-empty>\n\t\t<$list filter=\"[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]\">\n\t\t\t<$action-navigate $to={{{ [<tiddler>get[text]] }}}/>\n\t\t</$list>\n\t<$/list-empty>\n\t<$action-navigate $to={{{ [<tiddler>get[text]] }}}/>\n</$list>\n\\end\n\n\\procedure input-accept-variant-actions()\n\\whitespace trim\n<$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\">\n\t<$list-empty>\n\t\t<$list filter=\"[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]\">\n\t\t\t<$list filter=\"[<__tiddler__>get[text]minlength[1]]\">\n\t\t\t\t<$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<tiddler>get[text]] }}}/>\n\t\t\t</$list>\n\t\t</$list>\n\t</$list-empty>\n\t<$list filter=\"[<tiddler>get[text]minlength[1]]\">\n\t\t<$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<tiddler>get[text]] }}}/>\n\t</$list>\n</$list>\n\\end\n\n\\whitespace trim\n\n<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n\t<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>> class=\"tc-small-gap-right\">\n\t\t<$keyboard key=\"((input-tab-left))\" actions=<<set-previous-input-tab>>>\n\t\t\t<$transclude $variable=\"keyboard-driven-input\"\n\t\t\t\ttiddler=\"$:/temp/advancedsearch/input\"\n\t\t\t\tstoreTitle=\"$:/temp/advancedsearch\"\n\t\t\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\"\n\t\t\t\tselectionStateTitle=\"$:/temp/advancedsearch/selected-item\"\n\t\t\t\ttype=\"search\"\n\t\t\t\ttag=\"input\"\n\t\t\t\tfocus={{$:/config/Search/AutoFocus}}\n\t\t\t\tconfigTiddlerFilter=\"[[$:/temp/advancedsearch]]\"\n\t\t\t\tfirstSearchFilterField=\"text\"\n\t\t\t\tinputAcceptActions=<<input-accept-actions>>\n\t\t\t\tinputAcceptVariantActions=<<input-accept-variant-actions>>\n\t\t\t\tinputCancelActions=<<cancel-search-actions>>\n\t\t\t/>\n\t\t</$keyboard>\n\t</$keyboard>\n\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]\">\n\t\t<$transclude/>\n\t</$list>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\" tag=\"div\" class=\"tc-search-results\">\n\t<$set name=\"resultCount\" value=\"<$count filter={{$:/temp/advancedsearch}}/>\">\n\t\t<p><<lingo Filter/Matches>></p>\n\t\t<$list filter={{$:/temp/advancedsearch}}>\n\t\t\t<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] :and[then[]else[tc-list-item-selected]] }}}>\n\t\t\t\t<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n\t\t\t</span>\n\t\t</$list>\n\t</$set>\n</$reveal>\n"},"$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear":{"title":"$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear","tags":"$:/tags/AdvancedSearch/FilterButton","text":"\\whitespace trim\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n"},"$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete":{"title":"$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete","tags":"$:/tags/AdvancedSearch/FilterButton","text":"\\whitespace trim\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/DeleteTiddlers/Hint}} popup=<<qualify \"$:/state/filterDeleteDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/delete-button}}\n</$button>\n</$reveal>\n\n<$reveal state=<<qualify \"$:/state/filterDeleteDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<div class=\"tc-dropdown-item-plain\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\n{{$:/language/ConfirmDeleteTiddlers}}\n</$set>\n</div>\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn\">\n<$action-deletetiddler $filter={{$:/temp/advancedsearch}}/>\n{{$:/language/Buttons/DeleteTiddlers/Hint}}\n</$button>\n</div>\n</div>\n</div>\n</$reveal>\n"},"$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown":{"title":"$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown","tags":"$:/tags/AdvancedSearch/FilterButton","text":"\\whitespace trim\n\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</span>\n\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher actions=\"<$action-setfield $tiddler='$:/temp/advancedsearch' text=<<navigateTo>>/><$action-setfield $tiddler='$:/temp/advancedsearch/input' text=<<navigateTo>>/><$action-setfield $tiddler='$:/temp/advancedsearch/refresh' text='yes'/><$action-sendmessage $message='tm-focus-selector' $param='.tc-advanced-search input' />\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Filter]!is[draft]]\">\n<$link to={{!!filter}}><$let tv-wikilinks=\"no\"><$transclude field=\"description\"/></$let></$link>\n</$list>\n</div>\n</div>\n</$linkcatcher>\n</$set>\n</$reveal>\n"},"$:/core/ui/AdvancedSearch/Filter/FilterButtons/export":{"title":"$:/core/ui/AdvancedSearch/Filter/FilterButtons/export","tags":"$:/tags/AdvancedSearch/FilterButton","text":"\\whitespace trim\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$macrocall $name=\"exportButton\" exportFilter={{$:/temp/advancedsearch}} lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>\n</$reveal>\n"},"$:/core/ui/AdvancedSearch/Shadows":{"title":"$:/core/ui/AdvancedSearch/Shadows","tags":"$:/tags/AdvancedSearch","caption":"{{$:/language/Search/Shadows/Caption}}","first-search-filter":"[all[shadows]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]","text":"\\procedure lingo-base() $:/language/Search/\n\n\\procedure set-next-input-tab()\n<$transclude $variable=\"change-input-tab\"\n\tstateTitle=\"$:/state/tab--1498284803\"\n\ttag=\"$:/tags/AdvancedSearch\"\n\tbeforeafter=\"after\"\n\tdefaultState=\"$:/core/ui/AdvancedSearch/System\"\n\tactions=\"<$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=<<nextTab>>/>\"/>\n\\end\n\n\\procedure set-previous-input-tab()\n<$transclude $variable=\"change-input-tab\"\n\tstateTitle=\"$:/state/tab--1498284803\"\n\ttag=\"$:/tags/AdvancedSearch\"\n\tbeforeafter=\"before\"\n\tdefaultState=\"$:/core/ui/AdvancedSearch/System\"\n\tactions=\"<$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=<<nextTab>>/>\"/>\n\\end\n\n\\procedure cancel-search-actions()\n\\whitespace trim\n<$list\n\tfilter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\"\n\temptyMessage=\"<$action-deletetiddler $filter='[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]' />\">\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/>\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/>\n</$list>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-advanced-search input\"/>\n\\end\n\n\\procedure input-accept-actions()\n\\whitespace trim\n<$list\n\tfilter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\"\n\temptyMessage=\"<$list filter='[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]'><$action-navigate $to={{{ [<tiddler>get[text]] }}}/></$list>\">\n\t<$action-navigate $to={{{ [<tiddler>get[text]] }}}/>\n</$list>\n\\end\n\n\\procedure input-accept-variant-actions()\n\\whitespace trim\n<$list\n\tfilter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\"\n\temptyMessage=\"<$list filter='[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]'><$list filter='[<tiddler>get[text]minlength[1]]'><$action-sendmessage $message='tm-edit-tiddler' $param={{{  [<tiddler>get[text]] }}}/></$list></$list>\">\n\t<$list filter=\"[<tiddler>get[text]minlength[1]]\">\n\t\t<$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<tiddler>get[text]] }}}/>\n</$list></$list>\n\\end\n\n\\whitespace trim\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-previous-input-tab>>>\n<$transclude $variable=\"keyboard-driven-input\"\n\ttiddler=\"$:/temp/advancedsearch/input\"\n\tstoreTitle=\"$:/temp/advancedsearch\"\n\trefreshTitle=\"$:/temp/advancedsearch/refresh\"\n\tselectionStateTitle=\"$:/temp/advancedsearch/selected-item\"\n\ttype=\"search\"\n\ttag=\"input\"\n\tfocus={{$:/config/Search/AutoFocus}}\n\tconfigTiddlerFilter=\"[[$:/core/ui/AdvancedSearch/Shadows]]\"\n\tinputCancelActions=<<cancel-search-actions>>\n\tinputAcceptActions=<<input-accept-actions>>\n\tinputAcceptVariantActions=<<input-accept-variant-actions>>\n\tfilterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n&#32;\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"<div class='tc-search-results'>{{$:/language/Search/Search/TooShort}}</div>\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value={{{ [all[shadows]search{$:/temp/advancedsearch}] :except[[$:/temp/advancedsearch]] :except[[$:/temp/advancedsearch/input]] :and[count[]]}}}>\n\n<div class=\"tc-search-results\">\n\n<%if [<resultCount>match[0]] %>\n\t{{$:/language/Search/Matches/NoMatch}}\n<%else%>\n\t<<lingo Shadows/Matches>>\n<%endif%>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] :else[[$:/temp/advancedsearch]] :else[[$:/temp/advancedsearch/input]]\">\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] :else[[$:/temp/advancedsearch/selected-item]get[text]] :and[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"},"$:/core/ui/AdvancedSearch/Standard":{"title":"$:/core/ui/AdvancedSearch/Standard","tags":"$:/tags/AdvancedSearch","caption":"{{$:/language/Search/Standard/Caption}}","text":"\\procedure lingo-base() $:/language/Search/\n\\procedure set-next-input-tab() <$transclude $variable=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"after\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"<$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=<<nextTab>>/>\"/>\n\n\\procedure set-previous-input-tab() <$transclude $variable=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"before\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"<$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=<<nextTab>>/>\"/>\n\n\\procedure next-search-tab() <$transclude $variable=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/advancedsearch\" tag=\"$:/tags/SearchResults\" beforeafter=\"after\" defaultState={{$:/config/SearchResults/Default}} actions=\"<$action-setfield $tiddler='$:/state/advancedsearch/standard/currentTab' text=<<nextTab>>/>\"/>\n\n\\procedure previous-search-tab() <$transclude $variable=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/advancedsearch\" tag=\"$:/tags/SearchResults\" beforeafter=\"before\" defaultState={{$:/config/SearchResults/Default}} actions=\"<$action-setfield $tiddler='$:/state/advancedsearch/standard/currentTab' text=<<nextTab>>/>\"/>\n\n\\procedure cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"<$action-deletetiddler $filter='[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]' />\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-advanced-search input\"/>\n\n\\procedure input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"<$list filter='[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]'><$action-navigate $to={{{ [<tiddler>get[text]] }}}/></$list>\"><$action-navigate $to={{{ [<tiddler>get[text]] }}}/></$list>\n\n\\procedure input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"<$list filter='[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]'><$list filter='[<tiddler>get[text]minlength[1]]'><$action-sendmessage $message='tm-edit-tiddler' $param={{{  [<tiddler>get[text]] }}}/></$list></$list>\"><$list filter=\"[<tiddler>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<tiddler>get[text]] }}}/></$list></$list>\n\n\\whitespace trim\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-previous-input-tab>>>\n<$keyboard key=\"shift-alt-Right\" actions=<<next-search-tab>>>\n<$keyboard key=\"shift-alt-Left\" actions=<<previous-search-tab>>>\n<$transclude $variable=\"keyboard-driven-input\"\n\ttiddler=\"$:/temp/advancedsearch/input\"\n\tstoreTitle=\"$:/temp/advancedsearch\"\n\trefreshTitle=\"$:/temp/advancedsearch/refresh\"\n\tselectionStateTitle=\"$:/temp/advancedsearch/selected-item\"\n\ttype=\"search\"\n\ttag=\"input\"\n\tfocus={{$:/config/Search/AutoFocus}}\n\tinputCancelActions=<<cancel-search-actions>>\n\tinputAcceptActions=<<input-accept-actions>>\n\tinputAcceptVariantActions=<<input-accept-variant-actions>>\n\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] :else[{$:/config/SearchResults/Default}]\"\n\tfilterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n&#32;\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$list\n\tfilter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\"\n\temptyMessage=\"<div class='tc-search-results'>{{$:/language/Search/Search/TooShort}}</div>\"\n\tvariable=\"listItem\">\n<$vars\n\tuserInput={{{ [[$:/temp/advancedsearch]get[text]] }}}\n\tconfigTiddler={{{ [[$:/state/advancedsearch/standard/currentTab]!is[missing]get[text]] :else[{$:/config/SearchResults/Default}] }}}\n\tsearchListState=\"$:/temp/advancedsearch/selected-item\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\">\n<$list-empty>\n<$list filter='[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]'><$transclude mode=\"block\"/></$list>\n</$list-empty>\n<$transclude $variable=\"tabs\"\n\ttabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\"\n\tdefault={{$:/config/SearchResults/Default}}\n\tactions=\"<$action-setfield $tiddler='$:/state/advancedsearch/standard/currentTab' text=<<currentTab>>/>\"\n\texplicitState=\"$:/state/tab/search-results/advancedsearch\" />\n</$list>\n</$vars>\n</$list>\n</$reveal>\n"},"$:/core/ui/AdvancedSearch/System":{"title":"$:/core/ui/AdvancedSearch/System","tags":"$:/tags/AdvancedSearch","caption":"{{$:/language/Search/System/Caption}}","first-search-filter":"[is[system]search<userInput>sort[title]limit[250]] :except[[$:/temp/advancedsearch]] :except[[$:/temp/advancedsearch/input]] :except[[$:/temp/advancedsearch/selected-item]]","text":"\\procedure lingo-base() $:/language/Search/\n\\procedure set-next-input-tab()\n<$transclude $variable=\"change-input-tab\"\n\tstateTitle=\"$:/state/tab--1498284803\"\n\ttag=\"$:/tags/AdvancedSearch\"\n\tbeforeafter=\"after\"\n\tdefaultState=\"$:/core/ui/AdvancedSearch/System\"\n\tactions=\"<$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=<<nextTab>>/>\"/>\n\\end\n\n\\procedure set-previous-input-tab()\n<$transclude $variable=\"change-input-tab\"\n\tstateTitle=\"$:/state/tab--1498284803\"\n\ttag=\"$:/tags/AdvancedSearch\"\n\tbeforeafter=\"before\"\n\tdefaultState=\"$:/core/ui/AdvancedSearch/System\"\n\tactions=\"<$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=<<nextTab>>/>\"/>\n\\end\n\n\\procedure cancel-search-actions()\n\\whitespace trim\n<$list\n\tfilter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\"\n\temptyMessage=\"<$action-deletetiddler $filter='[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]' />\">\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/>\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/>\n</$list>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-advanced-search input\"/>\n\\end\n\n\\procedure input-accept-actions()\n\\whitespace trim\n<$list\n\tfilter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\"\n\temptyMessage=\"<$list filter='[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]'><$action-navigate $to={{{ [<tiddler>get[text]] }}}/></$list>\">\n\t<$action-navigate $to={{{ [<tiddler>get[text]] }}}/>\n</$list>\n\\end\n\n\\procedure input-accept-variant-actions()\n\\whitespace trim\n<$list\n\tfilter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\"\n\temptyMessage=\"<$list filter='[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]'><$list filter='[<tiddler>get[text]minlength[1]]'><$action-sendmessage $message='tm-edit-tiddler' $param={{{  [<tiddler>get[text]] }}}/></$list></$list>\">\n\t<$list filter=\"[<tiddler>get[text]minlength[1]]\">\n\t\t<$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<tiddler>get[text]] }}}/>\n</$list></$list>\n\\end\n\n\\whitespace trim\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-previous-input-tab>>>\n<$transclude $variable=\"keyboard-driven-input\"\n\ttiddler=\"$:/temp/advancedsearch/input\"\n\tstoreTitle=\"$:/temp/advancedsearch\"\n\trefreshTitle=\"$:/temp/advancedsearch/refresh\"\n\tselectionStateTitle=\"$:/temp/advancedsearch/selected-item\"\n\ttype=\"search\"\n\ttag=\"input\"\n\tfocus={{$:/config/Search/AutoFocus}}\n\tconfigTiddlerFilter=\"[[$:/core/ui/AdvancedSearch/System]]\"\n\tinputCancelActions=<<cancel-search-actions>>\n\tinputAcceptActions=<<input-accept-actions>>\n\tinputAcceptVariantActions=<<input-accept-variant-actions>>\n\tfilterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n&#32;\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"<div class='tc-search-results'>{{$:/language/Search/Search/TooShort}}</div>\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value={{{ [is[system]search{$:/temp/advancedsearch}] :except[[$:/temp/advancedsearch]] :except[[$:/temp/advancedsearch/input]] :except[[$:/temp/advancedsearch/selected-item]] +[count[]] }}}>\n\n<div class=\"tc-search-results\">\n\n<%if [<resultCount>match[0]] %>\n\t{{$:/language/Search/Matches/NoMatch}}\n<%else%>\n\t<<lingo System/Matches>>\n<%endif%>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] :except[[$:/temp/advancedsearch]] :except[[$:/temp/advancedsearch/input]] :except[[$:/temp/advancedsearch/selected-item]]\">\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] :except[[$:/temp/advancedsearch/selected-item]get[text]] :and[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"},"$:/AdvancedSearch":{"title":"$:/AdvancedSearch","icon":"$:/core/images/advanced-search-button","color":"#bbb","text":"\\whitespace trim\n<div class=\"tc-advanced-search\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" default=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab--1498284803\"/>\n</div>\n"},"$:/core/ui/AlertTemplate":{"title":"$:/core/ui/AlertTemplate","code-body":"yes","text":"\\whitespace trim\n<div class=\"tc-alert\">\n<div class=\"tc-alert-toolbar\">\n<$button class=\"tc-btn-invisible\"><$action-deletetiddler $tiddler=<<currentTiddler>>/>{{$:/core/images/cancel-button}}</$button>\n</div>\n<div class=\"tc-alert-subtitle\">\n<$wikify name=\"format\" text=<<lingo Tiddler/DateFormat>>>\n<$view field=\"component\"/>\n&#32;-&#32;\n<$view field=\"modified\" format=\"date\" template=<<format>>/>\n&#32;\n<$reveal type=\"nomatch\" state=\"!!count\" text=\"\">\n<span class=\"tc-alert-highlight\">\n({{$:/language/Count}}:&#32;<$view field=\"count\"/>)\n</span>\n</$reveal>\n</$wikify>\n</div>\n<div class=\"tc-alert-body\">\n\n<$transclude/>\n\n</div>\n</div>\n"},"$:/core/ui/BinaryWarning":{"title":"$:/core/ui/BinaryWarning","text":"\\define lingo-base() $:/language/BinaryWarning/\n<<lingo Prompt>>\n"},"$:/core/ui/VisibleTransclude":{"title":"$:/core/ui/VisibleTransclude","text":"<!--\nImport this component to make all the child transclusions visible.\n\nBlock transclusions are shown in red, and inline transclusions are shown in green.\n-->\n\\widget $transclude()\n<!-- Use a parameters widget so that we can access the `$params` data -->\n<$parameters tiddler=\"\" $$tiddler=\"\" mode=\"\" $$mode=\"\" $parseMode=\"@parseMode\" $params=\"@params\">\n\t<!-- Replicate the logic of the transclude widget to determine the output mode, and hence the tag and colour to use for output -->\n\t<$let\n\t\tmode={{{ [[$mode]is[variable]then<$mode>!is[blank]] :else[[mode]is[variable]then<mode>!is[blank]] :else[<@parseMode>] }}}\n\t\toutputTag={{{ [<mode>match[inline]then[span]else[div]] }}}\n\t\toutputColour={{{ [<mode>match[inline]then[green]else[red]] }}}\n\t>\n\t\t<!-- Use divs or spans according to the mode -->\n\t\t<$genesis $type=<<outputTag>> style=\"color:white;padding:4px;\" style.background=<<outputColour>>>\n\t\t\t<$genesis $type=<<outputTag>> style=\"display: inline-block;\">\n\t\t\t\t<div style=\"background:white;color:black;font-size: 12px;line-height:1.2;text-align:left;font-weight:normal;padding:4px;margin:4px;\">\n\t\t\t\t\t<!-- Render the parameters to the transclusion -->\n\t\t\t\t\t<$list filter=\"[<@params>jsonindexes[]]\" emptyMessage=\"(none)\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<$text text=<<currentTiddler>>/><$text text=\": \"/><$text text={{{ [<@params>jsonget<currentTiddler>] }}}/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</$list>\n\t\t\t\t</div>\n\t\t\t</$genesis>\n\t\t\t<$genesis $type=<<outputTag>> style=\"background:white;color:black;padding:4px;\">\n\t\t\t\t<!-- Look for a parameter starting with $ to determine if we are in legacy mode -->\n\t\t\t\t<$list filter=\"[<@params>jsonindexes[]] :filter[<currentTiddler>prefix[$]] +[limit[1]]\" variable=\"ignore\" emptyMessage=\"\"\"\n\t\t\t\t\t<!-- Legacy mode: we render the transclusion without a dollar sign for recursionMarker and mode -->\n\t\t\t\t\t<$genesis $type=\"$transclude\" $remappable=\"no\" $names=\"[<@params>jsonindexes[]]\" $values=\"[<@params>jsonindexes[]] :map[<@params>jsonget<currentTiddler>]\" recursionMarker=\"no\" mode=<<mode>> $$fillignore=\"yes\">\n\t\t\t\t\t\t<!-- Reach back up to the grandparent transclusion to get the correct slot value -->\n\t\t\t\t\t\t<$slot $name=\"ts-raw\"/>\n\t\t\t\t\t</$genesis>\n\t\t\t\t\"\"\">\n\t\t\t\t\t<!-- Non-legacy mode: we use dollar signs for the recursionMarker and mode -->\n\t\t\t\t\t<$genesis $type=\"$transclude\" $remappable=\"no\" $names=\"[<@params>jsonindexes[]]\" $values=\"[<@params>jsonindexes[]] :map[<@params>jsonget<currentTiddler>]\" $$recursionMarker=\"no\" $$mode=<<mode>> $$fillignore=\"yes\">\n\t\t\t\t\t\t<!-- Reach back up to the grandparent transclusion to get the correct slot fill value -->\n\t\t\t\t\t\t<$slot $name=\"ts-raw\"/>\n\t\t\t\t\t</$genesis>\n\t\t\t\t</$list>\n\t\t\t</$genesis>\n\t\t</$genesis>\n\t</$let>\n</$parameters>\n\\end\n"},"$:/core/ui/Components/plugin-info":{"title":"$:/core/ui/Components/plugin-info","text":"\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define popup-state-macro()\n$(qualified-state)$-$(currentTiddler)$\n\\end\n\n\\define tabs-state-macro()\n$(popup-state)$-$(pluginInfoType)$\n\\end\n\n\\define plugin-icon-title()\n$(currentTiddler)$/icon\n\\end\n\n\\define plugin-disable-title()\n$:/config/Plugins/Disabled/$(currentTiddler)$\n\\end\n\n\\define plugin-table-body(type,disabledMessage,default-popup-state)\n\\whitespace trim\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n\t<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n\t\t<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n\t\t\t{{$:/core/images/chevron-right}}\n\t\t</$button>\n\t</$reveal>\n\t<$reveal type=\"match\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n\t\t<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n\t\t\t{{$:/core/images/chevron-down}}\n\t\t</$button>\n\t</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n\t<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>\n\t\t<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\n\t</$transclude>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n\t<h1>\n\t\t''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'':&nbsp;<$view field=\"description\"><$view field=\"title\"/></$view>&nbsp;$disabledMessage$\n\t</h1>\n\t<h2>\n\t\t<$view field=\"title\"/>\n\t</h2>\n\t<h2>\n\t\t<div>\n\t\t\t<%if [<currentTiddler>get[stability]match[STABILITY_0_DEPRECATED]] %>\n\t\t\t\t<span class=\"tc-plugin-info-stability tc-plugin-info-stability-deprecated\"><<lingo \"Stability/Deprecated\">></span>\n\t\t\t<%elseif [<currentTiddler>get[stability]match[STABILITY_1_EXPERIMENTAL]] %>\n\t\t\t\t<span class=\"tc-plugin-info-stability tc-plugin-info-stability-experimental\"><<lingo \"Stability/Experimental\">></span>\n\t\t\t<%elseif [<currentTiddler>get[stability]match[STABILITY_2_STABLE]] %>\n\t\t\t\t<span class=\"tc-plugin-info-stability tc-plugin-info-stability-stable\"><<lingo \"Stability/Stable\">></span>\n\t\t\t<%elseif [<currentTiddler>get[stability]match[STABILITY_3_LEGACY]] %>\n\t\t\t\t<span class=\"tc-plugin-info-stability tc-plugin-info-stability-legacy\"><<lingo \"Stability/Legacy\">></span>\n\t\t\t<%endif%>\n\t\t\t<em><$view field=\"version\"/></em></div>\n\t</h2>\n</div>\n\\end\n\n\\define plugin-info(type,default-popup-state)\n\\whitespace trim\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n\t<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n\t\t<$link to={{!!title}} class=\"tc-plugin-info\">\n\t\t\t<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\">>\n\t\t</$link>\n\t</$reveal>\n\t<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n\t\t<$link to={{!!title}} class=\"tc-plugin-info tc-plugin-info-disabled\">\n\t\t\t<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\" disabledMessage:\"<$macrocall $name='lingo' title='Disabled/Status'/>\">>\n\t\t</$link>\n\t</$reveal>\n\t<$reveal type=\"match\" text=\"yes\" state=<<popup-state>> default=\"\"\"$default-popup-state$\"\"\">\n\t\t<div class=\"tc-plugin-info-dropdown\">\n\t\t\t<div class=\"tc-plugin-info-dropdown-body\">\n\t\t\t\t<$list filter=\"[all[current]] -[[$:/core]]\">\n\t\t\t\t\t<div style=\"float:right;\">\n\t\t\t\t\t\t<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n\t\t\t\t\t\t\t<$button set=<<plugin-disable-title>> setTo=\"yes\" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>\n\t\t\t\t\t\t\t\t<<lingo Disable/Caption>>\n\t\t\t\t\t\t\t</$button>\n\t\t\t\t\t\t</$reveal>\n\t\t\t\t\t\t<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n\t\t\t\t\t\t\t<$button set=<<plugin-disable-title>> setTo=\"no\" tooltip={{$:/language/ControlPanel/Plugins/Enable Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>\n\t\t\t\t\t\t\t\t<<lingo Enable/Caption>>\n\t\t\t\t\t\t\t</$button>\n\t\t\t\t\t\t</$reveal>\n\t\t\t\t\t</div>\n\t\t\t\t</$list>\n\t\t\t\t<$set name=\"tabsList\" filter=\"[<currentTiddler>list[]] contents\">\n\t\t\t\t\t<$macrocall $name=\"tabs\" state=<<tabs-state-macro>> tabsList=<<tabsList>> default={{{ [enlist<tabsList>] }}} template=\"$:/core/ui/PluginInfo\"/>\n\t\t\t\t</$set>\n\t\t\t</div>\n\t\t</div>\n\t</$reveal>\n</$set>\n\\end\n\n<$macrocall $name=\"plugin-info\" type=<<plugin-type>> default-popup-state=<<default-popup-state>>/>\n"},"$:/core/ui/Components/tag-link":{"title":"$:/core/ui/Components/tag-link","text":"\\whitespace trim\n<$link>\n<$set name=\"backgroundColor\" value={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}>\n<span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\"/>\n</span>\n</$set>\n</$link>"},"$:/core/ui/ControlPanel/Advanced":{"title":"$:/core/ui/ControlPanel/Advanced","tags":"$:/tags/ControlPanel/Info","caption":"{{$:/language/ControlPanel/Advanced/Caption}}","text":"\\whitespace trim\n{{$:/language/ControlPanel/Advanced/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/TiddlerFields\" explicitState=\"$:/state/tab--959111941\"/>\n</div>\n"},"$:/core/ui/ControlPanel/Appearance":{"title":"$:/core/ui/ControlPanel/Appearance","tags":"$:/tags/ControlPanel","caption":"{{$:/language/ControlPanel/Appearance/Caption}}","text":"\\whitespace trim\n{{$:/language/ControlPanel/Appearance/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Theme\" explicitState=\"$:/state/tab--1963855381\"/>\n</div>\n"},"$:/snippets/retain-story-ordering-button":{"title":"$:/snippets/retain-story-ordering-button","text":"<$button set=\"$:/DefaultTiddlers\" setTo={{$:/config/ControlPanel/Basics/DefaultTiddlers/RetainStory}} ><<currentTiddler>></$button>"},"$:/core/ui/ControlPanel/Basics":{"title":"$:/core/ui/ControlPanel/Basics","tags":"$:/tags/ControlPanel/Info","caption":"{{$:/language/ControlPanel/Basics/Caption}}","text":"\\procedure lingo-base() $:/language/ControlPanel/Basics/\n\\whitespace trim\n\n|tc-max-width tc-edit-max-width|k\n|<<lingo Version/Prompt>> |''<<version>>'' |\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/status/UserName\"><<lingo Username/Prompt>></$link> |<$edit-text tiddler=\"$:/status/UserName\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/AnimationDuration\"><<lingo AnimDuration/Prompt>></$link> |<$edit-text tiddler=\"$:/config/AnimationDuration\" default=\"\" tag=\"input\" type=\"number\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit class=\"tc-edit-texteditor\" tiddler=\"$:/DefaultTiddlers\" autoHeight=\"yes\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n|<$link to=\"$:/language/DefaultNewTiddlerTitle\"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/language/DefaultNewTiddlerTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Title\"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Title\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Text\"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler=\"$:/config/NewJournal/Text\" class=\"tc-edit-texteditor\" default=\"\" autoHeight=\"yes\"/> |\n|<$link to=\"$:/config/NewTiddler/Tags\"><<lingo NewTiddler/Tags/Prompt>></$link> |<$vars currentTiddler=\"$:/config/NewTiddler/Tags\" tagField=\"text\">{{||$:/core/ui/EditTemplate/tags}}<$list filter=\"[<currentTiddler>tags[]] +[limit[1]]\" variable=\"ignore\"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field=\"text\" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=\"\"/></$button></$list></$vars> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$vars currentTiddler=\"$:/config/NewJournal/Tags\" tagField=\"text\">{{||$:/core/ui/EditTemplate/tags}}<$list filter=\"[<currentTiddler>tags[]] +[limit[1]]\" variable=\"ignore\"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field=\"text\" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=\"\"/></$button></$list></$vars> |\n|<$link to=\"$:/config/AutoFocus\"><<lingo AutoFocus/Prompt>></$link> |{{$:/snippets/minifocusswitcher}} |\n|<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} |\n|<<lingo Tiddlers/Prompt>> |<<show-filter-count \"[!is[system]sort[title]]\">> |\n|<<lingo Tags/Prompt>> |<<show-filter-count \"[tags[]sort[title]]\">> |\n|<<lingo SystemTiddlers/Prompt>> |<<show-filter-count \"[is[system]sort[title]]\">> |\n|<<lingo ShadowTiddlers/Prompt>> |<<show-filter-count \"[all[shadows]sort[title]]\">> |\n|<<lingo OverriddenShadowTiddlers/Prompt>> |<<show-filter-count \"[is[tiddler]is[shadow]sort[title]]\">> |\n"},"$:/core/ui/ControlPanel/EditTemplateBody":{"title":"$:/core/ui/ControlPanel/EditTemplateBody","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/EditTemplateBody/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/EditTemplateBody/\n\n<<lingo Hint>>\n\n{{$:/tags/EditTemplateBodyFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/FieldEditor":{"title":"$:/core/ui/ControlPanel/FieldEditor","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/FieldEditor/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/FieldEditor/\n\n<<lingo Hint>>\n\n{{$:/tags/FieldEditorFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/StoryTiddler":{"title":"$:/core/ui/ControlPanel/StoryTiddler","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/StoryTiddler/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/StoryTiddler/\n\n<<lingo Hint>>\n\n{{$:/tags/StoryTiddlerTemplateFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/TiddlerColour":{"title":"$:/core/ui/ControlPanel/TiddlerColour","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/TiddlerColour/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/TiddlerColour/\n\n<<lingo Hint>>\n\n{{$:/tags/TiddlerColourFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/TiddlerIcon":{"title":"$:/core/ui/ControlPanel/TiddlerIcon","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/TiddlerIcon/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/TiddlerIcon/\n\n<<lingo Hint>>\n\n{{$:/tags/TiddlerIconFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/ViewTemplateBody":{"title":"$:/core/ui/ControlPanel/ViewTemplateBody","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/ViewTemplateBody/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/ViewTemplateBody/\n\n<<lingo Hint>>\n\n{{$:/tags/ViewTemplateBodyFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/ViewTemplateSubtitle":{"title":"$:/core/ui/ControlPanel/ViewTemplateSubtitle","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/ViewTemplateSubtitle/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/ViewTemplateSubtitle/\n\n<<lingo Hint>>\n\n{{$:/tags/ViewTemplateSubtitleFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/ViewTemplateTags":{"title":"$:/core/ui/ControlPanel/ViewTemplateTags","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/ViewTemplateTags/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/ViewTemplateTags/\n\n<<lingo Hint>>\n\n{{$:/tags/ViewTemplateTagsFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/ViewTemplateTitle":{"title":"$:/core/ui/ControlPanel/ViewTemplateTitle","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/ViewTemplateTitle/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/ViewTemplateTitle/\n\n<<lingo Hint>>\n\n{{$:/tags/ViewTemplateTitleFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/Cascades":{"title":"$:/core/ui/ControlPanel/Cascades","tags":"$:/tags/ControlPanel/Advanced","caption":"{{$:/language/ControlPanel/Cascades/Caption}}","text":"\\whitespace trim\n{{$:/language/ControlPanel/Cascades/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Cascades]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/StoryTiddler\"/>\n</div>\n"},"$:/core/ui/ControlPanel/EditorTypes":{"title":"$:/core/ui/ControlPanel/EditorTypes","tags":"$:/tags/ControlPanel/Advanced","caption":"{{$:/language/ControlPanel/EditorTypes/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/EditorTypes/\n\\whitespace trim\n\n<<lingo Hint>>\n\n<table>\n<tbody>\n<tr>\n<th><<lingo Type/Caption>></th>\n<th><<lingo Editor/Caption>></th>\n</tr>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/config/EditorTypeMappings/]sort[title]]\">\n<tr>\n<td>\n<$link>\n<$list filter=\"[all[current]removeprefix[$:/config/EditorTypeMappings/]]\">\n<$text text={{!!title}}/>\n</$list>\n</$link>\n</td>\n<td>\n<$view field=\"text\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"},"$:/core/ui/ControlPanel/Info":{"title":"$:/core/ui/ControlPanel/Info","tags":"$:/tags/ControlPanel","caption":"{{$:/language/ControlPanel/Info/Caption}}","text":"\\whitespace trim\n{{$:/language/ControlPanel/Info/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Basics\" explicitState=\"$:/state/tab--2112689675\"/>\n</div>\n"},"$:/core/ui/ControlPanel/KeyboardShortcuts":{"title":"$:/core/ui/ControlPanel/KeyboardShortcuts","tags":"$:/tags/ControlPanel","caption":"{{$:/language/ControlPanel/KeyboardShortcuts/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/KeyboardShortcuts/\n\n\\define new-shortcut(title)\n\\whitespace trim\n<div class=\"tc-dropdown-item-plain\">\n<$edit-shortcut tiddler=\"$title$\" placeholder={{$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt}} focus=\"true\" style=\"width:auto;\"/>\n&#32;\n<$button>\n<<lingo Add/Caption>>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"[{$title$}]\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"$title$\"\n/>\n</$button>\n</div>\n\\end\n\n\\define shortcut-list-item(caption)\n\\whitespace trim\n<td>\n</td>\n<td style=\"text-align:right;font-size:0.7em;\">\n<<lingo Platform/$caption$>>\n</td>\n<td>\n<div style=\"position:relative;\">\n<$button popup=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> class=\"tc-btn-invisible\">\n{{$:/core/images/edit-button}}\n</$button>\n&#32;\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutTitle)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\n<$reveal state=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown tc-popup-keep\">\n<$list\n\tfilter=\"[list[$(shortcutTitle)$!!text]sort[title]]\"\n\tvariable=\"shortcut\"\n\temptyMessage=\"<div class='tc-dropdown-item-plain'>//<<lingo NoShortcuts/Caption>>//</div>\">\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint}}>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"+[remove<shortcut>]\"\n/>\n<small>{{$:/core/images/close-button}}</small>\n</$button>\n&#32;\n<kbd>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts=<<shortcut>>/>\n</kbd>\n</div>\n</$list>\n<hr/>\n<$macrocall $name=\"new-shortcut\" title=<<qualify \"$:/state/new-shortcut/$(shortcutTitle)$\">>/>\n</div>\n</div>\n</$reveal>\n</div>\n</td>\n\\end\n\n\\define shortcut-list(caption,prefix)\n\\whitespace trim\n<tr>\n<$list filter=\"[[$prefix$$(shortcutName)$]]\" variable=\"shortcutTitle\">\n<<shortcut-list-item \"$caption$\">>\n</$list>\n</tr>\n\\end\n\n\\define shortcut-editor()\n\\whitespace trim\n<<shortcut-list \"All\" \"$:/config/shortcuts/\">> \n<<shortcut-list \"Mac\" \"$:/config/shortcuts-mac/\">>\n<<shortcut-list \"NonMac\" \"$:/config/shortcuts-not-mac/\">>\n<<shortcut-list \"Linux\" \"$:/config/shortcuts-linux/\">>\n<<shortcut-list \"NonLinux\" \"$:/config/shortcuts-not-linux/\">>\n<<shortcut-list \"Windows\" \"$:/config/shortcuts-windows/\">>\n<<shortcut-list \"NonWindows\" \"$:/config/shortcuts-not-windows/\">>\n\\end\n\n\\define shortcut-preview()\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutPrefix)$$(shortcutName)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\\end\n\n\\define shortcut-item-inner()\n\\whitespace trim\n<tr>\n<td>\n<$reveal type=\"nomatch\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"open\"\n/>\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"close\"\n/>\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n&#32;\n''<$text text=<<shortcutName>>/>''\n</td>\n<td>\n<$transclude tiddler=\"$:/config/ShortcutInfo/$(shortcutName)$\"/>\n</td>\n<td>\n<$list filter=\"$:/config/shortcuts/ $:/config/shortcuts-mac/ $:/config/shortcuts-not-mac/ $:/config/shortcuts-linux/ $:/config/shortcuts-not-linux/ $:/config/shortcuts-windows/ $:/config/shortcuts-not-windows/\" variable=\"shortcutPrefix\">\n<<shortcut-preview>>\n</$list>\n</td>\n</tr>\n<$set name=\"dropdownState\" value={{$(dropdownStateTitle)$}}>\n<$list filter=\"[<dropdownState>match[open]]\" variable=\"listItem\">\n<<shortcut-editor>>\n</$list>\n</$set>\n\\end\n\n\\define shortcut-item()\n\\whitespace trim\n<$set name=\"dropdownStateTitle\" value=<<qualify \"$:/state/dropdown/keyboardshortcut/$(shortcutName)$\">>>\n<<shortcut-item-inner>>\n</$set>\n\\end\n\\whitespace trim\n\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]removeprefix[$:/config/ShortcutInfo/]]\" variable=\"shortcutName\">\n<<shortcut-item>>\n</$list>\n</tbody>\n</table>\n"},"$:/core/ui/ControlPanel/LoadedModules":{"title":"$:/core/ui/ControlPanel/LoadedModules","tags":"$:/tags/ControlPanel/Advanced","caption":"{{$:/language/ControlPanel/LoadedModules/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/\n<<lingo LoadedModules/Hint>>\n\n{{$:/snippets/modules}}\n"},"$:/core/ui/ControlPanel/Modals/AddPlugins":{"title":"$:/core/ui/ControlPanel/Modals/AddPlugins","subtitle":"{{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/Add/Caption}}","text":"\\define install-plugin-actions()\n\\whitespace trim\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url={{!!url}} title={{$(assetInfo)$!!original-title}}/>\n<$set name=\"url\" value={{!!url}}>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]\" variable=\"dependency\">\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url=<<url>> title=<<dependency>>/>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define install-plugin-button()\n\\whitespace trim\n<div>\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$set name=\"reinstall-type\" value={{{ [<libraryVersion>compare:version:eq<installedVersion>then[tc-reinstall]] [<libraryVersion>compare:version:gt<installedVersion>then[tc-reinstall-upgrade]] [<libraryVersion>compare:version:lt<installedVersion>then[tc-reinstall-downgrade]] }}}>\n<$button actions=<<install-plugin-actions>> class={{{ [<assetInfo>get[original-title]has[version]then<reinstall-type>] tc-btn-invisible tc-install-plugin +[join[ ]] }}}>\n{{$:/core/images/download-button}}\n&#32;\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Install/Caption}}\">\n<$list filter=\"[<libraryVersion>compare:version:gt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"\n\\whitespace trim\n<$list filter='[<libraryVersion>compare:version:lt<installedVersion>]' variable='ignore' emptyMessage='{{$:/language/ControlPanel/Plugins/Reinstall/Caption}}'>\n{{$:/language/ControlPanel/Plugins/Downgrade/Caption}}\n</$list>\n\">\n{{$:/language/ControlPanel/Plugins/Update/Caption}}\n</$list>\n</$list>\n</$button>\n<div>\n</div>\n<$reveal stateTitle=<<assetInfo>> stateField=\"requires-reload\" type=\"match\" text=\"yes\">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}</$reveal>\n</$set>\n</$set>\n</$set>\n</div>\n\\end\n\n\\define popup-state-macro()\n$:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$\n\\end\n\n\\define display-plugin-info(type)\n\\whitespace trim\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<div class=\"tc-plugin-info\">\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$list filter=\"[<assetInfo>has[icon]]\" emptyMessage=\"\"\"<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\"\"\">\n<img src={{$(assetInfo)$!!icon}}/>\n</$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1><strong><$text text={{{ [<assetInfo>get[name]] ~[<assetInfo>get[original-title]split[/]last[1]] }}}/></strong>:\n&#32;\n<$view tiddler=<<assetInfo>> field=\"description\"/>\n</h1>\n<h2><$view tiddler=<<assetInfo>> field=\"original-title\"/></h2>\n<div>\n<%if [<assetInfo>get[stability]match[STABILITY_0_DEPRECATED]] %>\n\t<span class=\"tc-plugin-info-stability tc-plugin-info-stability-deprecated\">{{$:/language/ControlPanel/Plugins/Stability/Deprecated}}</span>\n<%elseif [<assetInfo>get[stability]match[STABILITY_1_EXPERIMENTAL]] %>\n\t<span class=\"tc-plugin-info-stability tc-plugin-info-stability-experimental\">{{$:/language/ControlPanel/Plugins/Stability/Experimental}}</span>\n<%elseif [<assetInfo>get[stability]match[STABILITY_2_STABLE]] %>\n\t<span class=\"tc-plugin-info-stability tc-plugin-info-stability-stable\">{{$:/language/ControlPanel/Plugins/Stability/Stable}}</span>\n<%elseif [<assetInfo>get[stability]match[STABILITY_3_LEGACY]] %>\n\t<span class=\"tc-plugin-info-stability tc-plugin-info-stability-legacy\">{{$:/language/ControlPanel/Plugins/Stability/Legacy}}</span>\n<%endif%>\n<em><$view tiddler=<<assetInfo>> field=\"version\"/></em></div>\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\"><div><em>{{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}}</em></div></$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-buttons\">\n<<install-plugin-button>>\n</div>\n</div>\n<$set name=\"original-title\" value={{{ [<assetInfo>get[original-title]] }}}>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]] ~[<assetInfo>get[original-title]!is[tiddler]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-dropdown-message\">\n<$list filter=\"[<assetInfo>get[original-title]!is[tiddler]]\">\n{{$:/language/ControlPanel/Plugins/NotInstalled/Hint}}\n</$list>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]]\" variable=\"ignore\">\n<div>\n{{$:/language/ControlPanel/Plugins/AlsoRequires}}&#32;\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]\" variable=\"dependency\">\n<$text text=<<dependency>>/>&#32;\n</$list>\n</div>\n</$list>\n</$set>\n</div>\n</$list>\n<div class=\"tc-plugin-info-dropdown-body\">\n<$transclude tiddler=<<assetInfo>> field=\"readme\" mode=\"block\"/>\n</div>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-sub-plugins\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[name]]\" variable=\"assetInfo\">\n<<display-plugin-info \"$type$\">>\n</$list>\n</div>\n</$list>\n</div>\n</$reveal>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<$reveal type=\"nomatch\" text=\"yes\" state=<<popup-state>> tag=\"div\" class=\"tc-plugin-info-sub-plugin-indicator\">\n<$wikify name=\"count\" text=\"\"\"<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>]\"/>\"\"\">\n<$button class=\"tc-btn-invisible\" set=<<popup-state>> setTo=\"yes\">\n{{$:/language/ControlPanel/Plugins/SubPluginPrompt}}\n</$button>\n</$wikify>\n</$reveal>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define load-plugin-library-button()\n\\whitespace trim\n<$list filter=\"[<currentTiddler>get[enabled]else[yes]match[yes]]\" variable=\"ignore\">\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-load-plugin-library\" url={{!!url}} infoTitlePrefix=\"$:/temp/RemoteAssetInfo/\"/>\n{{$:/core/images/chevron-right}}&#32;{{$:/language/ControlPanel/Plugins/OpenPluginLibrary}}\n</$button>\n</$list>\n\\end\n\n\\define display-server-assets(type)\n\\whitespace trim\n{{$:/language/Search/Search}}:\n&#32;\n<$edit-text tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" default=\"\" type=\"search\" tag=\"input\"/>\n&#32;\n<$reveal state=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<div class=\"tc-plugin-library-listing\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[name]]\" variable=\"assetInfo\">\n<$list filter=\"[[$:/temp/RemoteAssetSearch/$(currentTiddler)$]has[text]] ~[<assetInfo>!has[parent-plugin]]\" variable=\"ignore\"><!-- Hide sub-plugins if we're not searching -->\n<<display-plugin-info \"$type$\">>\n</$list>\n</$list>\n</div>\n\\end\n\n\\define display-server-connection()\n\\whitespace trim\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/ServerConnection]suffix{!!url}]\" variable=\"connectionTiddler\" emptyMessage=<<load-plugin-library-button>>>\n\n<$set name=\"transclusion\" value=<<connectionTiddler>>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Add/Plugins\">>\n\n</$set>\n\n</$list>\n\\end\n\n\\define close-library-button()\n\\whitespace trim\n<$reveal type='nomatch' state='$:/temp/ServerConnection/$(PluginLibraryURL)$' text=''>\n<$button class='tc-btn-big-green'>\n<$action-sendmessage $message=\"tm-unload-plugin-library\" url={{!!url}}/>\n{{$:/core/images/chevron-left}}&#32;{{$:/language/ControlPanel/Plugins/ClosePluginLibrary}}\n<$action-deletetiddler $filter=\"[prefix[$:/temp/ServerConnection/$(PluginLibraryURL)$]][prefix[$:/temp/RemoteAssetInfo/$(PluginLibraryURL)$]]\"/>\n</$button>\n</$reveal>\n\\end\n\n\\define plugin-library-listing()\n\\whitespace trim\n<div class=\"tc-tab-set\">\n<$set name=\"defaultTab\" value={{{ [all[tiddlers+shadows]tag[$:/tags/PluginLibrary]] }}}>\n<div class=\"tc-tab-buttons\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$button set=<<qualify \"$:/state/addplugins/tab\">> setTo=<<currentTiddler>> default=<<defaultTab>> selectedClass=\"tc-tab-selected\">\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude field=\"caption\"/>\n</$set>\n</$button>\n</$list>\n</div>\n<div class=\"tc-tab-divider\"/>\n<div class=\"tc-tab-content\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$reveal type=\"match\" state=<<qualify \"$:/state/addplugins/tab\">> text=<<currentTiddler>> default=<<defaultTab>>>\n<h2><$link><$transclude field=\"caption\"><$view field=\"title\"/></$transclude></$link></h2>\n//<$view field=\"url\"/>//\n<$transclude mode=\"block\"/>\n<$set name=PluginLibraryURL value={{!!url}}>\n<<close-library-button>>\n</$set>\n&#32;\n<<display-server-connection>>\n</$reveal>\n</$list>\n</div>\n</$set>\n</div>\n\\end\n\n\\import [subfilter{$:/core/config/GlobalImportFilter}]\n\\whitespace trim\n\n<div>\n<<plugin-library-listing>>\n</div>\n"},"$:/core/ui/ControlPanel/Palette":{"title":"$:/core/ui/ControlPanel/Palette","tags":"$:/tags/ControlPanel/Appearance","caption":"{{$:/language/ControlPanel/Palette/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/Palette/\n\n{{$:/snippets/paletteswitcher}}\n\n<$reveal type=\"nomatch\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"yes\"><<lingo ShowEditor/Caption>></$button>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"no\"><<lingo HideEditor/Caption>></$button>\n{{$:/PaletteManager}}\n\n</$reveal>\n\n"},"$:/core/ui/ControlPanel/Parsing":{"title":"$:/core/ui/ControlPanel/Parsing","tags":"$:/tags/ControlPanel/Advanced","caption":"{{$:/language/ControlPanel/Parsing/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/Parsing/\n\n\\define toggle(Type)\n\\whitespace trim\n<$checkbox\ntiddler=\"\"\"$:/config/WikiParserRules/$Type$/$(rule)$\"\"\"\nfield=\"text\"\nchecked=\"enable\"\nunchecked=\"disable\"\ndefault=\"enable\">\n<span class=\"tc-small-gap-left\"><<rule>></span>\n</$checkbox>\n\\end\n\n\\define rules(type,Type)\n\\whitespace trim\n<$list filter=\"[wikiparserrules[$type$]]\" variable=\"rule\">\n<dd><<toggle $Type$>></dd>\n</$list>\n\\end\n\\whitespace trim\n\n<<lingo Hint>>\n\n<dl>\n<dt><<lingo Pragma/Caption>></dt>\n<<rules pragma Pragma>>\n<dt><<lingo Inline/Caption>></dt>\n<<rules inline Inline>>\n<dt><<lingo Block/Caption>></dt>\n<<rules block Block>>\n</dl>"},"$:/core/ui/ControlPanel/Plugins/Add/Languages":{"title":"$:/core/ui/ControlPanel/Plugins/Add/Languages","caption":"{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[language]]\"/>)","text":"<<display-server-assets language>>\n"},"$:/core/ui/ControlPanel/Plugins/Add/Plugins":{"title":"$:/core/ui/ControlPanel/Plugins/Add/Plugins","caption":"{{$:/language/ControlPanel/Plugins/Plugins/Caption}}  (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[plugin]]\"/>)","text":"<<display-server-assets plugin>>\n"},"$:/core/ui/ControlPanel/Plugins/Add/Themes":{"title":"$:/core/ui/ControlPanel/Plugins/Add/Themes","caption":"{{$:/language/ControlPanel/Plugins/Themes/Caption}}  (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[theme]]\"/>)","text":"<<display-server-assets theme>>\n"},"$:/core/ui/ControlPanel/Plugins/Add/Updates":{"title":"$:/core/ui/ControlPanel/Plugins/Add/Updates","caption":"<$importvariables filter=\"$:/core/ui/ControlPanel/Plugins/Add/Updates\">{{$:/language/ControlPanel/Plugins/Updates/Caption}} (<<update-count>>)</$importvariables>","text":"\\define each-updateable-plugin(body)\n\\whitespace trim\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}sort[title]]\" variable=\"assetInfo\">\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$list filter=\"[<assetInfo>get[original-title]has[version]!version<libraryVersion>]\" variable=\"ignore\">\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$list filter=\"[<installedversion>!match<libraryVersion>]\" variable=\"ignore\">\n$body$\n</$list>\n</$set>\n</$list>\n</$set>\n</$list>\n\\end\n\n\\define update-all-actions()\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<<install-plugin-actions>>\n\"\"\"/>\n\\end\n\n\\define update-count()\n<$wikify name=\"count-filter\" text=<<each-updateable-plugin \"&#91;&#91;<$text text=<<assetInfo>>/>]]\">>><$count filter=<<count-filter>>/></$wikify>\n\\end\n\n\\whitespace trim\n<$button actions=<<update-all-actions>> class=\"tc-btn-invisible tc-install-plugin tc-reinstall-upgrade\">\n{{$:/core/images/download-button}}\n&#32;\n{{||$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption}}\n</$button>\n\n<div class=\"tc-plugin-library-listing\">\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<$macrocall $name=\"display-plugin-info\" type={{{ [<assetInfo>get[original-plugin-type]] }}}/>\n\"\"\"/>\n</div>\n"},"$:/core/ui/ControlPanel/Plugins/AddPlugins":{"title":"$:/core/ui/ControlPanel/Plugins/AddPlugins","text":"\\define lingo-base() $:/language/ControlPanel/Plugins/\n\\whitespace trim\n\n<$button message=\"tm-modal\" param=\"$:/core/ui/ControlPanel/Modals/AddPlugins\" tooltip={{$:/language/ControlPanel/Plugins/Add/Hint}} class=\"tc-btn-big-green tc-primary-btn\">\n{{$:/core/images/download-button}}\n&#32;\n<<lingo Add/Caption>>\n</$button>\n"},"$:/core/ui/ControlPanel/Plugins/Installed/Languages":{"title":"$:/core/ui/ControlPanel/Plugins/Installed/Languages","tags":"$:/tags/ControlPanel/Plugins","caption":"{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[language]]\"/>)","text":"<<plugin-table language>>\n"},"$:/core/ui/ControlPanel/Plugins/Installed/Plugins":{"title":"$:/core/ui/ControlPanel/Plugins/Installed/Plugins","tags":"$:/tags/ControlPanel/Plugins","caption":"{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[plugin]]\"/>)","text":"<<plugin-table plugin>>\n"},"$:/core/ui/ControlPanel/Plugins/Installed/Themes":{"title":"$:/core/ui/ControlPanel/Plugins/Installed/Themes","tags":"$:/tags/ControlPanel/Plugins","caption":"{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[theme]]\"/>)","text":"<<plugin-table theme>>\n"},"$:/core/ui/ControlPanel/Plugins":{"title":"$:/core/ui/ControlPanel/Plugins","tags":"$:/tags/ControlPanel","caption":"{{$:/language/ControlPanel/Plugins/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define plugin-table(type)\n\\whitespace trim\n<$set name=\"plugin-type\" value=\"\"\"$type$\"\"\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n<$list filter=\"[!has[draft.of]plugin-type[$type$]sort[name]]\" emptyMessage=<<lingo \"Empty/Hint\">> template=\"$:/core/ui/Components/plugin-info\"/>\n</$set>\n</$set>\n\\end\n\n{{$:/core/ui/ControlPanel/Plugins/AddPlugins}}\n\n<<lingo Installed/Hint>>\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[tiddlers+shadows]tag[$:/tags/ControlPanel/Plugins]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\" explicitState=\"$:/state/tab--86143343\"/>\n"},"$:/core/ui/ControlPanel/Saving/DownloadSaver":{"title":"$:/core/ui/ControlPanel/Saving/DownloadSaver","tags":"$:/tags/ControlPanel/Saving","caption":"{{$:/language/ControlPanel/Saving/DownloadSaver/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Saving/DownloadSaver/\n\n<div class=\"tc-control-panel-saving\" data-setting-title=<<currentTab>>>\n\n<<lingo Hint>>\n\n!!.tc-control-panel-accent <$link to=\"$:/config/DownloadSaver/AutoSave\"><<lingo AutoSave/Hint>></$link>\n\n<$checkbox tiddler=\"$:/config/DownloadSaver/AutoSave\"\n\tfield=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"\n\tclass=\"tc-control-panel-item\"\n>\n\t<span class=\"tc-tiny-gap-left\"><<lingo AutoSave/Description>></span>\n</$checkbox>\n</div>"},"$:/core/ui/ControlPanel/Saving/General":{"title":"$:/core/ui/ControlPanel/Saving/General","tags":"$:/tags/ControlPanel/Saving","caption":"{{$:/language/ControlPanel/Saving/General/Caption}}","list-before":"","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<div class=\"tc-control-panel-saving\" data-setting-title=<<currentTab>>>\n\n{{$:/language/ControlPanel/Saving/General/Hint}}\n\n!!.tc-control-panel-accent <$link to=\"$:/config/AutoSave\"><<lingo AutoSave/Caption>></$link>\n\n<<lingo AutoSave/Hint>>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"yes\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo AutoSave/Enabled/Description>></span>\n</$radio>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"no\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo AutoSave/Disabled/Description>></span>\n</$radio>\n</div>"},"$:/core/ui/ControlPanel/Saving/GitHub":{"title":"$:/core/ui/ControlPanel/Saving/GitHub","tags":"$:/tags/ControlPanel/Saving","caption":"{{$:/language/ControlPanel/Saving/GitService/GitHub/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitHub\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitHub/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitHub/Password>> |<$password name=\"github\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitHub/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitHub/Branch\" default=\"main\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitHub/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitHub/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitHub/ServerURL\" default=\"https://api.github.com\" tag=\"input\" type=\"url\"/> |"},"$:/core/ui/ControlPanel/Saving/GitLab":{"title":"$:/core/ui/ControlPanel/Saving/GitLab","tags":"$:/tags/ControlPanel/Saving","caption":"{{$:/language/ControlPanel/Saving/GitService/GitLab/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitLab\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitLab/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitLab/Password>> |<$password name=\"gitlab\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitLab/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitLab/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitLab/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitLab/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitLab/ServerURL\" default=\"https://gitlab.com/api/v4\" tag=\"input\" type=\"url\"/> |"},"$:/core/ui/ControlPanel/Saving/TiddlySpot":{"title":"$:/core/ui/ControlPanel/Saving/TiddlySpot","tags":"$:/tags/ControlPanel/Saving","caption":"{{$:/language/ControlPanel/Saving/TiddlySpot/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/Saving/TiddlySpot/\n\n\\define siteURL(path)\nhttp://$(userName)$.tiddlyspot.com/$path$/\n\\end\n\\define siteLink(path)\n\\whitespace trim\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<$reveal type=\"match\" state=\"$:/UploadURL\" text=\"\">\n<<siteURL $path$>>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/UploadURL\" text=\"\">\n<$macrocall $name=resolvePath source={{$:/UploadBackupDir}} root={{$:/UploadURL}}/>\n</$reveal>\n</$set>\n</$reveal>\n\\end\n\n<div class=\"tc-message-box\">\n\n<<lingo ReadOnly>>\n\n</div>\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo Password>> |<$password name=\"upload\"/> |\n\n''<<lingo Advanced/Heading>>''\n\n|<<lingo ServerURL>>  |<$edit-text tiddler=\"$:/UploadURL\" default=\"\" tag=\"input\" type=\"url\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/UploadFilename\" default=\"index.html\" tag=\"input\"/> |\n|<<lingo UploadDir>> |<$edit-text tiddler=\"$:/UploadDir\" default=\".\" tag=\"input\"/> |\n|<<lingo BackupDir>> |<$edit-text tiddler=\"$:/UploadBackupDir\" default=\".\" tag=\"input\"/> |\n\n<<lingo TiddlySpot/Hint>>\n"},"$:/core/ui/ControlPanel/Saving/Gitea":{"title":"$:/core/ui/ControlPanel/Saving/Gitea","tags":"$:/tags/ControlPanel/Saving","caption":"{{$:/language/ControlPanel/Saving/GitService/Gitea/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~Gitea\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/Gitea/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo Gitea/Password>> |<$password name=\"Gitea\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/Gitea/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/Gitea/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/Gitea/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/Gitea/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/Gitea/ServerURL\" default=\"https://gitea/api/v1\" tag=\"input\" type=\"url\"/> |\n"},"$:/core/ui/ControlPanel/Saving":{"title":"$:/core/ui/ControlPanel/Saving","tags":"$:/tags/ControlPanel","caption":"{{$:/language/ControlPanel/Saving/Caption}}","text":"\\whitespace trim\n{{$:/language/ControlPanel/Saving/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Saving]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Saving/General\" explicitState=\"$:/state/tab-2065006209\"/>\n</div>\n"},"$:/core/buttonstyles/Borderless":{"title":"$:/core/buttonstyles/Borderless","tags":"$:/tags/ToolbarButtonStyle","caption":"{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless}}","text":"tc-btn-invisible"},"$:/core/buttonstyles/Boxed":{"title":"$:/core/buttonstyles/Boxed","tags":"$:/tags/ToolbarButtonStyle","caption":"{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed}}","text":"tc-btn-boxed"},"$:/core/buttonstyles/Rounded":{"title":"$:/core/buttonstyles/Rounded","tags":"$:/tags/ToolbarButtonStyle","caption":"{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded}}","text":"tc-btn-rounded"},"$:/core/ui/ControlPanel/Settings/CamelCase":{"title":"$:/core/ui/ControlPanel/Settings/CamelCase","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/CamelCase/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/CamelCase/\n\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/WikiParserRules/Inline/wikilink\"\n\tfield=\"text\" checked=\"enable\" unchecked=\"disable\" default=\"enable\"\n\tclass=\"tc-control-panel-item\"\n>\n\t<$link to=\"$:/config/WikiParserRules/Inline/wikilink\" class=\"tc-tiny-gap-left\">\n\t\t<<lingo Description>>\n\t</$link>\n</$checkbox>\n"},"$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab":{"title":"$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab","caption":"{{$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption}}","tags":"$:/tags/ControlPanel/Settings","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/DefaultMoreSidebarTab/\n\n<$link to=\"$:/config/DefaultMoreSidebarTab\" class=\"tc-control-panel-item\">\n\t<<lingo Hint>>\n</$link>\n\n<$select tiddler=\"$:/config/DefaultMoreSidebarTab\" class=\"tc-select\">\n\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\">\n\t\t<option value=<<currentTiddler>>><$transclude field=\"caption\">\n\t\t\t<$text text=<<currentTiddler>>/>\n\t\t\t</$transclude>\n\t\t</option>\n\t</$list>\n</$select>\n"},"$:/core/ui/ControlPanel/Settings/DefaultSidebarTab":{"title":"$:/core/ui/ControlPanel/Settings/DefaultSidebarTab","caption":"{{$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption}}","tags":"$:/tags/ControlPanel/Settings","text":"\\define lingo-base() $:/language/ControlPanel/Settings/DefaultSidebarTab/\n\\whitespace trim\n\n<$link to=\"$:/config/DefaultSidebarTab\" class=\"tc-control-panel-item\">\n\t<<lingo Hint>>\n</$link>\n\n<$select tiddler=\"$:/config/DefaultSidebarTab\" class=\"tc-select\">\n\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\">\n\t\t<option value=<<currentTiddler>>>\n\t\t\t<$transclude field=\"caption\">\n\t\t\t\t<$text text=<<currentTiddler>>/>\n\t\t\t</$transclude>\n\t\t</option>\n\t</$list>\n</$select>\n"},"$:/core/ui/ControlPanel/Settings/EditorToolbar":{"title":"$:/core/ui/ControlPanel/Settings/EditorToolbar","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/EditorToolbar/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/EditorToolbar/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/TextEditor/EnableToolbar\"\n\tfield=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"\n\tclass=\"tc-control-panel-item\"\n>\n\t<$link to=\"$:/config/TextEditor/EnableToolbar\" class=\"tc-tiny-gap-left\">\n\t\t<<lingo Description>>\n\t</$link>\n</$checkbox>\n"},"$:/core/ui/ControlPanel/Settings/InfoPanelMode":{"title":"$:/core/ui/ControlPanel/Settings/InfoPanelMode","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/InfoPanelMode/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/InfoPanelMode/\n\n<$link to=\"$:/config/TiddlerInfo/Mode\" class=\"tc-control-panel-item\">\n\t<<lingo Hint>>\n</$link>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"popup\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo Popup/Description>></span>\n</$radio>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"sticky\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo Sticky/Description>></span>\n</$radio>\n"},"$:/core/ui/ControlPanel/Settings/LinkToBehaviour":{"title":"$:/core/ui/ControlPanel/Settings/LinkToBehaviour","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/LinkToBehaviour/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/LinkToBehaviour/\n\n<$link to=\"$:/config/Navigation/openLinkFromInsideRiver\" class=\"tc-control-panel-item\">\n\t<<lingo \"InsideRiver/Hint\">>\n</$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromInsideRiver\" class=\"tc-select\">\n\t<option value=\"above\"><<lingo \"OpenAbove\">></option>\n\t<option value=\"below\"><<lingo \"OpenBelow\">></option>\n\t<option value=\"top\"><<lingo \"OpenAtTop\">></option>\n\t<option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n\n<$link to=\"$:/config/Navigation/openLinkFromOutsideRiver\" class=\"tc-control-panel-item\">\n\t<<lingo \"OutsideRiver/Hint\">>\n</$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromOutsideRiver\" class=\"tc-select\">\n\t<option value=\"top\"><<lingo \"OpenAtTop\">></option>\n\t<option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n"},"$:/core/ui/ControlPanel/Settings/MissingLinks":{"title":"$:/core/ui/ControlPanel/Settings/MissingLinks","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/MissingLinks/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/MissingLinks/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/MissingLinks\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\">\n\t<$link to=\"$:/config/MissingLinks\" class=\"tc-control-panel-item\">\n\t\t<span class=\"tc-tiny-gap-left\"><<lingo Description>></span>\n\t</$link>\n</$checkbox>\n"},"$:/core/ui/ControlPanel/Settings/NavigationAddressBar":{"title":"$:/core/ui/ControlPanel/Settings/NavigationAddressBar","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/NavigationAddressBar/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/NavigationAddressBar/\n\n<$link to=\"$:/config/Navigation/UpdateAddressBar\" class=\"tc-control-panel-item\">\n\t<<lingo Hint>>\n</$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permaview\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo Permaview/Description>></span>\n</$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permalink\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo Permalink/Description>></span>\n</$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"no\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo No/Description>></span>\n</$radio>\n"},"$:/core/ui/ControlPanel/Settings/NavigationHistory":{"title":"$:/core/ui/ControlPanel/Settings/NavigationHistory","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/NavigationHistory/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/NavigationHistory/\n\n<$link to=\"$:/config/Navigation/UpdateHistory\" class=\"tc-control-panel-item\">\n\t<<lingo Hint>>\n</$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"yes\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo Yes/Description>></span>\n</$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"no\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo No/Description>></span>\n</$radio>\n"},"$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode":{"title":"$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/NavigationPermalinkviewMode/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/CopyToClipboard\"\n\tfield=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"\n\tclass=\"tc-control-panel-item\"\n>\n\t<$link to=\"$:/config/Navigation/Permalinkview/CopyToClipboard\" class=\"tc-tiny-gap-left\">\n\t\t<<lingo CopyToClipboard/Description>>\n\t</$link>\n</$checkbox>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\"\n\tfield=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"\n\tclass=\"tc-control-panel-item\"\n>\n\t<$link to=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\" class=\"tc-tiny-gap-left\">\n\t\t<<lingo UpdateAddressBar/Description>>\n\t</$link>\n</$checkbox>\n"},"$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation":{"title":"$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/PerformanceInstrumentation/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Performance/Instrumentation\"\n\tfield=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"\n\tclass=\"tc-control-panel-item\"\n>\n\t<$link to=\"$:/config/Performance/Instrumentation\" class=\"tc-tiny-gap-left\">\n\t\t<<lingo Description>>\n\t</$link>\n</$checkbox>\n"},"$:/core/ui/ControlPanel/Settings/RecentLimit":{"title":"$:/core/ui/ControlPanel/Settings/RecentLimit","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/RecentLimit/Caption}}","text":"\\whitespace trim\n\\procedure lingo-base() $:/language/ControlPanel/Settings/RecentLimit/\n<<lingo Hint>>\n\n|tc-table-no-border|k\n|<$link to=\"$:/config/RecentLimit\"><<lingo Caption>></$link> |<$edit-text tiddler=\"$:/config/RecentLimit\" tag=\"input\" type=\"number\"/> |\n"},"$:/core/ui/ControlPanel/Settings/TitleLinks":{"title":"$:/core/ui/ControlPanel/Settings/TitleLinks","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/TitleLinks/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/TitleLinks/\n\n<$link to=\"$:/config/Tiddlers/TitleLinks\" class=\"tc-control-panel-item\">\n\t<<lingo Hint>>\n</$link>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"yes\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo Yes/Description>></span>\n</$radio>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"no\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo No/Description>></span>\n</$radio>\n"},"$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle":{"title":"$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtonStyle/\n\n<$link to=\"$:/config/Toolbar/ButtonClass\" class=\"tc-control-panel-item\">\n\t<<lingo \"Hint\">>\n</$link>\n\n<$select tiddler=\"$:/config/Toolbar/ButtonClass\" class=\"tc-select\">\n\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ToolbarButtonStyle]]\">\n\t\t<option value={{!!text}}>{{!!caption}}</option>\n\t</$list>\n</$select>\n"},"$:/core/ui/ControlPanel/Settings/ToolbarButtons":{"title":"$:/core/ui/ControlPanel/Settings/ToolbarButtons","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/ToolbarButtons/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtons/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Icons\"\n\tfield=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"\n\tclass=\"tc-control-panel-item\"\n>\n\t<$link to=\"$:/config/Toolbar/Icons\" class=\"tc-tiny-gap-left\">\n\t\t<<lingo Icons/Description>>\n\t</$link>\n</$checkbox>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Text\"\n\tfield=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"\n\tclass=\"tc-control-panel-item\"\n>\n\t<$link to=\"$:/config/Toolbar/Text\" class=\"tc-tiny-gap-left\">\n\t\t<<lingo Text/Description>>\n\t</$link>\n</$checkbox>\n"},"$:/core/ui/ControlPanel/Settings":{"title":"$:/core/ui/ControlPanel/Settings","tags":"$:/tags/ControlPanel","caption":"{{$:/language/ControlPanel/Settings/Caption}}","text":"<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/SettingsTab]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Settings/TiddlyWiki\" explicitState=\"$:/state/tab--697582678\"/>\n</div>"},"$:/core/ui/ControlPanel/SocialCard":{"title":"$:/core/ui/ControlPanel/SocialCard","tags":"$:/tags/ControlPanel/Advanced","caption":"{{$:/language/ControlPanel/SocialCard/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo SocialCard/Hint>>\n\n|<$link to=\"$:/SiteTitle\"><<lingo Basics/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Basics/Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteDomain\"><<lingo SocialCard/Domain/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteDomain\" default=\"\" tag=\"input\" type=\"url\"/> |\n|<$link to=\"$:/SiteUrl\"><<lingo SocialCard/Url/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteUrl\" default=\"\" tag=\"input\" type=\"url\"/> |\n|<$link to=\"$:/SitePreviewUrl\"><<lingo SocialCard/PreviewUrl/Prompt>></$link> |<$edit-text tiddler=\"$:/SitePreviewUrl\" default=\"\" tag=\"input\" type=\"url\"/> |\n\n<%if [[$:/SitePreviewUrl]get[text]else[]!is[blank]] %>\n<div>\n<div>\n<<lingo SocialCard/PreviewUrl/Preview>>\n</div>\n<img src={{$:/SitePreviewUrl}}/>\n</div>\n<%endif%>"},"$:/core/ui/ControlPanel/StoryView":{"title":"$:/core/ui/ControlPanel/StoryView","tags":"$:/tags/ControlPanel/Appearance","caption":"{{$:/language/ControlPanel/StoryView/Caption}}","text":"{{$:/snippets/viewswitcher}}\n"},"$:/core/ui/ControlPanel/Stylesheets":{"title":"$:/core/ui/ControlPanel/Stylesheets","tags":"$:/tags/ControlPanel/Advanced","caption":"{{$:/language/ControlPanel/Stylesheets/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo Stylesheets/Hint>>\n\n{{$:/snippets/peek-stylesheets}}\n"},"$:/core/ui/ControlPanel/TestCases":{"title":"$:/core/ui/ControlPanel/TestCases","tags":"$:/tags/ControlPanel/Advanced","caption":"{{$:/language/ControlPanel/TestCases/Caption}}","text":"\\whitespace trim\n{{$:/language/ControlPanel/TestCases/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/TestCases]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/TestCases/All\"/>\n</div>\n"},"$:/core/ui/ControlPanel/TestCases/All":{"title":"$:/core/ui/ControlPanel/TestCases/All","tags":"$:/tags/ControlPanel/TestCases","caption":"{{$:/language/ControlPanel/TestCases/All/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/\n<<lingo TestCases/All/Hint>>\n\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/wiki-test-spec]type[text/vnd.tiddlywiki-multiple]] [all[tiddlers+shadows]tag[$:/tags/wiki-test-spec-failing]type[text/vnd.tiddlywiki-multiple]]\">\n\n<h2>\n\n<$link>\n\n<$text text=<<currentTiddler>>/>\n\n</$link>\n\n</h2>\n\n<$transclude\n\t$tiddler=\"$:/core/ui/TestCaseTemplate\"\n/>\n\n</$list>\n"},"$:/core/ui/ControlPanel/TestCases/Failed":{"title":"$:/core/ui/ControlPanel/TestCases/Failed","tags":"$:/tags/ControlPanel/TestCases","caption":"{{$:/language/ControlPanel/TestCases/Failed/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/\n<<lingo TestCases/Failed/Hint>>\n\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/wiki-test-spec]type[text/vnd.tiddlywiki-multiple]] [all[tiddlers+shadows]tag[$:/tags/wiki-test-spec-failing]type[text/vnd.tiddlywiki-multiple]]\">\n\n<$transclude\n\t$tiddler=\"$:/core/ui/TestCaseTemplate\"\n\thideIfPass=\"yes\"\n/>\n\n</$list>\n"},"$:/core/ui/ControlPanel/Theme":{"title":"$:/core/ui/ControlPanel/Theme","tags":"$:/tags/ControlPanel/Appearance","caption":"{{$:/language/ControlPanel/Theme/Caption}}","text":"{{$:/snippets/themeswitcher}}\n"},"$:/core/ui/ControlPanel/TiddlerFields":{"title":"$:/core/ui/ControlPanel/TiddlerFields","tags":"$:/tags/ControlPanel/Advanced","caption":"{{$:/language/ControlPanel/TiddlerFields/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo TiddlerFields/Hint>>\n\n{{$:/snippets/allfields}}"},"$:/core/ui/ControlPanel/Settings/TiddlyWiki":{"title":"$:/core/ui/ControlPanel/Settings/TiddlyWiki","tags":"$:/tags/ControlPanel/SettingsTab","caption":"TiddlyWiki","list-before":"","text":"\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div class=\"tc-control-panel-setting\" data-setting-title=<<currentTiddler>> >\n\n!!.tc-control-panel-accent <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"},"$:/core/ui/ControlPanel/Toolbars/EditToolbar":{"title":"$:/core/ui/ControlPanel/Toolbars/EditToolbar","tags":"$:/tags/ControlPanel/Toolbars","caption":"{{$:/language/ControlPanel/Toolbars/EditToolbar/Caption}}","text":"\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>"},"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate":{"title":"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate","text":"\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\\whitespace trim\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/>\n&#32;\n<span class=\"tc-icon-wrapper\"><$transclude tiddler={{!!icon}}/></span>\n&#32;\n<$transclude field=\"caption\"/>\n&#32;--&#32;\n<i class=\"tc-muted\"><$transclude field=\"description\"/></i>\n</$draggable>\n"},"$:/core/ui/ControlPanel/Toolbars/EditorToolbar":{"title":"$:/core/ui/ControlPanel/Toolbars/EditorToolbar","tags":"$:/tags/ControlPanel/Toolbars","caption":"{{$:/language/ControlPanel/Toolbars/EditorToolbar/Caption}}","text":"\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditorToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditorToolbar/Hint}}\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditorToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate\"/>\n"},"$:/core/ui/ControlPanel/Toolbars/ItemTemplate":{"title":"$:/core/ui/ControlPanel/Toolbars/ItemTemplate","text":"\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\\whitespace trim\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/>\n&#32;\n<span class=\"tc-icon-wrapper\">\n&#32;\n<$transclude field=\"caption\"/>\n&#32;\n<i class=\"tc-muted\">\n--&#32;\n<$transclude field=\"description\"/>\n</i></span>\n</$draggable>\n"},"$:/core/ui/ControlPanel/Toolbars/PageControls":{"title":"$:/core/ui/ControlPanel/Toolbars/PageControls","tags":"$:/tags/ControlPanel/Toolbars","caption":"{{$:/language/ControlPanel/Toolbars/PageControls/Caption}}","text":"\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/PageControlButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/PageControls/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/PageControls\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"},"$:/core/ui/ControlPanel/Toolbars/ViewToolbar":{"title":"$:/core/ui/ControlPanel/Toolbars/ViewToolbar","tags":"$:/tags/ControlPanel/Toolbars","caption":"{{$:/language/ControlPanel/Toolbars/ViewToolbar/Caption}}","text":"\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/ViewToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/ViewToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/ViewToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"},"$:/core/ui/ControlPanel/Toolbars":{"title":"$:/core/ui/ControlPanel/Toolbars","tags":"$:/tags/ControlPanel/Appearance","caption":"{{$:/language/ControlPanel/Toolbars/Caption}}","text":"\\whitespace trim\n{{$:/language/ControlPanel/Toolbars/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" class=\"tc-vertical\" explicitState=\"$:/state/tabs/controlpanel/toolbars-1345989671\"/>\n</div>\n"},"$:/ControlPanel":{"title":"$:/ControlPanel","icon":"$:/core/images/options-button","color":"#bbb","text":"\\whitespace trim\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Info\" explicitState=\"$:/state/tab-1749438307\"/>\n</div>\n"},"$:/core/ui/DefaultSearchResultList":{"title":"$:/core/ui/DefaultSearchResultList","tags":"$:/tags/SearchResults","caption":"{{$:/language/Search/DefaultResults/Caption}}","first-search-filter":"[!is[system]search:title<userInput>sort[title]limit[250]]","second-search-filter":"[!is[system]search<userInput>sort[title]limit[250]]","text":"\\define searchResultList()\n\\whitespace trim\n//<small>{{$:/language/Search/Matches/Title}}</small>//\n\n<$list filter=\"[<userInput>minlength[1]]\" variable=\"ignore\">\n<$list filter={{{ [<configTiddler>get[first-search-filter]] }}} emptyMessage={{$:/language/Search/Matches/NoResult}}>\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</$list>\n\n//<small>{{$:/language/Search/Matches/All}}</small>//\n\n<$list filter=\"[<userInput>minlength[1]]\" variable=\"ignore\">\n<$list filter={{{ [<configTiddler>get[second-search-filter]] }}} emptyMessage={{$:/language/Search/Matches/NoResult}}>\n<span class={{{[<currentTiddler>addsuffix[-secondaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</$list>\n\n\\end\n<<searchResultList>>\n"},"$:/core/ui/DownloadFullWiki":{"title":"$:/core/ui/DownloadFullWiki","text":"\\whitespace trim\n\\rules except wikilink\n\nTo download the standard single-file version of your wiki:\n\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$let publishFilter=\"\"\"-[[$:/config/SaveWikiButton/Template]] -[[$:/plugins/tiddlywiki/filesystem]] -[[$:/plugins/tiddlywiki/tiddlyweb]]\"\"\">\n<$button tooltip=\"Download fully standalone wiki\" aria-label=\"download full wiki\" class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" publishFilter=<<publishFilter>> filename=<<site-title>>/>\n{{$:/core/images/download-button}}\n<span class=\"tc-tiny-gap-left\">\nDownload full wiki\n</span>\n</$button>\n</$let>\n</$wikify>"},"$:/core/ui/EditTemplate/body/preview/diffs-current":{"title":"$:/core/ui/EditTemplate/body/preview/diffs-current","tags":"$:/tags/EditPreview","caption":"{{$:/language/EditTemplate/Body/Preview/Type/DiffCurrent}}","list-after":"$:/core/ui/EditTemplate/body/preview/output","text":"<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"},"$:/core/ui/EditTemplate/body/preview/diffs-shadow":{"title":"$:/core/ui/EditTemplate/body/preview/diffs-shadow","tags":"$:/tags/EditPreview","caption":"{{$:/language/EditTemplate/Body/Preview/Type/DiffShadow}}","list-after":"$:/core/ui/EditTemplate/body/preview/output","text":"<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{{ [{!!draft.of}shadowsource[]] }}} sourceSubTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"},"$:/core/ui/EditTemplate/body/preview/output":{"title":"$:/core/ui/EditTemplate/body/preview/output","tags":"$:/tags/EditPreview","caption":"{{$:/language/EditTemplate/Body/Preview/Type/Output}}","text":"\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Macro/View/Body]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Global/View]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Global/View/Body]!is[draft]]\n<$set name=\"tv-tiddler-preview\" value=\"yes\">\n\n<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/ViewTemplateBodyFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/ViewTemplate/body/default]] }}} />\n\n</$set>\n"},"$:/state/showeditpreview":{"title":"$:/state/showeditpreview","text":"no"},"$:/core/ui/EditTemplate/body/canonical-uri":{"title":"$:/core/ui/EditTemplate/body/canonical-uri","text":"\\define lingo-base() $:/language/EditTemplate/Body/\n\n<div class=\"tc-message-box\">\n\n<<lingo External/Hint>>\n\n<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>\n\n<$edit-text field=\"_canonical_uri\" class=\"tc-edit-fields\" tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"></$edit-text>\n\n</div>\n"},"$:/core/ui/EditTemplate/body/default":{"title":"$:/core/ui/EditTemplate/body/default","text":"\\function edit-preview-state()\n[{$:/config/ShowEditPreview/PerTiddler}!match[yes]then[$:/state/showeditpreview]] :else[<qualified-preview-state>] +[get[text]] :else[[no]]\n\\end\n\n\\define config-visibility-title()\n$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\n\\end\n\n\\define importFileActions()\n<$action-popup $state=<<importState>> $coords=\"(0,0,0,0)\" $floating=\"yes\"/>\n\\end\n\n\\whitespace trim\n<$let\n\tqualified-preview-state=<<qualify \"$:/state/showeditpreview\">>\n\teditPreviewStateTiddler={{{ [{$:/config/ShowEditPreview/PerTiddler}!match[yes]then[$:/state/showeditpreview]] :else[<qualified-preview-state>] }}}\n\timportTitle=<<qualify $:/ImportImage>>\n\timportState=<<qualify $:/state/ImportImage>> >\n<$dropzone importTitle=<<importTitle>> autoOpenOnImport=\"no\" contentTypesFilter={{$:/config/Editor/ImportContentTypesFilter}} class=\"tc-dropzone-editor\" enable={{{ [{$:/config/DragAndDrop/Enable}match[no]] :else[subfilter{$:/config/Editor/EnableImportFilter}then[yes]else[no]] }}} filesOnly=\"yes\" actions=<<importFileActions>> >\n<div>\n<div class={{{ [<edit-preview-state>match[yes]then[tc-tiddler-preview]else[tc-tiddler-preview-hidden]] [[tc-tiddler-editor]] +[join[ ]] }}}>\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n<$list filter=\"[<editPreviewStateTiddler>get[text]match[yes]]\" variable=\"ignore\">\n\n<div class=\"tc-tiddler-preview-preview\" data-tiddler-title={{!!draft.title}} data-tags={{!!tags}}>\n\n<$transclude tiddler={{$:/state/editpreviewtype}} mode=\"inline\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/preview/output\" mode=\"inline\"/>\n\n</$transclude>\n\n</div>\n\n</$list>\n\n</div>\n\n</div>\n\n</$dropzone>\n\n</$let>\n"},"$:/core/ui/EditTemplate/body/editor":{"title":"$:/core/ui/EditTemplate/body/editor","text":"\\whitespace trim\n\n<$edit\n\n  field=\"text\"\n  class=\"tc-edit-texteditor tc-edit-texteditor-body\"\n  placeholder={{$:/language/EditTemplate/Body/Placeholder}}\n  tabindex={{$:/config/EditTabIndex}}\n  focus={{{ [{$:/config/AutoFocus}match[text]then[true]] ~[[false]] }}}\n  cancelPopups=\"yes\"\n  fileDrop={{{ [{$:/config/DragAndDrop/Enable}match[no]] :else[subfilter{$:/config/Editor/EnableImportFilter}then[yes]else[no]] }}}\n\n><$set\n\n  name=\"targetTiddler\"\n  value=<<currentTiddler>>\n\n><$list\n\n  filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]]\"\n\n><$reveal\n\n  type=\"nomatch\"\n  state=<<config-visibility-title>>\n  text=\"hide\"\n  class=\"tc-text-editor-toolbar-item-wrapper\"\n\n><$transclude\n\n  tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\"\n  mode=\"inline\"\n\n/></$reveal></$list><$list\n\n  filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorTools]!has[draft.of]]\"\n\n><$list\n\tfilter={{!!condition}}\n\tvariable=\"list-condition\"\n><$transclude/>\n</$list></$list></$set></$edit>\n"},"$:/core/ui/EditTemplate/body/toolbar/button":{"title":"$:/core/ui/EditTemplate/body/toolbar/button","text":"\\define toolbar-button-icon()\n<$list\n\n  filter=\"[all[current]!has[custom-icon]]\"\n  variable=\"no-custom-icon\"\n\n><$transclude\n\n  tiddler={{!!icon}}\n\n/></$list>\n\\end\n\n\\define toolbar-button-tooltip()\n{{!!description}}<$macrocall $name=\"displayshortcuts\" $output=\"text/plain\" shortcuts={{!!shortcuts}} prefix=\"` - [\" separator=\"] [\" suffix=\"]`\"/>\n\\end\n\n\\define toolbar-button()\n<$list\n\n  filter={{!!condition}}\n  variable=\"list-condition\"\n\n><$wikify\n\n  name=\"tooltip-text\"\n  text=<<toolbar-button-tooltip>>\n  mode=\"inline\"\n  output=\"text\"\n\n><$list\n\n  filter=\"[all[current]!has[dropdown]]\"\n  variable=\"no-dropdown\"\n\n><$set name=disabled filter={{!!condition-disabled}}><$button\n\n  class=\"tc-btn-invisible $(buttonClasses)$\"\n  tooltip=<<tooltip-text>>\n  actions={{!!actions}}\n  disabled=<<disabled>>\n\n><span\n\n  data-tw-keyboard-shortcut={{{ [<disabled>match[yes]then[]else{!!shortcuts}] }}}\n\n/><<toolbar-button-icon>><$transclude\n\n  tiddler=<<currentTiddler>>\n  field=\"text\"\n\n/></$button></$set></$list><$list\n\n  filter=\"[all[current]has[dropdown]]\"\n  variable=\"dropdown\"\n\n><$set\n\n  name=\"dropdown-state\"\n  value=<<qualify \"$:/state/EditorToolbarDropdown\">>\n\n><$set name=disabled filter={{!!condition-disabled}}><$button\n\n  popup=<<dropdown-state>>\n  class=\"tc-popup-keep tc-btn-invisible $(buttonClasses)$\"\n  selectedClass=\"tc-selected\"\n  tooltip=<<tooltip-text>>\n  actions={{!!actions}}\n  disabled=<<disabled>>\n\n><span\n\n  data-tw-keyboard-shortcut={{{ [<disabled>match[yes]then[]else{!!shortcuts}] }}}\n\n/><<toolbar-button-icon>><$transclude\n\n  tiddler=<<currentTiddler>>\n  field=\"text\"\n\n/></$button></$set><$reveal\n\n  state=<<dropdown-state>>\n  type=\"popup\"\n  position=\"below\"\n  animate=\"yes\"\n  tag=\"span\"\n\n><div\n\n  class=\"tc-drop-down tc-popup-keep\"\n\n><$transclude\n\n  tiddler={{!!dropdown}}\n  mode=\"block\"\n\n/></div></$reveal></$set></$list></$wikify></$list>\n\\end\n\n\\define toolbar-button-outer()\n<$set\n\n  name=\"buttonClasses\"\n  value={{!!button-classes}}\n\n><<toolbar-button>></$set>\n\\end\n\n<<toolbar-button-outer>>"},"$:/core/ui/EditTemplate/body":{"title":"$:/core/ui/EditTemplate/body","tags":"$:/tags/EditTemplate","text":"<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/EditTemplateBodyFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/EditTemplate/body/default]] }}} />\n"},"$:/core/ui/EditTemplate/controls":{"title":"$:/core/ui/EditTemplate/controls","tags":"$:/tags/EditTemplate","text":"\\define config-title() $:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\whitespace trim\n<div class=\"tc-tiddler-title tc-tiddler-edit-title tc-clearfix\">\n\t<$view field=\"title\"/>\n\t<span class=\"tc-tiddler-controls tc-titlebar\">\n\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t<$let tv-config-toolbar-class={{{ [enlist<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]] +[join[ ]] }}}>\n\t\t\t\t<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\">\n\t\t\t\t\t<$transclude $tiddler=<<listItem>>/>\n\t\t\t\t</$reveal>\n\t\t\t</$let>\n\t\t</$list>\n\t</span>\n</div>\n"},"$:/core/ui/EditTemplate/fieldEditor/default":{"title":"$:/core/ui/EditTemplate/fieldEditor/default","text":"<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> tag=\"input\" default=\"\" class=\"tc-edit-texteditor tc-edit-fieldeditor\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>"},"$:/core/ui/EditTemplate/fields":{"title":"$:/core/ui/EditTemplate/fields","tags":"$:/tags/EditTemplate","text":"\\procedure lingo-base() $:/language/EditTemplate/\n\\function tf.config-title() [[$:/config/EditTemplateFields/Visibility/]addsuffix[$(currentField)$]substitute[]get[text]]\n\n\\function tf.config-filter() [[hide]] :except[title<tf.config-title>]\n\n<!-- Beware this is duplicated from EditTemplate.tid. For details see bug #7054 -->\n\\procedure get-field-value-tiddler-filter() [subfilter<get-field-editor-filter>sha256[16]addprefix[/]addprefix<newFieldValueTiddlerPrefix>]\n\\procedure get-field-editor-filter() [<newFieldNameTiddler>get[text]else[]] :cascade[all[shadows+tiddlers]tag[$:/tags/FieldEditorFilter]!is[draft]get[text]] :and[!is[blank]else{$:/core/ui/EditTemplate/fieldEditor/default}]\n\n\\procedure prefix.bracket() [\n\\procedure suffix.bracket() ]\n\n\\function tf.current-tiddler-new-field-selector() [[data-tiddler-title=]addprefix[$(prefix.bracket)$]substitute[]addsuffix<currentTiddlerCSSescaped>addsuffix[$(suffix.bracket)$]substitute[]] .tc-edit-field-add-name-wrapper input :and[join[ ]]\n\n\\procedure new-field-actions()\n\\whitespace trim\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldNameTiddler>get[text]] :map[subfilter<get-field-value-tiddler-filter>get[text]] }}}/>\n<$set name=\"safeNewFieldValueTiddlerPrefix\" value=<<newFieldValueTiddlerPrefix>> emptyValue=<<qualify \"$:/temp/NewFieldValue\">> >\n\t<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [prefix[$:/temp/NewFieldValue]prefix<safeNewFieldValueTiddlerPrefix>] [<storeTitle>] [<searchListState>]\"/>\n</$set>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<tf.current-tiddler-new-field-selector>>/>\n\\end\n\n\\procedure delete-state-tiddlers() <$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<storeTitle>] [<searchListState>]\"/>\n\n\\procedure cancel-search-actions-inner()\n\\whitespace trim\n<$list\n\tfilter=\"[<storeTitle>has[text]] [<newFieldNameTiddler>has[text]]\"\n\tvariable=\"ignore\"\n\temptyMessage=\"<<cancel-delete-tiddler-actions 'cancel'>>\">\n<<delete-state-tiddlers>>\n</$list>\n\\end\n\n\\procedure cancel-search-actions()\n\\whitespace trim\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list\n\tfilter=\"[<newFieldNameTiddler>get[text]!match<userInput>]\"\n\temptyMessage=\"<<cancel-search-actions-inner>>\">\n<$action-setfield $tiddler=<<newFieldNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\procedure new-field()\n\\whitespace trim\n<$vars name={{{ [<newFieldNameTiddler>get[text]] }}}>\n<$reveal type=\"nomatch\" text=\"\" default=<<name>>>\n<$button tooltip={{$:/language/EditTemplate/Fields/Add/Button/Hint}}>\n<$action-sendmessage $message=\"tm-add-field\"\n$name=<<name>>\n$value={{{ [subfilter<get-field-value-tiddler-filter>get[text]] }}}/>\n<$set name=\"safeNewFieldValueTiddlerPrefix\" value=<<newFieldValueTiddlerPrefix>> emptyValue=<<qualify \"$:/temp/NewFieldValue\">> >\n\t<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [prefix[$:/temp/NewFieldValue]prefix<safeNewFieldValueTiddlerPrefix>] [<storeTitle>] [<searchListState>]\"/>\n</$set>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" text=\"\" default=<<name>>>\n<$button>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n</$vars>\n\\end\n\\whitespace trim\n\n<$set name=\"newFieldValueTiddlerPrefix\" value=<<newFieldValueTiddlerPrefix>> emptyValue=<<qualify \"$:/temp/NewFieldValue\">> >\n<div class=\"tc-edit-fields\">\n<table class={{{ [all[current]fields[]] :filter[lookup[$:/config/EditTemplateFields/Visibility/]!match[hide]] :and[count[]!match[0]] :and[then[tc-edit-fields]] :else[[tc-edit-fields tc-edit-fields-small]] }}}>\n<tbody>\n<$list filter=\"[all[current]fields[]] :and[sort[title]]\" variable=\"currentField\" storyview=\"pop\">\n<$list filter=<<tf.config-filter>> variable=\"temp\">\n<tr class=\"tc-edit-field\">\n<td class=\"tc-edit-field-name\">\n<$text text=<<currentField>>/>:</td>\n<td class=\"tc-edit-field-value\">\n<$keyboard key=\"((delete-field))\" actions=\"\"\"<$action-deletefield $field=<<currentField>>/><$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<tf.current-tiddler-new-field-selector>>/></$set>\"\"\">\n<$transclude tiddler={{{ [<currentField>] :cascade[all[shadows+tiddlers]tag[$:/tags/FieldEditorFilter]!is[draft]get[text]] :and[!is[blank]else{$:/core/ui/EditTemplate/fieldEditor/default}] }}} />\n</$keyboard>\n</td>\n<td class=\"tc-edit-field-remove\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\n<$action-deletefield $field=<<currentField>>/>\n{{$:/core/images/delete-button}}\n</$button>\n</td>\n</tr>\n</$list>\n</$list>\n</tbody>\n</table>\n</div>\n\n<$fieldmangler>\n<div class=\"tc-edit-field-add\">\n<em class=\"tc-edit tc-small-gap-right\">\n<<lingo Fields/Add/Prompt>>\n</em>\n<$vars refreshTitle=<<qualify \"$:/temp/fieldname/refresh\">> storeTitle=<<newFieldNameInputTiddler>> searchListState=<<newFieldNameSelectionTiddler>>>\n<div class=\"tc-edit-field-add-name-wrapper\">\n<$transclude $variable=\"keyboard-driven-input\" tiddler=<<newFieldNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>>\n\t\tselectionStateTitle=<<searchListState>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}}\n\t\tfocusPopup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}}\n\t\tfocus={{{ [{$:/config/AutoFocus}match[fields]then[true]] :else[[false]] }}} cancelPopups=\"yes\"\n\t\tconfigTiddlerFilter=\"[[$:/config/EditMode/fieldname-filter]]\" inputCancelActions=<<cancel-search-actions>> />\n<$button popup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown tc-small-gap\" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/field-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher to=<<newFieldNameTiddler>>>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/User>>\n</div>\n<$set name=\"newFieldName\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] :except[[created]] :except[[creator]] :except[[draft.of]] :except[[draft.title]] :except[[modified]] :except[[modifier]] :except[[tags]] :except[[text]] :except[[title]] :except[[type]]\"  variable=\"currentField\">\n<$list filter=\"[<currentField>addsuffix[-primaryList]] :except[<searchListState>get[text]]\" emptyMessage=\"\"\"<$link to=<<currentField>> class=\"tc-list-item-selected\"><$text text=<<currentField>>/></$link>\"\"\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$list>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/System>>\n</div>\n<$list filter=\"[fields[]search:title<newFieldName>sort[]] :except[!is[shadow]!is[system]fields[]]\" variable=\"currentField\">\n<$list filter=\"[<currentField>addsuffix[-secondaryList]] :except[<searchListState>get[text]]\" emptyMessage=\"\"\"<$link to=<<currentField>> class=\"tc-list-item-selected\"><$text text=<<currentField>>/></$link>\"\"\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$list>\n</$set>\n</$linkcatcher>\n</$set>\n</div>\n</$reveal>\n</div>\n<$let currentTiddlerCSSescaped={{{ [<currentTiddler>escapecss[]] }}} currentTiddler={{{ [subfilter<get-field-value-tiddler-filter>] }}} currentField=\"text\" currentFieldName={{{ [<newFieldNameTiddler>get[text]] }}}>\n<span class=\"tc-edit-field-add-value tc-small-gap-right\">\n<$keyboard key=\"((add-field))\" actions=<<new-field-actions>>>\n<$transclude tiddler={{{ [subfilter<get-field-editor-filter>] }}} />\n</$keyboard>\n</span>\n<span class=\"tc-edit-field-add-button\">\n<$transclude $variable=\"new-field\"/>\n</span>\n</$let>\n</$vars>\n</div>\n</$fieldmangler>\n</$set>"},"$:/core/ui/EditTemplate/shadow":{"title":"$:/core/ui/EditTemplate/shadow","tags":"$:/tags/EditTemplate","text":"\\define lingo-base() $:/language/EditTemplate/Shadow/\n\\define pluginLinkBody()\n\\whitespace trim\n<$link to=\"\"\"$(pluginTitle)$\"\"\">\n<$text text=\"\"\"$(pluginTitle)$\"\"\"/>\n</$link>\n\\end\n\\whitespace trim\n<$list filter=\"[all[current]get[draft.of]is[shadow]!is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>\n\n<$list filter=\"[all[current]get[draft.of]is[shadow]is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo OverriddenWarning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>"},"$:/core/ui/EditTemplate/tags":{"title":"$:/core/ui/EditTemplate/tags","tags":"$:/tags/EditTemplate","text":"\\whitespace trim\n\n\\procedure lingo-base() $:/language/EditTemplate/\n\n\\procedure tag-body-inner(colour,fallbackTarget,colourA,colourB,icon,tagField:\"tags\")\n<$wikify name=\"foregroundColor\"\n\ttext=\"\"\"<$macrocall $name=\"contrastcolour\"\n\t\ttarget=<<colour>>\n\t\tfallbackTarget=<<fallbackTarget>>\n\t\tcolourA=<<colourA>>\n\t\tcolourB=<<colourB>>/>\n\t\"\"\"\n>\n\t<$let backgroundColor=<<colour>> >\n\t\t<span class=\"tc-tag-label tc-tag-list-item tc-small-gap-right\"\n\t\t\tdata-tag-title=<<currentTiddler>>\n\t\t\tstyle.color=<<foregroundColor>>\n\t\t\tstyle.fill=<<foregroundColor>>\n\t\t\tstyle.background-color=<<backgroundColor>>\n\t\t>\n\t\t\t<$transclude tiddler=<<icon>>/>\n\t\t\t<$view field=\"title\" format=\"text\"/>\n\t\t\t<$button class=\"tc-btn-invisible tc-remove-tag-button\"\n\t\t\t\tstyle.fill=<<foregroundColor>>\n\t\t\t>\n\t\t\t\t<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter=\"-[{!!title}]\"/>\n\t\t\t\t{{$:/core/images/close-button}}\n\t\t\t</$button>\n\t\t</span>\n\t</$let>\n</$wikify>\n\\end\n\n\\procedure tag-body(colour,palette,icon,tagField:\"tags\")\n<$macrocall $name=\"tag-body-inner\"\n\tcolour=`$(colour)$`\n\tcolourA={{{ [<palette>getindex[foreground]] }}}\n\tcolourB={{{ [<palette>getindex[background]] }}}\n\tfallbackTarget={{{ [<palette>getindex[tag-background]] }}}\n\ticon=<<icon>>\n\ttagField=<<tagField>>\n/>\n\\end\n\n\\procedure edit-tags-template(tagField:\"tags\")\n<div class=\"tc-edit-tags\">\n\t<$list filter=\"[<currentTiddler>get<tagField>enlist-input[]sort[title]]\" storyview=\"pop\">\n\t\t<$macrocall $name=\"tag-body\"\n\t\t\tcolour={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}\n\t\t\tpalette={{$:/palette}}\n\t\t\ticon={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}}\n\t\t\ttagField=<<tagField>>\n\t\t/>\n\t</$list>\n\t<$let tabIndex={{$:/config/EditTabIndex}} cancelPopups=\"yes\">\n\t\t<$macrocall $name=\"tag-picker\" tagField=<<tagField>>/>\n\t</$let>\n</div>\n\\end\n<$let saveTiddler=<<currentTiddler>>>\n\t<$macrocall $name=\"edit-tags-template\" tagField=<<tagField>>/>\n</$let>\n"},"$:/core/ui/EditTemplate/title":{"title":"$:/core/ui/EditTemplate/title","tags":"$:/tags/EditTemplate","text":"\\whitespace trim\n<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus={{{ [{$:/config/AutoFocus}match[title]then[true]] ~[[false]] }}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n\n<$vars pattern=\"\"\"[\\|\\[\\]{}]\"\"\" bad-chars=\"\"\"`| [ ] { }`\"\"\">\n\n<$list filter=\"[all[current]regexp:draft.title<pattern>]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}}&#32;{{$:/language/EditTemplate/Title/BadCharacterWarning}}\n\n</div>\n\n</$list>\n\n</$vars>\n\n<$reveal state=\"!!draft.title\" type=\"nomatch\" text={{!!draft.of}} tag=\"div\">\n\n<$list filter=\"[{!!draft.title}!is[missing]]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}}&#32;{{$:/language/EditTemplate/Title/Exists/Prompt}}:&#32;<$link to={{!!draft.title}} />\n\n</div>\n\n</$list>\n\n<$list filter=\"[{!!draft.of}!is[missing]]\" variable=\"listItem\">\n\n<$vars fromTitle={{!!draft.of}} toTitle={{!!draft.title}}>\n\n<$checkbox tiddler=\"$:/config/RelinkOnRename\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\">&#32;{{$:/language/EditTemplate/Title/Relink/Prompt}}</$checkbox>\n\n<$list filter=\"[title<fromTitle>backlinks[]limit[1]]\" variable=\"listItem\">\n\n<$vars stateTiddler=<<qualify \"$:/state/edit/references\">> >\n\n<$reveal type=\"nomatch\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"show\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n&#32;\n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"hide\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n&#32;\n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$tiddler tiddler=<<fromTitle>> >\n<$transclude tiddler=\"$:/core/ui/TiddlerInfo/References\"/>\n</$tiddler>\n</$reveal>\n\n</$vars>\n\n</$list>\n\n</$vars>\n\n</$list>\n\n</$reveal>\n"},"$:/core/ui/EditTemplate/type":{"title":"$:/core/ui/EditTemplate/type","tags":"$:/tags/EditTemplate","first-search-filter":"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]sort[description]sort[group-sort]removeprefix[$:/language/Docs/Types/]search<userInput>]","text":"\\procedure lingo-base() $:/language/EditTemplate/\n\\procedure input-cancel-actions() <$list filter=\"[<storeTitle>get[text]] [<currentTiddler>get[type]] :and[limit[1]]\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\"><$action-sendmessage $message=\"tm-remove-field\" $param=\"type\"/><$action-deletetiddler $filter=\"[<typeInputTiddler>] [<refreshTitle>] [<typeSelectionTiddler>]\"/></$list>\n\\whitespace trim\n<$set name=\"refreshTitle\" value=<<qualify \"$:/temp/type-search/refresh\">>>\n<div class=\"tc-edit-type-selector-wrapper\">\n<em class=\"tc-edit tc-small-gap-right\"><<lingo Type/Prompt>></em>\n<div class=\"tc-type-selector-dropdown-wrapper\">\n<div class=\"tc-type-selector\"><$fieldmangler>\n<$transclude $variable=\"keyboard-driven-input\" tiddler=<<currentTiddler>> storeTitle=<<typeInputTiddler>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<typeSelectionTiddler>> field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] :else[[false]] }}} cancelPopups=\"yes\" configTiddlerFilter=\"[[$:/core/ui/EditTemplate/type]]\" inputCancelActions=<<input-cancel-actions>>/><$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown tc-small-gap\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$button message=\"tm-remove-field\" param=\"type\" class=\"tc-btn-invisible tc-btn-icon\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}<$action-deletetiddler $filter=\"[<typeInputTiddler>] [<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]\"/></$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$reveal state=<<qualify \"$:/state/popup/type-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"!!type\">\n<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group-sort]]'>\n<div class=\"tc-dropdown-item\">\n<$text text={{!!group}}/>\n</div>\n<$set name=\"userInput\" value={{{ [<typeInputTiddler>get[text]] }}}>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] :and[sort[description]] :and[removeprefix[$:/language/Docs/Types/]] :and[search<userInput>]\"><span class={{{ [<currentTiddler>addsuffix[-primaryList]] :except[<typeSelectionTiddler>get[text]] :and[then[]else[tc-list-item-selected]] }}}><$link to={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]get[name]] }}}><$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\"description\"/><$text text=\" \"/>(<$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\"name\"/>)</$link></span>\n</$list>\n</$set>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</$set>\n</div>\n</div>\n</div>\n</$set>\n"},"$:/core/ui/EditTemplate":{"title":"$:/core/ui/EditTemplate","code-body":"yes","text":"\\define delete-edittemplate-state-tiddlers()\n<$set name=\"safeNewFieldValueTiddlerPrefix\" value=<<newFieldValueTiddlerPrefix>> emptyValue=<<qualify \"$:/temp/NewFieldValue\">> >\n\t<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [prefix[$:/temp/NewFieldValue]prefix<safeNewFieldValueTiddlerPrefix>] [<newFieldNameInputTiddler>] [<newFieldNameSelectionTiddler>] [<newTagNameTiddler>] [<newTagNameInputTiddler>] [<newTagNameSelectionTiddler>] [<typeInputTiddler>] [<typeSelectionTiddler>]\"/>\n</$set>\n\\end\n\n<!-- Beware this is duplicated from fields.tid. For details see bug #7054 -->\n\\define get-field-value-tiddler-filter() [subfilter<get-field-editor-filter>sha256[16]addprefix[/]addprefix<newFieldValueTiddlerPrefix>]\n\\define get-field-editor-filter() [<newFieldNameTiddler>get[text]else[]] :cascade[all[shadows+tiddlers]tag[$:/tags/FieldEditorFilter]!is[draft]get[text]] :and[!is[blank]else{$:/core/ui/EditTemplate/fieldEditor/default}]\n\n\\define save-tiddler-actions()\n\\whitespace trim\n<$action-sendmessage $message=\"tm-add-tag\" $param={{{ [<newTagNameTiddler>get[text]] }}}/>\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldNameTiddler>get[text]] :map[subfilter<get-field-value-tiddler-filter>get[text]] }}}/>\n<<delete-edittemplate-state-tiddlers>>\n<$action-sendmessage $message=\"tm-save-tiddler\"/>\n\\end\n\n\\define cancel-delete-tiddler-actions(message)\n\\whitespace trim\n<<delete-edittemplate-state-tiddlers>>\n<$action-sendmessage $message=\"tm-$message$-tiddler\"/>\n\\end\n\n\\whitespace trim\n<div\n\tdata-tiddler-title=<<currentTiddler>>\n\tdata-tags={{!!tags}}\n\tclass={{{ [all[shadows+tiddlers]tag[$:/tags/ClassFilters/TiddlerTemplate]!is[draft]] :map:flat[subfilter{!!text}] tc-tiddler-frame tc-tiddler-edit-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}\n\trole=\"region\"\n\taria-label={{$:/language/EditTemplate/Caption}}>\n<$fieldmangler>\n<$vars\n\tstoryTiddler=<<currentTiddler>>\n\tnewTagNameTiddler=<<qualify \"$:/temp/NewTagName\">>\n\tnewFieldNameTiddler=<<qualify \"$:/temp/NewFieldName\">>\n\tnewFieldValueTiddlerPrefix=<<qualify \"$:/temp/NewFieldValue\">>\n\tnewFieldNameInputTiddler=<<qualify \"$:/temp/NewFieldName/input\">>\n\tnewFieldNameSelectionTiddler=<<qualify \"$:/temp/NewFieldName/selected-item\">>\n\tnewTagNameInputTiddler=<<qualify \"$:/temp/NewTagName/input\">>\n\tnewTagNameSelectionTiddler=<<qualify \"$:/temp/NewTagName/selected-item\">>\n\ttypeInputTiddler=<<qualify \"$:/temp/Type/input\">>\n\ttypeSelectionTiddler=<<qualify \"$:/temp/Type/selected-item\">>>\n<$keyboard key=\"((cancel-edit-tiddler))\" actions=<<cancel-delete-tiddler-actions \"cancel\">> tag=\"div\">\n<$keyboard key=\"((save-tiddler))\" actions=<<save-tiddler-actions>> tag=\"div\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n</$list>\n</$keyboard>\n</$keyboard>\n</$vars>\n</$fieldmangler>\n</div>\n"},"$:/core/ui/Buttons/cancel":{"title":"$:/core/ui/Buttons/cancel","tags":"$:/tags/EditToolbar","caption":"{{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}}","description":"{{$:/language/Buttons/Cancel/Hint}}","text":"\\whitespace trim\n<$button actions=<<cancel-delete-tiddler-actions \"cancel\">>\n\ttooltip={{$:/language/Buttons/Cancel/Hint}}\n\taria-label={{$:/language/Buttons/Cancel/Hint}}\n\tclass=<<tv-config-toolbar-class>>\n>\n\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t{{$:/core/images/cancel-button}}\n\t<%endif%>\n\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span>\n\t<%endif%>\n</$button>\n"},"$:/core/ui/Buttons/delete":{"title":"$:/core/ui/Buttons/delete","tags":"$:/tags/EditToolbar $:/tags/ViewToolbar","caption":"{{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}}","description":"{{$:/language/Buttons/Delete/Hint}}","text":"\\whitespace trim\n<$button actions=<<cancel-delete-tiddler-actions \"delete\">>\n\ttooltip={{$:/language/Buttons/Delete/Hint}}\n\taria-label={{$:/language/Buttons/Delete/Hint}}\n\tclass=<<tv-config-toolbar-class>>\n>\n\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t{{$:/core/images/delete-button}}\n\t<%endif%>\n\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>\n\t<%endif%>\n</$button>\n"},"$:/core/ui/Buttons/save":{"title":"$:/core/ui/Buttons/save","tags":"$:/tags/EditToolbar","caption":"{{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}}","description":"{{$:/language/Buttons/Save/Hint}}","text":"\\whitespace trim\n\\procedure save-tiddler-button()\n<$fieldmangler>\n\t<$button\n\t\ttooltip={{$:/language/Buttons/Save/Hint}}\n\t\taria-label={{$:/language/Buttons/Save/Hint}}\n\t\tclass=<<tv-config-toolbar-class>>\n\t>\n\t\t<<save-tiddler-actions>>\n\t\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t\t{{$:/core/images/done-button}}\n\t\t<%endif%>\n\t\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t\t<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Save/Caption}}/></span>\n\t\t<%endif%>\n\t</$button>\n</$fieldmangler>\n\\end\n<<save-tiddler-button>>\n"},"$:/core/ui/EditorToolbar/bold":{"title":"$:/core/ui/EditorToolbar/bold","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/bold","caption":"{{$:/language/Buttons/Bold/Caption}}","description":"{{$:/language/Buttons/Bold/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","shortcuts":"((bold))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"''\"\n\tsuffix=\"''\"\n\ttrimSelection=\"yes\"\n/>\n"},"$:/core/ui/EditorToolbar/clear-dropdown":{"title":"$:/core/ui/EditorToolbar/clear-dropdown","text":"''{{$:/language/Buttons/Clear/Hint}}''\n\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"clear\"\n\tcolour=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n\n</div>\n"},"$:/core/ui/EditorToolbar/clear":{"title":"$:/core/ui/EditorToolbar/clear","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/erase","caption":"{{$:/language/Buttons/Clear/Caption}}","description":"{{$:/language/Buttons/Clear/Hint}}","condition":"[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]","dropdown":"$:/core/ui/EditorToolbar/clear-dropdown","text":""},"$:/core/ui/EditorToolbar/editor-height-dropdown":{"title":"$:/core/ui/EditorToolbar/editor-height-dropdown","text":"\\define lingo-base() $:/language/Buttons/EditorHeight/\n''<<lingo Hint>>''\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"auto\"> {{$:/core/images/auto-height}} <<lingo Caption/Auto>></$radio>\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"fixed\"> {{$:/core/images/fixed-height}} <<lingo Caption/Fixed>> <$edit-text tag=\"input\" tiddler=\"$:/config/TextEditor/EditorHeight/Height\" default=\"100px\"/></$radio>\n"},"$:/core/ui/EditorToolbar/editor-height":{"title":"$:/core/ui/EditorToolbar/editor-height","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/fixed-height","custom-icon":"yes","caption":"{{$:/language/Buttons/EditorHeight/Caption}}","description":"{{$:/language/Buttons/EditorHeight/Hint}}","condition":"[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]","dropdown":"$:/core/ui/EditorToolbar/editor-height-dropdown","text":"\\whitespace trim\n<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n{{$:/core/images/fixed-height}}\n</$reveal>\n<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n{{$:/core/images/auto-height}}\n</$reveal>\n"},"$:/core/ui/EditorToolbar/excise-dropdown":{"title":"$:/core/ui/EditorToolbar/excise-dropdown","text":"\\define lingo-base() $:/language/Buttons/Excise/\n\n\\define body(config-title)\n\\whitespace trim\n''<<lingo Hint>>''\n\n<<lingo Caption/NewTitle>>&#32;<$edit-text tag=\"input\" tiddler=\"$config-title$/new-title\" default=\"\" focus=\"true\"/>\n\n<$set name=\"new-title\" value={{$config-title$/new-title}}>\n<$list filter=\"\"\"[<new-title>is[tiddler]]\"\"\">\n<div class=\"tc-error\">\n<<lingo Caption/TiddlerExists>>\n</div>\n</$list>\n</$set>\n\n<$checkbox tiddler=\"\"\"$config-title$/tagnew\"\"\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"false\">&#32;<<lingo Caption/Tag>></$checkbox>\n\n<<lingo Caption/Replace>>&#32;<$select tiddler=\"\"\"$config-title$/type\"\"\" default=\"transclude\">\n<option value=\"link\"><<lingo Caption/Replace/Link>></option>\n<option value=\"transclude\"><<lingo Caption/Replace/Transclusion>></option>\n<option value=\"macro\"><<lingo Caption/Replace/Macro>></option>\n</$select>\n\n<$reveal state=\"\"\"$config-title$/type\"\"\" type=\"match\" text=\"macro\">\n<<lingo Caption/MacroName>>&#32;<$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/macro-title\"\"\" default=\"translink\"/>\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"excise\"\n\ttitle={{$config-title$/new-title}}\n\ttype={{$config-title$/type}}\n\tmacro={{$config-title$/macro-title}}\n\ttagnew={{$config-title$/tagnew}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"$config-title$/new-title\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Excise>>\n</$button>\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Excise/\">>/>\n"},"$:/core/ui/EditorToolbar/excise":{"title":"$:/core/ui/EditorToolbar/excise","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/excise","caption":"{{$:/language/Buttons/Excise/Caption}}","description":"{{$:/language/Buttons/Excise/Hint}}","condition":"[<targetTiddler>type[]] [<targetTiddler>type[text/vnd.tiddlywiki]] [<targetTiddler>type[text/markdown]] [<targetTiddler>type[text/x-markdown]] +[first[]]","shortcuts":"((excise))","dropdown":"$:/core/ui/EditorToolbar/excise-dropdown","text":""},"$:/core/ui/EditorToolbar/file-import":{"title":"$:/core/ui/EditorToolbar/file-import","tags":"$:/tags/EditorTools","condition":"[<targetTiddler>filter{$:/config/Editor/EnableImportFilter}]","text":"\\procedure lingo-base() $:/language/Import/\n\n\\procedure closePopupActions()\n<$action-deletetiddler $filter=\"[title<importState>] [title<importTitle>]\"/>\n\\end closePopupActions\n\n\\procedure tw5-ImageTemplate() [img[$(currentTiddler)$]]\n\\procedure tw5-FileTemplate() [[$(currentTiddler)$]]\n\n<!-- The following characters must be escaped in markdown: <>()\\ -->\n\\function escape.title() [search-replace:g:regexp[\\(|\\)|<|>|\\\\],[\\$&]]\n\\procedure markdown-ImageTemplate() ![](<#${ [<currentTiddler>escape.title[]] }$>)\n\\procedure markdown-FileTemplate() [](<#${ [<currentTiddler>escape.title[]] }$>)\n\n\\function is.markdown.tiddler() [all[]type[text/x-markdown]] [all[]type[text/markdown]]\n\\function is.image() [get[type]prefix[image]]\n\\function get.markdown.link() [is.image[]then<markdown-ImageTemplate>else<markdown-FileTemplate>]\n\\function get.tw5.link() [is.image[]then<tw5-ImageTemplate>else<tw5-FileTemplate>] \n\\function get.link.template() [<storyTiddler>is.markdown.tiddler[]then<get.markdown.link>else<get.tw5.link>]\n\n\\procedure postImportActions()\n\\whitespace trim\n<$list filter=\"[<importTitle>links[]] :reduce[get.link.template[]substitute[]addprefix<accumulator>]\" variable=\"imageTitle\">\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"insert-text\"\n\ttext=<<imageTitle>>\n/>\n</$list>\n<<closePopupActions>>\n\\end postImportActions\n\n\\procedure buttons()\n\\whitespace trim\n<$button class=\"tc-btn-invisible\" actions=<<closePopupActions>> ><<lingo Listing/Cancel/Caption>></$button>\n&#32;\n<$button class=\"tc-btn-invisible\" message=\"tm-perform-import\" param=<<importTitle>> actions=<<postImportActions>> ><<lingo Listing/Import/Caption>></$button>\n\\end buttons\n\n\\whitespace trim\n<$reveal type=\"popup\" state=<<importState>> tag=\"div\" class=\"tc-editor-importpopup\">\n<div class=\"tc-editor-import\">\n<$list filter=\"[<importTitle>field:plugin-type[import]]\">\n<h2><<lingo Editor/Import/Heading>></h2>\n<$tiddler tiddler=<<importTitle>>>\n{{||$:/core/ui/ImportListing}}\n<<buttons>>\n</$tiddler>\n</$list>\n</div>\n</$reveal>"},"$:/core/ui/EditorToolbar/heading-1":{"title":"$:/core/ui/EditorToolbar/heading-1","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/heading-1","caption":"{{$:/language/Buttons/Heading1/Caption}}","description":"{{$:/language/Buttons/Heading1/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","button-classes":"tc-text-editor-toolbar-item-start-group","shortcuts":"((heading-1))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"1\"\n/>\n"},"$:/core/ui/EditorToolbar/heading-2":{"title":"$:/core/ui/EditorToolbar/heading-2","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/heading-2","caption":"{{$:/language/Buttons/Heading2/Caption}}","description":"{{$:/language/Buttons/Heading2/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","shortcuts":"((heading-2))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"2\"\n/>\n"},"$:/core/ui/EditorToolbar/heading-3":{"title":"$:/core/ui/EditorToolbar/heading-3","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/heading-3","caption":"{{$:/language/Buttons/Heading3/Caption}}","description":"{{$:/language/Buttons/Heading3/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","shortcuts":"((heading-3))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"3\"\n/>\n"},"$:/core/ui/EditorToolbar/heading-4":{"title":"$:/core/ui/EditorToolbar/heading-4","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/heading-4","caption":"{{$:/language/Buttons/Heading4/Caption}}","description":"{{$:/language/Buttons/Heading4/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","shortcuts":"((heading-4))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"4\"\n/>\n"},"$:/core/ui/EditorToolbar/heading-5":{"title":"$:/core/ui/EditorToolbar/heading-5","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/heading-5","caption":"{{$:/language/Buttons/Heading5/Caption}}","description":"{{$:/language/Buttons/Heading5/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","shortcuts":"((heading-5))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"5\"\n/>\n"},"$:/core/ui/EditorToolbar/heading-6":{"title":"$:/core/ui/EditorToolbar/heading-6","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/heading-6","caption":"{{$:/language/Buttons/Heading6/Caption}}","description":"{{$:/language/Buttons/Heading6/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","shortcuts":"((heading-6))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"6\"\n/>\n"},"$:/core/ui/EditorToolbar/italic":{"title":"$:/core/ui/EditorToolbar/italic","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/italic","caption":"{{$:/language/Buttons/Italic/Caption}}","description":"{{$:/language/Buttons/Italic/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","shortcuts":"((italic))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"//\"\n\tsuffix=\"//\"\n\ttrimSelection=\"yes\"\n/>\n"},"$:/core/ui/EditorToolbar/line-width-dropdown":{"title":"$:/core/ui/EditorToolbar/line-width-dropdown","text":"\\define lingo-base() $:/language/Buttons/LineWidth/\n\n\\define toolbar-line-width-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(line-width)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/LineWidth\"\n\t$value=\"$(line-width)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; margin: 4px calc(80px - $(line-width)$); background-color: #000; width: calc(100px + $(line-width)$ * 2); height: $(line-width)$; border-radius: 120px; vertical-align: middle;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(line-width)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/LineWidth\" type=\"match\" text=\"\"\"$(line-width)$\"\"\" tag=\"span\">\n\n<$entity entity=\"&nbsp;\"/>\n\n<$entity entity=\"&#x2713;\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/LineWidths}} variable=\"line-width\">\n\n<<toolbar-line-width-inner>>\n\n</$list>\n"},"$:/core/ui/EditorToolbar/line-width":{"title":"$:/core/ui/EditorToolbar/line-width","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/line-width","caption":"{{$:/language/Buttons/LineWidth/Caption}}","description":"{{$:/language/Buttons/LineWidth/Hint}}","condition":"[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]","dropdown":"$:/core/ui/EditorToolbar/line-width-dropdown","text":"<$text text={{$:/config/BitmapEditor/LineWidth}}/>\n"},"$:/core/ui/EditorToolbar/link-dropdown":{"title":"$:/core/ui/EditorToolbar/link-dropdown","text":"\\procedure lingo-base() $:/language/Buttons/Link/\n\n\\procedure add-link-actions()\n\\whitespace trim\n<$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"make-link\" text={{{ [<linkTiddler>get[text]] }}} />\n<$action-deletetiddler $filter=\"[<dropdown-state>] [<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]\"/>\n\\end\n\n\\procedure prefix.bracket() [\n\\procedure suffix.bracket() ]\n\n\\function tf.get-focus-selector() [[data-tiddler-title=]addprefix[$(prefix.bracket)$]substitute[]addsuffix<cssEscapedTitle>addsuffix[$(suffix.bracket)$]substitute[]] .tc-create-wikitext-link input :and[join[ ]]\n\n\\procedure cancel-search-actions-inner()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}><$list filter=\"[<searchTiddler>get[text]!match<userInput>]\" emptyMessage=\"<$action-deletetiddler $filter='[<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]'/>\"><$action-setfield $tiddler=<<searchTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/></$list></$set>\n\\end\n\n\\procedure cancel-search-actions() <$list filter=\"[<storeTitle>!has[text]] :and[<searchTiddler>!has[text]]\" emptyMessage=\"<<cancel-search-actions-inner>>\"><$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"focus-editor\"/></$list>\n\n\\procedure external-link()\n\\whitespace trim\n<$button class=\"tc-btn-invisible tc-btn-mini\" style=\"width: auto; display: inline-block; background-colour: inherit;\" actions=<<add-link-actions>>>\n{{$:/core/images/chevron-right}}\n</$button>\n\\end\n\n\\procedure set-next-input-tab() <$transclude $variable=\"change-input-tab-after\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" defaultState={{$:/config/SearchResults/Default}} actions=\"<$action-setfield $tiddler='$:/state/search/currentTab' text=<<nextTab>>/>\"/>\n\n\\procedure set-previous-input-tab() <$transclude $variable=\"change-input-tab-before\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" defaultState={{$:/config/SearchResults/Default}} actions=\"<$action-setfield $tiddler='$:/state/search/currentTab' text=<<nextTab>>/>\"/>\n\n\\procedure body(config-title)\n\\whitespace trim\n''<<lingo Hint>>''\n\n<$vars searchTiddler={{{ [<config-title>addsuffix[/search]] }}} linkTiddler={{{ [<config-title>addsuffix[/link]] }}} linktext=\"\" searchListState=<<qualify \"$:/temp/link-search/selected-item\">> refreshTitle=<<qualify \"$:/temp/link-search/refresh\">> storeTitle=<<qualify \"$:/temp/link-search/input\">>>\n\n<$vars linkTiddler=<<searchTiddler>>>\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-previous-input-tab>> class=\"tc-create-wikitext-link\">\n<$transclude $variable=\"keyboard-driven-input\" tiddler=<<searchTiddler>> storeTitle=<<storeTitle>>\n\t\tselectionStateTitle=<<searchListState>> refreshTitle=<<refreshTitle>> type=\"search\" filterMinLength=\"1\"\n\t\ttag=\"input\" focus=\"true\" class=\"tc-popup-handle\" inputCancelActions=<<cancel-search-actions>>\n\t\tinputAcceptActions=<<add-link-actions>> placeholder={{$:/language/Search/Search}} default=\"\"\n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] :else[{$:/config/SearchResults/Default}]\" />\n</$keyboard>\n</$keyboard>\n&#32;\n<$reveal tag=\"span\" state=<<storeTitle>> type=\"nomatch\" text=\"\">\n<<external-link>>\n&#32;\n<$button class=\"tc-btn-invisible tc-btn-mini\" style=\"width: auto; display: inline-block; background-colour: inherit;\">\n<<cancel-search-actions>><$set name=\"cssEscapedTitle\" value={{{ [<storyTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<tf.get-focus-selector>>/></$set>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$vars>\n\n<$reveal tag=\"div\" state=<<storeTitle>> type=\"nomatch\" text=\"\">\n\n<$linkcatcher actions=<<add-link-actions>> to=<<linkTiddler>>>\n\n<$vars userInput={{{ [<storeTitle>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] :else[{$:/config/SearchResults/Default}] }}}>\n\n{{$:/core/ui/SearchResults}}\n\n</$vars>\n\n</$linkcatcher>\n\n</$reveal>\n\n</$vars>\n\n\\end\n\n<$transclude $variable=\"body\" config-title=<<qualify \"$:/state/Link/\">>/>\n"},"$:/core/ui/EditorToolbar/link":{"title":"$:/core/ui/EditorToolbar/link","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/link","caption":"{{$:/language/Buttons/Link/Caption}}","description":"{{$:/language/Buttons/Link/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","button-classes":"tc-text-editor-toolbar-item-start-group","shortcuts":"((link))","dropdown":"$:/core/ui/EditorToolbar/link-dropdown","text":""},"$:/core/ui/EditorToolbar/linkify":{"title":"$:/core/ui/EditorToolbar/linkify","caption":"{{$:/language/Buttons/Linkify/Caption}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","description":"{{$:/language/Buttons/Linkify/Hint}}","icon":"$:/core/images/linkify","list-before":"$:/core/ui/EditorToolbar/mono-block","shortcuts":"((linkify))","tags":"$:/tags/EditorToolbar","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"[[\"\n\tsuffix=\"]]\"\n\ttrimSelection=\"yes\"\n/>\n"},"$:/core/ui/EditorToolbar/list-bullet":{"title":"$:/core/ui/EditorToolbar/list-bullet","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/list-bullet","caption":"{{$:/language/Buttons/ListBullet/Caption}}","description":"{{$:/language/Buttons/ListBullet/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","shortcuts":"((list-bullet))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"*\"\n\tcount=\"1\"\n/>\n"},"$:/core/ui/EditorToolbar/list-number":{"title":"$:/core/ui/EditorToolbar/list-number","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/list-number","caption":"{{$:/language/Buttons/ListNumber/Caption}}","description":"{{$:/language/Buttons/ListNumber/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","shortcuts":"((list-number))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"1\"\n/>\n"},"$:/core/ui/EditorToolbar/mono-block":{"title":"$:/core/ui/EditorToolbar/mono-block","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/mono-block","caption":"{{$:/language/Buttons/MonoBlock/Caption}}","description":"{{$:/language/Buttons/MonoBlock/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","button-classes":"tc-text-editor-toolbar-item-start-group","shortcuts":"((mono-block))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n```\"\n\tsuffix=\"```\"\n/>\n"},"$:/core/ui/EditorToolbar/mono-line":{"title":"$:/core/ui/EditorToolbar/mono-line","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/mono-line","caption":"{{$:/language/Buttons/MonoLine/Caption}}","description":"{{$:/language/Buttons/MonoLine/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","shortcuts":"((mono-line))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"`\"\n\tsuffix=\"`\"\n\ttrimSelection=\"yes\"\n/>\n"},"$:/core/ui/EditorToolbar/more-dropdown":{"title":"$:/core/ui/EditorToolbar/more-dropdown","text":"\\define config-title()\n$:/config/EditorToolbarButtons/Visibility/$(toolbarItem)$\n\\end\n\n\\define conditional-button()\n\\whitespace trim\n<$list filter={{$(toolbarItem)$!!condition}} variable=\"condition\">\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\" mode=\"inline\"/>\n&#32;\n<$transclude tiddler=<<toolbarItem>> field=\"description\"/>\n</$list>\n\\end\n\\whitespace trim\n\n<div class=\"tc-text-editor-toolbar-more\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]] -[[$:/core/ui/EditorToolbar/more]]\">\n<$reveal type=\"match\" state=<<config-visibility-title>> text=\"hide\" tag=\"div\">\n<<conditional-button>>\n</$reveal>\n</$list>\n</div>\n"},"$:/core/ui/EditorToolbar/more":{"title":"$:/core/ui/EditorToolbar/more","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/down-arrow","caption":"{{$:/language/Buttons/More/Caption}}","description":"{{$:/language/Buttons/More/Hint}}","condition":"[<targetTiddler>]","dropdown":"$:/core/ui/EditorToolbar/more-dropdown","text":""},"$:/core/ui/EditorToolbar/opacity-dropdown":{"title":"$:/core/ui/EditorToolbar/opacity-dropdown","text":"\\define lingo-base() $:/language/Buttons/Opacity/\n\n\\define toolbar-opacity-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(opacity)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Opacity\"\n\t$value=\"$(opacity)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(current-paint-colour)$; opacity: $(opacity)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(opacity)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/Opacity\" type=\"match\" text=\"\"\"$(opacity)$\"\"\" tag=\"span\">\n\n<$entity entity=\"&nbsp;\"/>\n\n<$entity entity=\"&#x2713;\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n\\define toolbar-opacity()\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/Opacities}} variable=\"opacity\">\n\n<<toolbar-opacity-inner>>\n\n</$list>\n\\end\n\n<$set name=\"current-paint-colour\" value={{$:/config/BitmapEditor/Colour}}>\n\n<$set name=\"current-opacity\" value={{$:/config/BitmapEditor/Opacity}}>\n\n<<toolbar-opacity>>\n\n</$set>\n\n</$set>\n"},"$:/core/ui/EditorToolbar/opacity":{"title":"$:/core/ui/EditorToolbar/opacity","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/opacity","caption":"{{$:/language/Buttons/Opacity/Caption}}","description":"{{$:/language/Buttons/Opacity/Hint}}","condition":"[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]","dropdown":"$:/core/ui/EditorToolbar/opacity-dropdown","text":"<$text text={{$:/config/BitmapEditor/Opacity}}/>\n"},"$:/core/ui/EditorToolbar/paint-dropdown":{"title":"$:/core/ui/EditorToolbar/paint-dropdown","text":"''{{$:/language/Buttons/Paint/Hint}}''\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Colour\"\n\t$value=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"},"$:/core/ui/EditorToolbar/paint":{"title":"$:/core/ui/EditorToolbar/paint","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/paint","caption":"{{$:/language/Buttons/Paint/Caption}}","description":"{{$:/language/Buttons/Paint/Hint}}","condition":"[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]","dropdown":"$:/core/ui/EditorToolbar/paint-dropdown","text":"\\define toolbar-paint()\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(colour-picker-value)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\\end\n\\whitespace trim\n<$set name=\"colour-picker-value\" value={{$:/config/BitmapEditor/Colour}}>\n<<toolbar-paint>>\n</$set>\n"},"$:/core/ui/EditorToolbar/picture-dropdown":{"title":"$:/core/ui/EditorToolbar/picture-dropdown","text":"\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n''{{$:/language/Buttons/Picture/Hint}}''\n\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext=<<replacement-text>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"},"$:/core/ui/EditorToolbar/picture":{"title":"$:/core/ui/EditorToolbar/picture","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/picture","caption":"{{$:/language/Buttons/Picture/Caption}}","description":"{{$:/language/Buttons/Picture/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","shortcuts":"((picture))","dropdown":"$:/core/ui/EditorToolbar/picture-dropdown","text":""},"$:/core/ui/EditorToolbar/preview-type-dropdown":{"title":"$:/core/ui/EditorToolbar/preview-type-dropdown","text":"\\define preview-type-button()\n<$button tag=\"a\">\n\n<$action-setfield $tiddler=\"$:/state/editpreviewtype\" $value=\"$(previewType)$\"/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<previewType>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<previewType>> field=\"title\" mode=\"inline\"/>\n\n</$transclude> \n\n<$reveal tag=\"span\" state=\"$:/state/editpreviewtype\" type=\"match\" text=<<previewType>> default=\"$:/core/ui/EditTemplate/body/preview/output\">\n\n<$entity entity=\"&nbsp;\"/>\n\n<$entity entity=\"&#x2713;\"/>\n\n</$reveal>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]]\" variable=\"previewType\">\n\n<<preview-type-button>>\n\n</$list>\n"},"$:/core/ui/EditorToolbar/preview-type":{"title":"$:/core/ui/EditorToolbar/preview-type","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/chevron-down","caption":"{{$:/language/Buttons/PreviewType/Caption}}","description":"{{$:/language/Buttons/PreviewType/Hint}}","condition":"[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]butfirst[]limit[1]]","button-classes":"tc-text-editor-toolbar-item-adjunct","dropdown":"$:/core/ui/EditorToolbar/preview-type-dropdown"},"$:/core/ui/EditorToolbar/preview":{"title":"$:/core/ui/EditorToolbar/preview","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/preview-open","custom-icon":"yes","caption":"{{$:/language/Buttons/Preview/Caption}}","description":"{{$:/language/Buttons/Preview/Hint}}","condition":"[<targetTiddler>]","button-classes":"tc-text-editor-toolbar-item-start-group","shortcuts":"((preview))","text":"\\whitespace trim\n<span>\n\t<$transclude $tiddler={{{ [<edit-preview-state>match[yes]then[$:/core/images/preview-open]else[$:/core/images/preview-closed]] }}} />\n</span>\n<$action-setfield $tiddler=<<editPreviewStateTiddler>> $value={{{ [<editPreviewStateTiddler>get[text]toggle[yes],[no]] }}} />\n<$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"focus-editor\"/>\n"},"$:/core/ui/EditorToolbar/quote":{"title":"$:/core/ui/EditorToolbar/quote","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/quote","caption":"{{$:/language/Buttons/Quote/Caption}}","description":"{{$:/language/Buttons/Quote/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","shortcuts":"((quote))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n<<<\"\n\tsuffix=\"<<<\"\n/>\n"},"$:/core/ui/EditorToolbar/rotate-left":{"title":"$:/core/ui/EditorToolbar/rotate-left","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/rotate-left","caption":"{{$:/language/Buttons/RotateLeft/Caption}}","description":"{{$:/language/Buttons/RotateLeft/Hint}}","condition":"[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]","text":"<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"rotate-left\"\n/>\n"},"$:/core/ui/EditorToolbar/size-dropdown":{"title":"$:/core/ui/EditorToolbar/size-dropdown","text":"\\define lingo-base() $:/language/Buttons/Size/\n\n\\define toolbar-button-size-preset(config-title)\n<$set name=\"width\" filter=\"$(sizePair)$ +[first[]]\">\n\n<$set name=\"height\" filter=\"$(sizePair)$ +[last[]]\">\n\n<$button tag=\"a\">\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n\t$value=<<width>>\n/>\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n\t$value=<<height>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/presets-popup\"\"\"\n/>\n\n<$text text=<<width>>/> &times; <$text text=<<height>>/>\n\n</$button>\n\n</$set>\n\n</$set>\n\\end\n\n\\define toolbar-button-size(config-title)\n\\whitespace trim\n''{{$:/language/Buttons/Size/Hint}}''\n\n<<lingo Caption/Width>>&#32;<$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-width\"\"\" default=<<tv-bitmap-editor-width>> focus=\"true\" size=\"8\"/>\n&#32;\n<<lingo Caption/Height>>&#32;<$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-height\"\"\" default=<<tv-bitmap-editor-height>> size=\"8\"/>\n&#32;\n<$button popup=\"\"\"$config-title$/presets-popup\"\"\" class=\"tc-btn-invisible tc-popup-keep\" style=\"width: auto; display: inline-block; background-colour: inherit;\" selectedClass=\"tc-selected\">\n{{$:/core/images/down-arrow}}\n</$button>\n\n<$reveal tag=\"span\" state=\"\"\"$config-title$/presets-popup\"\"\" type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down tc-popup-keep\">\n\n<$list filter={{$:/config/BitmapEditor/ImageSizes}} variable=\"sizePair\">\n\n<$macrocall $name=\"toolbar-button-size-preset\" config-title=\"$config-title$\"/>\n\n</$list>\n\n</div>\n\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"resize\"\n\twidth={{$config-title$/new-width}}\n\theight={{$config-title$/new-height}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Resize>>\n</$button>\n\\end\n\n<$macrocall $name=\"toolbar-button-size\" config-title=<<qualify \"$:/state/Size/\">>/>\n"},"$:/core/ui/EditorToolbar/size":{"title":"$:/core/ui/EditorToolbar/size","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/size","caption":"{{$:/language/Buttons/Size/Caption}}","description":"{{$:/language/Buttons/Size/Hint}}","condition":"[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]","dropdown":"$:/core/ui/EditorToolbar/size-dropdown","text":""},"$:/core/ui/EditorToolbar/StampDropdown/ItemTemplate":{"title":"$:/core/ui/EditorToolbar/StampDropdown/ItemTemplate","text":"<$linkcatcher actions=\"\"\"\n\n<$list filter=\"[<modifier>!match[ctrl]]\" variable=\"ignore\">\n\n<$list filter=\"[<currentTiddler>addsuffix[/prefix]!is[tiddler]!is[shadow]removesuffix[/prefix]addsuffix[/suffix]!is[tiddler]!is[shadow]]\" variable=\"ignore\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext={{{ [<currentTiddler>get[text]] }}}\n/>\n\n</$list>\n\n\n<$list filter=\"[<currentTiddler>addsuffix[/prefix]] [<currentTiddler>addsuffix[/suffix]] +[is[shadow]] :else[is[tiddler]] +[limit[1]]\" variable=\"ignore\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix={{{ [<currentTiddler>addsuffix[/prefix]get[text]] }}}\n\tsuffix={{{ [<currentTiddler>addsuffix[/suffix]get[text]] }}}\n/>\n\n</$list>\n\n</$list>\n\n<$list filter=\"[<modifier>match[ctrl]]\" variable=\"ignore\">\n\n<$action-sendmessage $message=\"tm-edit-tiddler\"/>\n\n</$list>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\">\n\n<$link tooltip={{{ [<currentTiddler>get[description]] }}}>\n\n<$transclude tiddler=<<currentTiddler>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<currentTiddler>> field=\"title\" />\n\n</$transclude>\n\n</$link>\n\n</$linkcatcher>\n"},"$:/core/ui/EditorToolbar/stamp-dropdown":{"title":"$:/core/ui/EditorToolbar/stamp-dropdown","text":"<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/TextEditor/Snippet\" subFilter=\"!is[draft]\" itemTemplate=\"$:/core/ui/EditorToolbar/StampDropdown/ItemTemplate\"/>\n\n----\n\n<$button tag=\"a\">\n\n<$action-sendmessage\n\t$message=\"tm-new-tiddler\"\n\ttags=\"$:/tags/TextEditor/Snippet\"\n\tcaption={{$:/language/Buttons/Stamp/New/Title}}\n\ttext={{$:/language/Buttons/Stamp/New/Text}}\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<em>\n\n<$text text={{$:/language/Buttons/Stamp/Caption/New}}/>\n\n</em>\n\n</$button>\n"},"$:/core/ui/EditorToolbar/stamp":{"title":"$:/core/ui/EditorToolbar/stamp","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/stamp","caption":"{{$:/language/Buttons/Stamp/Caption}}","description":"{{$:/language/Buttons/Stamp/Hint}}","condition":"[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]","shortcuts":"((stamp))","dropdown":"$:/core/ui/EditorToolbar/stamp-dropdown","button-classes":"tc-editortoolbar-stamp-button","text":""},"$:/core/ui/EditorToolbar/strikethrough":{"title":"$:/core/ui/EditorToolbar/strikethrough","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/strikethrough","caption":"{{$:/language/Buttons/Strikethrough/Caption}}","description":"{{$:/language/Buttons/Strikethrough/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","shortcuts":"((strikethrough))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"~~\"\n\tsuffix=\"~~\"\n\ttrimSelection=\"yes\"\n/>\n"},"$:/core/ui/EditorToolbar/subscript":{"title":"$:/core/ui/EditorToolbar/subscript","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/subscript","caption":"{{$:/language/Buttons/Subscript/Caption}}","description":"{{$:/language/Buttons/Subscript/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","shortcuts":"((subscript))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\",,\"\n\tsuffix=\",,\"\n\ttrimSelection=\"yes\"\n/>\n"},"$:/core/ui/EditorToolbar/superscript":{"title":"$:/core/ui/EditorToolbar/superscript","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/superscript","caption":"{{$:/language/Buttons/Superscript/Caption}}","description":"{{$:/language/Buttons/Superscript/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","shortcuts":"((superscript))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"^^\"\n\tsuffix=\"^^\"\n\ttrimSelection=\"yes\"\n/>\n"},"$:/core/ui/EditorToolbar/transcludify":{"title":"$:/core/ui/EditorToolbar/transcludify","caption":"{{$:/language/Buttons/Transcludify/Caption}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","description":"{{$:/language/Buttons/Transcludify/Hint}}","icon":"$:/core/images/transcludify","list-before":"$:/core/ui/EditorToolbar/mono-block","shortcuts":"((transcludify))","tags":"$:/tags/EditorToolbar","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"{{\"\n\tsuffix=\"}}\"\n\ttrimSelection=\"yes\"\n/>\n"},"$:/core/ui/EditorToolbar/underline":{"title":"$:/core/ui/EditorToolbar/underline","tags":"$:/tags/EditorToolbar","icon":"$:/core/images/underline","caption":"{{$:/language/Buttons/Underline/Caption}}","description":"{{$:/language/Buttons/Underline/Hint}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[text/vnd.tiddlywiki]]","shortcuts":"((underline))","text":"<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"__\"\n\tsuffix=\"__\"\n\ttrimSelection=\"yes\"\n/>\n"},"$:/core/ui/ExportTiddlyWikiCore":{"title":"$:/core/ui/ExportTiddlyWikiCore","text":"\\define jsFileName() tiddlywikicore-$(version)$.js\n\\define noExportMsg()\nIt appears that you have a wiki with an external ~TiddlyWiki core. The export action cannot be performed.\n<p>You will need to view the page source in your browser. Then go to the very bottom the the source, find the last `<script>` \nelement, and right-click its `src` URI. Save the link as ''$(jsFileName)$''</p>\n\\end\n\n''For advanced users''\n\nExport the ~TiddlyWiki core ~JavaScript code for running with external ~JavaScript:\n\n<$button tooltip=\"Export the ~TiddlyWiki core code for running with external ~JavaScript\" aria-label=\"export TiddlyWiki core\" class=\"tc-btn-big-green\">\n<$list filter=\"[[$:/boot/boot.js]is[missing]]\" variable=\"ignore\" emptyMessage=\"\"\"<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/templates/tiddlywiki5.js\" filename=<<jsFileName>>/>\"\"\" >\n<$action-setfield $tiddler=<<qualify \"$:/temp/alert\">> text=<<noExportMsg>> subtitle=\"Export ~TiddllyWiki Core\"/>\n<$action-sendmessage $message=\"tm-modal\" $param=<<qualify \"$:/temp/alert\">>/>\n</$list>\n{{$:/core/images/download-button}} Download ~TiddlyWiki core\n</$button>\n\n[[Further information|https://tiddlywiki.com/#Using%20the%20external%20JavaScript%20template]]\n"},"$:/core/Filters/AllTags":{"title":"$:/core/Filters/AllTags","tags":"$:/tags/Filter","filter":"[tags[]!is[system]sort[title]]","description":"{{$:/language/Filters/AllTags}}","text":""},"$:/core/Filters/AllTiddlers":{"title":"$:/core/Filters/AllTiddlers","tags":"$:/tags/Filter","filter":"[!is[system]sort[title]]","description":"{{$:/language/Filters/AllTiddlers}}","text":""},"$:/core/Filters/Drafts":{"title":"$:/core/Filters/Drafts","tags":"$:/tags/Filter","filter":"[has[draft.of]sort[title]]","description":"{{$:/language/Filters/Drafts}}","text":""},"$:/core/Filters/Missing":{"title":"$:/core/Filters/Missing","tags":"$:/tags/Filter","filter":"[all[missing]sort[title]]","description":"{{$:/language/Filters/Missing}}","text":""},"$:/core/Filters/Orphans":{"title":"$:/core/Filters/Orphans","tags":"$:/tags/Filter","filter":"[all[orphans]sort[title]]","description":"{{$:/language/Filters/Orphans}}","text":""},"$:/core/Filters/OverriddenShadowTiddlers":{"title":"$:/core/Filters/OverriddenShadowTiddlers","tags":"$:/tags/Filter","filter":"[is[shadow]]","description":"{{$:/language/Filters/OverriddenShadowTiddlers}}","text":""},"$:/core/Filters/RecentSystemTiddlers":{"title":"$:/core/Filters/RecentSystemTiddlers","tags":"$:/tags/Filter","filter":"[has[modified]!sort[modified]limit[50]]","description":"{{$:/language/Filters/RecentSystemTiddlers}}","text":""},"$:/core/Filters/RecentTiddlers":{"title":"$:/core/Filters/RecentTiddlers","tags":"$:/tags/Filter","filter":"[!is[system]has[modified]!sort[modified]limit[50]]","description":"{{$:/language/Filters/RecentTiddlers}}","text":""},"$:/core/Filters/SessionTiddlers":{"title":"$:/core/Filters/SessionTiddlers","tags":"$:/tags/Filter","filter":"[haschanged[]]","description":"{{$:/language/Filters/SessionTiddlers}}","text":""},"$:/core/Filters/ShadowTiddlers":{"title":"$:/core/Filters/ShadowTiddlers","tags":"$:/tags/Filter","filter":"[all[shadows]sort[title]]","description":"{{$:/language/Filters/ShadowTiddlers}}","text":""},"$:/core/Filters/StoryList":{"title":"$:/core/Filters/StoryList","tags":"$:/tags/Filter","filter":"[list[$:/StoryList]] -$:/AdvancedSearch","description":"{{$:/language/Filters/StoryList}}","text":""},"$:/core/Filters/SystemTags":{"title":"$:/core/Filters/SystemTags","tags":"$:/tags/Filter","filter":"[all[shadows+tiddlers]tags[]is[system]sort[title]]","description":"{{$:/language/Filters/SystemTags}}","text":""},"$:/core/Filters/SystemTiddlers":{"title":"$:/core/Filters/SystemTiddlers","tags":"$:/tags/Filter","filter":"[is[system]sort[title]]","description":"{{$:/language/Filters/SystemTiddlers}}","text":""},"$:/core/Filters/TypedTiddlers":{"title":"$:/core/Filters/TypedTiddlers","tags":"$:/tags/Filter","filter":"[!is[system]has[type]each[type]sort[type]] -[type[text/vnd.tiddlywiki]]","description":"{{$:/language/Filters/TypedTiddlers}}","text":""},"$:/core/ui/ImportListing":{"title":"$:/core/ui/ImportListing","text":"\\define lingo-base() $:/language/Import/\n\n\\define messageField() message-$(payloadTiddler)$\n\n\\define payloadTitleFilter() [<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>]\n\n\\define overWriteWarning()\n\\whitespace trim\n<$list filter=\"[<currentTiddler>!has<suppressedField>]\">\n<$text text={{{[subfilter<payloadTitleFilter>!is[tiddler]then[]] ~[<lingo-base>addsuffix[Listing/Rename/OverwriteWarning]get[text]]}}}/>\n</$list>\n\\end\n\n\\define selectionInfo()\n\\whitespace trim\n<$set name=\"escUnselected\" value={{{[{$:/language/Import/Upgrader/Tiddler/Unselected}escaperegexp[]addprefix[(?g)]]}}}>\n\t<$list filter=\"[all[current]get<messageField>regexp<escUnselected>]\" variable=\"ignore\">\n\t\t<$text text={{{[all[current]get<selectionField>match[checked]then{$:/language/Import/Upgrader/Tiddler/Selected}else[]]}}}/>\n\t</$list>\n</$set>\n\\end\n\n\\define libraryInfo()\n\\whitespace trim\n<$set name=\"escUnselected\" value={{{[{$:/language/Import/Upgrader/Tiddler/Unselected}escaperegexp[]addprefix[(?g)]]}}}>\n\t<$list filter=\"[all[current]get<messageField>!regexp<escUnselected>]\" variable=\"ignore\">\n\t\t<$text text={{{[all[current]get<messageField>]}}}/>\n\t</$list>\n</$set>\n\\end\n\n\\define selectionField() selection-$(payloadTiddler)$\n\n\\define renameField() rename-$(payloadTiddler)$\n\n\\define suppressedField() suppressed-$(payloadTiddler)$\n\n\\define newImportTitleTiddler() $:/temp/NewImportTitle-$(payloadTiddler)$\n\n\\define previewPopupState() $(currentTiddler)$!!popup-$(payloadTiddler)$\n\n\\define renameFieldState() $(currentTiddler)$!!state-rename-$(payloadTiddler)$\n\n\\define select-all-actions()\n\\whitespace trim\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<$action-setfield $field={{{ [<payloadTiddler>addprefix[selection-]] }}} $value={{$:/state/import/select-all}}/>\n</$list>\n\\end\n\n\\whitespace trim\n<table class=\"tc-import-table\">\n<tbody>\n<tr>\n<th align=\"left\">\n<$checkbox tiddler=\"$:/state/import/select-all\" field=\"text\" checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" actions=<<select-all-actions>>>\n&#32;\n<<lingo Listing/Select/Caption>>\n</$checkbox>\n</th>\n<th>\n<<lingo Listing/Title/Caption>>\n</th>\n<th>\n<<lingo Listing/Status/Caption>>\n</th>\n</tr>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<tr class={{{[<currentTiddler>has<suppressedField>then[tc-row-disabled]] ~[subfilter<payloadTitleFilter>is[tiddler]then[tc-row-warning]] }}}>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}/>\n</td>\n<td>\n<$reveal type=\"nomatch\" state=<<renameFieldState>> text=\"yes\" tag=\"div\">\n<$reveal type=\"nomatch\" state=<<previewPopupState>> text=\"yes\" tag=\"div\" class=\"tc-flex\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown tc-flex-grow-1 tc-word-break\" set=<<previewPopupState>> setTo=\"yes\" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}>\n<span class=\"tc-small-gap-right\">{{$:/core/images/right-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/>\n</$button>\n<$list filter=\"[<currentTiddler>!has<suppressedField>]\"><$button class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"yes\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}</$button></$list>\n</$reveal>\n<$reveal type=\"match\" state=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<previewPopupState>> setTo=\"no\">\n<span class=\"tc-small-gap-right\">{{$:/core/images/down-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/>\n</$button>\n</$reveal>\n</$reveal>\n<$reveal type=\"match\" state=<<renameFieldState>> text=\"yes\" tag=\"div\">\n<$text text={{{[<lingo-base>addsuffix[Listing/Rename/Prompt]get[text]]}}}/>\n</$reveal>\n</td>\n<td>\n<<selectionInfo>>\n&#32;\n<<libraryInfo>>\n&#32;\n<<overWriteWarning>>\n</td>\n</tr>\n<$reveal type=\"match\" state=<<renameFieldState>> text=\"yes\" tag=\"tr\">\n\t<td colspan=\"3\">\n\t\t<div class=\"tc-flex\">\n\t\t\t<$edit-text tiddler=<<newImportTitleTiddler>>  default={{{[subfilter<payloadTitleFilter>]}}} tag=\"input\" class=\"tc-import-rename tc-flex-grow-1\"/>\n\t\t\t<span class=\"tc-small-gap-left\">\n\t\t\t\t<$button  class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"no\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/CancelRename]get[text]]}}}>\n\t\t\t\t\t{{$:/core/images/close-button}}\n\t\t\t\t\t<$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/>\n\t\t\t\t</$button>\n\t\t\t\t<span class=\"tc-small-gap-right\"/>\n\t\t\t</span>\n\t\t\t<$button  class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"no\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/ConfirmRename]get[text]]}}}>\n\t\t\t\t{{$:/core/images/done-button}}\n\t\t\t\t<$action-setfield $field=<<renameField>> $value={{{[<newImportTitleTiddler>get[text]minlength[1]else<payloadTiddler>]}}} />\n\t\t\t\t<$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/>\n\t\t\t</$button>\n\t\t</div>\n\t</td>\n</$reveal>\n<$reveal type=\"match\" text=\"yes\" state=<<previewPopupState>> tag=\"tr\">\n<td colspan=\"3\">\n<$list filter=\"[{$:/state/importpreviewtype}has[text]]\" variable=\"listItem\" emptyMessage={{$:/core/ui/ImportPreviews/Text}}>\n\t<div>\n\t\t<$transclude tiddler={{$:/state/importpreviewtype}}/>\n\t</div>\n</$list>\n</td>\n</$reveal>\n</$list>\n</tbody>\n</table>\n"},"$:/core/ui/ImportPreviews/Diff":{"title":"$:/core/ui/ImportPreviews/Diff","tags":"$:/tags/ImportPreview","caption":"{{$:/language/Import/Listing/Preview/Diff}}","text":"<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>>/>\n"},"$:/core/ui/ImportPreviews/DiffFields":{"title":"$:/core/ui/ImportPreviews/DiffFields","tags":"$:/tags/ImportPreview","caption":"{{$:/language/Import/Listing/Preview/DiffFields}}","text":"<$macrocall $name=\"compareTiddlers\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>> exclude=\"text\"/>\n"},"$:/core/ui/ImportPreviews/Fields":{"title":"$:/core/ui/ImportPreviews/Fields","tags":"$:/tags/ImportPreview","caption":"{{$:/language/Import/Listing/Preview/Fields}}","text":"\\whitespace trim\n<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[<payloadTiddler>subtiddlerfields<currentTiddler>sort[]] -text\" variable=\"fieldName\">\n<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<fieldName>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<fieldName>> tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>>/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"},"$:/core/ui/ImportPreviews/Text":{"title":"$:/core/ui/ImportPreviews/Text","tags":"$:/tags/ImportPreview","caption":"{{$:/language/Import/Listing/Preview/Text}}","code-body":"yes","text":"<$transclude tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> mode=\"block\"/>\n"},"$:/core/ui/ImportPreviews/TextRaw":{"title":"$:/core/ui/ImportPreviews/TextRaw","tags":"$:/tags/ImportPreview","caption":"{{$:/language/Import/Listing/Preview/TextRaw}}","text":"<pre><code><$view tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> /></code></pre>"},"$:/core/ui/KeyboardShortcuts/advanced-search":{"title":"$:/core/ui/KeyboardShortcuts/advanced-search","tags":"$:/tags/KeyboardShortcut","key":"((advanced-search))","text":"\\whitespace trim\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n<$action-navigate $to=\"$:/AdvancedSearch\" $scroll=\"yes\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\" preventScroll=\"true\"/>\n</$navigator>\n"},"$:/core/ui/KeyboardShortcuts/change-sidebar-layout":{"title":"$:/core/ui/KeyboardShortcuts/change-sidebar-layout","tags":"$:/tags/KeyboardShortcut","key":"((change-sidebar-layout))","text":"\\whitespace trim\n<$list\n\tfilter=\"[{$:/themes/tiddlywiki/vanilla/options/sidebarlayout}match[fixed-fluid]]\"\n\temptyMessage=\"<$action-setfield $tiddler='$:/themes/tiddlywiki/vanilla/options/sidebarlayout' text='fixed-fluid'/>\">\n<$action-setfield $tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" text=\"fluid-fixed\"/>\n</$list>\n"},"$:/core/ui/KeyboardShortcuts/new-image":{"title":"$:/core/ui/KeyboardShortcuts/new-image","tags":"$:/tags/KeyboardShortcut","key":"((new-image))","text":"\\whitespace trim\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-image}}\n</$navigator>\n"},"$:/core/ui/KeyboardShortcuts/new-journal":{"title":"$:/core/ui/KeyboardShortcuts/new-journal","tags":"$:/tags/KeyboardShortcut","key":"((new-journal))","text":"\\whitespace trim\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-journal}}\n</$navigator>\n"},"$:/core/ui/KeyboardShortcuts/new-tiddler":{"title":"$:/core/ui/KeyboardShortcuts/new-tiddler","tags":"$:/tags/KeyboardShortcut","key":"((new-tiddler))","text":"\\whitespace trim\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-tiddler}}\n</$navigator>\n"},"$:/core/ui/KeyboardShortcuts/open-control-panel":{"title":"$:/core/ui/KeyboardShortcuts/open-control-panel","tags":"$:/tags/KeyboardShortcut","key":"((open-control-panel))","text":"\\whitespace trim\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n<$action-navigate $to=\"$:/ControlPanel\" $scroll=\"yes\"/>\n</$navigator>\n"},"$:/core/ui/KeyboardShortcuts/refresh":{"title":"$:/core/ui/KeyboardShortcuts/refresh","tags":"$:/tags/KeyboardShortcut","key":"((refresh))","text":"<$action-sendmessage $message=\"tm-browser-refresh\"/>\n"},"$:/core/ui/KeyboardShortcuts/save-wiki":{"title":"$:/core/ui/KeyboardShortcuts/save-wiki","tags":"$:/tags/KeyboardShortcut","key":"((save-wiki))","text":"\\whitespace trim\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n"},"$:/core/ui/KeyboardShortcuts/sidebar-search":{"title":"$:/core/ui/KeyboardShortcuts/sidebar-search","tags":"$:/tags/KeyboardShortcut","key":"((sidebar-search))","text":"<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n"},"$:/core/ui/KeyboardShortcuts/switcher":{"title":"$:/core/ui/KeyboardShortcuts/switcher","tags":"$:/tags/KeyboardShortcut","key":"((layout-switcher))","text":"<$action-sendmessage $message=\"tm-show-switcher\" switch=\"layout\"/>"},"$:/core/ui/KeyboardShortcuts/toggle-sidebar":{"title":"$:/core/ui/KeyboardShortcuts/toggle-sidebar","tags":"$:/tags/KeyboardShortcut","key":"((toggle-sidebar))","text":"\\whitespace trim\n<$list\n\tfilter=\"[[$:/state/sidebar]is[missing]] [{$:/state/sidebar}removeprefix[yes]]\"\n\temptyMessage=\"<$action-setfield $tiddler='$:/state/sidebar' text='yes'/>\">\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"no\"/>\n</$list>\n"},"$:/snippets/LayoutSwitcher":{"title":"$:/snippets/LayoutSwitcher","tags":"$:/tags/ControlPanel/Appearance","caption":"{{$:/language/ControlPanel/LayoutSwitcher/Caption}}","text":"\\whitespace trim\n<$linkcatcher to=\"$:/layout\">\n<div class=\"tc-chooser\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/Layout]] [[$:/core/ui/PageTemplate]] +[!is[draft]sort[name]]\">\n<$list\n\tfilter=\"[{$:/layout}!has[text]]\"\n\tvariable=\"ignore\"\n\temptyMessage=\"\"\"\\whitespace trim\n\t\t<$set name=\"cls\" filter=\"[all[current]field:title{$:/layout}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\">\n\t\t<div class=<<cls>>>\n\t\t<$link to={{!!title}}>\n\t\t''<$transclude tiddler={{{ [<currentTiddler>get[icon]] }}}/><$transclude field=\"name\"/>''&#32;-&#32;<$transclude field=\"description\"/>\n\t\t</$link></div></$set>\n\"\"\">\n<$set name=\"cls\" filter=\"[all[current]field:title[$:/core/ui/PageTemplate]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\">\n<div class=<<cls>>>\n<$link to={{!!title}}>\n''<$transclude tiddler={{{ [<currentTiddler>get[icon]] }}}/><$transclude field=\"name\"/>''&#32;-&#32;<$transclude field=\"description\"/>\n</$link>\n</div>\n</$set>\n</$list>\n</$list>\n</div>\n</$linkcatcher>\n"},"$:/core/ui/ListItemTemplate":{"title":"$:/core/ui/ListItemTemplate","text":"<div class=\"tc-menu-list-item\"><$link /></div>"},"$:/snippets/ListTaggedCascade":{"title":"$:/snippets/ListTaggedCascade","text":"\\whitespace trim\n{{||$:/language/ControlPanel/Cascades/TagPrompt}}\n\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag<currentTiddler>]\">\n<li>\n<div>\n<$link><$text text=<<currentTiddler>>/></$link>\n</div>\n<$codeblock code={{!!text}}/>\n</li>\n</$list>\n</ol>\n"},"$:/Manager/ItemMain/Fields":{"title":"$:/Manager/ItemMain/Fields","tags":"$:/tags/Manager/ItemMain","caption":"{{$:/language/Manager/Item/Fields}}","text":"\\whitespace trim\n<table>\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"},"$:/Manager/ItemMain/RawText":{"title":"$:/Manager/ItemMain/RawText","tags":"$:/tags/Manager/ItemMain","caption":"{{$:/language/Manager/Item/RawText}}","text":"<pre><code><$view/></code></pre>\n"},"$:/Manager/ItemMain/WikifiedText":{"title":"$:/Manager/ItemMain/WikifiedText","tags":"$:/tags/Manager/ItemMain","caption":"{{$:/language/Manager/Item/WikifiedText}}","text":"<$transclude mode=\"block\"/>\n"},"$:/Manager/ItemSidebar/Colour":{"title":"$:/Manager/ItemSidebar/Colour","tags":"$:/tags/Manager/ItemSidebar","caption":"{{$:/language/Manager/Item/Colour}}","text":"\\define swatch-styles()\nheight: 1em;\nbackground-color: $(colour)$\n\\end\n\n\\whitespace trim\n<$vars colour={{!!color}}>\n<p style=<<swatch-styles>>/>\n</$vars>\n<p>\n<$edit-text field=\"color\" tag=\"input\" type=\"color\"/>\n&#32;/&#32;\n<$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/>\n</p>\n"},"$:/Manager/ItemSidebar/Icon":{"title":"$:/Manager/ItemSidebar/Icon","tags":"$:/tags/Manager/ItemSidebar","caption":"{{$:/language/Manager/Item/Icon}}","text":"\\whitespace trim\n<p>\n<div class=\"tc-manager-icon-editor\">\n<$button popup=<<qualify \"$:/state/popup/image-picker\">> class=\"tc-btn-invisible\">\n<$transclude tiddler={{!!icon}}>\n{{$:/language/Manager/Item/Icon/None}}\n</$transclude>\n</$button>\n<div class=\"tc-block-dropdown-wrapper\" style=\"position: static;\">\n<$reveal state=<<qualify \"$:/state/popup/image-picker\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-popup\">\n<div class=\"tc-block-dropdown tc-popup-keep\" style=\"width: 80%; left: 10%; right: 10%; padding: 0.5em;\">\n<$macrocall\n\t$name=\"image-picker-include-tagged-images\"\n\tactions=\"<$action-setfield $field='icon' $value=<<imageTitle>>/><$action-deletetiddler $tiddler=<<qualify '$:/state/popup/image-picker'>>/>\"/>\n</div>\n</$reveal>\n</div>\n</div>\n</p>\n"},"$:/Manager/ItemSidebar/Tags":{"title":"$:/Manager/ItemSidebar/Tags","tags":"$:/tags/Manager/ItemSidebar","caption":"{{$:/language/Manager/Item/Tags}}","text":"\\whitespace trim\n\\define tag-checkbox-actions()\n<$action-listops\n\t$tiddler=\"$:/config/Manager/RecentTags\"\n\t$subfilter=\"[<tag>] [list[$:/config/Manager/RecentTags]] +[limit[12]]\"\n/>\n\\end\n\n\\define tag-picker-actions()\n<<tag-checkbox-actions>>\n\\end\n\n<p>\n<$list filter=\"[all[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] \" variable=\"tag\" storyview=\"pop\">\n<div>\n<$checkbox tiddler=<<currentTiddler>> tag=<<tag>> actions=<<tag-checkbox-actions>>>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$checkbox>\n</div>\n</$list>\n</p>\n<p>\n<$fieldmangler>\n<$macrocall $name=\"tag-picker\" actions=<<tag-picker-actions>>/>\n</$fieldmangler>\n</p>\n"},"$:/Manager/ItemSidebar/Tools":{"title":"$:/Manager/ItemSidebar/Tools","tags":"$:/tags/Manager/ItemSidebar","caption":"{{$:/language/Manager/Item/Tools}}","text":"\\whitespace trim\n<p>\n<$button to=<<currentTiddler>>>\n{{$:/core/images/link}}&#32;open\n</$button>\n</p>\n<p>\n<$button message=\"tm-edit-tiddler\" param=<<currentTiddler>>>\n{{$:/core/images/edit-button}}&#32;edit\n</$button>\n</p>\n"},"$:/Manager":{"title":"$:/Manager","icon":"$:/core/images/list","color":"#bbb","text":"\\define lingo-base() $:/language/Manager/\n\n\\define list-item-content-item()\n\\whitespace trim\n<div class=\"tc-manager-list-item-content-item\">\n\t<$vars state-title=\"\"\"$:/state/popup/manager/item/$(listItem)$\"\"\">\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"hide\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/down-arrow}}&#32;<$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"nomatch\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"show\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/right-arrow}}&#32;<$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\" class=\"tc-manager-list-item-content-item-body\">\n\t\t\t<$transclude tiddler=<<listItem>>/>\n\t\t</$reveal>\n\t</$vars>\n</div>\n\\end\n\n\\whitespace trim\n<div class=\"tc-manager-wrapper\">\n\t<div class=\"tc-manager-controls\">\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Show/Prompt>>&#32;<$select tiddler=\"$:/config/Manager/Show\" default=\"tiddlers\">\n\t\t\t\t<option value=\"tiddlers\"><<lingo Controls/Show/Option/Tiddlers>></option>\n\t\t\t\t<option value=\"tags\"><<lingo Controls/Show/Option/Tags>></option>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Search/Prompt>>&#32;<$edit-text tiddler=\"$:/config/Manager/Filter\" tag=\"input\" default=\"\" placeholder={{$:/language/Manager/Controls/Search/Placeholder}}/>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/FilterByTag/Prompt>>&#32;<$select tiddler=\"$:/config/Manager/Tag\" default=\"\">\n\t\t\t\t<option value=\"\"><<lingo Controls/FilterByTag/None>></option>\n\t\t\t\t<$list filter=\"[!is{$:/config/Manager/System}tags[]!is[system]sort[title]]\" variable=\"tag\">\n\t\t\t\t\t<option value=<<tag>>><$text text=<<tag>>/></option>\n\t\t\t\t</$list>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Sort/Prompt>>&#32;<$select tiddler=\"$:/config/Manager/Sort\" default=\"title\">\n\t\t\t\t<optgroup label=\"Common\">\n\t\t\t\t\t<$list filter=\"title modified modifier created creator created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t\t<optgroup label=\"All\">\n\t\t\t\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}fields[]sort[title]] -title -modified -modifier -created -creator -created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t</$select>\n\t\t\t&#32;\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/Order\" field=\"text\" checked=\"reverse\" unchecked=\"forward\" default=\"forward\">\n\t\t\t\t&#32;\n\t\t\t\t<<lingo Controls/Order/Prompt>>\n\t\t\t</$checkbox>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/System\" field=\"text\" checked=\"\" unchecked=\"system\" default=\"system\">\n\t\t\t\t&#32;\n\t\t\t\t{{$:/language/SystemTiddlers/Include/Prompt}}\n\t\t\t</$checkbox>\n\t\t</div>\n\t</div>\n\t<div class=\"tc-manager-list\">\n\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}search{$:/config/Manager/Filter}tag:strict{$:/config/Manager/Tag}sort{$:/config/Manager/Sort}order{$:/config/Manager/Order}]\">\n\t\t\t<$vars transclusion=<<currentTiddler>>>\n\t\t\t\t<div style=\"tc-manager-list-item\">\n\t\t\t\t\t<$button popup=<<qualify \"$:/state/manager/popup\">> class=\"tc-btn-invisible tc-manager-list-item-heading\" selectedClass=\"tc-manager-list-item-heading-selected\">\n\t\t\t\t\t\t<$text text=<<currentTiddler>>/>\n\t\t\t\t\t</$button>\n\t\t\t\t\t<$reveal state=<<qualify \"$:/state/manager/popup\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-manager-list-item-content tc-popup-handle\">\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-tiddler\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemMain]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-sidebar\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemSidebar]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</$reveal>\n\t\t\t\t</div>\n\t\t\t</$vars>\n\t\t</$list>\n\t</div>\n</div>\n"},"$:/core/ui/MissingTemplate":{"title":"$:/core/ui/MissingTemplate","text":"\\whitespace trim\n<div class=\"tc-tiddler-missing\">\n<$button popup=<<qualify \"$:/state/popup/missing\">> class=\"tc-btn-invisible tc-missing-tiddler-label\">\n<$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/missing\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]backlinks[]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</div>\n"},"$:/core/ui/MoreSideBar/All":{"title":"$:/core/ui/MoreSideBar/All","tags":"$:/tags/MoreSideBar","caption":"{{$:/language/SideBar/All/Caption}}","text":"<$list filter={{$:/core/Filters/AllTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"},"$:/core/ui/MoreSideBar/Drafts":{"title":"$:/core/ui/MoreSideBar/Drafts","tags":"$:/tags/MoreSideBar","caption":"{{$:/language/SideBar/Drafts/Caption}}","text":"<$list filter={{$:/core/Filters/Drafts!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"},"$:/core/ui/MoreSideBar/Explorer":{"title":"$:/core/ui/MoreSideBar/Explorer","tags":"$:/tags/MoreSideBar","caption":"{{$:/language/SideBar/Explorer/Caption}}","text":"<<tree \"$:/\">>\n"},"$:/core/ui/MoreSideBar/Missing":{"title":"$:/core/ui/MoreSideBar/Missing","tags":"$:/tags/MoreSideBar","caption":"{{$:/language/SideBar/Missing/Caption}}","text":"<$list filter={{$:/core/Filters/Missing!!filter}} template=\"$:/core/ui/MissingTemplate\"/>\n"},"$:/core/ui/MoreSideBar/Orphans":{"title":"$:/core/ui/MoreSideBar/Orphans","tags":"$:/tags/MoreSideBar","caption":"{{$:/language/SideBar/Orphans/Caption}}","text":"<$list filter={{$:/core/Filters/Orphans!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"},"$:/core/ui/MoreSideBar/Plugins":{"title":"$:/core/ui/MoreSideBar/Plugins","tags":"$:/tags/MoreSideBar","caption":"{{$:/language/ControlPanel/Plugins/Caption}}","text":"\n{{$:/language/ControlPanel/Plugins/Installed/Hint}}\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar/Plugins]!has[draft.of]]\" default=\"$:/core/ui/MoreSideBar/Plugins/Plugins\" explicitState=\"$:/state/tab-1163638994\"/>\n"},"$:/core/ui/MoreSideBar/Recent":{"title":"$:/core/ui/MoreSideBar/Recent","tags":"$:/tags/MoreSideBar","caption":"{{$:/language/SideBar/Recent/Caption}}","text":"<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"},"$:/core/ui/MoreSideBar/Shadows":{"title":"$:/core/ui/MoreSideBar/Shadows","tags":"$:/tags/MoreSideBar","caption":"{{$:/language/SideBar/Shadows/Caption}}","text":"<$list filter={{$:/core/Filters/ShadowTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"},"$:/core/ui/MoreSideBar/System":{"title":"$:/core/ui/MoreSideBar/System","tags":"$:/tags/MoreSideBar","caption":"{{$:/language/SideBar/System/Caption}}","text":"<$list filter={{$:/core/Filters/SystemTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"},"$:/core/ui/MoreSideBar/Tags":{"title":"$:/core/ui/MoreSideBar/Tags","tags":"$:/tags/MoreSideBar","caption":"{{$:/language/SideBar/Tags/Caption}}","text":"\\whitespace trim\n<$let tv-config-toolbar-icons=\"yes\" tv-config-toolbar-text=\"yes\" tv-config-toolbar-class=\"\">\n\t<div class=\"tc-tiny-v-gap-bottom\">\n\t\t{{$:/core/ui/Buttons/tag-manager}}\n\t</div>\n</$let>\n<$list filter={{$:/core/Filters/AllTags!!filter}}>\n\t<div class=\"tc-tiny-v-gap-bottom\">\n\t\t<$transclude tiddler=\"$:/core/ui/TagTemplate\"/>\n\t</div>\n</$list>\n<hr class=\"tc-untagged-separator\">\n{{$:/core/ui/UntaggedTemplate}}\n"},"$:/core/ui/MoreSideBar/Types":{"title":"$:/core/ui/MoreSideBar/Types","tags":"$:/tags/MoreSideBar","caption":"{{$:/language/SideBar/Types/Caption}}","text":"\\whitespace trim\n<$list filter={{$:/core/Filters/TypedTiddlers!!filter}}>\n<div class=\"tc-menu-list-item\">\n<$view field=\"type\"/>\n<$list filter=\"[type{!!type}!is[system]sort[title]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><$view field=\"title\"/></$link>\n</div>\n</$list>\n</div>\n</$list>\n"},"$:/core/ui/MoreSideBar/Plugins/Languages":{"title":"$:/core/ui/MoreSideBar/Plugins/Languages","tags":"$:/tags/MoreSideBar/Plugins","caption":"{{$:/language/ControlPanel/Plugins/Languages/Caption}}","text":"<$list filter=\"[!has[draft.of]plugin-type[language]sort[name]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"},"$:/core/ui/MoreSideBar/Plugins/Plugins":{"title":"$:/core/ui/MoreSideBar/Plugins/Plugins","tags":"$:/tags/MoreSideBar/Plugins","caption":"{{$:/language/ControlPanel/Plugins/Plugins/Caption}}","text":"<$list filter=\"[!has[draft.of]plugin-type[plugin]sort[name]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}>>/>\n"},"$:/core/ui/MoreSideBar/Plugins/Theme":{"title":"$:/core/ui/MoreSideBar/Plugins/Theme","tags":"$:/tags/MoreSideBar/Plugins","caption":"{{$:/language/ControlPanel/Plugins/Themes/Caption}}","text":"<$list filter=\"[!has[draft.of]plugin-type[theme]sort[name]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"},"$:/core/ui/Buttons/advanced-search":{"title":"$:/core/ui/Buttons/advanced-search","tags":"$:/tags/PageControls","caption":"{{$:/core/images/advanced-search-button}} {{$:/language/Buttons/AdvancedSearch/Caption}}","description":"{{$:/language/Buttons/AdvancedSearch/Hint}}","text":"\\whitespace trim\n\\procedure advanced-search-button(class)\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=`$(tv-config-toolbar-class)$ $(class)$`>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/advanced-search-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/></span>\n<%endif%>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]\" emptyMessage=<<advanced-search-button>>>\n<<advanced-search-button \"tc-selected\">>\n</$list>\n"},"$:/core/ui/Buttons/close-all":{"title":"$:/core/ui/Buttons/close-all","tags":"$:/tags/PageControls","caption":"{{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}}","description":"{{$:/language/Buttons/CloseAll/Hint}}","text":"\\whitespace trim\n<$button message=\"tm-close-all-tiddlers\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/close-all-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/CloseAll/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/core/ui/Buttons/control-panel":{"title":"$:/core/ui/Buttons/control-panel","tags":"$:/tags/PageControls","caption":"{{$:/core/images/options-button}} {{$:/language/Buttons/ControlPanel/Caption}}","description":"{{$:/language/Buttons/ControlPanel/Hint}}","text":"\\whitespace trim\n\\procedure control-panel-button(class)\n<$button to=\"$:/ControlPanel\" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=`$(tv-config-toolbar-class)$ $(class)$`>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/options-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/ControlPanel/Caption}}/></span>\n<%endif%>\n</$button>\n\\end\n\n<$list filter=\"[list<tv-story-list>] +[field:title[$:/ControlPanel]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"},"$:/core/ui/Buttons/encryption":{"title":"$:/core/ui/Buttons/encryption","tags":"$:/tags/PageControls","caption":"{{$:/core/images/locked-padlock}} {{$:/language/Buttons/Encryption/Caption}}","description":"{{$:/language/Buttons/Encryption/Hint}}","text":"\\whitespace trim\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-clear-password\" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/locked-padlock}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/>\n</span>\n<%endif%>\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-set-password\" tooltip={{$:/language/Buttons/Encryption/SetPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/SetPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/unlocked-padlock}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/>\n</span>\n<%endif%>\n</$button>\n</$reveal>\n"},"$:/core/ui/Buttons/export-page":{"title":"$:/core/ui/Buttons/export-page","tags":"$:/tags/PageControls","caption":"{{$:/core/images/export-button}} {{$:/language/Buttons/ExportPage/Caption}}","description":"{{$:/language/Buttons/ExportPage/Hint}}","text":"<$transclude $variable=\"exportButton\" exportFilter=\"[!is[system]sort[title]]\" lingoBase=\"$:/language/Buttons/ExportPage/\"/>"},"$:/core/ui/Buttons/fold-all":{"title":"$:/core/ui/Buttons/fold-all","tags":"$:/tags/PageControls","caption":"{{$:/core/images/fold-all-button}} {{$:/language/Buttons/FoldAll/Caption}}","description":"{{$:/language/Buttons/FoldAll/Hint}}","text":"\\whitespace trim\n<$button tooltip={{$:/language/Buttons/FoldAll/Hint}} aria-label={{$:/language/Buttons/FoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/fold-all-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/FoldAll/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/core/ui/Buttons/full-screen":{"title":"$:/core/ui/Buttons/full-screen","tags":"$:/tags/PageControls","caption":"{{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/Caption}}","description":"{{$:/language/Buttons/FullScreen/Hint}}","text":"\\whitespace trim\n<$button message=\"tm-full-screen\" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/full-screen-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/FullScreen/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/core/ui/Buttons/home":{"title":"$:/core/ui/Buttons/home","tags":"$:/tags/PageControls","caption":"{{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}}","description":"{{$:/language/Buttons/Home/Hint}}","text":"\\whitespace trim\n<$button message=\"tm-home\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/home-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Home/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/core/ui/Buttons/import":{"title":"$:/core/ui/Buttons/import","tags":"$:/tags/PageControls","caption":"{{$:/core/images/import-button}} {{$:/language/Buttons/Import/Caption}}","description":"{{$:/language/Buttons/Import/Hint}}","text":"\\whitespace trim\n<div class=\"tc-file-input-wrapper\">\n<$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/import-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Import/Caption}}/>\n</span>\n<%endif%>\n</$button>\n<$browse tooltip={{$:/language/Buttons/Import/Hint}}/>\n</div>\n"},"$:/core/ui/Buttons/language":{"title":"$:/core/ui/Buttons/language","tags":"$:/tags/PageControls","caption":"{{$:/core/images/globe}} {{$:/language/Buttons/Language/Caption}}","description":"{{$:/language/Buttons/Language/Hint}}","text":"\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/language\">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n    <span class=\"tc-image-button\">\n        <$set name=\"languagePluginTitle\" value={{$:/language}}>\n            <$image source=`$(languagePluginTitle)$/icon`/>\n        </$set>\n    </span>\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Language/Caption}}/></span>\n<%endif%>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/language\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/languageswitcher}}\n</div>\n</$reveal>\n"},"$:/core/ui/Buttons/layout":{"title":"$:/core/ui/Buttons/layout","tags":"$:/tags/PageControls","caption":"{{$:/core/images/layout-button}} {{$:/language/Buttons/LayoutSwitcher/Caption}}","description":"{{$:/language/LayoutSwitcher/Description}}","text":"\\whitespace trim\n<$button tooltip={{$:/language/Buttons/LayoutSwitcher/Hint}} aria-label={{$:/language/Buttons/LayoutSwitcher/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-show-switcher\" switch=\"layout\"/>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/layout-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/LayoutSwitcher/Caption}}/></span>\n<%endif%>\n</$button>\n"},"$:/core/ui/Buttons/manager":{"title":"$:/core/ui/Buttons/manager","tags":"$:/tags/PageControls","caption":"{{$:/core/images/list}} {{$:/language/Buttons/Manager/Caption}}","description":"{{$:/language/Buttons/Manager/Hint}}","text":"\\whitespace trim\n\\procedure manager-button(class)\n<$button to=\"$:/Manager\" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class=`$(tv-config-toolbar-class)$ $(class)$`>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/list}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Manager/Caption}}/>\n</span>\n<%endif%>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/Manager]]\" emptyMessage=<<manager-button>>>\n<<manager-button \"tc-selected\">>\n</$list>\n"},"$:/core/ui/Buttons/more-page-actions":{"title":"$:/core/ui/Buttons/more-page-actions","tags":"$:/tags/PageControls","caption":"{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}","description":"{{$:/language/Buttons/More/Hint}}","text":"\\whitespace trim\n\\define config-title() $:/config/PageControlButtons/Visibility/$(listItem)$\n\n<$button popup=<<qualify \"$:/state/popup/more\">>\n\ttooltip={{$:/language/Buttons/More/Hint}}\n\taria-label={{$:/language/Buttons/More/Caption}}\n\tclass=<<tv-config-toolbar-class>>\n\tselectedClass=\"tc-selected\"\n>\n\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t{{$:/core/images/down-arrow}}\n\t<%endif%>\n\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t<span class=\"tc-btn-text\">\n\t\t\t<$text text={{$:/language/Buttons/More/Caption}}/>\n\t\t</span>\n\t<%endif%>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\t<div class=\"tc-drop-down\">\n\t\t<$let tv-config-toolbar-icons=\"yes\" tv-config-toolbar-text=\"yes\" tv-config-toolbar-class=\"tc-btn-invisible\">\n\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]] -[[$:/core/ui/Buttons/more-page-actions]]\"\n\t\t\t\tvariable=\"listItem\"\n\t\t\t>\n\t\t\t\t<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\t\t\t\t\t<$set name=\"tv-config-toolbar-class\"\n\t\t\t\t\t\tfilter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\t\t\t\t\t</$set>\n\t\t\t\t</$reveal>\n\t\t\t</$list>\n\t\t</$let>\n\t</div>\n</$reveal>\n"},"$:/core/ui/Buttons/network-activity":{"title":"$:/core/ui/Buttons/network-activity","tags":"$:/tags/PageControls","caption":"{{$:/core/images/network-activity}} {{$:/language/Buttons/NetworkActivity/Caption}}","description":"{{$:/language/Buttons/NetworkActivity/Hint}}","text":"\\whitespace trim\n<$button message=\"tm-http-cancel-all-requests\" tooltip={{$:/language/Buttons/NetworkActivity/Hint}} aria-label={{$:/language/Buttons/NetworkActivity/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/network-activity}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NetworkActivity/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/core/ui/Buttons/new-image":{"title":"$:/core/ui/Buttons/new-image","tags":"$:/tags/PageControls","caption":"{{$:/core/images/new-image-button}} {{$:/language/Buttons/NewImage/Caption}}","description":"{{$:/language/Buttons/NewImage/Hint}}","text":"\\whitespace trim\n<$button tooltip={{$:/language/Buttons/NewImage/Hint}} aria-label={{$:/language/Buttons/NewImage/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-image}}>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/new-image-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewImage/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/core/ui/Buttons/new-journal":{"title":"$:/core/ui/Buttons/new-journal","tags":"$:/tags/PageControls","caption":"{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournal/Caption}}","description":"{{$:/language/Buttons/NewJournal/Hint}}","text":"\\whitespace trim\n\\procedure journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-journal}}>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/new-journal-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewJournal/Caption}}/>\n</span>\n<%endif%>\n</$button>\n\\end\n<<journalButton>>\n"},"$:/core/ui/Buttons/new-tiddler":{"title":"$:/core/ui/Buttons/new-tiddler","tags":"$:/tags/PageControls","caption":"{{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption}}","description":"{{$:/language/Buttons/NewTiddler/Hint}}","text":"\\whitespace trim\n<$button actions={{$:/core/ui/Actions/new-tiddler}} tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/new-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewTiddler/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/core/ui/Buttons/palette":{"title":"$:/core/ui/Buttons/palette","tags":"$:/tags/PageControls","caption":"{{$:/core/images/palette}} {{$:/language/Buttons/Palette/Caption}}","description":"{{$:/language/Buttons/Palette/Hint}}","text":"\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/palette\">> tooltip={{$:/language/Buttons/Palette/Hint}} aria-label={{$:/language/Buttons/Palette/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/palette}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Palette/Caption}}/></span>\n<%endif%>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/palette\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\" style=\"font-size:0.7em;\">\n{{$:/snippets/paletteswitcher}}\n</div>\n</$reveal>\n"},"$:/core/ui/Buttons/print":{"title":"$:/core/ui/Buttons/print","tags":"$:/tags/PageControls","caption":"{{$:/core/images/print-button}} {{$:/language/Buttons/Print/Caption}}","description":"{{$:/language/Buttons/Print/Hint}}","text":"\\whitespace trim\n<$button message=\"tm-print\" tooltip={{$:/language/Buttons/Print/Hint}} aria-label={{$:/language/Buttons/Print/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/print-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Print/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/core/ui/Buttons/refresh":{"title":"$:/core/ui/Buttons/refresh","tags":"$:/tags/PageControls","caption":"{{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}}","description":"{{$:/language/Buttons/Refresh/Hint}}","text":"\\whitespace trim\n<$button message=\"tm-browser-refresh\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/refresh-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Refresh/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/core/ui/Buttons/save-wiki":{"title":"$:/core/ui/Buttons/save-wiki","tags":"$:/tags/PageControls","caption":"{{$:/core/images/save-button-dynamic}} {{$:/language/Buttons/SaveWiki/Caption}}","description":"{{$:/language/Buttons/SaveWiki/Hint}}","text":"\\whitespace trim\n<$button tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n<span class=\"tc-dirty-indicator\">\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/save-button-dynamic}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/SaveWiki/Caption}}/>\n</span>\n<%endif%>\n</span>\n</$button>\n"},"$:/core/ui/Buttons/storyview":{"title":"$:/core/ui/Buttons/storyview","tags":"$:/tags/PageControls","caption":"{{$:/core/images/storyview-classic}} {{$:/language/Buttons/StoryView/Caption}}","description":"{{$:/language/Buttons/StoryView/Hint}}","text":"\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/storyview\">> tooltip={{$:/language/Buttons/StoryView/Hint}} aria-label={{$:/language/Buttons/StoryView/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n<$set name=\"storyview\" value={{$:/view}}>\n<$transclude tiddler=`$:/core/images/storyview-$(storyview)$`/>\n</$set>\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span>\n<%endif%>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/storyview\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/viewswitcher}}\n</div>\n</$reveal>\n"},"$:/core/ui/Buttons/tag-manager":{"title":"$:/core/ui/Buttons/tag-manager","tags":"$:/tags/PageControls","caption":"{{$:/core/images/tag-button}} {{$:/language/Buttons/TagManager/Caption}}","description":"{{$:/language/Buttons/TagManager/Hint}}","text":"\\whitespace trim\n\\procedure control-panel-button(class)\n<$button to=\"$:/TagManager\" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=`$(tv-config-toolbar-class)$ $(class)$`>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/tag-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/TagManager/Caption}}/>\n</span>\n<%endif%>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/TagManager]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"},"$:/core/ui/Buttons/theme":{"title":"$:/core/ui/Buttons/theme","tags":"$:/tags/PageControls","caption":"{{$:/core/images/theme-button}} {{$:/language/Buttons/Theme/Caption}}","description":"{{$:/language/Buttons/Theme/Hint}}","text":"\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/theme\">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/theme-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Theme/Caption}}/></span>\n<%endif%>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/theme\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/theme\">\n{{$:/snippets/themeswitcher}}\n</$linkcatcher>\n</div>\n</$reveal>\n"},"$:/core/ui/Buttons/timestamp":{"title":"$:/core/ui/Buttons/timestamp","tags":"$:/tags/PageControls","caption":"{{$:/core/images/timestamp-on}} {{$:/language/Buttons/Timestamp/Caption}}","description":"{{$:/language/Buttons/Timestamp/Hint}}","text":"\\whitespace trim\n<$reveal type=\"nomatch\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/On/Hint}} aria-label={{$:/language/Buttons/Timestamp/On/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"yes\"/>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/timestamp-on}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Timestamp/On/Caption}}/>\n</span>\n<%endif%>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/Off/Hint}} aria-label={{$:/language/Buttons/Timestamp/Off/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"no\"/>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/timestamp-off}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/>\n</span>\n<%endif%>\n</$button>\n</$reveal>\n"},"$:/core/ui/Buttons/unfold-all":{"title":"$:/core/ui/Buttons/unfold-all","tags":"$:/tags/PageControls","caption":"{{$:/core/images/unfold-all-button}} {{$:/language/Buttons/UnfoldAll/Caption}}","description":"{{$:/language/Buttons/UnfoldAll/Hint}}","text":"\\whitespace trim\n<$button tooltip={{$:/language/Buttons/UnfoldAll/Hint}} aria-label={{$:/language/Buttons/UnfoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-unfold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/unfold-all-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/UnfoldAll/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/core/ui/PageTemplate/pagecontrols":{"title":"$:/core/ui/PageTemplate/pagecontrols","text":"\\whitespace trim\n\\function config-title() [[$:/config/PageControlButtons/Visibility/$(listItem)$]substitute[]]\n\n<div class=\"tc-page-controls\">\n\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\t\t<$list filter=\"[<config-title>!text[hide]]\" storyview=\"pop\" variable=\"ignore\">\n\t\t\t<$let tv-config-toolbar-class={{{ [enlist<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]] +[join[ ]] }}}>\n\t\t\t\t<$transclude $tiddler=<<listItem>> $mode=\"inline\"/>\n\t\t\t</$let>\n\t\t</$list>\n\t</$list>\n</div>"},"$:/core/ui/PageStylesheet":{"title":"$:/core/ui/PageStylesheet","code-body":"yes","text":"\\import [subfilter{$:/core/config/GlobalImportFilter}]\n\\whitespace trim\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\n</$set>\n\n</$set>\n"},"$:/core/ui/PageTemplate/alerts":{"title":"$:/core/ui/PageTemplate/alerts","tags":"$:/tags/PageTemplate","text":"<div class=\"tc-alerts\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Alert]!has[draft.of]]\" template=\"$:/core/ui/AlertTemplate\" storyview=\"pop\"/>\n\n</div>\n"},"$:/core/ui/PageTemplate/drafts":{"title":"$:/core/ui/PageTemplate/drafts","tags":"$:/tags/PageTemplate","text":"\\whitespace trim\n<$reveal state=\"$:/status/IsReadOnly\" type=\"nomatch\" text=\"yes\" tag=\"div\" class=\"tc-drafts-list\">\n<$list filter=\"[has[draft.of]!sort[modified]] -[list[$:/StoryList]]\">\n<$link>\n{{$:/core/images/edit-button}} <$text text=<<currentTiddler>>/>\n</$link>\n</$list>\n</$reveal>\n"},"$:/core/ui/PageTemplate/pluginreloadwarning":{"title":"$:/core/ui/PageTemplate/pluginreloadwarning","tags":"$:/tags/PageTemplate","text":"\\define lingo-base() $:/language/\n\n<$list filter=\"[{$:/status/RequireReloadDueToPluginChange}match[yes]]\">\n\n<$reveal type=\"nomatch\" state=\"$:/temp/HidePluginWarning\" text=\"yes\">\n\n<div class=\"tc-plugin-reload-warning\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<<lingo PluginReloadWarning>> <$button set=\"$:/temp/HidePluginWarning\" setTo=\"yes\" class=\"tc-btn-invisible\">{{$:/core/images/close-button}}</$button>\n\n</$set>\n\n</div>\n\n</$reveal>\n\n</$list>\n"},"$:/core/ui/PageTemplate/sidebar":{"title":"$:/core/ui/PageTemplate/sidebar","tags":"$:/tags/PageTemplate","text":"\\whitespace trim\n\\define config-title()\n$:/config/SideBarSegments/Visibility/$(listItem)$\n\\end\n\n<$scrollable fallthrough=\"no\" class=\"tc-sidebar-scrollable\">\n\n<div class=\"tc-sidebar-header\">\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBarSegment]!has[draft.of]]\" variable=\"listItem\">\n\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"  tag=\"div\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n\n</$reveal>\n\n</$list>\n\n</$reveal>\n\n</div>\n\n</$scrollable>\n"},"$:/core/ui/PageTemplate/story":{"title":"$:/core/ui/PageTemplate/story","tags":"$:/tags/PageTemplate","text":"\\whitespace trim\n<section class=\"tc-story-river\" role=\"main\">\n\n<section class=\"story-backdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" template=\"$:/core/ui/StoryTiddlerTemplate\" storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/>\n\n<section class=\"story-frontdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n</section>\n"},"$:/core/ui/PageTemplate/topleftbar":{"title":"$:/core/ui/PageTemplate/topleftbar","tags":"$:/tags/PageTemplate","text":"<span class=\"tc-topbar tc-topbar-left\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"},"$:/core/ui/PageTemplate/toprightbar":{"title":"$:/core/ui/PageTemplate/toprightbar","tags":"$:/tags/PageTemplate","text":"<span class=\"tc-topbar tc-topbar-right\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"},"$:/PaletteManager":{"title":"$:/PaletteManager","text":"\\define lingo-base() $:/language/ControlPanel/Palette/Editor/\n\\define describePaletteColour(colour)\n<$transclude tiddler=\"$:/language/Docs/PaletteColours/$colour$\"><$text text=\"$colour$\"/></$transclude>\n\\end\n\\define edit-colour-placeholder()\n edit $(colourName)$\n\\end\n\\define colour-tooltip(showhide) $showhide$ editor for $(newColourName)$ \n\n\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\n\\define delete-colour-index-actions() <$action-setfield $index=<<colourName>>/>\n\\define palette-manager-colour-row-segment()\n\\whitespace trim\n<$edit-text index=<<colourName>> tag=\"input\" placeholder=<<edit-colour-placeholder>> default=\"\"/>\n<br>\n<$edit-text index=<<colourName>> type=\"color\" tag=\"input\" class=\"tc-palette-manager-colour-input\"/>\n<$list filter=\"[<currentTiddler>getindex<colourName>removeprefix[<<]removesuffix[>>]] [<currentTiddler>getindex<colourName>removeprefix[<$]removesuffix[/>]]\" variable=\"ignore\">\n<$set name=\"state\" value={{{ [[$:/state/palettemanager/]addsuffix<currentTiddler>addsuffix[/]addsuffix<colourName>] }}}>\n<$wikify name=\"newColourName\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall={{{ [<currentTiddler>getindex<colourName>] }}}/>\"\"\">\n<$reveal state=<<state>> type=\"nomatch\" text=\"show\">\n<$button tooltip=<<colour-tooltip show>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" set=<<state>> setTo=\"show\">{{$:/core/images/down-arrow}}<$text text=<<newColourName>> class=\"tc-small-gap-left\"/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$button tooltip=<<colour-tooltip hide>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" actions=\"\"\"<$action-deletetiddler $tiddler=<<state>>/>\"\"\">{{$:/core/images/up-arrow}}<$text text=<<newColourName>> class=\"tc-small-gap-left\"/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$set name=\"colourName\" value=<<newColourName>>>\n<br>\n<<palette-manager-colour-row-segment>>\n<br><br>\n</$set>\n</$reveal>\n</$wikify>\n</$set>\n</$list>\n\\end\n\n\\define palette-manager-colour-row()\n\\whitespace trim\n<tr>\n<td>\n<span style=\"float:right;\">\n<$button tooltip={{$:/language/ControlPanel/Palette/Editor/Delete/Hint}} aria-label={{$:/language/ControlPanel/Palette/Editor/Delete/Hint}} class=\"tc-btn-invisible\" actions=<<delete-colour-index-actions>>>\n{{$:/core/images/delete-button}}</$button>\n</span>\n''<$macrocall $name=\"describePaletteColour\" colour=<<colourName>>/>''<br/>\n<$macrocall $name=\"colourName\" $output=\"text/plain\"/>\n</td>\n<td>\n<<palette-manager-colour-row-segment>>\n</td>\n</tr>\n\\end\n\n\\define palette-manager-table()\n\\whitespace trim\n<table>\n<tbody>\n<$set name=\"colorList\" filter=\"[{$:/state/palettemanager/showexternal}match[yes]]\"\n   value=\"[all[shadows+tiddlers]tag[$:/tags/Palette]indexes[]]\" emptyValue=\"[<currentTiddler>indexes[]]\">\n<$list filter=<<colorList>> variable=\"colourName\"> <<palette-manager-colour-row>> </$list>\n</$set>\n</tbody>\n</table>\n\\end\n\\whitespace trim\n<$set name=\"currentTiddler\" value={{$:/palette}}>\n\n<<lingo Prompt>>&#32;<$link to={{$:/palette}}><$macrocall $name=\"currentTiddler\" $output=\"text/plain\"/></$link>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\" variable=\"listItem\">\n<<lingo Prompt/Modified>>\n&#32;\n<$button message=\"tm-delete-tiddler\" param={{$:/palette}}><<lingo Reset/Caption>></$button>\n</$list>\n\n<$list filter=\"[all[current]is[shadow]!is[tiddler]]\" variable=\"listItem\">\n<<lingo Clone/Prompt>>\n</$list>\n\n<$button message=\"tm-new-tiddler\" param={{$:/palette}}><<lingo Clone/Caption>></$button>\n\n<$checkbox tiddler=\"$:/state/palettemanager/showexternal\" field=\"text\" checked=\"yes\" unchecked=\"no\"><span class=\"tc-small-gap-left\"><<lingo Names/External/Show>></span></$checkbox>\n\n<<palette-manager-table>>\n"},"$:/core/ui/PluginInfo":{"title":"$:/core/ui/PluginInfo","text":"\\define localised-info-tiddler-title()\n$(currentTiddler)$/$(languageTitle)$/$(currentTab)$\n\\end\n\\define info-tiddler-title()\n$(currentTiddler)$/$(currentTab)$\n\\end\n\\define default-tiddler-title()\n$:/core/ui/PluginInfo/Default/$(currentTab)$\n\\end\n\\whitespace trim\n<$transclude tiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<default-tiddler-title>> mode=\"block\">\n{{$:/language/ControlPanel/Plugin/NoInfoFound/Hint}}\n</$transclude>\n</$transclude>\n</$transclude>\n</$transclude>\n"},"$:/core/ui/PluginInfo/Default/contents":{"title":"$:/core/ui/PluginInfo/Default/contents","text":"\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n\\whitespace trim\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link />\n</li>\n</$list>\n</ul>\n"},"$:/core/ui/PluginListItemTemplate":{"title":"$:/core/ui/PluginListItemTemplate","text":"\\whitespace trim\n<$link to={{!!title}} class=\"tc-plugin-info\">\n\t<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n\t\t<$transclude tiddler=<<currentTiddler>> subtiddler={{{ [<currentTiddler>addsuffix[/icon]] }}}>\n\t\t\t<$transclude tiddler={{{ [<currentTiddler>get[plugin-type]addprefix[$:/core/images/plugin-generic-]] }}}/>\n\t\t</$transclude>\n\t</div>\n\t<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n\t\t<h1>\n\t\t\t''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'':&nbsp;<$view field=\"description\"><$view field=\"title\"/></$view>\n\t\t</h1>\n\t</div>\n</$link>\n"},"$:/core/ui/RootTemplate":{"title":"$:/core/ui/RootTemplate","code-body":"yes","text":"<$transclude tiddler={{{ [{$:/layout}has[text]] ~[[$:/core/ui/PageTemplate]] }}} mode=\"inline\"/>\n\n"},"$:/core/ui/SearchResults":{"title":"$:/core/ui/SearchResults","text":"<div class=\"tc-search-results\">\n\n<$list\n\tfilter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\"\n\temptyMessage=\"<$list filter='[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]'><$transclude mode='block'/></$list>\">\n\n<$macrocall $name=\"tabs\"\n\ttabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\"\n\tdefault={{$:/config/SearchResults/Default}}\n\tactions=\"<$action-setfield $tiddler='$:/state/search/currentTab' text=<<currentTab>>/>\"\n\texplicitState=\"$:/state/tab/search-results/sidebar\"/>\n\n</$list>\n\n</div>\n"},"$:/core/ui/SideBar/More":{"title":"$:/core/ui/SideBar/More","tags":"$:/tags/SideBar","caption":"{{$:/language/SideBar/More/Caption}}","text":"\\whitespace trim\n<div class={{{ [{$:/config/ui/SideBar/More/horizontal}match[yes]then[tc-sidebar-tabs]else[tc-more-sidebar]] }}}>\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\" default={{$:/config/DefaultMoreSidebarTab}} state=\"$:/state/tab/moresidebar\" class={{{ [{$:/config/ui/SideBar/More/horizontal}match[yes]then[tc-sidebar-tabs-more]else[tc-vertical tc-sidebar-tabs-more]] }}} explicitState=\"$:/state/tab/moresidebar-1850697562\"/>\n</div>\n"},"$:/core/ui/SideBar/Open":{"title":"$:/core/ui/SideBar/Open","tags":"$:/tags/SideBar","caption":"{{$:/language/SideBar/Open/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/CloseAll/\n\n\\define drop-actions()\n<$action-listops $tiddler=<<tv-story-list>> $subfilter=\"+[insertbefore<actionTiddler>,<currentTiddler>]\"/>\n\\end\n\n\\define placeholder()\n<div class=\"tc-droppable-placeholder\"/>\n\\end\n\n\\define droppable-item(button)\n\\whitespace trim\n<$droppable actions=<<drop-actions>> enable=<<tv-allow-drag-and-drop>> tag=\"div\">\n<<placeholder>>\n<div>\n$button$\n</div>\n</$droppable>\n\\end\n\n<div class=\"tc-sidebar-tab-open\">\n<$list filter=\"[list<tv-story-list>]\" history=<<tv-history-list>> storyview=\"pop\">\n<div class=\"tc-sidebar-tab-open-item\">\n<$macrocall $name=\"droppable-item\" button=\"<$button message='tm-close-tiddler' tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class='tc-btn-invisible tc-btn-mini tc-small-gap-right'>{{$:/core/images/close-button}}</$button><$link/>\"/>\n</div>\n</$list>\n<$tiddler tiddler=\"\">\n<div>\n<$macrocall $name=\"droppable-item\" button=\"<$button message='tm-close-all-tiddlers' class='tc-btn-invisible tc-btn-mini'><<lingo Button>></$button>\"/>\n</div>\n</$tiddler>\n</div>\n"},"$:/core/ui/SideBar/Recent":{"title":"$:/core/ui/SideBar/Recent","tags":"$:/tags/SideBar","caption":"{{$:/language/SideBar/Recent/Caption}}","text":"<$transclude $variable=\"timeline\" format={{$:/language/RecentChanges/DateFormat}} limit={{$:/config/RecentLimit}}/>\n"},"$:/core/ui/SideBar/Tools":{"title":"$:/core/ui/SideBar/Tools","tags":"$:/tags/SideBar","caption":"{{$:/language/SideBar/Tools/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n<<lingo Basics/Version/Prompt>> <<version>>\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<div style=\"position:relative;\" class={{{ [<listItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</div>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"},"$:/core/ui/SideBarLists":{"title":"$:/core/ui/SideBarLists","text":"<$transclude tiddler=\"$:/core/ui/SideBarSegments/search\"/>\n\n<$transclude tiddler=\"$:/core/ui/SideBarSegments/tabs\"/>\n\n"},"$:/core/ui/SideBarSegments/page-controls":{"title":"$:/core/ui/SideBarSegments/page-controls","tags":"$:/tags/SideBarSegment","text":"{{||$:/core/ui/PageTemplate/pagecontrols}}\n"},"$:/core/ui/SideBarSegments/search":{"title":"$:/core/ui/SideBarSegments/search","tags":"$:/tags/SideBarSegment","text":"\\whitespace trim\n\n\\procedure count-popup-button()\n\\whitespace trim\n<$button popup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<$list filter=\"[<searchTiddler>get[text]minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$vars userInput={{{ [<searchTiddler>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] :else[{$:/config/SearchResults/Default}] }}} replaceRegexp=\"limit\\[\\d+\\]\">\n<$vars primaryListFilter={{{ [<configTiddler>get[first-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}} secondaryListFilter={{{ [<configTiddler>get[second-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}}>\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[subfilter<primaryListFilter>] [subfilter<secondaryListFilter>]\"/>\"\"\">\n{{$:/language/Search/Matches}}\n</$set>\n</$vars>\n</$vars>\n</$list>\n</$button>\n\\end\n\n\\procedure search-results-list()\n\\whitespace trim\n<$vars userInput={{{ [<searchTiddler>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] :else[{$:/config/SearchResults/Default}] }}}>\n<$list filter=\"[<userInput>minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$tiddler tiddler=<<configTiddler>>>\n\n{{$:/core/ui/SearchResults}}\n\n</$tiddler>\n\n</$list>\n</$vars>\n\\end\n\n\\procedure cancel-search-actions() <$list filter=\"[<searchTiddler>get[text]!match{$:/temp/search}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/search]] [<searchTiddler>] [<searchListState>]\"/>\"\"\"><$action-setfield $tiddler=\"$:/temp/search\" text={{{ [<searchTiddler>get[text]] }}}/><$action-setfield $tiddler=\"$:/temp/search/refresh\" text=\"yes\"/></$list>\n\n\\procedure input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]\"><$action-navigate $to={{{ [<tiddler>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<tiddler>get[text]] }}}/></$list>\n\n\\procedure input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]\"><$list filter=\"[<tiddler>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<tiddler>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<tiddler>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<tiddler>get[text]] }}}/></$list></$list>\n\n\\procedure set-next-input-tab() <$transclude $variable=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"after\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\procedure set-previous-input-tab() <$transclude $variable=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"before\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\procedure advanced-search-actions() <$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search/input}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/search/input}}/><<delete-state-tiddlers>><$action-navigate $to=\"$:/AdvancedSearch\"/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\" preventScroll=\"true\"/><$action-deletetiddler $filter=\"$:/temp/search $:/temp/search/input $:/temp/search/refresh [<searchListState>]\"/>\n\n<div class=\"tc-sidebar-lists tc-sidebar-search\">\n\n<$vars editTiddler=\"$:/temp/search\" searchTiddler=\"$:/temp/search/input\" searchListState=<<qualify \"$:/state/search-list/selected-item\">>>\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-previous-input-tab>>>\n<$keyboard key=\"((advanced-search-sidebar))\" actions=<<advanced-search-actions>>>\n<form class=\"tc-form-inline\">\n<$transclude $variable=\"keyboard-driven-input\" tiddler=<<editTiddler>> storeTitle=<<searchTiddler>> \n\t\tselectionStateTitle=<<searchListState>> refreshTitle=\"$:/temp/search/refresh\" type=\"search\" \n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify \"$:/state/popup/search-dropdown\">> \n\t\tclass=\"tc-tiny-gap-right tc-popup-handle\" filterMinLength={{$:/config/Search/MinLength}} inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> cancelPopups=\"yes\" \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] :else[{$:/config/SearchResults/Default}]\"/>\n</form>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n<$reveal state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<<advanced-search-actions>>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>><$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n{{$:/core/images/close-button}}\n</$button>\n<<count-popup-button>>\n</$reveal>\n<$reveal state=<<searchTiddler>> type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown tc-search-drop-down tc-popup-handle\" state=<<qualify \"$:/state/popup/search-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n\n<<search-results-list>>\n\n</$reveal>\n\n</$reveal>\n\n</$vars>\n\n</div>\n"},"$:/core/ui/SideBarSegments/site-subtitle":{"title":"$:/core/ui/SideBarSegments/site-subtitle","tags":"$:/tags/SideBarSegment","text":"<div class=\"tc-site-subtitle\">\n\n<$transclude tiddler=\"$:/SiteSubtitle\" mode=\"inline\"/>\n\n</div>\n"},"$:/core/ui/SideBarSegments/site-title":{"title":"$:/core/ui/SideBarSegments/site-title","tags":"$:/tags/SideBarSegment","text":"<h1 class=\"tc-site-title\">\n\n<$transclude tiddler=\"$:/SiteTitle\" mode=\"inline\"/>\n\n</h1>\n"},"$:/core/ui/SideBarSegments/tabs":{"title":"$:/core/ui/SideBarSegments/tabs","tags":"$:/tags/SideBarSegment","text":"<div class=\"tc-sidebar-lists tc-sidebar-tabs\" role=\"region\" aria-label={{$:/language/SideBar/Caption}}>\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" default={{$:/config/DefaultSidebarTab}} state=\"$:/state/tab/sidebar\" class=\"tc-sidebar-tabs-main\" explicitState=\"$:/state/tab/sidebar--595412856\"/>\n\n</div>\n"},"$:/core/ui/PageTemplate":{"title":"$:/core/ui/PageTemplate","name":"{{$:/language/PageTemplate/Name}}","description":"{{$:/language/PageTemplate/Description}}","icon":"$:/core/images/standard-layout","code-body":"yes","text":"\\whitespace trim\n\\import [subfilter{$:/core/config/GlobalImportFilter}]\n\n<$vars\n\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\n\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\n\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\n\ttv-enable-drag-and-drop={{$:/config/DragAndDrop/Enable}}\n\ttv-show-missing-links={{$:/config/MissingLinks}}\n\tstoryviewTitle={{$:/view}}\n\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\n\n<div class={{{ [all[shadows+tiddlers]tag[$:/tags/ClassFilters/PageTemplate]!is[draft]] :map:flat[subfilter{!!text}] tc-page-container [[tc-page-view-]addsuffix<storyviewTitle>] [[tc-language-]addsuffix<languageTitle>] :and[unique[]join[ ]] }}} >\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n\n<$dropzone enable=<<tv-enable-drag-and-drop>> class=\"tc-dropzone tc-page-container-inner\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n\n</$dropzone>\n\n</$navigator>\n\n</div>\n\n</$vars>\n"},"$:/core/ui/StoryTiddlerTemplate":{"title":"$:/core/ui/StoryTiddlerTemplate","code-body":"yes","text":"<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/StoryTiddlerTemplateFilter]!is[draft]get[text]] :and[has[title]else[$:/core/ui/ViewTemplate]] }}} />\n"},"$:/core/ui/SwitcherModal":{"title":"$:/core/ui/SwitcherModal","subtitle":"<$text text={{{[<switch>lookup[$:/language/Switcher/Subtitle/]]}}}/>","class":"tc-modal-centered","mask-closable":"yes","text":"<$tiddler tiddler={{{[<switch>lookup[$:/config/SwitcherTargets/]]}}}>\n\n\n<$transclude/>\n\n\n</$tiddler>"},"$:/TagManager":{"title":"$:/TagManager","icon":"$:/core/images/tag-button","color":"#bbb","text":"\\define lingo-base() $:/language/TagManager/\n\n\\define iconEditorTab(type)\n\\whitespace trim\n<$link to=\"\"><<lingo Icons/None>></$link>\n<$list filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[sort[title]] +[$type$is[system]]\">\n\t<$link to={{!!title}}>\n\t\t<$transclude/> <$view field=\"title\"/>\n\t</$link>\n</$list>\n\\end\n\n\\define iconEditor(title)\n\\whitespace trim\n<div class=\"tc-drop-down-wrapper\">\n\t<$button popupTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} class=\"tc-btn-invisible tc-btn-dropdown\">\n\t\t{{$:/core/images/down-arrow}}\n\t</$button>\n\t<$reveal stateTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n\t\t<div class=\"tc-drop-down\">\n\t\t\t<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=<<__title__>> icon=<<navigateTo>>/>\"\"\">\n\t\t\t\t<<iconEditorTab type:\"!\">>\n\t\t\t\t<hr/>\n\t\t\t\t<<iconEditorTab type:\"\">>\n\t\t\t</$linkcatcher>\n\t\t</div>\n\t</$reveal>\n</div>\n\\end\n\n\\define toggleButton(state)\n\\whitespace trim\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"closed\" default=\"closed\">\n\t<$button setTitle=<<__state__>> setTo=\"open\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n\t\t{{$:/core/images/info-button}}\n\t</$button>\n</$reveal>\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"open\" default=\"closed\">\n\t<$button setTitle=<<__state__>> setTo=\"closed\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n\t\t{{$:/core/images/info-button}}\n\t</$button>\n</$reveal>\n\\end\n\n\\procedure color-picker-actions()\n\\whitespace trim\n<$action-setfield $tiddler=<<currentTiddler>> color=<<colour-picker-value>>/>\n\\end\n\n\\procedure color-picker-button()\n\\whitespace trim\n<div class=\"tc-drop-down-wrapper\">\n<$button class=\"tc-btn-invisible\" popup={{{ [[$:/state/tag-manager/color/]addsuffix<currentTiddler>] }}}>{{$:/core/images/palette}}</$button>\n<$reveal type=\"popup\" tag=\"div\" class=\"tc-drop-down tc-popup-keep\" state={{{ [[$:/state/tag-manager/color/]addsuffix<currentTiddler>] }}}>\n<$transclude $variable=\"colour-picker\" actions=<<color-picker-actions>>/>\n</$reveal>\n</div>\n\\end\n\n\\whitespace trim\n<table class=\"tc-tag-manager-table\">\n<tbody>\n\t<tr>\n\t\t<th><<lingo Colour/Heading>></th>\n\t\t<th class=\"tc-tag-manager-tag\"><<lingo Tag/Heading>></th>\n\t\t<th><<lingo Count/Heading>></th>\n\t\t<th><<lingo Icon/Heading>></th>\n\t\t<th><<lingo Info/Heading>></th>\n\t</tr>\n\t<$list filter=\"[tags[]!is[system]sort[title]]\">\n\t\t<tr>\n\t\t\t<td><$transclude $variable=\"color-picker-button\"/></td>\n\t\t\t<td>{{||$:/core/ui/TagTemplate}}</td>\n\t\t\t<td><$count filter=\"[all[current]tagging[]]\"/></td>\n\t\t\t<td>\n\t\t\t\t<$macrocall $name=\"iconEditor\" title={{!!title}}/>\n\t\t\t</td>\n\t\t\t<td>\n\t\t\t\t<$macrocall $name=\"toggleButton\" state={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} />\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td></td>\n\t\t\t<td colspan=\"4\">\n\t\t\t\t<$reveal stateTitle={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} type=\"match\" text=\"open\" default=\"\">\n\t\t\t\t\t<table>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td><<lingo Colour/Heading>></td>\n\t\t\t\t\t\t\t\t<td><$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/></td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td><<lingo Icon/Heading>></td>\n\t\t\t\t\t\t\t\t<td><$edit-text field=\"icon\" tag=\"input\" size=\"45\"/></td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t</$reveal>\n\t\t\t</td>\n\t\t</tr>\n\t</$list>\n\t<tr>\n\t\t<td></td>\n\t\t<td style=\"position:relative;\">\n\t\t\t{{$:/core/ui/UntaggedTemplate}}\n\t\t</td>\n\t\t<td>\n\t\t\t<small class=\"tc-menu-list-count\"><$count filter=\"[untagged[]!is[system]] -[tags[]]\"/></small>\n\t\t</td>\n\t\t<td></td>\n\t\t<td></td>\n\t</tr>\n</tbody>\n</table>"},"$:/core/ui/TagPickerTagTemplate":{"title":"$:/core/ui/TagPickerTagTemplate","text":"\\whitespace trim\n<$button class=<<button-classes>> tag=\"a\" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}>\n\t<$list filter=\"[<saveTiddler>minlength[1]]\">\n\t\t<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter=\"[<tag>]\"/>\n\t</$list>\n\t<$set name=\"currentTiddlerCSSEscaped\" value={{{ [<saveTiddler>escapecss[]] }}}>\n\t\t<$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-tagpicker-focus-selector>> preventScroll=\"true\"/>\n\t</$set>\n\t<<delete-tag-state-tiddlers>>\n\t<$list filter=\"[<refreshTitle>minlength[1]]\">\n\t\t<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n\t</$list>\n\t<<actions>>\n\t<$set name=\"backgroundColor\"\n\t\tvalue={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}\n\t>\n\t\t<$wikify name=\"foregroundColor\"\n\t\t\ttext=\"\"\"<$macrocall $name=\"contrastcolour\" target=<<backgroundColor>> fallbackTarget=<<fallbackTarget>> colourA=<<colourA>> colourB=<<colourB>>/>\"\"\"\n\t\t>\n\t\t\t<span class=\"tc-tag-label tc-btn-invisible\"\n\t\t\t\tstyle=<<tag-pill-styles>>\n\t\t\t\tdata-tag-title=<<currentTiddler>>\n\t\t\t>\n\t\t\t\t{{||$:/core/ui/TiddlerIcon}}<$view field=\"title\" format=\"text\"/>\n\t\t\t</span>\n\t\t</$wikify>\n\t</$set>\n</$button>\n"},"$:/core/ui/TagTemplate":{"title":"$:/core/ui/TagTemplate","text":"\\whitespace trim\n<span class=\"tc-tag-list-item\" data-tag-title=<<currentTiddler>>>\n<$set name=\"transclusion\" value=<<currentTiddler>>>\n\t<$macrocall $name=\"tag-pill-body\"\n\t\ttag=<<currentTiddler>>\n\t\ticon={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}}\n\t\tcolour={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}\n\t\tpalette={{$:/palette}}\n\t\telement-tag=\"$button\"\n\t\telement-attributes=\"\"\"popup=<<qualify \"$:/state/popup/tag\">> dragFilter=\"[subfilter{$:/core/config/TagPillDragFilter}]\" tag='span'\"\"\"\n\t/>\n\t<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\" animate=\"yes\" class=\"tc-drop-down\">\n\t\t<$set name=\"tv-show-missing-links\" value=\"yes\">\n\t\t\t<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n\t\t</$set>\n\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]\" variable=\"listItem\"> \n\t\t\t<$transclude tiddler=<<listItem>>/> \n\t\t</$list>\n\t\t<hr>\n\t\t<$macrocall $name=\"list-tagged-draggable\" tag=<<currentTiddler>>/>\n\t</$reveal>\n</$set>\n</span>\n"},"$:/core/ui/TestCaseTemplate":{"title":"$:/core/ui/TestCaseTemplate","text":"\\parameters (hideIfPass:\"no\")\n\\whitespace trim\n<$let\n\tlinkTarget=\"yes\"\n\tdisplayFormat={{!!display-format}}\n\ttestcaseTiddler=<<currentTiddler>>\n>\n\t<$testcase\n\t\ttestOutput=\"Output\"\n\t\ttestExpectedResult=\"ExpectedResult\"\n\t\ttestActions=\"Actions\"\n\t\ttestHideIfPass=<<hideIfPass>>\n\t>\n\t\t<$data $filter={{!!import}}/>\n\t\t<$data $compound-filter={{!!import-compound}}/>\n\t\t<$data $compound-tiddler=<<currentTiddler>>/>\n\t\t<%if [{!!description}!is[blank]] %><$data title=\"Description\" text={{!!description}}/><%endif%>\n\t</$testcase>\n</$let>\n"},"$:/core/ui/testcases/DefaultTemplate":{"title":"$:/core/ui/testcases/DefaultTemplate","code-body":"yes","text":"\\whitespace trim\n\n\\function tf.state() \"$:/state/testcase\"\n\n\\procedure linkcatcherActions()\n<%if [<navigateTo>has[title]] %>\n\t<$action-setfield $tiddler=<<tf.state>> text=<<navigateTo>>/>\n<%endif%>\n\\end\n\n\\procedure testcase-header()\n<div class=\"tc-test-case-header\">\n\t<h2>\n\t\t<$genesis $type={{{ [<linkTarget>!match[]then[$link]else[span]] }}} to=<<testcaseTiddler>>>\n\t\t\t<%if [<testResult>!match[]] %>\n\t\t\t\t<span class={{{ tc-test-case-result-icon\n\t\t\t\t\t[<testResult>!match[fail]then[tc-test-case-result-icon-pass]]\n\t\t\t\t\t[<testResult>match[fail]then[tc-test-case-result-icon-fail]]\n\t\t\t\t\t+[join[ ]] }}}\n\t\t\t\t>\n\t\t\t\t\t<%if [<testResult>!match[fail]] %>\n\t\t\t\t\t\t{{$:/core/images/done-button}}\n\t\t\t\t\t<%else%>\n\t\t\t\t\t\t{{$:/core/images/close-button}}\n\t\t\t\t\t<%endif%>\n\t\t\t\t</span>\n\t\t\t<%endif%>\n\t\t\t<$view tiddler=\"Description\" mode=\"inline\"/>\n\t\t</$genesis>\n\t\t<span class=\"tc-test-case-toolbar\">\n\t\t\t<<testcase-toolbar>>\n\t\t</span>\n\t</h2>\n</div>\n\\end\n\n\\procedure testcase-toolbar()\n<$button popup=`$(tf.state)$-more`\n\ttooltip={{$:/language/Buttons/More/Hint}}\n\taria-label={{$:/language/Buttons/More/Caption}}\n\tclass=\"tc-btn-invisible\"\n\tselectedClass=\"tc-selected\"\n>\n\t{{$:/core/images/down-arrow}}\n</$button>\n<$let\n\ttv-config-toolbar-icons=\"yes\"\n\ttv-config-toolbar-text=\"yes\"\n\ttv-config-toolbar-class=\"tc-btn-invisible\"\n>\n\t<$reveal state=`$(tf.state)$-more` type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\t\t<div class=\"tc-drop-down\">\n\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TestCase/Actions]!has[draft.of]]\"\n\t\t\t\tvariable=\"listItem\"\n\t\t\t>\n\t\t\t\t<$transclude $tiddler=<<listItem>> $mode=\"inline\"/>\n\t\t\t</$list>\n\t\t</div>\n\t</$reveal>\n</$let>\n\\end\n\n\\procedure testcase-narrative()\n<div class=\"tc-test-case-narrative\">\n\t<$transclude $tiddler=\"Narrative\" $mode=\"block\"/>\n</div>\n\\end\n\n\\procedure testcase-fail()\n<div class=\"tc-test-case-result-fail\">\n\t<div class=\"tc-test-case-result-fail-header\">\n\t\tTEST FAILED\n\t</div>\n\t<div class=\"tc-test-case-result-fail-body\">\n\t\t<$diff-text source=<<expectedHTML>> dest=<<outputHTML>>/>\n\t</div>\n</div>\n\\end\n\n\\procedure testcase-output-wikified()\n<$linkcatcher actions=<<linkcatcherActions>>>\n\t<$tiddler tiddler=\"Output\">\n\t\t<$transclude $tiddler=\"Output\" $mode=\"block\"/>\n\t</$tiddler>\n</$linkcatcher>\n\\end\n\n\\procedure testcase-output()\n<div class=\"tc-test-case-output\">\n\t<%if [<displayFormat>!match[]else[wikitext]match[plaintext]] %>\n\t\t<pre><$view tiddler=\"Output\" format=\"plainwikified\" mode=\"block\"/></pre>\n\t<%else%>\n\t\t<<testcase-output-wikified>>\n\t<%endif%>\n</div>\n\\end\n\n\\procedure testcase-tabsList()\n[all[tiddlers]sort[]] Output +[putfirst[]]\n-Description\n-Narrative\n-[[$:/temp/testcase/draft-title]]\n-[has[plugin-type]]\n-[prefix<tf.state>]\n-[prefix[$:/state/popup/export]]\n-[prefix[$:/HistoryList]]\n-[prefix[$:/StoryList]]\n\\end\n\n\\procedure testcase-source()\n<div class=\"tc-test-case-source\">\n\t<$macrocall $name=\"tabs\"\n\t\ttabsList=<<testcase-tabsList>>\n\t\texplicitState=<<tf.state>>\n\t\tdefault=\"Output\"\n\t\ttemplate=\"$:/core/ui/testcases/DefaultTemplate/SourceTabs\"\n\t/>\n</div>\n\\end\n\n\\procedure testcase-panes()\n<div class=\"tc-test-case-panes\">\n\t<<testcase-source>>\n\t<div class=\"tc-test-case-divider\"></div>\n\t<<testcase-output>>\n</div>\n\\end\n\n\\procedure testcase-body()\n<div class=\"tc-test-case-wrapper\">\n\t<<testcase-header>>\n\t<$let testcase-source-state = <<tf.state>>>\n\t\t<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\t\t\t<%if [[Narrative]is[tiddler]] %>\n\t\t\t\t<<testcase-narrative>>\n\t\t\t<%endif%>\n\t\t\t<%if [<testResult>match[fail]] %>\n\t\t\t\t<<testcase-fail>>\n\t\t\t<%endif%>\n\t\t\t<<testcase-panes>>\n\t\t</$navigator>\n\t</$let>\n</div>\n\\end\n\n<<testcase-body>>"},"$:/core/ui/testcases/DefaultTemplate/SourceTabs":{"title":"$:/core/ui/testcases/DefaultTemplate/SourceTabs","text":"\\whitespace trim\n\n\\procedure testcaseNewTitle() $:/temp/testcase/draft-title\n\n\\procedure saveActions()\n<$action-setfield $tiddler=<<currentTab>> $field=\"draft.title\" $value=<<newTitle>>/>\n<$action-sendmessage $message=\"tm-save-tiddler\" $param=<<title>> />\n<$action-setfield $tiddler=<<testcase-source-state>> text=<<newTitle>>/>\n<$action-deletetiddler $tiddler=<<testcaseNewTitle>>/>\n\\end\n\n\\procedure saveButton(title, newTitle)\n<$button class=\"tc-btn-invisible tc-test-case-save-button tc-small-gap-left\" actions=<<saveActions>> disabled={{{ [<testcaseNewTitle>!has[text]then[yes]] }}}>\n{{$:/core/images/done-button}}\n</$button>\n\\end\n\n\\procedure body()\n<$list filter=\"[<currentTab>fields[]] -text +[limit[1]]\" variable=\"ignore\">\n\t<table class=\"tc-field-table\">\n\t\t<tbody>\n\t\t\t<$list filter=\"[<currentTab>fields[]sort[]] -text -title title +[putfirst[]]\" variable=\"fieldName\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<$text text=<<fieldName>>/>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<%if [<fieldName>match[draft.title]]  %>\n\t\t\t\t\t\t\t<$edit-text class=\"tc-edit-texteditor tc-max-width-80\" tiddler=<<testcaseNewTitle>> focus=\"yes\" tag=\"input\"/>\n\t\t\t\t\t\t\t<$macrocall $name=\"saveButton\" newTitle={{{ [<testcaseNewTitle>get[text]] }}} title=<<currentTab>>/>\n\t\t\t\t\t\t<%else%>\n\t\t\t\t\t\t\t<$view tiddler=<<currentTab>> field=<<fieldName>>/>\n\t\t\t\t\t\t<%endif%>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</$list>\n\t\t</tbody>\n\t</table>\n</$list>\n<$edit class=\"tc-edit-texteditor\" tiddler=<<currentTab>>/>\n<div class=\"tc-test-case-footer-toolbar\">\n<$macrocall $name=\"copy-to-clipboard\" src={{{ [<currentTab>get[text]] }}}/>\n</div>\n\\end\n\n<$transclude $variable=\"body\" $mode=\"inline\"/>\n"},"$:/core/ui/testcases/RawJSONTemplate":{"title":"$:/core/ui/testcases/RawJSONTemplate","text":"\\whitespace trim\n<$text text=<<payloadTiddlers>>/>\n"},"$:/core/ui/testcases/actions/Export":{"title":"$:/core/ui/testcases/actions/Export","tags":"$:/tags/TestCase/Actions","text":"<$macrocall $name=\"exportButton\" exportFilter=\"[all[tiddlers]sort[]] -[prefix[$:/state/]] -Description -Narrative -ExpectedResult -[has[plugin-type]]\" lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>"},"$:/core/ui/testcases/actions/Import":{"title":"$:/core/ui/testcases/actions/Import","tags":"$:/tags/TestCase/Actions","text":"\\whitespace trim\n<$button tooltip={{$:/language/Buttons/TestCaseImport/Hint}} aria-label={{$:/language/Buttons/TestCaseImport/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-import-tiddlers\" $param=<<payloadTiddlers>>/>\n{{$:/core/images/input-button}}\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/TestCaseImport/Caption}}/>\n</span>\n</$button>\n"},"$:/core/ui/TiddlerFieldTemplate":{"title":"$:/core/ui/TiddlerFieldTemplate","text":"\\whitespace trim\n<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<listItem>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<listItem>>/>\n</td>\n</tr>"},"$:/core/ui/TiddlerFields":{"title":"$:/core/ui/TiddlerFields","text":"\\whitespace trim\n<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"},"$:/core/ui/TiddlerIcon":{"title":"$:/core/ui/TiddlerIcon","text":"\\whitespace trim\n<$let tiddlerIcon={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}}>\n<$list filter=\"[<tiddlerIcon>!is[blank]]\" variable=\"ignore\">\n<$transclude tiddler=<<tiddlerIcon>>/>\n</$list>\n</$let>\n"},"$:/core/ui/TiddlerInfo/Advanced/PluginInfo":{"title":"$:/core/ui/TiddlerInfo/Advanced/PluginInfo","tags":"$:/tags/TiddlerInfo/Advanced","text":"\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n\\whitespace trim\n<$list filter=\"[all[current]has[plugin-type]]\">\n\n! <<lingo Heading>>\n\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</li>\n</$list>\n</ul>\n\n</$list>\n"},"$:/core/ui/TiddlerInfo/Advanced/ShadowInfo":{"title":"$:/core/ui/TiddlerInfo/Advanced/ShadowInfo","tags":"$:/tags/TiddlerInfo/Advanced","text":"\\define lingo-base() $:/language/TiddlerInfo/Advanced/ShadowInfo/\n<$set name=\"infoTiddler\" value=<<currentTiddler>>>\n\n''<<lingo Heading>>''\n\n<$list filter=\"[all[current]!is[shadow]]\">\n\n<<lingo NotShadow/Hint>>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]]\">\n\n<<lingo Shadow/Hint>>\n\n<$list filter=\"[all[current]shadowsource[]]\">\n\n<$set name=\"pluginTiddler\" value=<<currentTiddler>>>\n\n<<lingo Shadow/Source>>\n</$set>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\">\n\n<<lingo OverriddenShadow/Hint>>\n\n</$list>\n\n\n</$list>\n</$set>\n"},"$:/core/ui/TiddlerInfo/Advanced":{"title":"$:/core/ui/TiddlerInfo/Advanced","tags":"$:/tags/TiddlerInfo","caption":"{{$:/language/TiddlerInfo/Advanced/Caption}}","text":"<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n\n</$list>\n"},"$:/core/ui/TiddlerInfo/Fields":{"title":"$:/core/ui/TiddlerInfo/Fields","tags":"$:/tags/TiddlerInfo","caption":"{{$:/language/TiddlerInfo/Fields/Caption}}","text":"<$transclude tiddler=\"$:/core/ui/TiddlerFields\"/>\n"},"$:/core/ui/TiddlerInfo/List":{"title":"$:/core/ui/TiddlerInfo/List","tags":"$:/tags/TiddlerInfo","caption":"{{$:/language/TiddlerInfo/List/Caption}}","text":"\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[list{!!title}]\" emptyMessage=<<lingo List/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"},"$:/core/ui/TiddlerInfo/Listed":{"title":"$:/core/ui/TiddlerInfo/Listed","tags":"$:/tags/TiddlerInfo","caption":"{{$:/language/TiddlerInfo/Listed/Caption}}","text":"\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]listed[]!is[system]]\" emptyMessage=<<lingo Listed/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"},"$:/core/ui/TiddlerInfo/References":{"title":"$:/core/ui/TiddlerInfo/References","tags":"$:/tags/TiddlerInfo","caption":"{{$:/language/TiddlerInfo/References/Caption}}","text":"\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]backlinks[]sort[title]]\" emptyMessage=<<lingo References/Empty>> template=\"$:/core/ui/ListItemTemplate\">\n</$list>"},"$:/core/ui/TiddlerInfo/Tagging":{"title":"$:/core/ui/TiddlerInfo/Tagging","tags":"$:/tags/TiddlerInfo","caption":"{{$:/language/TiddlerInfo/Tagging/Caption}}","text":"\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]tagging[]]\" emptyMessage=<<lingo Tagging/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"},"$:/core/ui/TiddlerInfo/Tools":{"title":"$:/core/ui/TiddlerInfo/Tools","tags":"$:/tags/TiddlerInfo","caption":"{{$:/language/TiddlerInfo/Tools/Caption}}","text":"\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"},"$:/core/ui/TiddlerInfo":{"title":"$:/core/ui/TiddlerInfo","text":"\\whitespace trim\n<div style=\"position:relative;\">\n<div class=\"tc-tiddler-controls\" style=\"position:absolute;right:0;\">\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n</div>\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\" default={{$:/config/TiddlerInfo/Default}}/>\n"},"$:/core/ui/TopBar/menu":{"title":"$:/core/ui/TopBar/menu","tags":"$:/tags/TopRightBar","text":"\\whitespace trim\n<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]!match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible tc-hide-sidebar-btn\">{{$:/core/images/chevron-right}}</$button>\n</$list>\n<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible tc-show-sidebar-btn\">{{$:/core/images/chevron-left}}</$button>\n</$list>\n"},"$:/core/ui/UntaggedTemplate":{"title":"$:/core/ui/UntaggedTemplate","text":"\\define lingo-base() $:/language/SideBar/\n\\whitespace trim\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-untagged-label tc-tag-label\">\n\t<<lingo Tags/Untagged/Caption>>\n</$button>\n<$reveal class=\"tc-drop-down\" tag=\"div\" state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\">\n\t<$list filter=\"[untagged[]!is[system]] -[tags[]] +[sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</$reveal>\n"},"$:/core/ui/ViewTemplate/body/blank":{"title":"$:/core/ui/ViewTemplate/body/blank","text":"<!-- Intentionally blank -->\n"},"$:/core/ui/ViewTemplate/body/code":{"title":"$:/core/ui/ViewTemplate/body/code","text":"<%if [<currentTiddler>is[missing]] :and[!is[shadow]] %>\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n<%else%>\n<$transclude $variable=\"copy-to-clipboard-above-right\" src={{{ [<currentTiddler>get[text]] }}} />\n<$codeblock code={{{ [<currentTiddler>get[text]] }}} language={{{ [<currentTiddler>get[type]else[text/vnd.tiddlywiki]] }}}/>\n<%endif%>"},"$:/core/ui/ViewTemplate/body/default":{"title":"$:/core/ui/ViewTemplate/body/default","code-body":"yes","text":"<$transclude>\n\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n\n</$transclude>\n"},"$:/core/ui/ViewTemplate/body/import":{"title":"$:/core/ui/ViewTemplate/body/import","text":"\\define lingo-base() $:/language/Import/\n\n\\define confirmCancel()\n\\whitespace trim\n<$action-confirm $message={{$:/language/Import/Listing/Cancel/Warning}} >\n<$action-deletetiddler $tiddler=<<currentTiddler>>/>\n<$action-deletetiddler $tiddler=\"$:/state/import/select-all\"/>\n<$action-sendmessage $message=\"tm-close-tiddler\" title=<<currentTiddler>>/>\n</$action-confirm>\n\\end\n\n\\define buttons()\n\\whitespace trim\n<$button actions=<<confirmCancel>> ><<lingo Listing/Cancel/Caption>></$button>\n&#32;\n<$button message=\"tm-perform-import\" param=<<currentTiddler>>><<lingo Listing/Import/Caption>></$button>\n&#32;\n<<lingo Listing/Preview>>&#32;<$select tiddler=\"$:/state/importpreviewtype\" default=\"$:/core/ui/ImportPreviews/Text\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ImportPreview]!has[draft.of]]\">\n<option value=<<currentTiddler>>>{{!!caption}}</option>\n</$list>\n</$select>\n\\end\n\\whitespace trim\n\n<$list filter=\"[all[current]field:plugin-type[import]]\">\n\n<div class=\"tc-import\">\n\n<<lingo Listing/Hint>>\n\n<<buttons>>\n\n{{||$:/core/ui/ImportListing}}\n\n<<buttons>>\n\n</div>\n\n</$list>\n"},"$:/core/ui/ViewTemplate/body/plugin":{"title":"$:/core/ui/ViewTemplate/body/plugin","text":"\\whitespace trim\n<div class=\"tc-tiddler-plugin-info\">\n<$let plugin-type={{!!plugin-type}}\n\tdefault-popup-state=\"yes\"\n\tqualified-state=<<qualify \"$:/state/plugin-info\">>\n>\n{{||$:/core/ui/Components/plugin-info}}\n</$let>\n</div>"},"$:/core/ui/ViewTemplate/body/rendered-plain-text":{"title":"$:/core/ui/ViewTemplate/body/rendered-plain-text","code-body":"yes","text":"\\whitespace trim\n<$wikify name=\"text\" text={{!!text}} type={{!!type}}>\n<$codeblock code=<<text>> language=\"css\"/>\n</$wikify>\n"},"$:/core/ui/ViewTemplate/body":{"title":"$:/core/ui/ViewTemplate/body","tags":"$:/tags/ViewTemplate","text":"\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View/Body]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Global/View/Body]!is[draft]]\n\n<$reveal tag=\"div\" class=\"tc-tiddler-body tc-clearfix\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/ViewTemplateBodyFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/ViewTemplate/body/default]] }}} />\n\n</$reveal>\n"},"$:/core/ui/ViewTemplate/classic":{"title":"$:/core/ui/ViewTemplate/classic","tags":"$:/tags/ViewTemplate $:/tags/EditTemplate","text":"\\define lingo-base() $:/language/ClassicWarning/\n\\whitespace trim\n<$list filter=\"[all[current]type[text/x-tiddlywiki]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Hint>>\n\n<$button set=\"!!type\" setTo=\"text/vnd.tiddlywiki\"><<lingo Upgrade/Caption>></$button>\n\n</div>\n</$list>\n"},"$:/core/ui/ViewTemplate/lazy-loading":{"title":"$:/core/ui/ViewTemplate/lazy-loading","tags":"$:/tags/ViewTemplate","text":"\\whitespace trim\n<%if [<currentTiddler>has:field[_is_skinny]] %>\n  <!-- Render the text to trigger lazy-loading -->\n  {{||$:/core/ui/ViewTemplate/body/default}}\n  <!-- Indicator of loading state -->\n  <div class=\"tc-tiddler-lazy-loading\" />\n<%endif%>\n"},"$:/core/ui/ViewTemplate/subtitle/default":{"title":"$:/core/ui/ViewTemplate/subtitle/default","text":"\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-subtitle tc-clearfix\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate/Subtitle]!has[draft.of]]\" variable=\"subtitleTiddler\">\n<$transclude tiddler=<<subtitleTiddler>> mode=\"inline\"/>\n</$list>\n</div>\n</$reveal>\n"},"$:/core/ui/ViewTemplate/subtitle/modified":{"title":"$:/core/ui/ViewTemplate/subtitle/modified","tags":"$:/tags/ViewTemplate/Subtitle","text":"<$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>"},"$:/core/ui/ViewTemplate/subtitle/modifier":{"title":"$:/core/ui/ViewTemplate/subtitle/modifier","tags":"$:/tags/ViewTemplate/Subtitle","text":"<%if [{!!modifier}!is[blank]] %><$link to={{!!modifier}}/><%endif%>"},"$:/core/ui/ViewTemplate/subtitle":{"title":"$:/core/ui/ViewTemplate/subtitle","tags":"$:/tags/ViewTemplate","text":"\\whitespace trim\n<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/ViewTemplateSubtitleFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/ViewTemplate/subtitle/default]] }}} />"},"$:/core/ui/ViewTemplate/tags/default":{"title":"$:/core/ui/ViewTemplate/tags/default","text":"\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n  <div class=\"tc-tags-wrapper\">\n    <$list filter=\"[all[current]tags[]sort[title]]\" template=\"$:/core/ui/TagTemplate\" storyview=\"pop\"/>\n    <$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate/Tags]!has[draft.of]]\">\n      <$transclude mode=\"inline\"/>\n    </$list>\n  </div>\n</$reveal>\n"},"$:/core/ui/ViewTemplate/tags":{"title":"$:/core/ui/ViewTemplate/tags","tags":"$:/tags/ViewTemplate","text":"\\whitespace trim\n<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/ViewTemplateTagsFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/ViewTemplate/tags/default]] }}} />"},"$:/core/ui/ViewTemplate/title/default":{"title":"$:/core/ui/ViewTemplate/title/default","text":"\\whitespace trim\n<h2 class=\"tc-title\">\n<$view field=\"title\"/>\n</h2>\n"},"$:/core/ui/ViewTemplate/title/system":{"title":"$:/core/ui/ViewTemplate/title/system","text":"\\whitespace trim\n<h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n<span class=\"tc-system-title-prefix\">$:/</span><$text text={{{ [<currentTiddler>removeprefix[$:/]] }}}/>\n</h2>"},"$:/core/ui/ViewTemplate/title":{"title":"$:/core/ui/ViewTemplate/title","tags":"$:/tags/ViewTemplate","text":"\\whitespace trim\n\\define title-styles() fill:$(foregroundColor)$;\n\n<div class=\"tc-tiddler-title tc-clearfix\">\n\t<div class=\"tc-titlebar\">\n\t\t<span class=\"tc-tiddler-controls\">\n\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] :filter[lookup[$:/config/ViewToolbarButtons/Visibility/]!match[hide]]\"\n\t\t\t\tstoryview=\"pop\"\n\t\t\t\tvariable=\"listItem\"\n\t\t\t>\n\t\t\t\t<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\t\t\t\t\t<$transclude tiddler=<<listItem>>/>\n\t\t\t\t</$set>\n\t\t\t</$list>\n\t\t</span>\n\t\t<$set name=\"tv-wikilinks\" value={{$:/config/Tiddlers/TitleLinks}}>\n\t\t\t<$link>\n\t\t\t\t<$list filter=\"[<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] +[!is[blank]]\"\n\t\t\t\t\tvariable=\"ignore\"\n\t\t\t\t>\n\t\t\t\t\t<$let foregroundColor={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}>\n\t\t\t\t\t\t<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n\t\t\t\t\t\t\t{{||$:/core/ui/TiddlerIcon}}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</$let>\n\t\t\t\t</$list>\n\t\t\t\t<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/ViewTemplateTitleFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/ViewTemplate/title/default]] }}} />\n\t\t\t</$link>\n\t\t</$set>\n\t</div>\n\t<$reveal tag=\"div\" type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\">\n\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]\" variable=\"listItem\">\n\t\t\t<$transclude tiddler=<<listItem>> mode=\"block\"/>\n\t\t</$list>\n\t</$reveal>\n</div>\n"},"$:/core/ui/ViewTemplate/unfold":{"title":"$:/core/ui/ViewTemplate/unfold","tags":"$:/tags/ViewTemplate","text":"\\whitespace trim\n<div class=\"tc-reveal\">\n<$list filter=\"[{$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar}match[show]]\" variable=\"ignore\">\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=\"tc-fold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-up}}\n</$button>\n</$reveal>\n</$list>\n<$list filter=\"[{$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar}match[show]] :else[<folded-state>get[text]match[hide]]\" variable=\"ignore\">\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"show\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=\"tc-unfold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</$list>\n</div>"},"$:/core/ui/ViewTemplate":{"title":"$:/core/ui/ViewTemplate","code-body":"yes","text":"\\whitespace trim\n\\define folded-state()\n$:/state/folded/$(currentTiddler)$\n\\end\n\\define cancel-delete-tiddler-actions(message) <$action-sendmessage $message=\"tm-$message$-tiddler\"/>\n\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Global/View]!is[draft]]\n<$vars storyTiddler=<<currentTiddler>> tiddlerInfoState=<<qualify \"$:/state/popup/tiddler-info\">>>\n<div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ [all[shadows+tiddlers]tag[$:/tags/ClassFilters/TiddlerTemplate]!is[draft]] :map:flat[subfilter{!!text}] tc-tiddler-frame tc-tiddler-view-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[shadow]is[tiddler]then[tc-tiddler-overridden-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}} role=\"article\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!is[draft]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n</$list>\n</div>\n</$vars>\n"},"$:/core/ui/Buttons/clone":{"title":"$:/core/ui/Buttons/clone","tags":"$:/tags/ViewToolbar","caption":"{{$:/core/images/clone-button}} {{$:/language/Buttons/Clone/Caption}}","description":"{{$:/language/Buttons/Clone/Hint}}","text":"\\whitespace trim\n<$button message=\"tm-new-tiddler\"\n\tparam=<<currentTiddler>>\n\ttooltip={{$:/language/Buttons/Clone/Hint}}\n\taria-label={{$:/language/Buttons/Clone/Hint}}\n\tclass=<<tv-config-toolbar-class>>\n>\n\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t{{$:/core/images/clone-button}}\n\t<%endif%>\n\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t<span class=\"tc-btn-text\">\n\t\t\t<$text text={{$:/language/Buttons/Clone/Caption}}/>\n\t\t</span>\n\t<%endif%>\n</$button>"},"$:/core/ui/Buttons/close-others":{"title":"$:/core/ui/Buttons/close-others","tags":"$:/tags/ViewToolbar","caption":"{{$:/core/images/close-others-button}} {{$:/language/Buttons/CloseOthers/Caption}}","description":"{{$:/language/Buttons/CloseOthers/Hint}}","text":"\\whitespace trim\n<$button message=\"tm-close-other-tiddlers\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/CloseOthers/Hint}} aria-label={{$:/language/Buttons/CloseOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/close-others-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/CloseOthers/Caption}}/>\n</span>\n<%endif%>\n</$button>"},"$:/core/ui/Buttons/close":{"title":"$:/core/ui/Buttons/close","tags":"$:/tags/ViewToolbar","caption":"{{$:/core/images/close-button}} {{$:/language/Buttons/Close/Caption}}","description":"{{$:/language/Buttons/Close/Hint}}","text":"\\whitespace trim\n<$button message=\"tm-close-tiddler\"\n\ttooltip={{$:/language/Buttons/Close/Hint}}\n\taria-label={{$:/language/Buttons/Close/Caption}}\n\tclass=<<tv-config-toolbar-class>>\n>\n\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t{{$:/core/images/close-button}}\n\t<%endif%>\n\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t<span class=\"tc-btn-text\">\n\t\t\t<$text text={{$:/language/Buttons/Close/Caption}}/>\n\t\t</span>\n\t<%endif%>\n</$button>"},"$:/core/ui/Buttons/edit":{"title":"$:/core/ui/Buttons/edit","tags":"$:/tags/ViewToolbar","caption":"{{$:/core/images/edit-button}} {{$:/language/Buttons/Edit/Caption}}","description":"{{$:/language/Buttons/Edit/Hint}}","text":"\\whitespace trim\n<$button message=\"tm-edit-tiddler\"\n\ttooltip={{$:/language/Buttons/Edit/Hint}}\n\taria-label={{$:/language/Buttons/Edit/Hint}}\n\tclass=<<tv-config-toolbar-class>>\n>\n\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t{{$:/core/images/edit-button}}\n\t<%endif%>\n\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t<span class=\"tc-btn-text\">\n\t\t<$text text={{$:/language/Buttons/Edit/Caption}}/>\n\t</span>\n\t<%endif%>\n</$button>"},"$:/core/ui/Buttons/export-tiddler":{"title":"$:/core/ui/Buttons/export-tiddler","tags":"$:/tags/ViewToolbar","caption":"{{$:/core/images/export-button}} {{$:/language/Buttons/ExportTiddler/Caption}}","description":"{{$:/language/Buttons/ExportTiddler/Hint}}","text":"<$transclude $variable=\"exportButton\" exportFilter=`[[$(currentTiddler)$]]` lingoBase=\"$:/language/Buttons/ExportTiddler/\" baseFilename=<<currentTiddler>>/>"},"$:/core/ui/Buttons/fold-bar":{"title":"$:/core/ui/Buttons/fold-bar","tags":"$:/tags/ViewToolbar","caption":"{{$:/core/images/chevron-up}} {{$:/language/Buttons/Fold/FoldBar/Caption}}","description":"{{$:/language/Buttons/Fold/FoldBar/Hint}}","text":"<!-- This dummy toolbar button is here to allow visibility of the fold-bar to be controlled as if it were a toolbar button -->"},"$:/core/ui/Buttons/fold-others":{"title":"$:/core/ui/Buttons/fold-others","tags":"$:/tags/ViewToolbar","caption":"{{$:/core/images/fold-others-button}} {{$:/language/Buttons/FoldOthers/Caption}}","description":"{{$:/language/Buttons/FoldOthers/Hint}}","text":"\\whitespace trim\n<$button tooltip={{$:/language/Buttons/FoldOthers/Hint}} aria-label={{$:/language/Buttons/FoldOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-other-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/fold-others-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/FoldOthers/Caption}}/>\n</span>\n<%endif%>\n</$button>"},"$:/core/ui/Buttons/fold":{"title":"$:/core/ui/Buttons/fold","tags":"$:/tags/ViewToolbar","caption":"{{$:/core/images/fold-button}} {{$:/language/Buttons/Fold/Caption}}","description":"{{$:/language/Buttons/Fold/Hint}}","text":"\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/fold-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Fold/Caption}}/>\n</span>\n<%endif%>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/unfold-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Unfold/Caption}}/>\n</span>\n<%endif%>\n</$button>\n</$reveal>\n"},"$:/core/ui/Buttons/info":{"title":"$:/core/ui/Buttons/info","tags":"$:/tags/ViewToolbar","caption":"{{$:/core/images/info-button}} {{$:/language/Buttons/Info/Caption}}","description":"{{$:/language/Buttons/Info/Hint}}","text":"\\whitespace trim\n\\procedure button-content()\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/info-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Info/Caption}}/>\n</span>\n<%endif%>\n\\end\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"popup\">\n<$button popup=<<tiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$transclude $variable=\"button-content\" $mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$reveal state=<<tiddlerInfoState>> type=\"match\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"yes\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$transclude $variable=\"button-content\" $mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=<<tiddlerInfoState>> type=\"nomatch\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$transclude $variable=\"button-content\" $mode=\"inline\"/>\n</$button>\n</$reveal>\n</$reveal>"},"$:/core/ui/Buttons/more-tiddler-actions":{"title":"$:/core/ui/Buttons/more-tiddler-actions","tags":"$:/tags/ViewToolbar","caption":"{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}","description":"{{$:/language/Buttons/More/Hint}}","text":"\\whitespace trim\n\n<$button popup=<<qualify \"$:/state/popup/more\">>\n\ttooltip={{$:/language/Buttons/More/Hint}}\n\taria-label={{$:/language/Buttons/More/Caption}}\n\tclass=<<tv-config-toolbar-class>>\n\tselectedClass=\"tc-selected\"\n>\n\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t{{$:/core/images/down-arrow}}\n\t<%endif%>\n\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t<span class=\"tc-btn-text\">\n\t\t\t<$text text={{$:/language/Buttons/More/Caption}}/>\n\t\t</span>\n\t<%endif%>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\t<div class=\"tc-drop-down\">\n\t\t<$let tv-config-toolbar-icons=\"yes\" tv-config-toolbar-text=\"yes\" tv-config-toolbar-class=\"tc-btn-invisible\">\n\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-actions]]\"\n\t\t\t\tvariable=\"listItem\"\n\t\t\t>\n\t\t\t\t<$reveal type=\"match\" state=`$:/config/ViewToolbarButtons/Visibility/$(listItem)$` text=\"hide\">\n\t\t\t\t\t<$set name=\"tv-config-toolbar-class\"\n\t\t\t\t\t\tfilter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\t\t\t\t\t</$set>\n\t\t\t\t</$reveal>\n\t\t\t</$list>\n\t\t</$let>\n\t</div>\n</$reveal>"},"$:/core/ui/Buttons/new-here":{"title":"$:/core/ui/Buttons/new-here","tags":"$:/tags/ViewToolbar","caption":"{{$:/core/images/new-here-button}} {{$:/language/Buttons/NewHere/Caption}}","description":"{{$:/language/Buttons/NewHere/Hint}}","text":"\\whitespace trim\n\\procedure newHereActions()\n<$set name=\"tags\" filter=\"[<currentTiddler>] [enlist{$:/config/NewTiddler/Tags}]\">\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<tags>>/>\n</$set>\n\\end\n\\procedure newHereButton()\n<$button actions=<<newHereActions>> tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/new-here-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewHere/Caption}}/>\n</span>\n<%endif%>\n</$button>\n\\end\n<<newHereButton>>\n"},"$:/core/ui/Buttons/new-journal-here":{"title":"$:/core/ui/Buttons/new-journal-here","tags":"$:/tags/ViewToolbar","caption":"{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournalHere/Caption}}","description":"{{$:/language/Buttons/NewJournalHere/Hint}}","text":"\\whitespace trim\n\\procedure journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"journalTitle\" text=\"\"\"<$transclude $variable=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=`[[$(currentTiddlerTag)$]] $(journalTags)$`/>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/new-journal-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>\n</span>\n<%endif%>\n</$wikify>\n</$button>\n\\end\n<$let journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{$:/config/NewJournal/Tags}} currentTiddlerTag=<<currentTiddler>>>\n<<journalButton>>\n</$let>\n"},"$:/core/ui/Buttons/open-window":{"title":"$:/core/ui/Buttons/open-window","tags":"$:/tags/ViewToolbar","caption":"{{$:/core/images/open-window}} {{$:/language/Buttons/OpenWindow/Caption}}","description":"{{$:/language/Buttons/OpenWindow/Hint}}","text":"\\whitespace trim\n<$button message=\"tm-open-window\" tooltip={{$:/language/Buttons/OpenWindow/Hint}} aria-label={{$:/language/Buttons/OpenWindow/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/open-window}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/OpenWindow/Caption}}/>\n</span>\n<%endif%>\n</$button>"},"$:/core/ui/Buttons/permalink":{"title":"$:/core/ui/Buttons/permalink","tags":"$:/tags/ViewToolbar","caption":"{{$:/core/images/permalink-button}} {{$:/language/Buttons/Permalink/Caption}}","description":"{{$:/language/Buttons/Permalink/Hint}}","text":"\\whitespace trim\n<$button message=\"tm-permalink\" tooltip={{$:/language/Buttons/Permalink/Hint}} aria-label={{$:/language/Buttons/Permalink/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/permalink-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Permalink/Caption}}/>\n</span>\n<%endif%>\n</$button>"},"$:/core/ui/Buttons/permaview":{"title":"$:/core/ui/Buttons/permaview","tags":"$:/tags/ViewToolbar $:/tags/PageControls","caption":"{{$:/core/images/permaview-button}} {{$:/language/Buttons/Permaview/Caption}}","description":"{{$:/language/Buttons/Permaview/Hint}}","text":"\\whitespace trim\n<$button message=\"tm-permaview\" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/permaview-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Permaview/Caption}}/>\n</span>\n<%endif%>\n</$button>"},"$:/DefaultTiddlers":{"title":"$:/DefaultTiddlers","text":"GettingStarted\n"},"$:/temp/advancedsearch":{"title":"$:/temp/advancedsearch","text":""},"$:/snippets/allfields":{"title":"$:/snippets/allfields","text":"\\whitespace trim\n\n\\procedure lingo-base() $:/language/Docs/Fields/\n\n\\function tf.getLingoText() [<lingo-base>] [<title>] +[join[]get[text]]\n\n\\procedure renderfield(title)\n<tr class=\"tc-view-field\">\n\t<td class=\"tc-view-field-name\">\n\t\t''<$text text=<<title>>/>'':\n\t</td>\n\t<td class=\"tc-view-field-value\">\n\t\t//<<tf.getLingoText>>//\n\t</td>\n\t<td class=\"tc-view-field-list\">\n\t\t<$macrocall $name=\"show-filter-count\" filter=`[has[$(title)$]sort[]]`>>\n\t</td>\n</tr>\n\\end\n\n<table class=\"tc-view-field-table\">\n\t<tbody>\n\t\t<!-- <<renderfieldHeader>> -->\n\t\t<$list filter=\"[fields[]sort[title]]\" variable=\"listItem\">\n\t\t\t<$macrocall $name=\"renderfield\" title=<<listItem>>/>\n\t\t</$list>\n\t</tbody>\n</table>\n"},"$:/config/AnimationDuration":{"title":"$:/config/AnimationDuration","text":"400"},"$:/config/AutoFocus":{"title":"$:/config/AutoFocus","text":"title"},"$:/config/AutoSave":{"title":"$:/config/AutoSave","text":"yes"},"$:/config/BitmapEditor/Colour":{"title":"$:/config/BitmapEditor/Colour","text":"#444"},"$:/config/BitmapEditor/ImageSizes":{"title":"$:/config/BitmapEditor/ImageSizes","text":"[[62px 100px]] [[100px 62px]] [[124px 200px]] [[200px 124px]] [[248px 400px]] [[371px 600px]] [[400px 248px]] [[556px 900px]] [[600px 371px]] [[742px 1200px]] [[900px 556px]] [[1200px 742px]]"},"$:/config/BitmapEditor/LineWidth":{"title":"$:/config/BitmapEditor/LineWidth","text":"3px"},"$:/config/BitmapEditor/LineWidths":{"title":"$:/config/BitmapEditor/LineWidths","text":"0.25px 0.5px 1px 2px 3px 4px 6px 8px 10px 16px 20px 28px 40px 56px 80px"},"$:/config/BitmapEditor/Opacities":{"title":"$:/config/BitmapEditor/Opacities","text":"0.01 0.025 0.05 0.075 0.1 0.15 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0"},"$:/config/BitmapEditor/Opacity":{"title":"$:/config/BitmapEditor/Opacity","text":"1.0"},"$:/config/DefaultMoreSidebarTab":{"title":"$:/config/DefaultMoreSidebarTab","text":"$:/core/ui/MoreSideBar/Tags"},"$:/config/DefaultSidebarTab":{"title":"$:/config/DefaultSidebarTab","text":"$:/core/ui/SideBar/Open"},"$:/config/ControlPanel/Basics/DefaultTiddlers/RetainStory":{"title":"$:/config/ControlPanel/Basics/DefaultTiddlers/RetainStory","text":"[list[$:/StoryList]]"},"$:/config/DownloadSaver/AutoSave":{"title":"$:/config/DownloadSaver/AutoSave","text":"no"},"$:/config/Drafts/TypingTimeout":{"title":"$:/config/Drafts/TypingTimeout","text":"400"},"$:/config/EditMode/fieldname-filter":{"title":"$:/config/EditMode/fieldname-filter","first-search-filter":"[!is[shadow]!is[system]fields[]search:title<userInput>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type","second-search-filter":"[fields[]search:title<userInput>sort[]] -[!is[shadow]!is[system]fields[]]"},"$:/config/EditTabIndex":{"title":"$:/config/EditTabIndex","text":"1"},"$:/config/EditTemplateBodyFilters/canonical-uri":{"title":"$:/config/EditTemplateBodyFilters/canonical-uri","tags":"$:/tags/EditTemplateBodyFilter","text":"[has[_canonical_uri]then[$:/core/ui/EditTemplate/body/canonical-uri]]"},"$:/config/EditTemplateBodyFilters/default":{"title":"$:/config/EditTemplateBodyFilters/default","tags":"$:/tags/EditTemplateBodyFilter","text":"[[$:/core/ui/EditTemplate/body/default]]"},"$:/config/EditTemplateFields/Visibility/title":{"title":"$:/config/EditTemplateFields/Visibility/title","text":"hide"},"$:/config/EditTemplateFields/Visibility/tags":{"title":"$:/config/EditTemplateFields/Visibility/tags","text":"hide"},"$:/config/EditTemplateFields/Visibility/text":{"title":"$:/config/EditTemplateFields/Visibility/text","text":"hide"},"$:/config/EditTemplateFields/Visibility/creator":{"title":"$:/config/EditTemplateFields/Visibility/creator","text":"hide"},"$:/config/EditTemplateFields/Visibility/created":{"title":"$:/config/EditTemplateFields/Visibility/created","text":"hide"},"$:/config/EditTemplateFields/Visibility/modified":{"title":"$:/config/EditTemplateFields/Visibility/modified","text":"hide"},"$:/config/EditTemplateFields/Visibility/modifier":{"title":"$:/config/EditTemplateFields/Visibility/modifier","text":"hide"},"$:/config/EditTemplateFields/Visibility/type":{"title":"$:/config/EditTemplateFields/Visibility/type","text":"hide"},"$:/config/EditTemplateFields/Visibility/draft.title":{"title":"$:/config/EditTemplateFields/Visibility/draft.title","text":"hide"},"$:/config/EditTemplateFields/Visibility/draft.of":{"title":"$:/config/EditTemplateFields/Visibility/draft.of","text":"hide"},"$:/config/EditTemplateFields/Visibility/revision":{"title":"$:/config/EditTemplateFields/Visibility/revision","text":"hide"},"$:/config/EditTemplateFields/Visibility/bag":{"title":"$:/config/EditTemplateFields/Visibility/bag","text":"hide"},"$:/config/Editor/EnableImportFilter":{"title":"$:/config/Editor/EnableImportFilter","type":"text/vnd.tiddlywiki","text":"[all[current]type[text/vnd.tiddlywiki]] [all[current]!has[type]] [all[current]type[text/markdown]] [all[current]type[text/x-markdown]]"},"$:/config/Editor/ImportContentTypesFilter":{"title":"$:/config/Editor/ImportContentTypesFilter","type":"text/vnd.tiddlywiki","text":"[prefix[image/]]"},"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4":{"title":"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4","text":"hide"},"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5":{"title":"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5","text":"hide"},"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6":{"title":"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6","text":"hide"},"$:/config/EditorTypeMappings/image/gif":{"title":"$:/config/EditorTypeMappings/image/gif","text":"bitmap"},"$:/config/EditorTypeMappings/image/webp":{"title":"$:/config/EditorTypeMappings/image/webp","text":"bitmap"},"$:/config/EditorTypeMappings/image/heic":{"title":"$:/config/EditorTypeMappings/image/heic","text":"bitmap"},"$:/config/EditorTypeMappings/image/heif":{"title":"$:/config/EditorTypeMappings/image/heif","text":"bitmap"},"$:/config/EditorTypeMappings/image/jpeg":{"title":"$:/config/EditorTypeMappings/image/jpeg","text":"bitmap"},"$:/config/EditorTypeMappings/image/jpg":{"title":"$:/config/EditorTypeMappings/image/jpg","text":"bitmap"},"$:/config/EditorTypeMappings/image/png":{"title":"$:/config/EditorTypeMappings/image/png","text":"bitmap"},"$:/config/EditorTypeMappings/image/x-icon":{"title":"$:/config/EditorTypeMappings/image/x-icon","text":"bitmap"},"$:/config/EditorTypeMappings/text/vnd.tiddlywiki":{"title":"$:/config/EditorTypeMappings/text/vnd.tiddlywiki","text":"text"},"$:/config/FieldEditorFilters/default":{"title":"$:/config/FieldEditorFilters/default","tags":"$:/tags/FieldEditorFilter","text":"[[$:/core/ui/EditTemplate/fieldEditor/default]]"},"$:/core/config/GlobalImportFilter":{"title":"$:/core/config/GlobalImportFilter","text":"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Global]!is[draft]]"},"$:/config/Manager/Show":{"title":"$:/config/Manager/Show","text":"tiddlers"},"$:/config/Manager/Filter":{"title":"$:/config/Manager/Filter","text":""},"$:/config/Manager/Order":{"title":"$:/config/Manager/Order","text":"forward"},"$:/config/Manager/Sort":{"title":"$:/config/Manager/Sort","text":"title"},"$:/config/Manager/System":{"title":"$:/config/Manager/System","text":"system"},"$:/config/Manager/Tag":{"title":"$:/config/Manager/Tag","text":""},"$:/state/popup/manager/item/$:/Manager/ItemMain/RawText":{"title":"$:/state/popup/manager/item/$:/Manager/ItemMain/RawText","text":"hide"},"$:/config/MissingLinks":{"title":"$:/config/MissingLinks","text":"yes"},"$:/config/Navigation/UpdateAddressBar":{"title":"$:/config/Navigation/UpdateAddressBar","text":"no"},"$:/config/Navigation/UpdateHistory":{"title":"$:/config/Navigation/UpdateHistory","text":"no"},"$:/config/NewImageType":{"title":"$:/config/NewImageType","text":"jpeg"},"$:/config/OfficialPluginLibrary":{"title":"$:/config/OfficialPluginLibrary","tags":"$:/tags/PluginLibrary","url":"https://tiddlywiki.com/library/v5.3.6/index.html","caption":"{{$:/language/OfficialPluginLibrary}}","text":"{{$:/language/OfficialPluginLibrary/Hint}}\n"},"$:/config/Navigation/openLinkFromInsideRiver":{"title":"$:/config/Navigation/openLinkFromInsideRiver","text":"below"},"$:/config/Navigation/openLinkFromOutsideRiver":{"title":"$:/config/Navigation/openLinkFromOutsideRiver","text":"top"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/network-activity":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/network-activity","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/layout":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/layout","text":"hide"},"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all","text":"hide"},"$:/config/Performance/Instrumentation":{"title":"$:/config/Performance/Instrumentation","text":"no"},"$:/config/RecentLimit":{"title":"$:/config/RecentLimit","text":"100"},"$:/config/RegisterPluginType/plugin":{"title":"$:/config/RegisterPluginType/plugin","text":"yes"},"$:/config/RegisterPluginType/theme":{"title":"$:/config/RegisterPluginType/theme","text":"no"},"$:/config/RegisterPluginType/language":{"title":"$:/config/RegisterPluginType/language","text":"no"},"$:/config/RegisterPluginType/info":{"title":"$:/config/RegisterPluginType/info","text":"yes"},"$:/config/RegisterPluginType/import":{"title":"$:/config/RegisterPluginType/import","text":"no"},"$:/config/SaveWikiButton/Template":{"title":"$:/config/SaveWikiButton/Template","text":"$:/core/save/all"},"$:/config/SaverFilter":{"title":"$:/config/SaverFilter","text":"[all[]] -[prefix[$:/HistoryList]] -[prefix[$:/StoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\n"},"$:/config/Search/AutoFocus":{"title":"$:/config/Search/AutoFocus","text":"true"},"$:/config/Search/MinLength":{"title":"$:/config/Search/MinLength","text":"3"},"$:/config/SearchResults/Default":{"title":"$:/config/SearchResults/Default","text":"$:/core/ui/DefaultSearchResultList"},"$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]":{"title":"$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]","text":"yes"},"$:/config/ShortcutInfo/add-field":{"title":"$:/config/ShortcutInfo/add-field","text":"{{$:/language/EditTemplate/Fields/Add/Button/Hint}}"},"$:/config/ShortcutInfo/advanced-search":{"title":"$:/config/ShortcutInfo/advanced-search","text":"{{$:/language/Buttons/AdvancedSearch/Hint}}"},"$:/config/ShortcutInfo/advanced-search-sidebar":{"title":"$:/config/ShortcutInfo/advanced-search-sidebar","text":"{{$:/language/Shortcuts/Input/AdvancedSearch/Hint}}"},"$:/config/ShortcutInfo/bold":{"title":"$:/config/ShortcutInfo/bold","text":"{{$:/language/Buttons/Bold/Hint}}"},"$:/config/ShortcutInfo/cancel-edit-tiddler":{"title":"$:/config/ShortcutInfo/cancel-edit-tiddler","text":"{{$:/language/Buttons/Cancel/Hint}}"},"$:/config/ShortcutInfo/change-sidebar-layout":{"title":"$:/config/ShortcutInfo/change-sidebar-layout","text":"{{$:/language/Shortcuts/SidebarLayout/Hint}}"},"$:/config/ShortcutInfo/delete-field":{"title":"$:/config/ShortcutInfo/delete-field","text":"{{$:/language/EditTemplate/Field/Remove/Hint}}"},"$:/config/ShortcutInfo/excise":{"title":"$:/config/ShortcutInfo/excise","text":"{{$:/language/Buttons/Excise/Hint}}"},"$:/config/ShortcutInfo/heading-1":{"title":"$:/config/ShortcutInfo/heading-1","text":"{{$:/language/Buttons/Heading1/Hint}}"},"$:/config/ShortcutInfo/heading-2":{"title":"$:/config/ShortcutInfo/heading-2","text":"{{$:/language/Buttons/Heading2/Hint}}"},"$:/config/ShortcutInfo/heading-3":{"title":"$:/config/ShortcutInfo/heading-3","text":"{{$:/language/Buttons/Heading3/Hint}}"},"$:/config/ShortcutInfo/heading-4":{"title":"$:/config/ShortcutInfo/heading-4","text":"{{$:/language/Buttons/Heading4/Hint}}"},"$:/config/ShortcutInfo/heading-5":{"title":"$:/config/ShortcutInfo/heading-5","text":"{{$:/language/Buttons/Heading5/Hint}}"},"$:/config/ShortcutInfo/heading-6":{"title":"$:/config/ShortcutInfo/heading-6","text":"{{$:/language/Buttons/Heading6/Hint}}"},"$:/config/ShortcutInfo/input-accept":{"title":"$:/config/ShortcutInfo/input-accept","text":"{{$:/language/Shortcuts/Input/Accept/Hint}}"},"$:/config/ShortcutInfo/input-accept-variant":{"title":"$:/config/ShortcutInfo/input-accept-variant","text":"{{$:/language/Shortcuts/Input/AcceptVariant/Hint}}"},"$:/config/ShortcutInfo/input-cancel":{"title":"$:/config/ShortcutInfo/input-cancel","text":"{{$:/language/Shortcuts/Input/Cancel/Hint}}"},"$:/config/ShortcutInfo/input-down":{"title":"$:/config/ShortcutInfo/input-down","text":"{{$:/language/Shortcuts/Input/Down/Hint}}"},"$:/config/ShortcutInfo/input-tab-left":{"title":"$:/config/ShortcutInfo/input-tab-left","text":"{{$:/language/Shortcuts/Input/Tab-Left/Hint}}"},"$:/config/ShortcutInfo/input-tab-right":{"title":"$:/config/ShortcutInfo/input-tab-right","text":"{{$:/language/Shortcuts/Input/Tab-Right/Hint}}"},"$:/config/ShortcutInfo/input-up":{"title":"$:/config/ShortcutInfo/input-up","text":"{{$:/language/Shortcuts/Input/Up/Hint}}"},"$:/config/ShortcutInfo/italic":{"title":"$:/config/ShortcutInfo/italic","text":"{{$:/language/Buttons/Italic/Hint}}"},"$:/config/ShortcutInfo/layout-switcher":{"title":"$:/config/ShortcutInfo/layout-switcher","text":"{{$:/language/LayoutSwitcher/Description}}"},"$:/config/ShortcutInfo/link":{"title":"$:/config/ShortcutInfo/link","text":"{{$:/language/Buttons/Link/Hint}}"},"$:/config/ShortcutInfo/linkify":{"title":"$:/config/ShortcutInfo/linkify","text":"{{$:/language/Buttons/Linkify/Hint}}"},"$:/config/ShortcutInfo/list-bullet":{"title":"$:/config/ShortcutInfo/list-bullet","text":"{{$:/language/Buttons/ListBullet/Hint}}"},"$:/config/ShortcutInfo/list-number":{"title":"$:/config/ShortcutInfo/list-number","text":"{{$:/language/Buttons/ListNumber/Hint}}"},"$:/config/ShortcutInfo/mono-block":{"title":"$:/config/ShortcutInfo/mono-block","text":"{{$:/language/Buttons/MonoBlock/Hint}}"},"$:/config/ShortcutInfo/mono-line":{"title":"$:/config/ShortcutInfo/mono-line","text":"{{$:/language/Buttons/MonoLine/Hint}}"},"$:/config/ShortcutInfo/new-image":{"title":"$:/config/ShortcutInfo/new-image","text":"{{$:/language/Buttons/NewImage/Hint}}"},"$:/config/ShortcutInfo/new-journal":{"title":"$:/config/ShortcutInfo/new-journal","text":"{{$:/language/Buttons/NewJournal/Hint}}"},"$:/config/ShortcutInfo/new-tiddler":{"title":"$:/config/ShortcutInfo/new-tiddler","text":"{{$:/language/Buttons/NewTiddler/Hint}}"},"$:/config/ShortcutInfo/open-control-panel":{"title":"$:/config/ShortcutInfo/open-control-panel","text":"{{$:/language/Buttons/OpenControlPanel/Hint}}"},"$:/config/ShortcutInfo/picture":{"title":"$:/config/ShortcutInfo/picture","text":"{{$:/language/Buttons/Picture/Hint}}"},"$:/config/ShortcutInfo/preview":{"title":"$:/config/ShortcutInfo/preview","text":"{{$:/language/Buttons/Preview/Hint}}"},"$:/config/ShortcutInfo/quote":{"title":"$:/config/ShortcutInfo/quote","text":"{{$:/language/Buttons/Quote/Hint}}"},"$:/config/ShortcutInfo/refresh":{"title":"$:/config/ShortcutInfo/refresh","text":"{{$:/language/Buttons/Refresh/Hint}}"},"$:/config/ShortcutInfo/save-tiddler":{"title":"$:/config/ShortcutInfo/save-tiddler","text":"{{$:/language/Buttons/Save/Hint}}"},"$:/config/ShortcutInfo/save-wiki":{"title":"$:/config/ShortcutInfo/save-wiki","text":"{{$:/language/Buttons/SaveWiki/Hint}}"},"$:/config/ShortcutInfo/sidebar-search":{"title":"$:/config/ShortcutInfo/sidebar-search","text":"{{$:/language/Buttons/SidebarSearch/Hint}}"},"$:/config/ShortcutInfo/stamp":{"title":"$:/config/ShortcutInfo/stamp","text":"{{$:/language/Buttons/Stamp/Hint}}"},"$:/config/ShortcutInfo/strikethrough":{"title":"$:/config/ShortcutInfo/strikethrough","text":"{{$:/language/Buttons/Strikethrough/Hint}}"},"$:/config/ShortcutInfo/subscript":{"title":"$:/config/ShortcutInfo/subscript","text":"{{$:/language/Buttons/Subscript/Hint}}"},"$:/config/ShortcutInfo/superscript":{"title":"$:/config/ShortcutInfo/superscript","text":"{{$:/language/Buttons/Superscript/Hint}}"},"$:/config/ShortcutInfo/toggle-sidebar":{"title":"$:/config/ShortcutInfo/toggle-sidebar","text":"{{$:/language/Buttons/ToggleSidebar/Hint}}"},"$:/config/ShortcutInfo/transcludify":{"title":"$:/config/ShortcutInfo/transcludify","text":"{{$:/language/Buttons/Transcludify/Hint}}"},"$:/config/ShortcutInfo/underline":{"title":"$:/config/ShortcutInfo/underline","text":"{{$:/language/Buttons/Underline/Hint}}"},"$:/config/StoryTiddlerTemplateFilters/draft":{"title":"$:/config/StoryTiddlerTemplateFilters/draft","tags":"$:/tags/StoryTiddlerTemplateFilter","text":"[is[draft]then{$:/config/ui/EditTemplate}]"},"$:/config/StoryTiddlerTemplateFilters/default":{"title":"$:/config/StoryTiddlerTemplateFilters/default","tags":"$:/tags/StoryTiddlerTemplateFilter","text":"[{$:/config/ui/ViewTemplate}]"},"$:/config/SwitcherTargets/layout":{"title":"$:/config/SwitcherTargets/layout","text":"$:/snippets/LayoutSwitcher"},"$:/config/SwitcherTargets/language":{"title":"$:/config/SwitcherTargets/language","text":"$:/snippets/languageswitcher"},"$:/config/SwitcherTargets/palette":{"title":"$:/config/SwitcherTargets/palette","text":"$:/core/ui/ControlPanel/Palette"},"$:/config/SwitcherTargets/theme":{"title":"$:/config/SwitcherTargets/theme","text":"$:/core/ui/ControlPanel/Theme"},"$:/config/SyncFilter":{"title":"$:/config/SyncFilter","text":"[is[tiddler]] -[[$:/core]] -[[$:/library/sjcl.js]] -[prefix[$:/boot/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\n"},"$:/config/SyncSystemTiddlersFromServer":{"title":"$:/config/SyncSystemTiddlersFromServer","text":"no"},"$:/core/config/TagPillDragFilter":{"title":"$:/core/config/TagPillDragFilter","text":"[all[current]tagging[]] +[!is[draft]]"},"$:/config/Tags/MinLength":{"title":"$:/config/Tags/MinLength","text":"0"},"$:/config/TextEditor/EditorHeight/Height":{"title":"$:/config/TextEditor/EditorHeight/Height","text":"400px"},"$:/config/TextEditor/EditorHeight/Mode":{"title":"$:/config/TextEditor/EditorHeight/Mode","text":"auto"},"$:/config/TiddlerColourFilters/color-field":{"title":"$:/config/TiddlerColourFilters/color-field","tags":"$:/tags/TiddlerColourFilter","text":"[has[color]then{!!color}]"},"$:/config/TiddlerColourFilters/default":{"title":"$:/config/TiddlerColourFilters/default","tags":"$:/tags/TiddlerColourFilter","text":"[[$:/config/DefaultTiddlerColour]has[text]get[text]trim[]]"},"$:/config/TiddlerIconFilters/icon-field":{"title":"$:/config/TiddlerIconFilters/icon-field","tags":"$:/tags/TiddlerIconFilter","text":"[has[icon]then{!!icon}]"},"$:/config/TiddlerIconFilters/default":{"title":"$:/config/TiddlerIconFilters/default","tags":"$:/tags/TiddlerIconFilter","text":"[{$:/config/DefaultTiddlerIcon}has[text]]"},"$:/config/TiddlerInfo/Default":{"title":"$:/config/TiddlerInfo/Default","text":"$:/core/ui/TiddlerInfo/Fields"},"$:/config/TiddlerInfo/Mode":{"title":"$:/config/TiddlerInfo/Mode","text":"popup"},"$:/config/Tiddlers/TitleLinks":{"title":"$:/config/Tiddlers/TitleLinks","text":"no"},"$:/config/Toolbar/ButtonClass":{"title":"$:/config/Toolbar/ButtonClass","text":"tc-btn-invisible"},"$:/config/Toolbar/Icons":{"title":"$:/config/Toolbar/Icons","text":"yes"},"$:/config/Toolbar/Text":{"title":"$:/config/Toolbar/Text","text":"no"},"$:/config/ViewTemplateBodyFilters/testcase":{"title":"$:/config/ViewTemplateBodyFilters/testcase","tags":"$:/tags/ViewTemplateBodyFilter","text":"[tag[$:/tags/wiki-test-spec]type[text/vnd.tiddlywiki-multiple]] [tag[$:/tags/wiki-test-spec-failing]type[text/vnd.tiddlywiki-multiple]] :then[[$:/core/ui/TestCaseTemplate]]"},"$:/config/ViewTemplateBodyFilters/stylesheet":{"title":"$:/config/ViewTemplateBodyFilters/stylesheet","tags":"$:/tags/ViewTemplateBodyFilter","text":"[tag[$:/tags/Stylesheet]then[$:/core/ui/ViewTemplate/body/rendered-plain-text]]"},"$:/config/ViewTemplateBodyFilters/core-ui-tags":{"title":"$:/config/ViewTemplateBodyFilters/core-ui-tags","tags":"$:/tags/ViewTemplateBodyFilter","text":"[tag[$:/tags/PageTemplate]] [tag[$:/tags/EditTemplate]] [tag[$:/tags/ViewTemplate]] [tag[$:/tags/KeyboardShortcut]] [tag[$:/tags/ImportPreview]] [tag[$:/tags/EditPreview]] [tag[$:/tags/EditorToolbar]] [tag[$:/EditorTools]] [tag[$:/tags/Actions]] [tag[$:/tags/ToolbarButtonStyle]] :then[[$:/core/ui/ViewTemplate/body/code]]"},"$:/config/ViewTemplateBodyFilters/system":{"title":"$:/config/ViewTemplateBodyFilters/system","tags":"$:/tags/ViewTemplateBodyFilter","text":"[prefix[$:/boot/]] [prefix[$:/core/macros]] [prefix[$:/core/save/]] [prefix[$:/core/templates/]]  [prefix[$:/config/]] [prefix[$:/core/config/]] [prefix[$:/info/]] [prefix[$:/language/]] [prefix[$:/languages/]] [prefix[$:/snippets/]]  [prefix[$:/info/]] [prefix[$:/state/]] [prefix[$:/status/]] [prefix[$:/temp/]] :and[!is[image]]  :then[[$:/core/ui/ViewTemplate/body/code]]"},"$:/config/ViewTemplateBodyFilters/code-body":{"title":"$:/config/ViewTemplateBodyFilters/code-body","tags":"$:/tags/ViewTemplateBodyFilter","text":"[field:code-body[yes]then[$:/core/ui/ViewTemplate/body/code]]"},"$:/config/ViewTemplateBodyFilters/import":{"title":"$:/config/ViewTemplateBodyFilters/import","tags":"$:/tags/ViewTemplateBodyFilter","text":"[field:plugin-type[import]then[$:/core/ui/ViewTemplate/body/import]]"},"$:/config/ViewTemplateBodyFilters/plugin":{"title":"$:/config/ViewTemplateBodyFilters/plugin","tags":"$:/tags/ViewTemplateBodyFilter","text":"[has[plugin-type]then[$:/core/ui/ViewTemplate/body/plugin]]"},"$:/config/ViewTemplateBodyFilters/hide-body":{"title":"$:/config/ViewTemplateBodyFilters/hide-body","tags":"$:/tags/ViewTemplateBodyFilter","text":"[field:hide-body[yes]then[$:/core/ui/ViewTemplate/body/blank]]"},"$:/config/ViewTemplateBodyFilters/default":{"title":"$:/config/ViewTemplateBodyFilters/default","tags":"$:/tags/ViewTemplateBodyFilter","text":"[[$:/core/ui/ViewTemplate/body/default]]"},"$:/config/ViewTemplateSubtitleFilters/default":{"title":"$:/config/ViewTemplateSubtitleFilters/default","tags":"$:/tags/ViewTemplateSubtitleFilter","text":"[[$:/core/ui/ViewTemplate/subtitle/default]]"},"$:/config/ViewTemplateTagsFilters/default":{"title":"$:/config/ViewTemplateTagsFilters/default","tags":"$:/tags/ViewTemplateTagsFilter","text":"[[$:/core/ui/ViewTemplate/tags/default]]"},"$:/config/ViewTemplateTitleFilters/system":{"title":"$:/config/ViewTemplateTitleFilters/system","tags":"$:/tags/ViewTemplateTitleFilter","text":"[prefix[$:/]then[$:/core/ui/ViewTemplate/title/system]]"},"$:/config/ViewTemplateTitleFilters/default":{"title":"$:/config/ViewTemplateTitleFilters/default","tags":"$:/tags/ViewTemplateTitleFilter","text":"[[$:/core/ui/ViewTemplate/title/default]]"},"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone":{"title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone","text":"hide"},"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others":{"title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others","text":"hide"},"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler":{"title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler","text":"hide"},"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info":{"title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info","text":"hide"},"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions":{"title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions","text":"show"},"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here":{"title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here","text":"hide"},"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here":{"title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here","text":"hide"},"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window":{"title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window","text":"hide"},"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink":{"title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink","text":"hide"},"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview":{"title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview","text":"hide"},"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete":{"title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete","text":"hide"},"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold":{"title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold","text":"hide"},"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar":{"title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar","text":"hide"},"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others":{"title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others","text":"hide"},"$:/config/shortcuts-mac/bold":{"title":"$:/config/shortcuts-mac/bold","text":"meta-B"},"$:/config/shortcuts-mac/italic":{"title":"$:/config/shortcuts-mac/italic","text":"meta-I"},"$:/config/shortcuts-mac/underline":{"title":"$:/config/shortcuts-mac/underline","text":"meta-U"},"$:/config/shortcuts-mac/new-image":{"title":"$:/config/shortcuts-mac/new-image","text":"ctrl-I"},"$:/config/shortcuts-mac/new-journal":{"title":"$:/config/shortcuts-mac/new-journal","text":"ctrl-J"},"$:/config/shortcuts-mac/new-tiddler":{"title":"$:/config/shortcuts-mac/new-tiddler","text":"ctrl-N"},"$:/config/shortcuts-mac/refresh":{"title":"$:/config/shortcuts-mac/refresh","text":"meta-R"},"$:/config/shortcuts-mac/save-wiki":{"title":"$:/config/shortcuts-mac/save-wiki","text":"meta-S"},"$:/config/shortcuts-not-mac/bold":{"title":"$:/config/shortcuts-not-mac/bold","text":"ctrl-B"},"$:/config/shortcuts-not-mac/italic":{"title":"$:/config/shortcuts-not-mac/italic","text":"ctrl-I"},"$:/config/shortcuts-not-mac/underline":{"title":"$:/config/shortcuts-not-mac/underline","text":"ctrl-U"},"$:/config/shortcuts-not-mac/new-image":{"title":"$:/config/shortcuts-not-mac/new-image","text":"alt-I"},"$:/config/shortcuts-not-mac/new-journal":{"title":"$:/config/shortcuts-not-mac/new-journal","text":"alt-J"},"$:/config/shortcuts-not-mac/new-tiddler":{"title":"$:/config/shortcuts-not-mac/new-tiddler","text":"alt-N"},"$:/config/shortcuts-not-mac/refresh":{"title":"$:/config/shortcuts-not-mac/refresh","text":"ctrl-R"},"$:/config/shortcuts/add-field":{"title":"$:/config/shortcuts/add-field","text":"enter"},"$:/config/shortcuts/advanced-search":{"title":"$:/config/shortcuts/advanced-search","text":"ctrl-shift-A"},"$:/config/shortcuts/advanced-search-sidebar":{"title":"$:/config/shortcuts/advanced-search-sidebar","text":"alt-Enter"},"$:/config/shortcuts/cancel-edit-tiddler":{"title":"$:/config/shortcuts/cancel-edit-tiddler","text":"escape"},"$:/config/shortcuts/change-sidebar-layout":{"title":"$:/config/shortcuts/change-sidebar-layout","text":"shift-alt-Down"},"$:/config/shortcuts/delete-field":{"title":"$:/config/shortcuts/delete-field","text":"shift-alt-D"},"$:/config/shortcuts/excise":{"title":"$:/config/shortcuts/excise","text":"ctrl-E"},"$:/config/shortcuts/sidebar-search":{"title":"$:/config/shortcuts/sidebar-search","text":"ctrl-shift-F"},"$:/config/shortcuts/heading-1":{"title":"$:/config/shortcuts/heading-1","text":"ctrl-1"},"$:/config/shortcuts/heading-2":{"title":"$:/config/shortcuts/heading-2","text":"ctrl-2"},"$:/config/shortcuts/heading-3":{"title":"$:/config/shortcuts/heading-3","text":"ctrl-3"},"$:/config/shortcuts/heading-4":{"title":"$:/config/shortcuts/heading-4","text":"ctrl-4"},"$:/config/shortcuts/heading-5":{"title":"$:/config/shortcuts/heading-5","text":"ctrl-5"},"$:/config/shortcuts/heading-6":{"title":"$:/config/shortcuts/heading-6","text":"ctrl-6"},"$:/config/shortcuts/input-accept":{"title":"$:/config/shortcuts/input-accept","text":"Enter"},"$:/config/shortcuts/input-accept-variant":{"title":"$:/config/shortcuts/input-accept-variant","text":"ctrl-Enter"},"$:/config/shortcuts/input-cancel":{"title":"$:/config/shortcuts/input-cancel","text":"Escape"},"$:/config/shortcuts/input-down":{"title":"$:/config/shortcuts/input-down","text":"Down"},"$:/config/shortcuts/input-tab-left":{"title":"$:/config/shortcuts/input-tab-left","text":"alt-ctrl-Left"},"$:/config/shortcuts/input-tab-right":{"title":"$:/config/shortcuts/input-tab-right","text":"alt-ctrl-Right"},"$:/config/shortcuts/input-up":{"title":"$:/config/shortcuts/input-up","text":"Up"},"$:/config/shortcuts/layout-switcher":{"title":"$:/config/shortcuts/layout-switcher","text":"ctrl-shift-L"},"$:/config/shortcuts/link":{"title":"$:/config/shortcuts/link","text":"ctrl-L"},"$:/config/shortcuts/linkify":{"title":"$:/config/shortcuts/linkify","text":"alt-shift-L"},"$:/config/shortcuts/list-bullet":{"title":"$:/config/shortcuts/list-bullet","text":"ctrl-shift-L"},"$:/config/shortcuts/list-number":{"title":"$:/config/shortcuts/list-number","text":"ctrl-shift-N"},"$:/config/shortcuts/mono-block":{"title":"$:/config/shortcuts/mono-block","text":"ctrl-shift-M"},"$:/config/shortcuts/mono-line":{"title":"$:/config/shortcuts/mono-line","text":"ctrl-M"},"$:/config/shortcuts/open-control-panel":{"title":"$:/config/shortcuts/open-control-panel","text":"ctrl-alt-C"},"$:/config/shortcuts/picture":{"title":"$:/config/shortcuts/picture","text":"ctrl-shift-I"},"$:/config/shortcuts/preview":{"title":"$:/config/shortcuts/preview","text":"alt-P"},"$:/config/shortcuts/quote":{"title":"$:/config/shortcuts/quote","text":"ctrl-Q"},"$:/config/shortcuts/save-tiddler":{"title":"$:/config/shortcuts/save-tiddler","text":"ctrl+enter"},"$:/config/shortcuts/save-wiki":{"title":"$:/config/shortcuts/save-wiki","text":"ctrl-S"},"$:/config/shortcuts/stamp":{"title":"$:/config/shortcuts/stamp","text":"ctrl-S"},"$:/config/shortcuts/strikethrough":{"title":"$:/config/shortcuts/strikethrough","text":"ctrl-T"},"$:/config/shortcuts/subscript":{"title":"$:/config/shortcuts/subscript","text":"ctrl-shift-B"},"$:/config/shortcuts/superscript":{"title":"$:/config/shortcuts/superscript","text":"ctrl-shift-P"},"$:/config/shortcuts/toggle-sidebar":{"title":"$:/config/shortcuts/toggle-sidebar","text":"alt-shift-S"},"$:/config/shortcuts/transcludify":{"title":"$:/config/shortcuts/transcludify","text":"alt-shift-T"},"$:/config/ui/EditTemplate":{"title":"$:/config/ui/EditTemplate","text":"$:/core/ui/EditTemplate"},"$:/config/ui/ViewTemplate":{"title":"$:/config/ui/ViewTemplate","text":"$:/core/ui/ViewTemplate"},"$:/config/WikiParserRules/Inline/wikilink":{"title":"$:/config/WikiParserRules/Inline/wikilink","text":"disable"},"$:/snippets/currpalettepreview":{"title":"$:/snippets/currpalettepreview","text":"\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch-inner()\n\\whitespace trim\n<$set name=\"swatchColour\" value={{##$(colourResolved)$}}>\n<$list filter=\"[<swatchColour>!prefix[<<colour ]!suffix[>>]]\" variable=\"ignore\">\n<div class=\"tc-swatch\" style=<<swatchStyle>> title=<<swatchTitle>>/>\n&#32;\n</$list>\n<$list filter=\"[<swatchColour>prefix[<<colour ]suffix[>>]]\" variable=\"ignore\">\n<$wikify name=\"colourResolved\" text=\"<$macrocall $name='resolve-colour' macrocall=<<swatchColour>>/>\">\n<<swatch-inner>>\n</$wikify>\n</$list>\n</$set>\n\\end\n\\define swatch()\n\\whitespace trim\n<$set name=\"swatchColour\" value={{##$(colour)$}}>\n<$set name=\"swatchTitle\" value=<<colour>>>\n<$list filter=\"[<swatchColour>!prefix[<<colour ]!suffix[>>]]\" variable=\"ignore\">\n<div class=\"tc-swatch\" style=<<swatchStyle>> title=<<swatchTitle>>/>\n&#32;\n</$list>\n<$list filter=\"[<swatchColour>prefix[<<colour ]suffix[>>]]\" variable=\"ignore\">\n<$wikify name=\"colourResolved\" text=\"<$macrocall $name='resolve-colour' macrocall=<<swatchColour>>/>\">\n<<swatch-inner>>\n</$wikify>\n</$list>\n</$set>\n</$set>\n\\end\n\\whitespace trim\n<div class=\"tc-swatches-horiz\"><$list filter=\"\nforeground\nbackground\nmuted-foreground\nprimary\npage-background\ntab-background\ntiddler-info-background\n\" variable=\"colour\"><<swatch>></$list></div>\n"},"$:/snippets/DebugStylesheets":{"title":"$:/snippets/DebugStylesheets","text":"\\whitespace trim\n<style>[test]{list-style:'❌'}</style>\n<ul>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]has[modified]]\" counter=\"n\">\n<style>{{!!text}}[test=\"<<n>>\"]{list-style:disc;}</style>\n<li test=<<n>>><$link/></li>\n</$list>\n</ul>\n"},"$:/snippets/download-wiki-button":{"title":"$:/snippets/download-wiki-button","text":"\\define lingo-base() $:/language/ControlPanel/Tools/Download/\n\\whitespace trim\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" filename=\"index.html\"/>\n<<lingo Full/Caption>>&#32;{{$:/core/images/save-button-dynamic}}\n</$button>"},"$:/language":{"title":"$:/language","text":"$:/languages/en-GB"},"$:/snippets/languageswitcher":{"title":"$:/snippets/languageswitcher","text":"\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n\\whitespace trim\n\n<$linkcatcher to=\"$:/language\">\n<div class=\"tc-chooser tc-language-chooser\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/language}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link>\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value=<<currentTiddler>>>\n<$transclude subtiddler=<<flag-title>>>\n<$list filter=\"[all[current]field:title[$:/languages/en-GB]]\">\n<$transclude tiddler=\"$:/languages/en-GB/icon\"/>\n</$list>\n</$transclude>\n</$set>\n</span>\n&#32;\n<$view field=\"description\">\n<$view field=\"name\">\n<$view field=\"title\"/>\n</$view>\n</$view>\n</$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"},"$:/core/macros/CSS":{"title":"$:/core/macros/CSS","tags":"$:/tags/Macro","text":"<!-- Needs to stay that way for backwards compatibility. See GH issue: #8326 -->\n\\define colour(name)\n\\whitespace trim\n<$transclude tiddler={{$:/palette}} index=\"$name$\">\n\t<$transclude tiddler=\"$:/palettes/Vanilla\" index=\"$name$\">\n\t\t<$transclude tiddler=\"$:/config/DefaultColourMappings/$name$\"/>\n\t</$transclude>\n</$transclude>\n\\end\n\n\\define color(name) <<colour $name$>>\n\n\\define box-shadow(shadow)\n``\n-webkit-box-shadow: $shadow$;\n\t-moz-box-shadow: $shadow$;\n\t\tbox-shadow: $shadow$;\n``\n\\end\n\n\\define filter(filter)\n``\n-webkit-filter: $filter$;\n\t-moz-filter: $filter$;\n\t\tfilter: $filter$;\n``\n\\end\n\n\\define transition(transition)\n``\n-webkit-transition: $transition$;\n\t-moz-transition: $transition$;\n\t\ttransition: $transition$;\n``\n\\end\n\n\\define transform-origin(origin)\n``\n-webkit-transform-origin: $origin$;\n\t-moz-transform-origin: $origin$;\n\t\ttransform-origin: $origin$;\n``\n\\end\n\n\\define background-linear-gradient(gradient)\n``\nbackground-image: linear-gradient($gradient$);\nbackground-image: -o-linear-gradient($gradient$);\nbackground-image: -moz-linear-gradient($gradient$);\nbackground-image: -webkit-linear-gradient($gradient$);\nbackground-image: -ms-linear-gradient($gradient$);\n``\n\\end\n\n\\define column-count(columns)\n``\n-moz-column-count: $columns$;\n-webkit-column-count: $columns$;\ncolumn-count: $columns$;\n``\n\\end\n\n\\procedure datauri(title)\n<$macrocall $name=\"makedatauri\" type={{{ [<title>get[type]] }}} text={{{ [<title>get[text]] }}} _canonical_uri={{{ [<title>get[_canonical_uri]] }}}/>\n\\end\n\n\\procedure if-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\"><<text>></$reveal>\n\\end\n\n\\procedure if-no-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\"><<text>></$reveal>\n\\end\n\n\\procedure if-background-attachment(text)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" type=\"nomatch\" text=\"\"><<text>></$reveal>\n\\end\n"},"$:/core/macros/colour-picker":{"title":"$:/core/macros/colour-picker","tags":"$:/tags/Macro","text":"\\define colour-picker-update-recent()\n<$action-listops\n\t$tiddler=\"$:/config/ColourPicker/Recent\"\n\t$subfilter=\"$(colour-picker-value)$ [list[$:/config/ColourPicker/Recent]remove[$(colour-picker-value)$]] +[limit[8]]\"\n/>\n\\end\n\n\\define colour-picker-inner(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(colour-picker-value)$\"\"\">\n$(colour-picker-update-recent)$\n<$transclude $variable=\"__actions__\"/>\n\n<span style=\"display:inline-block; background-color: $(colour-picker-value)$; width: 100%; height: 100%; border-radius: 50%;\"/>\n\n</$button>\n\\end\n\n\\define colour-picker-recent-inner(actions)\n\\whitespace trim\n<$set name=\"colour-picker-value\" value=\"$(recentColour)$\">\n<$macrocall $name=\"colour-picker-inner\" actions=<<__actions__>>/>\n</$set>\n\\end\n\n\\define colour-picker-recent(actions)\n\\whitespace trim\n{{$:/language/ColourPicker/Recent}}<$list filter=\"[list[$:/config/ColourPicker/Recent]]\" variable=\"recentColour\">\n&#32;\n<$macrocall $name=\"colour-picker-recent-inner\" actions=<<__actions__>>/>\n</$list>\n\\end\n\n\\define colour-picker(actions)\n\\whitespace trim\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker-recent\" actions=<<__actions__>>/>\n\n---\n\n<$list filter=\"LightPink Pink Crimson LavenderBlush PaleVioletRed HotPink DeepPink MediumVioletRed Orchid Thistle Plum Violet Magenta Fuchsia DarkMagenta Purple MediumOrchid DarkViolet DarkOrchid Indigo BlueViolet MediumPurple MediumSlateBlue SlateBlue DarkSlateBlue Lavender GhostWhite Blue MediumBlue MidnightBlue DarkBlue Navy RoyalBlue CornflowerBlue LightSteelBlue LightSlateGrey SlateGrey DodgerBlue AliceBlue SteelBlue LightSkyBlue SkyBlue DeepSkyBlue LightBlue PowderBlue CadetBlue Azure LightCyan PaleTurquoise Cyan Aqua DarkTurquoise DarkSlateGrey DarkCyan Teal MediumTurquoise LightSeaGreen Turquoise Aquamarine MediumAquamarine MediumSpringGreen MintCream SpringGreen MediumSeaGreen SeaGreen Honeydew LightGreen PaleGreen DarkSeaGreen LimeGreen Lime ForestGreen Green DarkGreen Chartreuse LawnGreen GreenYellow DarkOliveGreen YellowGreen OliveDrab Beige LightGoldenrodYellow Ivory LightYellow Yellow Olive DarkKhaki LemonChiffon PaleGoldenrod Khaki Gold Cornsilk Goldenrod DarkGoldenrod FloralWhite OldLace Wheat Moccasin Orange PapayaWhip BlanchedAlmond NavajoWhite AntiqueWhite Tan BurlyWood Bisque DarkOrange Linen Peru PeachPuff SandyBrown Chocolate SaddleBrown Seashell Sienna LightSalmon Coral OrangeRed DarkSalmon Tomato MistyRose Salmon Snow LightCoral RosyBrown IndianRed Red Brown FireBrick DarkRed Maroon White WhiteSmoke Gainsboro LightGrey Silver DarkGrey Grey DimGrey Black\" variable=\"colour-picker-value\">\n&#32;\n<$macrocall $name=\"colour-picker-inner\" actions=<<__actions__>>/>\n</$list>\n\n---\n\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" tag=\"input\" default=\"\" placeholder=\"\"/>\n&#32;\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" type=\"color\" tag=\"input\"/>\n<$set name=\"colour-picker-value\" value={{$:/config/ColourPicker/New}}>\n<$macrocall $name=\"colour-picker-inner\" actions=<<__actions__>>/>\n</$set>\n\n</div>\n\n\\end\n"},"$:/core/macros/copy-to-clipboard":{"title":"$:/core/macros/copy-to-clipboard","tags":"$:/tags/Macro","text":"\\whitespace trim\n\n\\procedure copy-to-clipboard(src,class:\"tc-btn-invisible\",style)\n<$button message=\"tm-copy-to-clipboard\"\n\tparam=<<src>>\n\tclass=<<class>>\n\tstyle=<<style>>\n\ttooltip={{$:/language/Buttons/CopyToClipboard/Hint}}\n>\n\t{{$:/core/images/copy-clipboard}}\n\t<span class=\"tc-tiny-gap-left\">\n\t\t<$text text={{$:/language/Buttons/CopyToClipboard/Caption}}/>\n\t</span>\n</$button>\n\\end\n\n\\procedure copy-to-clipboard-above-right(src,class:\"tc-btn-invisible\",style)\n<div style=\"position: relative;\">\n\t<div style=\"position: absolute; bottom: 0; right: 0;\">\n\t\t<$macrocall $name=\"copy-to-clipboard\" src=<<src>> class=<<class>> style=<<style>>/>\n\t</div>\n</div>\n\\end\n"},"$:/core/macros/diff":{"title":"$:/core/macros/diff","tags":"$:/tags/Macro","text":"\\whitespace trim\n\n\\procedure compareTiddlerText(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle)\n<$set name=\"source\" tiddler=<<sourceTiddlerTitle>> subtiddler=<<sourceSubTiddlerTitle>>>\n\t<$set name=\"dest\" tiddler=<<destTiddlerTitle>> subtiddler=<<destSubTiddlerTitle>>>\n\t\t<$diff-text source=<<source>> dest=<<dest>>/>\n\t</$set>\n</$set>\n\\end\n\n\\procedure compareTiddlers(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle,exclude)\n<table class=\"tc-diff-tiddlers\">\n\t<tbody>\n\t\t<$set name=\"sourceFields\" filter=\"[<sourceTiddlerTitle>fields[]sort[]]\">\n\t\t\t<$set name=\"destFields\" filter=\"[<destSubTiddlerTitle>subtiddlerfields<destTiddlerTitle>sort[]]\">\n\t\t\t<$list filter=\"[enlist<sourceFields>] [enlist<destFields>] -[enlist<exclude>] +[sort[]]\" variable=\"fieldName\">\n\t\t\t\t<tr>\n\t\t\t\t\t<th>\n\t\t\t\t\t\t<$text text=<<fieldName>>/>\n\t\t\t\t\t</th>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<$set name=\"source\" tiddler=<<sourceTiddlerTitle>> subtiddler=<<sourceSubTiddlerTitle>> field=<<fieldName>>>\n\t\t\t\t\t\t\t<$set name=\"dest\" tiddler=<<destTiddlerTitle>> subtiddler=<<destSubTiddlerTitle>> field=<<fieldName>>>\n\t\t\t\t\t\t\t\t<$diff-text source=<<source>> dest=<<dest>>>&#32;</$diff-text>\n\t\t\t\t\t\t\t</$set>\n\t\t\t\t\t\t</$set>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</$list>\n\t\t\t</$set>\n\t\t</$set>\n\t</tbody>\n</table>\n\\end\n"},"$:/core/macros/dumpvariables":{"title":"$:/core/macros/dumpvariables","tags":"$:/tags/Macro","text":"\\define dumpvariables()\n\\whitespace trim\n<ul>\n<$list filter=\"[variables[]]\" variable=\"varname\">\n<li>\n<strong><code><$text text=<<varname>>/></code></strong>:<br/>\n<$codeblock code={{{ [<varname>getvariable[]] }}}/>\n</li>\n</$list>\n</ul>\n\\end\n"},"$:/core/macros/export":{"title":"$:/core/macros/export","tags":"$:/tags/Macro","text":"\\function exportButtonFilename(baseFilename)\n[<baseFilename>] [<extension>] +[join[]]\n\\end\n\n\\procedure exportButton(exportFilter:\"[!is[system]sort[title]]\",lingoBase,baseFilename:\"tiddlers\")\n\\whitespace trim\n<$let hint={{{ [<lingoBase>addsuffix[Hint]get[text]] }}}\n\tcaption={{{  [<lingoBase>addsuffix[Caption]get[text]] }}}\n>\n\t<span class=\"tc-popup-keep\">\n\t\t<$button popup=<<qualify \"$:/state/popup/export\">>\n\t\t\ttooltip=<<hint>>\n\t\t\taria-label=<<caption>>\n\t\t\tclass=<<tv-config-toolbar-class>>\n\t\t\tselectedClass=\"tc-selected\"\n\t\t\tdragFilter=<<exportFilter>>\n\t\t>\n\t\t\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t\t\t{{$:/core/images/export-button}}\n\t\t\t<%endif%>\n\t\t\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t\t\t<span class=\"tc-btn-text\"><$text text=<<caption>>/></span>\n\t\t\t<%endif%>\n\t\t</$button>\n\t</span>\n</$let>\n<$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\t<div class=\"tc-drop-down\">\n\t\t<$set name=\"count\" value={{{ [subfilter<exportFilter>count[]] }}}>\n\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n\t\t\t\t<$list filter=\"[<currentTiddler>has[condition]subfilter{!!condition}limit[1]] ~[<currentTiddler>!has[condition]then[true]]\"\n\t\t\t\t\tvariable=\"ignore\"\n\t\t\t\t>\n\t\t\t\t\t<$button class=\"tc-btn-invisible\">\n\t\t\t\t\t\t<$action-sendmessage $message=\"tm-download-file\"\n\t\t\t\t\t\t\t$param=<<currentTiddler>>\n\t\t\t\t\t\t\texportFilter=<<exportFilter>>\n\t\t\t\t\t\t\tfilename={{{ [<baseFilename>addsuffix{!!extension}] }}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n\t\t\t\t\t\t<$transclude field=\"description\"/>\n\t\t\t\t\t</$button>\n\t\t\t\t</$list>\n\t\t\t</$list>\n\t\t</$set>\n\t</div>\n</$reveal>\n\\end\n"},"$:/core/macros/image-picker":{"title":"$:/core/macros/image-picker","created":"20170715180840889","modified":"20170715180914005","tags":"$:/tags/Macro","type":"text/vnd.tiddlywiki","text":"\\define image-picker-thumbnail(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(imageTitle)$\"\"\"><$transclude $variable=\"__actions__\"/><$transclude tiddler=<<imageTitle>>/></$button>\n\\end\n\n\\define image-picker-list(filter,actions)\n\\whitespace trim\n<$list filter=\"\"\"$filter$\"\"\" variable=\"imageTitle\">\n<$macrocall $name=\"image-picker-thumbnail\" actions=<<__actions__>>/>\n&#32;\n</$list>\n\\end\n\n\\define image-picker(actions,filter:\"[all[shadows+tiddlers]is[image]] -[type[application/pdf]] +[!has[draft.of]$subfilter$sort[title]]\",subfilter:\"\")\n\\whitespace trim\n<div class=\"tc-image-chooser\">\n<$vars state-system=<<qualify \"$:/state/image-picker/system\">>>\n<$checkbox tiddler=<<state-system>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"hide\">\n&#32;\n{{$:/language/SystemTiddlers/Include/Prompt}}\n</$checkbox>\n<$reveal state=<<state-system>> type=\"match\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$ +[!is[system]]\"\"\" actions=<<__actions__>>/>\n</$reveal>\n<$reveal state=<<state-system>> type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$\"\"\" actions=<<__actions__>>/>\n</$reveal>\n</$vars>\n</div>\n\\end\n\n\\define image-picker-include-tagged-images(actions)\n<$macrocall $name=\"image-picker\" filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[!has[draft.of]sort[title]]\" actions=<<__actions__>>/>\n\\end\n"},"$:/core/macros/keyboard-driven-input":{"title":"$:/core/macros/keyboard-driven-input","tags":"$:/tags/Macro","text":"\\procedure prefix.bracket() [\n\\procedure suffix.bracket() ]\n\n\\function tf.change-input-tab.next-tab() [[all]addprefix<prefix.bracket>addsuffix<prefix.bracket>addsuffix[shadows+tiddlers]addsuffix<suffix.bracket>addsuffix[tag<tag>!has]addsuffix<prefix.bracket>addsuffix[draft.of]addsuffix<suffix.bracket>addsuffix<beforeafter>addsuffix[<currentState>]addsuffix<suffix.bracket>addsuffix[ :else]addsuffix<prefix.bracket>addsuffix<prefix.bracket>addsuffix<beforeafter>addsuffix<suffix.bracket>addsuffix[match]addsuffix<prefix.bracket>addsuffix[after]addsuffix<suffix.bracket>addsuffix[then<firstTab>]addsuffix<suffix.bracket>addsuffix[ :else]addsuffix<prefix.bracket>addsuffix<prefix.bracket>addsuffix<beforeafter>addsuffix<suffix.bracket>addsuffix[match]addsuffix<prefix.bracket>addsuffix[before]addsuffix<suffix.bracket>addsuffix[then<lastTab>]addsuffix<suffix.bracket>]\n\n\\procedure change-input-tab(stateTitle,tag,beforeafter,defaultState,actions)\n\\whitespace trim\n<$set name=\"tabsList\" filter=\"[<explicitTabList>!is[blank]enlist-input[]] :else[all[shadows+tiddlers]tag<tag>!has[draft.of]]\">\n\t<$let\n\t\tcurrentState={{{ [<stateTitle>!is[missing]get[text]] :else[<defaultState>] }}}\n\t\tfirstTab={{{ [enlist<tabsList>nth[1]] }}}\n\t\tlastTab={{{ [enlist<tabsList>last[]] }}}\n\t\tnextTabSubFilter=<<tf.change-input-tab.next-tab>>\n\t\tnextTab={{{ [subfilter<nextTabSubFilter>] }}}\n\t>\n\t\t<$action-setfield $tiddler=<<stateTitle>> text=<<nextTab>>/>\n\t\t<<actions>>\n\t</$let>\n</$set>\n\\end\n\n\\procedure keyboard-input-actions()\n\\whitespace trim\n<%if [<index>match[]] %>\n\t<$action-setfield $tiddler=<<storeTitle>> text={{{ [<tiddler>get<field>] }}}/>\n<% endif %>\n<%if [<index>!match[]] %>\n\t<$action-setfield $tiddler=<<storeTitle>> text={{{ [<tiddler>getindex<index>] }}}/>\n<% endif %>\n\\end\n\n\\procedure input-next-actions-inner()\n\\whitespace trim\n<%if [<nextItem>minlength[1]] %>\n\t<$action-setfield $tiddler=<<selectionStateTitle>> text=<<nextItem>>/>\n\t<%if [<index>match[]] %>\n\t\t<$action-setfield $tiddler=<<tiddler>> $field=<<field>> $value={{{ [<nextItem>] :and[splitregexp[(?:.(?!-))+$]] }}}/>\n\t<% endif %>\n\t<%if [<index>!match[]] %>\n\t\t<$action-setfield $tiddler=<<tiddler>> $index=<<index>> $value={{{ [<nextItem>] :and[splitregexp[(?:.(?!-))+$]] }}}/>\n\t<% endif %>\n\t<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n<% endif %>\n\\end\n\n\\procedure input-next-actions-after()\n\\whitespace trim\n<%if [<storeTitle>get[text]minlength<filterMinLength>] [<filterMinLength>match[0]] %>\n\t<$let\n\t\tuserInput={{{ [<storeTitle>get[text]] }}}\n\t\tselectedItem={{{ [<selectionStateTitle>get[text]] }}}\n\t\tconfigTiddler={{{ [subfilter<configTiddlerFilter>] }}}\n\t\tprimaryListFilter={{{ [<configTiddler>get<firstSearchFilterField>] }}}\n\t\tsecondaryListFilter={{{ [<configTiddler>get<secondSearchFilterField>] }}}\n\t>\n\t\t<$set\n\t\t\tname=\"filteredList\"\n\t\t\tfilter=\"[subfilter<primaryListFilter>addsuffix[-primaryList]] :all[subfilter<secondaryListFilter>addsuffix[-secondaryList]]\"\n\t\t>\n\t\t\t<$let\n\t\t\t\tnextItem={{{ [enlist<filteredList>after<selectedItem>] :else[enlist<filteredList>nth[1]] }}}\n\t\t\t\tfirstItem={{{ [enlist<filteredList>nth[1]] }}}\n\t\t\t\tlastItem={{{ [enlist<filteredList>last[]] }}}\n\t\t\t>\n\t\t\t\t<%if [<selectedItem>match<firstItem>!match<lastItem>] [<selectedItem>!match<firstItem>!match<lastItem>] %>\n\t\t\t\t\t<<input-next-actions-inner>>\n\t\t\t\t<%elseif [<selectedItem>match<lastItem>!match<firstItem>] %>\n\t\t\t\t\t<$set name=\"nextItem\" value={{{ [<userInput>addsuffix[-userInput]] }}}>\n\t\t\t\t\t\t<<input-next-actions-inner>>\n\t\t\t\t\t</$set>\n\t\t\t\t<%elseif [<selectedItem>match<firstItem>match<lastItem>] %>\n\t\t\t\t\t<$set name=\"nextItem\" value={{{ [<userInput>addsuffix[-userInput]] }}}>\n\t\t\t\t\t\t<<input-next-actions-inner>>\n\t\t\t\t\t</$set>\n\t\t\t\t<% endif %>\n\t\t\t</$let>\n\t\t</$set>\n\t</$let>\n<% endif %>\n\\end\n\n\\procedure input-next-actions-before()\n\\whitespace trim\n<%if [<storeTitle>get[text]minlength<filterMinLength>] [<filterMinLength>match[0]] %>\n\t<$let\n\t\tuserInput={{{ [<storeTitle>get[text]] }}}\n\t\tselectedItem={{{ [<selectionStateTitle>get[text]] }}}\n\t\tconfigTiddler={{{ [subfilter<configTiddlerFilter>] }}}\n\t\tprimaryListFilter={{{ [<configTiddler>get<firstSearchFilterField>] }}}\n\t\tsecondaryListFilter={{{ [<configTiddler>get<secondSearchFilterField>] }}}\n\t>\n\t\t<$set\n\t\t\tname=\"filteredList\"\n\t\t\tfilter=\"[subfilter<primaryListFilter>addsuffix[-primaryList]] :all[subfilter<secondaryListFilter>addsuffix[-secondaryList]]\"\n\t\t>\n\t\t\t<$let\n\t\t\t\tnextItem={{{ [enlist<filteredList>before<selectedItem>] :else[enlist<filteredList>reverse[]nth[1]] }}}\n\t\t\t\tfirstItem={{{ [enlist<filteredList>nth[1]] }}}\n\t\t\t\tlastItem={{{ [enlist<filteredList>last[]] }}}\n\t\t\t>\n\t\t\t\t<%if [<selectedItem>match<firstItem>!match<lastItem>] %>\n\t\t\t\t\t<$set name=\"nextItem\" value={{{ [<userInput>addsuffix[-userInput]] }}}>\n\t\t\t\t\t\t<<input-next-actions-inner>>\n\t\t\t\t\t</$set>\n\t\t\t\t<%elseif [<selectedItem>match<lastItem>!match<firstItem>] [<selectedItem>!match<firstItem>!match<lastItem>] %>\n\t\t\t\t\t<<input-next-actions-inner>>\n\t\t\t\t<%elseif [<selectedItem>match<firstItem>match<lastItem>] %>\n\t\t\t\t\t<$set name=\"nextItem\" value={{{ [<userInput>addsuffix[-userInput]] }}}>\n\t\t\t\t\t\t<<input-next-actions-inner>>\n\t\t\t\t\t</$set>\n\t\t\t\t<% endif %>\n\t\t\t</$let>\n\t\t</$set>\n\t</$let>\n<% endif %>\n\\end\n\n\\procedure keyboard-driven-input(tiddler,storeTitle,field:\"text\",index:\"\",tag:\"input\",type,focus:\"\",inputAcceptActions,inputAcceptVariantActions,inputCancelActions,placeholder:\"\",default:\"\",class,focusPopup,rows,minHeight,tabindex,size,autoHeight,filterMinLength:\"0\",refreshTitle,selectionStateTitle,cancelPopups:\"\",configTiddlerFilter,firstSearchFilterField:\"first-search-filter\",secondSearchFilterField:\"second-search-filter\")\n\\whitespace trim\n<$keyboard key=\"((input-accept))\" actions=<<inputAcceptActions>>>\n<$keyboard key=\"((input-accept-variant))\" actions=<<inputAcceptVariantActions>>>\n<$keyboard key=\"((input-up))\" actions=<<input-next-actions-before>>>\n<$keyboard key=\"((input-down))\" actions=<<input-next-actions-after>>>\n<$keyboard key=\"((input-cancel))\" actions=<<inputCancelActions>>>\n\t<$edit-text\n\t\ttiddler=<<tiddler>> field=<<field>> index=<<index>>\n\t\tinputActions=<<keyboard-input-actions>> tag=<<tag>> class=<<class>>\n\t\tplaceholder=<<placeholder>> default=<<default>> focusPopup=<<focusPopup>>\n\t\tfocus=<<focus>> type=<<type>> rows=<<rows>> minHeight=<<minHeight>>\n\t\ttabindex=<<tabindex>> size=<<size>> autoHeight=<<autoHeight>>\n\t\trefreshTitle=<<refreshTitle>> cancelPopups=<<cancelPopups>>\n\t/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n\\end\n"},"$:/core/macros/lingo":{"title":"$:/core/macros/lingo","tags":"$:/tags/Macro","text":"\\define lingo-base()\n$:/language/\n\\end\n\n\\define lingo(title)\n{{$(lingo-base)$$title$}}\n\\end\n"},"$:/core/macros/list":{"title":"$:/core/macros/list","tags":"$:/tags/Macro","text":"\\define list-links(filter,type:\"ul\",subtype:\"li\",class:\"\",emptyMessage,field:\"caption\")\n\\whitespace trim\n<$genesis $type=<<__type__>> class=<<__class__>>>\n\t<$list filter=<<__filter__>> emptyMessage=<<__emptyMessage__>>>\n\t\t<$genesis $type=<<__subtype__>>>\n\t\t\t<$link to={{!!title}}>\n\t\t\t\t<$let tv-wikilinks=\"no\">\n\t\t\t\t\t<$transclude field=<<__field__>>>\n\t\t\t\t\t\t<$view field=\"title\"/>\n\t\t\t\t\t</$transclude>\n\t\t\t\t</$let>\n\t\t\t</$link>\n\t\t</$genesis>\n\t</$list>\n</$genesis>\n\\end\n\n\\define list-links-draggable-drop-actions()\n<$action-listops $tiddler=<<targetTiddler>> $field=<<targetField>> $subfilter=\"+[insertbefore<actionTiddler>,<currentTiddler>]\"/>\n\\end\n\n\\define list-links-draggable(tiddler,field:\"list\",emptyMessage,type:\"ul\",subtype:\"li\",class:\"\",itemTemplate)\n\\whitespace trim\n<span class=\"tc-links-draggable-list\">\n\t<$vars targetTiddler=\"\"\"$tiddler$\"\"\" targetField=\"\"\"$field$\"\"\">\n\t\t<$genesis $type=<<__type__>> class=\"$class$\">\n\t\t\t<$list filter=\"[list[$tiddler$!!$field$]]\" emptyMessage=<<__emptyMessage__>>>\n\t\t\t\t<$droppable\n\t\t\t\t\tactions=<<list-links-draggable-drop-actions>>\n\t\t\t\t\ttag=\"\"\"$subtype$\"\"\"\n\t\t\t\t\tenable=<<tv-enable-drag-and-drop>>\n\t\t\t\t>\n\t\t\t\t\t<div class=\"tc-droppable-placeholder\"/>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n\t\t\t\t\t\t\t<$link to={{!!title}}>\n\t\t\t\t\t\t\t\t<$let tv-wikilinks=\"no\">\n\t\t\t\t\t\t\t\t\t<$transclude field=\"caption\">\n\t\t\t\t\t\t\t\t\t\t<$view field=\"title\"/>\n\t\t\t\t\t\t\t\t\t</$transclude>\n\t\t\t\t\t\t\t\t</$let>\n\t\t\t\t\t\t\t</$link>\n\t\t\t\t\t\t</$transclude>\n\t\t\t\t\t</div>\n\t\t\t\t</$droppable>\n\t\t\t</$list>\n\t\t\t<$tiddler tiddler=\"\">\n\t\t\t\t<$droppable\n\t\t\t\t\tactions=<<list-links-draggable-drop-actions>> \n\t\t\t\t\ttag=\"div\"\n\t\t\t\t\tenable=<<tv-enable-drag-and-drop>>\n\t\t\t\t>\n\t\t\t\t\t<div class=\"tc-droppable-placeholder\">\n\t\t\t\t\t\t{{$:/core/images/blank}}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style=\"height:0.5em;\"/>\n\t\t\t\t</$droppable>\n\t\t\t</$tiddler>\n\t\t</$genesis>\n\t</$vars>\n</span>\n\\end\n\n\\define list-tagged-draggable-drop-actions(tag)\n\\whitespace trim\n<!-- Save the current ordering of the tiddlers with this tag -->\n<$set name=\"order\" filter=\"[<__tag__>tagging[]]\">\n\t<!-- Remove any list-after or list-before fields from the tiddlers with this tag -->\n\t<$list filter=\"[<__tag__>tagging[]]\">\n\t\t<$action-deletefield $field=\"list-before\"/>\n\t\t<$action-deletefield $field=\"list-after\"/>\n\t</$list>\n\t<!-- Save the new order to the Tag Tiddler -->\n\t<$action-listops $tiddler=<<__tag__>> $field=\"list\" $filter=\"+[enlist<order>] +[insertbefore<actionTiddler>,<currentTiddler>]\"/>\n\t<!-- Make sure the newly added item has the right tag -->\n\t<!-- Removing this line makes dragging tags within the dropdown work as intended -->\n\t<!--<$action-listops $tiddler=<<actionTiddler>> $tags=<<__tag__>>/>-->\n\t<!-- Using the following 5 lines as replacement makes dragging titles from outside into the dropdown apply the tag -->\n\t<$list filter=\"[<actionTiddler>!contains:tags<__tag__>]\">\n\t\t<$fieldmangler tiddler=<<actionTiddler>>>\n\t\t\t<$action-sendmessage $message=\"tm-add-tag\" $param=<<__tag__>>/>\n\t\t</$fieldmangler>\n\t</$list>\n</$set>\n\\end\n\n\\define list-tagged-draggable(tag,subFilter,emptyMessage,itemTemplate,elementTag:\"div\",storyview:\"\")\n\\whitespace trim\n<span class=\"tc-tagged-draggable-list\">\n\t<$set name=\"tag\" value=<<__tag__>>>\n\t\t<$list\n\t\t\tfilter=\"[<__tag__>tagging[]$subFilter$]\"\n\t\t\temptyMessage=<<__emptyMessage__>>\n\t\t\tstoryview=<<__storyview__>>\n\t\t>\n\t\t\t<$genesis $type=<<__elementTag__>> class=\"tc-menu-list-item\">\n\t\t\t\t<$droppable\n\t\t\t\t\tactions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\"\n\t\t\t\t\tenable=<<tv-enable-drag-and-drop>>\n\t\t\t\t>\n\t\t\t\t\t<$genesis $type=<<__elementTag__>> class=\"tc-droppable-placeholder\"/>\n\t\t\t\t\t<$genesis $type=<<__elementTag__>>>\n\t\t\t\t\t\t<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n\t\t\t\t\t\t\t<$link to={{!!title}}>\n\t\t\t\t\t\t\t\t<$view field=\"title\"/>\n\t\t\t\t\t\t\t</$link>\n\t\t\t\t\t\t</$transclude>\n\t\t\t\t\t</$genesis>\n\t\t\t\t</$droppable>\n\t\t\t</$genesis>\n\t\t</$list>\n\t\t<$tiddler tiddler=\"\">\n\t\t\t<$droppable\n\t\t\t\tactions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\"\n\t\t\t\tenable=<<tv-enable-drag-and-drop>>\n\t\t\t>\n\t\t\t\t<$genesis $type=<<__elementTag__>> class=\"tc-droppable-placeholder\"/>\n\t\t\t\t<$genesis $type=<<__elementTag__>> style=\"height:0.5em;\"/>\n\t\t\t</$droppable>\n\t\t</$tiddler>\n\t</$set>\n</span>\n\\end\n"},"$:/core/macros/show-filter-count":{"title":"$:/core/macros/show-filter-count","tags":"$:/tags/Macro","text":"\\whitespace trim\n\n\\procedure show-filter-count(filter)\n<$button class=\"tc-btn-invisible\">\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $value=<<filter>>/>\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" $value=<<filter>>/>\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/>\n\t<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n\t<$action-navigate $to=\"$:/AdvancedSearch\"/>\n\t<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-advanced-search input\"/>\n\t<span class=\"tc-small-gap-right\">''<$count filter=<<filter>>/>''</span>\n\t{{$:/core/images/advanced-search-button}}\n</$button>\n\\end"},"$:/core/macros/tabs":{"title":"$:/core/macros/tabs","tags":"$:/tags/Macro","code-body":"yes","text":"\\define tabs-button()\n\\whitespace trim\n<$button\n\tset=<<tabsState>>\n\tsetTo=<<currentTab>>\n\tdefault=<<__default__>>\n\tselectedClass=\"tc-tab-selected\"\n\ttooltip={{!!tooltip}}\n\trole=\"switch\"\n\tdata-tab-title=<<currentTab>>\n>\n\t<$tiddler tiddler=<<save-currentTiddler>>>\n\t\t<$set name=\"tv-wikilinks\" value=\"no\">\n\t\t\t<$transclude tiddler=<<__buttonTemplate__>> mode=\"inline\">\n\t\t\t\t<$transclude tiddler=<<currentTab>> field=\"caption\">\n\t\t\t\t\t<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n\t\t\t\t</$transclude>\n\t\t\t</$transclude>\n\t\t</$set>\n\t</$tiddler>\n\t<<__actions__>>\n</$button>\n\\end\n\n\\define tabs-tab()\n\\whitespace trim\n<$set name=\"save-currentTiddler\" value=<<currentTiddler>>>\n\t<$tiddler tiddler=<<currentTab>>>\n\t\t<<tabs-button>>\n\t</$tiddler>\n</$set>\n\\end\n\n\\define tabs-tab-list()\n\\whitespace trim\n<$list filter=<<__tabsList__>> variable=\"currentTab\" storyview=\"pop\">\n\t<<tabs-tab>>\n</$list>\n\\end\n\n\\define tabs-tab-body()\n\\whitespace trim\n<$list filter=<<__tabsList__>> variable=\"currentTab\">\n\t<$reveal type=\"match\" state=<<tabsState>> text=<<currentTab>> default=<<__default__>> retain=<<__retain__>> tag=\"div\">\n\t\t<$transclude tiddler=<<__template__>> mode=\"block\">\n\t\t\t<$transclude tiddler=<<currentTab>> mode=\"block\"/>\n\t\t</$transclude>\n\t</$reveal>\n</$list>\n\\end\n\n\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template,buttonTemplate,retain,actions,explicitState)\n\\whitespace trim\n<$qualify title=<<__state__>> name=\"qualifiedState\">\n\t<$let tabsState={{{ [<__explicitState__>minlength[1]] ~[<qualifiedState>] }}}>\n\t\t<div class={{{ [[tc-tab-set]addsuffix[ ]addsuffix<__class__>] }}}>\n\t\t\t<div class={{{ [[tc-tab-buttons]addsuffix[ ]addsuffix<__class__>] }}}>\n\t\t\t\t<<tabs-tab-list>>\n\t\t\t</div>\n\t\t\t<div class={{{ [[tc-tab-divider]addsuffix[ ]addsuffix<__class__>] }}}/>\n\t\t\t<div class={{{ [[tc-tab-content]addsuffix[ ]addsuffix<__class__>] }}}>\n\t\t\t\t<<tabs-tab-body>>\n\t\t\t</div>\n\t\t</div>\n\t</$let>\n</$qualify>\n\\end"},"$:/core/macros/tag-picker":{"title":"$:/core/macros/tag-picker","tags":"$:/tags/Macro","first-search-filter":"[subfilter<tagListFilter>!is[system]search:title<userInput>]","second-search-filter":"[subfilter<tagListFilter>is[system]search:title<userInput>]","text":"<!--\n\tFields: \"first-search-filter\", \"second-search-filter\" are assigned to the keyboard-driven input macro with parameter: \"configTiddlerFilter\"\n\tThey __need to be the same__ as used for variables: \"nonSystemTagsFilter\" and \"systemTagsFilter\". See code below!\n-->\n\n\\whitespace trim\n\n<!-- tf.tagpicker-dropdown-id is needed if several tap-pickers are shown in one tiddler -->\n\\function tf.tagpicker-dropdown-id()\n\t[<qualify $:/state/popup/tags-auto-complete>]\n\t[[$(saveTiddler)$-[$(tagField)$-$(tagListFilter)$]substitute[]sha256[]] :and[join[/]]\n\\end\n\n\\function tf.tagpicker-dropdown-class() [<tf.tagpicker-dropdown-id>sha256[]addprefix[tc-]]\n\\function tf.get-tagpicker-focus-selector() [<tf.tagpicker-dropdown-class>addprefix[.]] .tc-popup-handle :and[join[ ]]\n\n<!-- clean up temporary tiddlers, so the next \"pick\" starts with a clean input -->\n<!-- This could probably be optimized / removed if we would use different temp-tiddlers\n\t(future improvement because keeping track is comlex for humans)\n-->\n\\procedure delete-tag-state-tiddlers()\n<$action-deletetiddler $filter=\"[<newTagNameTiddler>] [<storeTitle>] [<tagSelectionState>]\"/>\n\\end\n\n<!-- trigger __toggle tag__ by keyboard -->\n\\procedure add-tag-actions()\n<$let tag=<<_tf.getTag>> >\n\t<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter=':and[toggle<tag>trim[]]'/>\n\t<%if [<tag>] :intersection[<saveTiddler>get<tagField>enlist-input[]] %>\n\t\t<!-- tag has been removed - do nothing -->\n\t<%else%>\n\t\t<<actions>>\n\t<%endif%>\n\t<<delete-tag-state-tiddlers>>\n\t<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$let>\n\\end\n<!-- <$action-log  /> -->\n\n<!-- ESC key removes the text from the input\nThe second ESC tries to close the \"draft tiddler\"\n-->\n\\procedure clear-tags-actions-inner()\n<%if [<storeTitle>has[text]] :else[<newTagNameTiddler>has[text]] %>\n\t<<delete-tag-state-tiddlers>>\n<%else%>\n\t\t<<cancel-delete-tiddler-actions \"cancel\">>\n<%endif%>\n\\end\n\n<!-- triggered by keyboard only -->\n\\procedure clear-tags-actions()\n<$let userInput=<<_tf.getUserInput>> >\n\t<!-- this list __cannot__ be transformed to conditional IF. The list variable is used! -->\n\t<$list filter=\"[<newTagNameTiddler>get[text]!match<userInput>]\" >\n\t\t<$list-empty>\n\t\t\t<<clear-tags-actions-inner>>\n\t\t</$list-empty>\n\t\t<$action-setfield $tiddler=<<newTagNameTiddler>> text=<<userInput>>/>\n\t\t<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n\t</$list>\n</$let>\n\\end\n\n<!-- similar to add-tag-actions __but__ add-only -->\n\\procedure add-button-actions()\n<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter=\"[<tag>trim[]]\"/>\n<<actions>>\n<<delete-tag-state-tiddlers>>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<tf.get-tagpicker-focus-selector>>/>\n\\end\n<!-- <$action-log /> -->\n\n<!-- create dropdown list -->\n\\procedure tag-picker-listTags(filter, suffix, empty)\n<$let userInput=<<_tf.getUserInput>> >\n\t<$list filter=\"[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]\"\n\t\temptyMessage=\"<div class='tc-search-results'>{{$:/language/Search/Search/TooShort}}</div>\" variable=\"listItem\"\n\t>\n\t\t<$list filter=<<filter>> variable=\"tag\">\n\t\t\t<$list-empty>\n\t\t\t\t<span class=\"tc-small-gap-left\"><<empty>></span>\n\t\t\t</$list-empty>\n\t\t\t<!-- The buttonClasses filter is used to define tc-tag-button-selected state -->\n\t\t\t<!-- tf.get-tagpicker-focus-selector has to be resolved for $:/core/ui/TagPickerTagTemplate,\n\t\t\t\tothwerwise qualify in tf.tagpicker-dropdown-id causes problems -->\n\t\t\t<$let currentTiddler=<<tag>>\n\t\t\t\tbutton-classes=`tc-btn-invisible ${[<tag>addsuffix<suffix>] :except[<tagSelectionState>get[text]] :then[[]] ~tc-tag-button-selected }$`\n\t\t\t\tget-tagpicker-focus-selector=`${[<tf.get-tagpicker-focus-selector>]}$`\n\t\t\t>\n\t\t\t\t{{||$:/core/ui/TagPickerTagTemplate}}\n\t\t\t</$let>\n\t\t</$list>\n\t</$list>\n</$let>\n\\end\n\n<!-- tag-picker-inner is the main function -->\n\\procedure tag-picker-inner()\n<div class={{{ [[tc-edit-add-tag]] [<tf.tagpicker-dropdown-class>] :and[join[ ]] }}}>\n\t<div class=\"tc-edit-add-tag-ui\">\n\t\t<span class=\"tc-add-tag-name tc-small-gap-right\">\n\t\t\t<$transclude $variable=\"keyboard-driven-input\"\n\t\t\t\ttiddler=<<newTagNameTiddler>>\n\t\t\t\tstoreTitle=<<storeTitle>>\n\t\t\t\trefreshTitle=<<refreshTitle>>\n\t\t\t\tselectionStateTitle=<<tagSelectionState>>\n\t\t\t\tinputAcceptActions=<<add-tag-actions>>\n\t\t\t\tinputCancelActions=<<clear-tags-actions>>\n\t\t\t\ttag=\"input\"\n\t\t\t\tplaceholder={{$:/language/EditTemplate/Tags/Add/Placeholder}}\n\t\t\t\tfocusPopup=<<tf.tagpicker-dropdown-id>>\n\t\t\t\tclass=\"tc-edit-texteditor tc-popup-handle\"\n\t\t\t\ttabindex=<<tabIndex>>\n\t\t\t\tfocus={{{ [{$:/config/AutoFocus}match[tags]then[true]] :else[[false]] }}}\n\t\t\t\tfilterMinLength={{$:/config/Tags/MinLength}}\n\t\t\t\tcancelPopups=<<cancelPopups>>\n\t\t\t\tconfigTiddlerFilter=\"[[$:/core/macros/tag-picker]]\"\n\t\t\t/>\n\t\t</span>\n\t\t<$button popup=<<tf.tagpicker-dropdown-id>> class=\"tc-btn-invisible tc-btn-dropdown\"\n\t\t\ttooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}\n\t\t>\n\t\t\t{{$:/core/images/down-arrow}}\n\t\t</$button>\n\t\t<%if [<storeTitle>has[text]] %>\n\t\t\t<$button actions=<<delete-tag-state-tiddlers>> class=\"tc-btn-invisible tc-small-gap tc-btn-dropdown\"\n\t\t\t\ttooltip={{$:/language/EditTemplate/Tags/ClearInput/Hint}} aria-label={{$:/language/EditTemplate/Tags/ClearInput/Caption}}\n\t\t\t>\n\t\t\t\t{{$:/core/images/close-button}}\n\t\t\t</$button>\n\t\t<%endif%>\n\t\t<span class=\"tc-add-tag-button tc-small-gap-left\">\n\t\t\t<$let tag=<<_tf.getTag>>>\n\t\t\t\t<$button set=<<newTagNameTiddler>> actions=<<add-button-actions>> >\n\t\t\t\t\t{{$:/language/EditTemplate/Tags/Add/Button}}\n\t\t\t\t</$button>\n\t\t\t</$let>\n\t\t</span>\n\t</div>\n\t<div class=\"tc-block-dropdown-wrapper\">\n\t\t<%if [<tf.tagpicker-dropdown-id>has[text]] %>\n\t\t\t<div class=\"tc-block-dropdown tc-block-tags-dropdown\">\n\t\t\t\t<$transclude $variable=\"tag-picker-listTags\" filter=<<nonSystemTagsFilter>> suffix=\"-primaryList\" empty={{$:/language/EditTemplate/Tags/EmptyMessage}}/>\n\t\t\t\t<hr>\n\t\t\t\t<$transclude $variable=\"tag-picker-listTags\" filter=<<systemTagsFilter>> suffix=\"-secondaryList\" empty={{$:/language/EditTemplate/Tags/EmptyMessage/System}}/>\n\t\t\t</div>\n\t\t<%endif%>\n\t</div>\n</div>\n\\end\n\n<!-- prepare all variables for tag-picker keyboard handling -->\n\\procedure tag-picker(actions, tagField:\"tags\", tiddler, tagListFilter:\"[tags[]sort[]]\")\n\n\\function _tf.getUserInput() [<storeTitle>get[text]]\n\\function _tf.getTag() [<newTagNameTiddler>get[text]]\n<!-- Use this function if tag-picker is a stand alone macro. Otherwise use \"newTagNameTiddler\" defined for fieldmangler in EditTemplate -->\n\\function _tf.makeTagNameTiddler() [[$:/temp/NewTagName]] [<tagField>!match[tags]] :and[join[/]] [<qualify>] :and[join[]]\n\n<!-- keep those variables because they may \"bleed\" into macros using old syntax -->\n<!-- \"nonSystemTagsFilter\", \"systemTagsFilter\" __need to be the same__ as fields: \"first-search-filter\", \"second-search-filter\" -->\n<$let\n\tpalette={{$:/palette}}\n\tcolourA={{{ [<palette>getindex[foreground]] }}}\n\tcolourB={{{ [<palette>getindex[background]] }}}\n\tfallbackTarget={{{ [<palette>getindex[tag-background]] }}}\n\n\tsaveTiddler={{{ [<tiddler>is[blank]then<currentTiddler>else<tiddler>] }}}\n\n\tnewTagNameTiddler={{{ [[newTagNameTiddler]is[variable]then<newTagNameTiddler>] :else[<_tf.makeTagNameTiddler>] }}}\n\tstoreTitle={{{ [[$:/temp/NewTagName/input]] [<tagField>!match[tags]] :and[join[/]] [<qualify>] :and[join[]] }}}\n\n\tnewTagNameSelectionTiddlerQualified=<<qualify \"$:/temp/NewTagName/selected-item\">>\n\ttagSelectionState={{{ [<newTagNameSelectionTiddler>!match[]] :else[<newTagNameSelectionTiddlerQualified>] }}}\n\n\trefreshTitle=<<qualify \"$:/temp/NewTagName/refresh\">>\n\n\tnonSystemTagsFilter=\"[subfilter<tagListFilter>!is[system]search:title<userInput>]\"\n\tsystemTagsFilter=\"[subfilter<tagListFilter>is[system]search:title<userInput>]\"\n\n\tcancelPopups=\"yes\"\n>\n\t<$transclude $variable=\"tag-picker-inner\"/>\n</$let>\n\\end\n"},"$:/core/macros/tag":{"title":"$:/core/macros/tag","tags":"$:/tags/Macro","text":"\\define tag-pill-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n<!-- This has no whitespace trim to avoid modifying $actions$ -->\n\\define tag-pill-inner(tag,icon,colour,fallbackTarget,colourA,colourB,element-tag,element-attributes,actions)\n\\whitespace trim\n<$let\n\tforegroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">>\n\tbackgroundColor=<<__colour__>>\n>\n<$element-tag$\n\t$element-attributes$\n\tclass=\"tc-tag-label tc-btn-invisible\"\n\tstyle=<<tag-pill-styles>>\n>\n\t<<__actions__>>\n\t<$transclude tiddler=<<__icon__>>/>\n\t<span class={{{ [<__tag__>is[missing]then[tc-tag-missing]else[tc-tag-exists]] }}}>\n\t\t<$view tiddler=<<__tag__>> field=\"title\" format=\"text\" />\n\t</span>\n</$element-tag$>\n</$let>\n\\end\n\n\\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)\n\\whitespace trim\n<$macrocall $name=\"tag-pill-inner\"\n\ttag=<<__tag__>>\n\ticon=<<__icon__>>\n\tcolour=<<__colour__>>\n\tfallbackTarget={{$palette$##tag-background}}\n\tcolourA={{$palette$##foreground}}\n\tcolourB={{$palette$##background}}\n\telement-tag=<<__element-tag__>>\n\telement-attributes=<<__element-attributes__>>\n\tactions=<<__actions__>>\n/>\n\\end\n\n\\define tag-pill(tag,element-tag:\"span\",element-attributes:\"\",actions:\"\")\n\\whitespace trim\n<span class=\"tc-tag-list-item\" data-tag-title=<<__tag__>>>\n\t<$let currentTiddler=<<__tag__>>>\n\t\t<$macrocall $name=\"tag-pill-body\"\n\t\t\ttag=<<__tag__>>\n\t\t\ticon={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}}\n\t\t\tcolour={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}\n\t\t\tpalette={{$:/palette}}\n\t\t\telement-tag=<<__element-tag__>>\n\t\t\telement-attributes=<<__element-attributes__>>\n\t\t\tactions=<<__actions__>>/>\n\t</$let>\n</span>\n\\end\n\n\\define tag(tag)\n{{$tag$||$:/core/ui/TagTemplate}}\n\\end\n"},"$:/core/macros/testcase":{"title":"$:/core/macros/testcase","tags":"$:/tags/Macro","text":"\\whitespace trim\n\n\\procedure testcase(tiddler)\n<$tiddler tiddler=<<tiddler>>>\n<$transclude $tiddler=\"$:/core/ui/TestCaseTemplate\">\n</$tiddler>\n\\end\n"},"$:/core/macros/thumbnails":{"title":"$:/core/macros/thumbnails","tags":"$:/tags/Macro","text":"<!-- This macro does not use \\whitespace trim because it could affect the caption -->\n\\define thumbnail(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<$link to=\"\"\"$link$\"\"\"><div class=\"tc-thumbnail-wrapper\"\n><div\n\tclass=\"tc-thumbnail-image\"\n\tstyle=\"width:$width$px;height:$height$px;\"><$reveal\n\ttype=\"nomatch\"\n\ttext=\"\"\n\tdefault=\"\"\"$image$\"\"\"\n\ttag=\"div\"\n\tstyle=\"width:$width$px;height:$height$px;\"\n>[img[$image$]]</$reveal><$reveal\n\ttype=\"match\"\n\ttext=\"\"\n\tdefault=\"\"\"$image$\"\"\"\n\ttag=\"div\"\n\tclass=\"tc-thumbnail-background\"\n\tstyle=\"width:$width$px;height:$height$px;background-color:$background-color$;\"\n></$reveal></div><div\n\tclass=\"tc-thumbnail-icon\"\n\tstyle=\"fill:$color$;color:$color$;\"\n>$icon$</div><div class=\"tc-thumbnail-caption\">$caption$</div></div></$link>\n\\end\n\n\\define thumbnail-right(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<div class=\"tc-thumbnail-right-wrapper\"><<thumbnail \"\"\"$link$\"\"\" \"\"\"$icon$\"\"\" \"\"\"$color$\"\"\" \"\"\"$background-color$\"\"\" \"\"\"$image$\"\"\" \"\"\"$caption$\"\"\" \"\"\"$width$\"\"\" \"\"\"$height$\"\"\">></div>\n\\end\n\n\\define list-thumbnails(filter,width:\"280\",height:\"157\")\n<$list filter=\"\"\"$filter$\"\"\"><$macrocall $name=\"thumbnail\" link={{!!link}} icon={{!!icon}} color={{!!color}} background-color={{!!background-color}} image={{!!image}} caption={{!!caption}} width=\"\"\"$width$\"\"\" height=\"\"\"$height$\"\"\"/></$list>\n\\end\n"},"$:/core/macros/timeline":{"title":"$:/core/macros/timeline","tags":"$:/tags/Macro","text":"<!-- Override one or both of the following two macros with a global or local macro of the same name \nif you need to change how titles are displayed on a timeline -->\n\n\\procedure timeline-title() <$view field=\"title\"/>\n\\procedure timeline-link() <$link to={{!!title}}><<timeline-title>></$link>\n\\procedure timeline(limit:\"100\",format:\"DDth MMM YYYY\",subfilter:\"\",dateField:\"modified\")\n\\whitespace trim\n<div class=\"tc-timeline\">\n<$set name=\"tv-tids\" filter=`[!is[system]$(subfilter)$has<dateField>!sort<dateField>limit<limit>]`>\n<$list filter=\"[enlist<tv-tids>eachday<dateField>]\">\n<div class=\"tc-menu-list-item\">\n<$view field=<<dateField>> format=\"date\" template=<<format>>/>\n<$list filter=`[enlist<tv-tids>sameday:$(dateField)${!!$(dateField)$}]`>\n<div class=\"tc-menu-list-subitem\">\n<<timeline-link>>\n</div>\n</$list>\n</div>\n</$list>\n</$set>\n</div>\n\\end\n"},"$:/core/macros/toc":{"title":"$:/core/macros/toc","tags":"$:/tags/Macro","text":"\n\\define toc-open-icon() $:/core/images/down-arrow\n\\define toc-closed-icon() $:/core/images/right-arrow\n\n\\define toc-caption()\n\\whitespace trim\n<span class=\"tc-toc-caption tc-tiny-gap-left\">\n<$set name=\"tv-wikilinks\" value=\"no\">\n  <$transclude field=\"caption\">\n    <$view field=\"title\"/>\n  </$transclude>\n</$set>\n</span>\n\\end\n\n\\define toc-body(tag,sort:\"\",itemClassFilter,exclude,path)\n\\whitespace trim\n<ol class=\"tc-toc\">\n  <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[subfilter<__exclude__>]\"\"\">\n    <$let item=<<currentTiddler>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n      <$set name=\"excluded\" filter=\"[subfilter<__exclude__>] [<__tag__>]\">\n        <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n          <li class=<<toc-item-class>>>\n            <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}><<toc-caption>></$link>\">\n              <<toc-caption>>\n            </$list>\n            <$macrocall $name=\"toc-body\" tag=<<item>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n          </li>\n        </$set>\n      </$set>\n    </$let>\n  </$list>\n</ol>\n\\end\n\n\\define toc(tag,sort:\"\",itemClassFilter:\"\", exclude)\n\\whitespace trim\n<$let __tag__={{{ [<__tag__>is[blank]then<currentTiddler>else<__tag__>] }}} >\n  <$macrocall $name=\"toc-body\"  tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>>/>\n</$let>\n\\end\n\n\\define toc-linked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n\\whitespace trim\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n    <li class=<<toc-item-class>>>\n    <$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>\n      <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n          <$transclude tiddler=<<toc-closed-icon>> />\n        </$button>\n      </$reveal>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n          <$transclude tiddler=<<toc-open-icon>> />\n        </$button>\n      </$reveal>\n      <<toc-caption>>\n    </$link>\n    <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n      <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n    </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n\\whitespace trim\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n    <li class=<<toc-item-class>>>\n      <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n        <$transclude tiddler=<<toc-closed-icon>> />\n          <<toc-caption>>\n        </$button>\n      </$reveal>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n          <$transclude tiddler=<<toc-open-icon>> />\n          <<toc-caption>>\n        </$button>\n      </$reveal>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n      </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-expandable-empty-message()\n<$macrocall $name=\"toc-linked-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-expandable(tag,sort:\"\",itemClassFilter:\"\",exclude,path)\n\\whitespace trim\n<$let __tag__={{{ [<__tag__>is[blank]then<currentTiddler>else<__tag__>] }}} tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n  <$set name=\"excluded\" filter=\"[subfilter<__exclude__>] [<__tag__>]\">\n    <ol class=\"tc-toc toc-expandable\">\n      <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[subfilter<__exclude__>]\"\"\">\n        <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=<<toc-expandable-empty-message>> >\n          <$macrocall $name=\"toc-unlinked-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"\"\"itemClassFilter\"\"\" exclude=<<excluded>> path=<<path>> />\n        </$list>\n      </$list>\n    </ol>\n  </$set>\n</$let>\n\\end\n\n\\define toc-linked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n\\whitespace trim\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\" >\n    <li class=<<toc-item-class>>>\n      <$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>\n          <$list filter=\"[all[current]tagging[]$sort$limit[1]]  -[subfilter<__exclude__>]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>\">\n          <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n            <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n            <$transclude tiddler=<<toc-closed-icon>> />\n            </$button>\n          </$reveal>\n          <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n            <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n              <$transclude tiddler=<<toc-open-icon>> />\n            </$button>\n          </$reveal>\n        </$list>\n        <<toc-caption>>\n      </$link>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n      </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n\\whitespace trim\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n    <li class=<<toc-item-class>>>\n      <$list filter=\"[all[current]tagging[]$sort$limit[1]] -[subfilter<__exclude__>]\" variable=\"ignore\" emptyMessage=\"\"\"<$button class=\"tc-btn-invisible\">{{$:/core/images/blank}}</$button><span class=\"toc-item-muted\"><<toc-caption>></span>\"\"\">\n        <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n          <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n            <$transclude tiddler=<<toc-closed-icon>> />\n            <<toc-caption>>\n          </$button>\n        </$reveal>\n        <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n          <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n            <$transclude tiddler=<<toc-open-icon>> />\n            <<toc-caption>>\n          </$button>\n        </$reveal>\n      </$list>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n      </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-selective-expandable-empty-message()\n<$macrocall $name=\"toc-linked-selective-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-selective-expandable(tag,sort:\"\",itemClassFilter,exclude,path)\n\\whitespace trim\n<$let __tag__={{{ [<__tag__>is[blank]then<currentTiddler>else<__tag__>] }}} tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n  <$set name=\"excluded\" filter=\"[subfilter<__exclude__>] [<__tag__>]\">\n    <ol class=\"tc-toc toc-selective-expandable\">\n      <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[subfilter<__exclude__>]\"\"\">\n        <$list filter=\"[all[current]toc-link[no]]\" variable=\"ignore\" emptyMessage=<<toc-selective-expandable-empty-message>> >\n          <$macrocall $name=\"toc-unlinked-selective-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n        </$list>\n      </$list>\n    </ol>\n  </$set>\n</$let>\n\\end\n\n\\define toc-tabbed-external-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\",exclude)\n\\whitespace trim\n<$let __tag__={{{ [<__tag__>is[blank]then<currentTiddler>else<__tag__>] }}}>\n  <$tiddler tiddler={{{ [<__selectedTiddler__>get[text]] }}}>\n    <div class=\"tc-tabbed-table-of-contents\">\n      <$linkcatcher to=<<__selectedTiddler__>>>\n        <div class=\"tc-table-of-contents\">\n          <$macrocall $name=\"toc-selective-expandable\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"[all[current]] -[<__selectedTiddler__>get[text]]\" exclude=<<__exclude__>>/>\n        </div>\n      </$linkcatcher>\n      <div class=\"tc-tabbed-table-of-contents-content\">\n        <$reveal stateTitle=<<__selectedTiddler__>> type=\"nomatch\" text=\"\">\n          <$transclude mode=\"block\" tiddler=<<__template__>>>\n            <h1><<toc-caption>></h1>\n            <$transclude mode=\"block\">$missingText$</$transclude>\n          </$transclude>\n        </$reveal>\n        <$reveal stateTitle=<<__selectedTiddler__>> type=\"match\" text=\"\">\n          $unselectedText$\n        </$reveal>\n      </div>\n    </div>\n  </$tiddler>\n</$let>\n\\end\n\n\\define toc-tabbed-internal-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\",exclude)\n\\whitespace trim\n<$let __tag__={{{ [<__tag__>is[blank]then<currentTiddler>else<__tag__>] }}}>\n  <$linkcatcher to=<<__selectedTiddler__>>>\n    <$macrocall $name=\"toc-tabbed-external-nav\" tag=<<__tag__>> sort=<<__sort__>> selectedTiddler=<<__selectedTiddler__>> unselectedText=<<__unselectedText__>> missingText=<<__missingText__>> template=<<__template__>> exclude=<<__exclude__>> />\n  </$linkcatcher>\n</$let>\n\\end\n"},"$:/core/macros/translink":{"title":"$:/core/macros/translink","tags":"$:/tags/Macro","text":"\\define translink(title,mode:\"block\")\n\\whitespace trim\n<$list filter=\"[<__mode__>match[block]]\">\n<div class=\"tc-translink\">\n<div>\n<$link to=\"\"\"$title$\"\"\">\n<h1><$text text=\"\"\"$title$\"\"\"/></h1>\n</$link>\n<$transclude tiddler=\"\"\"$title$\"\"\" mode=\"block\">\n<$set name=\"currentTiddler\" value=\"\"\"$title$\"\"\"><$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/></$set>\n</$transclude>\n</div>\n</div>\n</$list>\n<$list filter=\"[<__mode__>match[inline]]\">\n<span class=\"tc-translink\">\n<$link to=\"\"\"$title$\"\"\">\n<$text text=\"\"\"$title$\"\"\"/>\n</$link>\n&#32;(<$transclude tiddler=\"\"\"$title$\"\"\" mode=\"inline\">\n<$set name=\"currentTiddler\" value=\"\"\"$title$\"\"\"><$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/></$set>\n</$transclude>)\n</span>\n</$list>\n\\end\n"},"$:/core/macros/tree":{"title":"$:/core/macros/tree","tags":"$:/tags/Macro","text":"\\define leaf-link(full-title,chunk,separator: \"/\")\n<$link to=<<__full-title__>>><$text text=<<__chunk__>>/></$link>\n\\end\n\n\\define leaf-node(prefix,chunk)\n\\whitespace trim\n<li>\n<$list filter=\"[<__prefix__>addsuffix<__chunk__>is[shadow]] [<__prefix__>addsuffix<__chunk__>is[tiddler]]\" variable=\"full-title\">\n<$list filter=\"[<full-title>removeprefix<__prefix__>]\" variable=\"chunk\">\n<span>{{$:/core/images/file}}</span>&#32;<$macrocall $name=\"leaf-link\" full-title=<<full-title>> chunk=<<chunk>>/>\n</$list>\n</$list>\n</li>\n\\end\n\n\\define branch-node(prefix,chunk,separator: \"/\")\n\\whitespace trim\n<li>\n<$set name=\"reveal-state\" value={{{ [[$:/state/tree/]addsuffix<__prefix__>addsuffix<__chunk__>] }}}>\n<$reveal type=\"nomatch\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"show\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}}&#32;<$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"hide\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}}&#32;<$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n&#32;\n<span>(<$count filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>removeprefix<__chunk__>] -[<__prefix__>addsuffix<__chunk__>]\"/>)</span>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$macrocall $name=\"tree-node\" prefix={{{ [<__prefix__>addsuffix<__chunk__>] }}} separator=<<__separator__>>/>\n</$reveal>\n</$set>\n</li>\n\\end\n\n\\define tree-node(prefix,separator: \"/\")\n\\whitespace trim\n<ol>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]!suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"leaf-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"branch-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n</ol>\n\\end\n\n\\define tree(prefix: \"$:/\",separator: \"/\")\n\\whitespace trim\n<div class=\"tc-tree\">\n<span><$text text=<<__prefix__>>/></span>\n<div>\n<$macrocall $name=\"tree-node\" prefix=<<__prefix__>> separator=<<__separator__>>/>\n</div>\n</div>\n\\end\n"},"$:/core/macros/utils":{"title":"$:/core/macros/utils","text":"\\define colour(colour)\n$colour$\n\\end\n"},"$:/snippets/minifocusswitcher":{"title":"$:/snippets/minifocusswitcher","text":"\\whitespace trim\n<$select tiddler=\"$:/config/AutoFocus\">\n<$list filter=\"title tags text type fields\">\n<option value=<<currentTiddler>>><<currentTiddler>></option>\n</$list>\n</$select>\n"},"$:/snippets/minilanguageswitcher":{"title":"$:/snippets/minilanguageswitcher","text":"\\whitespace trim\n<$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>"},"$:/snippets/minithemeswitcher":{"title":"$:/snippets/minithemeswitcher","text":"\\define lingo-base() $:/language/ControlPanel/Theme/\n\\whitespace trim\n<<lingo Prompt>>&#32;<$select tiddler=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"name\"><$view field=\"title\"/></$view></option>\n</$list>\n</$select>"},"$:/snippets/modules":{"title":"$:/snippets/modules","text":"\\define describeModuleType(type)\n{{$:/language/Docs/ModuleTypes/$type$}}\n\\end\n\\whitespace trim\n<$list filter=\"[moduletypes[]]\">\n\n!! <$macrocall $name=\"currentTiddler\" $type=\"text/plain\" $output=\"text/plain\"/>\n\n<$macrocall $name=\"describeModuleType\" type=<<currentTiddler>>/>\n\n<ul><$list filter=\"[all[current]modules[]]\"><li><$link><<currentTiddler>></$link>\n</li>\n</$list>\n</ul>\n</$list>\n"},"$:/palette":{"title":"$:/palette","text":"$:/palettes/Vanilla"},"$:/snippets/paletteeditor":{"title":"$:/snippets/paletteeditor","text":"<$transclude tiddler=\"$:/PaletteManager\"/>\n"},"$:/snippets/palettepreview":{"title":"$:/snippets/palettepreview","text":"\\whitespace trim\n<$set name=\"currentTiddler\" value={{$:/palette}}>\n{{||$:/snippets/currpalettepreview}}\n</$set>\n"},"$:/snippets/paletteswitcher":{"title":"$:/snippets/paletteswitcher","text":"\\whitespace trim\n<$linkcatcher to=\"$:/palette\">\n<div class=\"tc-chooser\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[name]]\">\n<$set name=\"cls\" filter=\"[all[current]prefix{$:/palette}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\">\n<div class=<<cls>>>\n<$link to={{!!title}}>\n''<$view field=\"name\" format=\"text\"/>''\n&#32;-&#32;\n<$view field=\"description\" format=\"text\"/>\n{{||$:/snippets/currpalettepreview}}\n</$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>\n"},"$:/snippets/peek-stylesheets":{"title":"$:/snippets/peek-stylesheets","text":"\\define expandable-stylesheets-list()\n\\whitespace trim\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$vars state=<<qualify \"$:/state/peek-stylesheets/open/\">>>\n<$set name=\"state\" value={{{ [<state>addsuffix<currentTiddler>] }}}>\n<li>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"no\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"yes\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"div\">\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<$codeblock code=<<styles>> language=\"css\"/>\n</$wikify>\n</$set>\n</$reveal>\n</li>\n</$set>\n</$vars>\n</$list>\n</ol>\n\\end\n\n\\define stylesheets-list()\n\\whitespace trim\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<li>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</li>\n</$list>\n</ol>\n\\end\n\\whitespace trim\n\n<$vars modeState=<<qualify \"$:/state/peek-stylesheets/mode/\">>>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"expanded\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Stylesheets/Expand/Caption}}</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"restored\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}} {{$:/language/ControlPanel/Stylesheets/Restore/Caption}}</$button>\n</$reveal>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<expandable-stylesheets-list>>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<stylesheets-list>>\n</$reveal>\n\n</$vars>\n"},"$:/temp/search":{"title":"$:/temp/search","text":""},"$:/tags/AdvancedSearch":{"title":"$:/tags/AdvancedSearch","list":"[[$:/core/ui/AdvancedSearch/Standard]] [[$:/core/ui/AdvancedSearch/System]] [[$:/core/ui/AdvancedSearch/Shadows]] [[$:/core/ui/AdvancedSearch/Filter]]"},"$:/tags/AdvancedSearch/FilterButton":{"title":"$:/tags/AdvancedSearch/FilterButton","list":"$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown $:/core/ui/AdvancedSearch/Filter/FilterButtons/clear $:/core/ui/AdvancedSearch/Filter/FilterButtons/export $:/core/ui/AdvancedSearch/Filter/FilterButtons/delete"},"$:/tags/ControlPanel":{"title":"$:/tags/ControlPanel","list":"$:/core/ui/ControlPanel/Info $:/core/ui/ControlPanel/Appearance $:/core/ui/ControlPanel/Settings $:/core/ui/ControlPanel/Saving $:/core/ui/ControlPanel/Plugins $:/core/ui/ControlPanel/Tools $:/core/ui/ControlPanel/Internals"},"$:/tags/ControlPanel/Info":{"title":"$:/tags/ControlPanel/Info","list":"$:/core/ui/ControlPanel/Basics $:/core/ui/ControlPanel/Advanced"},"$:/tags/ControlPanel/Plugins":{"title":"$:/tags/ControlPanel/Plugins","list":"$:/core/ui/ControlPanel/Plugins/Installed/Plugins $:/core/ui/ControlPanel/Plugins/Installed/Themes $:/core/ui/ControlPanel/Plugins/Installed/Languages"},"$:/tags/EditTemplate":{"title":"$:/tags/EditTemplate","list":"[[$:/core/ui/EditTemplate/controls]] [[$:/core/ui/EditTemplate/title]] [[$:/core/ui/EditTemplate/tags]] [[$:/core/ui/EditTemplate/shadow]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/EditTemplate/body]] [[$:/core/ui/EditTemplate/type]] [[$:/core/ui/EditTemplate/fields]]"},"$:/tags/EditTemplateBodyFilter":{"title":"$:/tags/EditTemplateBodyFilter","list":"$:/config/EditTemplateBodyFilters/canonical-uri $:/config/EditTemplateBodyFilters/default"},"$:/tags/EditToolbar":{"title":"$:/tags/EditToolbar","list":"[[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/cancel]] [[$:/core/ui/Buttons/save]]"},"$:/tags/EditorToolbar":{"title":"$:/tags/EditorToolbar","list":"$:/core/ui/EditorToolbar/paint $:/core/ui/EditorToolbar/opacity $:/core/ui/EditorToolbar/line-width $:/core/ui/EditorToolbar/rotate-left $:/core/ui/EditorToolbar/clear $:/core/ui/EditorToolbar/bold $:/core/ui/EditorToolbar/italic $:/core/ui/EditorToolbar/strikethrough $:/core/ui/EditorToolbar/underline $:/core/ui/EditorToolbar/superscript $:/core/ui/EditorToolbar/subscript $:/core/ui/EditorToolbar/mono-line $:/core/ui/EditorToolbar/mono-block $:/core/ui/EditorToolbar/quote $:/core/ui/EditorToolbar/list-bullet $:/core/ui/EditorToolbar/list-number $:/core/ui/EditorToolbar/heading-1 $:/core/ui/EditorToolbar/heading-2 $:/core/ui/EditorToolbar/heading-3 $:/core/ui/EditorToolbar/heading-4 $:/core/ui/EditorToolbar/heading-5 $:/core/ui/EditorToolbar/heading-6 $:/core/ui/EditorToolbar/link $:/core/ui/EditorToolbar/excise $:/core/ui/EditorToolbar/picture $:/core/ui/EditorToolbar/stamp $:/core/ui/EditorToolbar/size $:/core/ui/EditorToolbar/editor-height $:/core/ui/EditorToolbar/more $:/core/ui/EditorToolbar/preview $:/core/ui/EditorToolbar/preview-type"},"$:/tags/Manager/ItemMain":{"title":"$:/tags/Manager/ItemMain","list":"$:/Manager/ItemMain/WikifiedText $:/Manager/ItemMain/RawText $:/Manager/ItemMain/Fields"},"$:/tags/Manager/ItemSidebar":{"title":"$:/tags/Manager/ItemSidebar","list":"$:/Manager/ItemSidebar/Tags $:/Manager/ItemSidebar/Colour $:/Manager/ItemSidebar/Icon $:/Manager/ItemSidebar/Tools"},"$:/tags/MoreSideBar":{"title":"$:/tags/MoreSideBar","list":"[[$:/core/ui/MoreSideBar/All]] [[$:/core/ui/MoreSideBar/Recent]] [[$:/core/ui/MoreSideBar/Tags]] [[$:/core/ui/MoreSideBar/Missing]] [[$:/core/ui/MoreSideBar/Drafts]] [[$:/core/ui/MoreSideBar/Orphans]] [[$:/core/ui/MoreSideBar/Types]] [[$:/core/ui/MoreSideBar/System]] [[$:/core/ui/MoreSideBar/Shadows]] [[$:/core/ui/MoreSideBar/Explorer]] [[$:/core/ui/MoreSideBar/Plugins]]","text":""},"$:/tags/PageControls":{"title":"$:/tags/PageControls","list":"[[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/fold-all]] [[$:/core/ui/Buttons/unfold-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/new-image]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/manager]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/palette]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/layout]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/timestamp]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/print]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/network-activity]] [[$:/core/ui/Buttons/more-page-actions]]"},"$:/tags/PageTemplate":{"title":"$:/tags/PageTemplate","list":"[[$:/core/ui/PageTemplate/topleftbar]] [[$:/core/ui/PageTemplate/toprightbar]] [[$:/core/ui/PageTemplate/sidebar]] [[$:/core/ui/PageTemplate/story]] [[$:/core/ui/PageTemplate/alerts]]","text":""},"$:/tags/PluginLibrary":{"title":"$:/tags/PluginLibrary","list":"$:/config/OfficialPluginLibrary"},"$:/tags/SideBar":{"title":"$:/tags/SideBar","list":"[[$:/core/ui/SideBar/Open]] [[$:/core/ui/SideBar/Recent]] [[$:/core/ui/SideBar/Tools]] [[$:/core/ui/SideBar/More]]","text":""},"$:/tags/SideBarSegment":{"title":"$:/tags/SideBarSegment","list":"[[$:/core/ui/SideBarSegments/site-title]] [[$:/core/ui/SideBarSegments/site-subtitle]] [[$:/core/ui/SideBarSegments/page-controls]] [[$:/core/ui/SideBarSegments/search]] [[$:/core/ui/SideBarSegments/tabs]]"},"$:/tags/StoryTiddlerTemplateFilter":{"title":"$:/tags/StoryTiddlerTemplateFilter","list":"$:/config/StoryTiddlerTemplateFilters/draft $:/config/StoryTiddlerTemplateFilters/default"},"$:/tags/TestCase/Actions":{"title":"$:/tags/TestCase/Actions","list":""},"$:/tags/TextEditor/Snippet":{"title":"$:/tags/TextEditor/Snippet","list":"$:/language/Snippets/ProcedureDefinition $:/language/Snippets/FunctionDefinition $:/language/Snippets/ListByTag $:/language/Snippets/Table4x3 $:/language/Snippets/TableOfContents $:/language/Snippets/MacroDefinition"},"$:/tags/TiddlerColourFilter":{"title":"$:/tags/TiddlerColourFilter","list":"$:/config/TiddlerColourFilters/color-field $:/config/TiddlerColourFilters/default","text":""},"$:/tags/TiddlerIconFilter":{"title":"$:/tags/TiddlerIconFilter","list":"$:/config/TiddlerIconFilters/icon-field $:/config/TiddlerIconFilters/default","text":""},"$:/tags/TiddlerInfo":{"title":"$:/tags/TiddlerInfo","list":"[[$:/core/ui/TiddlerInfo/Tools]] [[$:/core/ui/TiddlerInfo/References]] [[$:/core/ui/TiddlerInfo/Tagging]] [[$:/core/ui/TiddlerInfo/List]] [[$:/core/ui/TiddlerInfo/Listed]] [[$:/core/ui/TiddlerInfo/Fields]]","text":""},"$:/tags/TiddlerInfo/Advanced":{"title":"$:/tags/TiddlerInfo/Advanced","list":"[[$:/core/ui/TiddlerInfo/Advanced/ShadowInfo]] [[$:/core/ui/TiddlerInfo/Advanced/PluginInfo]]"},"$:/tags/ViewTemplate":{"title":"$:/tags/ViewTemplate","list":"[[$:/core/ui/ViewTemplate/title]] [[$:/core/ui/ViewTemplate/unfold]] [[$:/core/ui/ViewTemplate/subtitle]] [[$:/core/ui/ViewTemplate/tags]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/ViewTemplate/body]] [[$:/core/ui/ViewTemplate/lazy-loading]]"},"$:/tags/ViewTemplateBodyFilter":{"title":"$:/tags/ViewTemplateBodyFilter","list":"$:/config/ViewTemplateBodyFilters/testcase $:/config/ViewTemplateBodyFilters/hide-body $:/config/ViewTemplateBodyFilters/code-body $:/config/ViewTemplateBodyFilters/stylesheet $:/config/ViewTemplateBodyFilters/core-ui-advanced-search $:/config/ViewTemplateBodyFilters/core-ui-tags $:/config/ViewTemplateBodyFilters/import $:/config/ViewTemplateBodyFilters/plugin $:/config/ViewTemplateBodyFilters/system $:/config/ViewTemplateBodyFilters/default"},"$:/tags/ViewTemplate/Subtitle":{"title":"$:/tags/ViewTemplate/Subtitle","list":"$:/core/ui/ViewTemplate/subtitle/modifier $:/core/ui/ViewTemplate/subtitle/modified"},"$:/tags/ViewTemplateTitleFilter":{"title":"$:/tags/ViewTemplateTitleFilter","list":"$:/config/ViewTemplateTitleFilters/system $:/config/ViewTemplateTitleFilters/default","text":""},"$:/tags/ViewToolbar":{"title":"$:/tags/ViewToolbar","list":"[[$:/core/ui/Buttons/more-tiddler-actions]] [[$:/core/ui/Buttons/info]] [[$:/core/ui/Buttons/new-here]] [[$:/core/ui/Buttons/new-journal-here]] [[$:/core/ui/Buttons/clone]] [[$:/core/ui/Buttons/export-tiddler]] [[$:/core/ui/Buttons/edit]] [[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/permalink]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/open-window]] [[$:/core/ui/Buttons/close-others]] [[$:/core/ui/Buttons/close]] [[$:/core/ui/Buttons/fold-others]] [[$:/core/ui/Buttons/fold]]"},"$:/snippets/themeswitcher":{"title":"$:/snippets/themeswitcher","text":"\\whitespace trim\n<$linkcatcher to=\"$:/theme\">\n<div class=\"tc-chooser\">\n<$list filter=\"[plugin-type[theme]sort[title]]\">\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/theme}] [[$:/theme]!has[text]addsuffix[s/tiddlywiki/vanilla]field:title<currentTiddler>] +[limit[1]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\">\n<div class=<<cls>>><$link to={{!!title}}>\n''<$view field=\"name\" format=\"text\"/>''\n&#32;\n<$view field=\"description\" format=\"text\"/>\n</$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"},"$:/core/wiki/title":{"title":"$:/core/wiki/title","text":"\\whitespace trim\n{{$:/SiteTitle}}\n<$list filter=\"[{$:/SiteSubtitle}trim[]minlength[1]]\" variable=\"ignore\">\n&#32;---&#32;{{$:/SiteSubtitle}}\n</$list>"},"$:/view":{"title":"$:/view","text":"classic"},"$:/snippets/viewswitcher":{"title":"$:/snippets/viewswitcher","text":"\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n\\whitespace trim\n<$linkcatcher to=\"$:/view\">\n<div class=\"tc-chooser tc-viewswitcher\">\n<$list filter=\"[storyviews[]]\" variable=\"storyview\">\n<$set name=\"cls\" filter=\"[<storyview>prefix{$:/view}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$button tag=\"a\" class=\"tc-tiddlylink tc-btn-invisible\" to=<<storyview>>><$transclude tiddler=<<icon>>/><$text text=<<storyview>>/></$button>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>\n"}}}
no
{"tiddlers":{"$:/config/SyncFilter":{"title":"$:/config/SyncFilter","text":"[is[tiddler]] -[[$:/StoryList]] -[[$:/HistoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[[$:/library/sjcl.js]] -[[$:/core]] -[[$:/plugins/federatial/xememex]] -[[$:/plugins/federatial/xememex/raw-markup]] -[[$:/plugins/tiddlywiki/tw2parser]] -[[$:/themes/tiddlywiki/snowwhite]] -[[$:/themes/tiddlywiki/vanilla]] -[prefix[$:/boot/]] -[prefix[$:/plugins/federatial/xememex/config/]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]]"},"$:/plugins/federatial/xememex/bag-operator.js":{"title":"$:/plugins/federatial/xememex/bag-operator.js","text":"/*\\\ntitle: $:/plugins/federatial/xememex/bag-operator.js\ntype: application/javascript\nmodule-type: filteroperator\n\nSelects those tiddlers that are stored in the bag named in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.frombag = function(source,operator,options) {\n\tvar data,title,results = [];\n\tif(operator.operand){\n\t\tsource(function(tiddler,title) {\n\t\t\ttitle = tiddler ? tiddler.fields.title : title;\n\t\t\tvar bagName = options.wiki.extractTiddlerDataItem(\"$:/state/federatial/xememex/tiddlers/bag\",title,\"\");\n\t\t\tif(bagName === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/plugins/federatial/xememex/icon":{"title":"$:/plugins/federatial/xememex/icon","tags":"$:/tags/Image","text":"<svg class=\"tc-image-xememex-plugin tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n    <path d=\"M79.7435765,9.49213757 L64.0237949,36.9372695 L48.0705582,9.08454876 L63.5596004,-1.13686838e-13 L79.7435765,9.49213757 Z M90.764123,15.9558486 L118.119201,32 L118.119201,96 L103.155698,104.776312 L71.5125369,49.0659545 L90.764123,15.9558486 Z M91.9243286,111.363674 L63.5596004,128 L35.7919091,111.713845 L64.0152972,61.3155681 L91.9243286,111.363674 Z M24.6598969,105.184758 L9,96 L9,32 L36.9468534,15.6087636 L56.5307941,49.0734527 L24.6598969,105.184758 Z\"></path>\n</svg>"},"$:/plugins/tiddlywiki/tiddlyweb/icon/cloud":{"title":"$:/plugins/tiddlywiki/tiddlyweb/icon/cloud","tags":"$:/tags/Image","text":"<svg class=\"tc-image-cloud tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><g><path d=\"M24 103C10.745 103 0 92.255 0 79c0-9.697 5.75-18.05 14.027-21.836A24.787 24.787 0 0114 56c0-13.255 10.745-24 24-24 1.373 0 2.718.115 4.028.337C48.628 24.2 58.707 19 70 19c19.882 0 36 16.118 36 36v.082c12.319 1.016 22 11.336 22 23.918 0 12.239-9.16 22.337-20.999 23.814L107 103H24z\"/><path class=\"tc-image-cloud-idle\" d=\"M57.929 84.698a6 6 0 01-8.485 0L35.302 70.556a6 6 0 118.485-8.485l9.9 9.9L81.97 43.686a6 6 0 018.485 8.486L57.929 84.698z\"/><path class=\"tc-image-cloud-progress tc-animate-rotate-slow\" d=\"M44.8 40a3.6 3.6 0 100 7.2h2.06A23.922 23.922 0 0040 64c0 13.122 10.531 23.785 23.603 23.997L64 88l.001-7.2c-9.171 0-16.626-7.348-16.798-16.477L47.2 64c0-5.165 2.331-9.786 5.999-12.868L53.2 55.6a3.6 3.6 0 107.2 0v-12a3.6 3.6 0 00-3.6-3.6h-12zM64 40v7.2c9.278 0 16.8 7.522 16.8 16.8 0 5.166-2.332 9.787-6 12.869V72.4a3.6 3.6 0 10-7.2 0v12a3.6 3.6 0 003.6 3.6h12a3.6 3.6 0 100-7.2l-2.062.001A23.922 23.922 0 0088 64c0-13.255-10.745-24-24-24z\"/></g></svg>"},"$:/plugins/tiddlywiki/tiddlyweb/save/offline":{"title":"$:/plugins/tiddlywiki/tiddlyweb/save/offline","text":"\\import [subfilter{$:/core/config/GlobalImportFilter}]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[[$:/boot/boot.css]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[[$:/plugins/tiddlywiki/filesystem]] -[[$:/plugins/tiddlywiki/tiddlyweb]] -[prefix[$:/temp/]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"},"$:/core/ui/Buttons/save-wiki":{"title":"$:/core/ui/Buttons/save-wiki","tags":"$:/tags/PageControls","caption":"{{$:/plugins/tiddlywiki/tiddlyweb/icon/cloud}} Server status","description":"Status of synchronisation with server","text":"\\whitespace trim\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/save-wiki\">> tooltip=\"Status of synchronisation with server\" aria-label=\"Server status\" class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<span class=\"tc-dirty-indicator\">\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/plugins/tiddlywiki/tiddlyweb/icon/cloud}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\"><$text text=\"Server status\"/></span>\n<%endif%>\n</span>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/save-wiki\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SyncerDropdown]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n</$list>\n</div>\n</$reveal>\n"},"$:/config/SaveWikiButton/Template":{"title":"$:/config/SaveWikiButton/Template","text":"$:/plugins/federatial/xememex/save/offline"},"$:/plugins/tiddlywiki/tiddlyweb/styles":{"title":"$:/plugins/tiddlywiki/tiddlyweb/styles","tags":"[[$:/tags/Stylesheet]]","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\nbody.tc-dirty span.tc-dirty-indicator svg {\n\ttransition: fill 250ms ease-in-out;\n}\n\nbody .tc-image-cloud-idle {\n\tfill: <<colour background>>;\n\ttransition: opacity 250ms ease-in-out;\n\topacity: 1;\n\tdisplay: unset;\n}\n\nbody.tc-dirty .tc-image-cloud-idle {\n\topacity: 0;\n\tdisplay: none;\n}\n\nbody .tc-image-cloud-progress {\n\ttransition: opacity 250ms ease-in-out;\n\ttransform-origin: 50% 50%;\n\ttransform: rotate(359deg);\n\tanimation: animation-rotate-slow 2s infinite linear;\n\tfill: <<colour background>>;\n\tdisplay: none;\n\topacity: 0;\n}\n\nbody.tc-dirty .tc-image-cloud-progress {\n\topacity: 1;\n\tdisplay: unset;\n}\n\n@keyframes animation-rotate-slow {\n\tfrom {\n\t\ttransform: rotate(0deg);\n\t}\n\tto {\n\t\ttransform: scale(359deg);\n\t}\n}\n"},"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/copy-logs":{"title":"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/copy-logs","tags":"$:/tags/SyncerDropdown","text":"<$button message=\"tm-copy-syncer-logs-to-clipboard\" class=\"tc-btn-invisible\">\n{{$:/core/images/copy-clipboard}} Copy syncer logs to clipboard\n</$button>\n"},"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login-status":{"title":"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login-status","tags":"$:/tags/SyncerDropdown","text":"<$reveal state=\"$:/status/IsLoggedIn\" type=\"match\" text=\"yes\">\n<div class=\"tc-drop-down-info\">\nYou are logged in<$reveal state=\"$:/status/UserName\" type=\"nomatch\" text=\"\" default=\"\"> as <strong><$text text={{$:/status/UserName}}/></strong></$reveal><$reveal state=\"$:/status/IsReadOnly\" type=\"match\" text=\"yes\" default=\"no\"> (read-only)</$reveal>\n</div>\n<hr/>\n</$reveal>\n"},"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login":{"title":"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login","tags":"$:/tags/SyncerDropdown","text":"<$reveal state=\"$:/status/IsLoggedIn\" type=\"nomatch\" text=\"yes\">\n<$button message=\"tm-login\" class=\"tc-btn-invisible\">\n{{$:/core/images/unlocked-padlock}} Login\n</$button>\n</$reveal>\n"},"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/logout":{"title":"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/logout","tags":"$:/tags/SyncerDropdown","text":"<$reveal state=\"$:/status/IsLoggedIn\" type=\"match\" text=\"yes\">\n<$button message=\"tm-logout\" class=\"tc-btn-invisible\">\n{{$:/core/images/cancel-button}} Logout\n</$button>\n</$reveal>\n"},"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/refresh":{"title":"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/refresh","tags":"$:/tags/SyncerDropdown","text":"<$reveal state=\"$:/status/IsLoggedIn\" type=\"match\" text=\"yes\">\n<$button tooltip=\"Get latest changes from the server\" aria-label=\"Refresh from server\" class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-server-refresh\"/>\n{{$:/core/images/refresh-button}}<span class=\"tc-btn-text\"><$text text=\"Get latest changes from the server\"/></span>\n</$button>\n</$reveal>\n"},"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/save-snapshot":{"title":"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/save-snapshot","tags":"$:/tags/SyncerDropdown","text":"<$button class=\"tc-btn-invisible\">\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-download-file\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n{{$:/core/images/download-button}} Save snapshot for offline use\n</$button>\n"},"$:/tags/SyncerDropdown":{"title":"$:/tags/SyncerDropdown","list":"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login-status $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/refresh $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/logout $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/save-snapshot $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/copy-logs"},"$:/plugins/federatial/xememex/info-segment":{"title":"$:/plugins/federatial/xememex/info-segment","tags":"$:/tags/TiddlerInfoSegment","text":"<$reveal type=\"nomatch\" state=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-xememex-tiddler-info tc-subtitle\">\nBag: <$view tiddler=\"$:/state/federatial/xememex/tiddlers/bag\" index=<<currentTiddler>>>(none)</$view>\n</div>\n</$reveal>\n"},"$:/plugins/federatial/xememex/login":{"title":"$:/plugins/federatial/xememex/login","text":"<$reveal state=\"$:/status/IsLoggedIn\" type=\"nomatch\" text=\"yes\">\nLog in to Xememex: <$button message=\"tm-login\">Login</$button>\n</$reveal>\n\n<$reveal state=\"$:/status/IsLoggedIn\" type=\"match\" text=\"yes\">\nLogged in as {{$:/status/UserName}} <$button message=\"tm-logout\">Logout</$button> <$button message=\"tm-server-refresh\">Fetch updates from server</$button>\n</$reveal>"},"$:/core/modules/widgets/on-render.js":{"title":"$:/core/modules/widgets/on-render.js","text":"/*\\\ntitle: $:/core/modules/widgets/on-render.js\ntype: application/javascript\nmodule-type: widget\n\nOnRender variable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar OnRenderWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nOnRenderWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nOnRenderWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\tif(this.isWithinVisibleDocument()) {\n\t\twindow.setTimeout(this.handleTimeoutEvent.bind(this),0);\n\t}\n};\n\nOnRenderWidget.prototype.isWithinVisibleDocument = function() {\n\treturn $tw.browser && !this.document.isTiddlyWikiFakeDom && $tw.utils.domContains(this.document,this.parentDomNode);\n};\n\nOnRenderWidget.prototype.handleTimeoutEvent = function() {\n\tif(this.isWithinVisibleDocument()) {\n\t\t$tw.taskDaemon.invoke({\n\t\t\twidget: this,\n\t\t\tname: this.getAttribute(\"name\"),\n\t\t\tactions: this.getAttribute(\"actions\"),\n\t\t\tminimumInterval: parseInt(this.getAttribute(\"minimumInterval\"),10) || 0\n\t\t});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nOnRenderWidget.prototype.execute = function() {\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nOnRenderWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"on-render\"] = OnRenderWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/DefaultTiddlers":{"title":"$:/DefaultTiddlers","text":"[list[DefaultTiddlers!!text]]"},"$:/core/ui/PageTemplate/drafts":{"title":"$:/core/ui/PageTemplate/drafts","text":"This tiddler is overridden by Xememex to remove the red drafts indicator"},"$:/language/PluginReloadWarning":{"title":"$:/language/PluginReloadWarning","text":"Please refresh this page {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect\n\n"},"$:/SiteSubtitle":{"title":"$:/SiteSubtitle","text":"<$transclude tiddler=\"SiteSubtitle\">A place for thinking</$transclude>"},"$:/SiteTitle":{"title":"$:/SiteTitle","text":"<$transclude tiddler=\"SiteTitle\">Xememex</$transclude>"},"$:/config/SyncPollingInterval":{"title":"$:/config/SyncPollingInterval","text":"30000"},"$:/core/ui/AboveStory/tw2-plugin-check":{"title":"$:/core/ui/AboveStory/tw2-plugin-check","text":"(Disabled TW2 plugin check)\n"},"$:/plugins/federatial/xememex/raw-markup-boot.js":{"title":"$:/plugins/federatial/xememex/raw-markup-boot.js","text":"/*\\\ntitle: $:/plugins/federatial/xememex/raw-markup-boot.js\ntype: application/javascript\nmodule-type: library\n\nBoot code that is transcluded by a rawmarkup startup tiddler\n\n\\*/\n\n(function() {\n\nvar MAP_BAG_TITLE = \"$:/state/federatial/xememex/tiddlers/bag\",\n\tMAP_ETAG_TITLE = \"$:/state/federatial/xememex/tiddlers/etag\",\n\tCONFIG_RECIPE_TITLE = \"$:/plugins/federatial/xememex/config/recipe\";\n\nif($xememex && $xememex.server && $xememex.server.addEventListener) {\n\t$xememex.server.addEventListener(\"login-status-change\",handleLoginStatusChange);\n}\n\nvar hasBooted = false;\n\nfunction handleLoginStatusChange(user) {\n\tvar requireLogin  = $xememex.config[\"require-login\"];\n\tif(user || (!requireLogin && $xememex.server.isAnonymousAccount())) {\n\t\t$xememex.server.removeEventListener(\"login-status-change\",handleLoginStatusChange);\n\t\t$xememex.pill.showDropdown();\n\t\t$xememex.pill.setProgress(1);\n\t\t$xememex.pill.showProgress();\n\t\t$xememex.pill.hideAuth();\n\t\tif(!hasBooted) {\n\t\t\tbootXememex();\n\t\t}\n\t} else {\n\t\tif(requireLogin) {\n\t\t\t$xememex.pill.showDropdown();\n\t\t} else {\n\t\t\tbootTiddlyWiki();\n\t\t}\n\t}\n}\n\nfunction bootXememex() {\n\thasBooted = true;\n\t// Get the tiddlers we need from within the HTML file\n\tvar tiddlerStoreMap = getTiddlerStoreMap(),\n\t\tbagMap = JSON.parse(getTiddlerText(tiddlerStoreMap[MAP_BAG_TITLE])),\n\t\tetagMap = JSON.parse(getTiddlerText(tiddlerStoreMap[MAP_ETAG_TITLE])),\n\t\trecipeName = getTiddlerText(tiddlerStoreMap[CONFIG_RECIPE_TITLE]),\n\t\tbagsToLoad = null,\n\t\ttiddlersToReload = null;\n\t\ttaskFunctions = {\n\t\t\t// Get the recipe details\n\t\t\tgetRecipeDetails: {\n\t\t\t\tprogressContribution: 1,\n\t\t\t\thandler: function(startProgress,lengthProgress,callback) {\n\t\t\t\t\t$xememex.server.jsonRequest({\n\t\t\t\t\t\turl: \"recipes/\" + fullyEncodeURIComponent(recipeName),\n\t\t\t\t\t\tprogress: function(lengthComputable,loaded,total) {\n\t\t\t\t\t\t\tsetProgressIndicator(startProgress,lengthProgress,lengthComputable,loaded,total);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcallback: function(err,recipeInfo) {\n\t\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Get the details of the bags to be loaded\n\t\t\t\t\t\t\tbagsToLoad = recipeInfo.recipe.map(function(recipeLine) {\n\t\t\t\t\t\t\t\treturn recipeLine[0];\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcallback(null);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\t// Get the cached content of each bag\n\t\t\tgetCachedBags: {\n\t\t\t\tprogressContribution: 50,\n\t\t\t\thandler: function(startProgress,lengthProgress,callback) {\n\t\t\t\t\tasync.eachOfSeries(bagsToLoad,function(bagName,bagIndex,callback) {\n\t\t\t\t\t\tvar startProgressBag = startProgress + (lengthProgress / bagsToLoad.length) * bagIndex,\n\t\t\t\t\t\t\tlengthProgressBag = lengthProgress / bagsToLoad.length,\n\t\t\t\t\t\t\tlengthProgressBagFirst = lengthProgressBag / 20;\n\t\t\t\t\t\t$xememex.server.jsonRequest({\n\t\t\t\t\t\t\turl: \"bags/\" + fullyEncodeURIComponent(bagName),\n\t\t\t\t\t\t\tprogress: function(lengthComputable,loaded,total) {\n\t\t\t\t\t\t\t\tsetProgressIndicator(startProgressBag,lengthProgressBagFirst,lengthComputable,loaded,total);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcallback: function(err,bagInfo) {\n\t\t\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Load the tiddlers from the bag\n\t\t\t\t\t\t\t\t$xememex.httpRequest({\n\t\t\t\t\t\t\t\t\turl: bagInfo.cacheUrl,\n\t\t\t\t\t\t\t\t\tprogress: function(lengthComputable,loaded,total) {\n\t\t\t\t\t\t\t\t\t\tsetProgressIndicator(startProgressBag + lengthProgressBagFirst,lengthProgressBag - lengthProgressBagFirst,lengthComputable,loaded,total);\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tcallback: function(err,data) {\n\t\t\t\t\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tvar tiddlerInfoArray;\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\ttiddlerInfoArray = JSON.parse(data);\n\t\t\t\t\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\t\t\t\t\treturn handleError(\"JSON parse error reading bag \" + bagName)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif(tiddlerInfoArray) {\n\t\t\t\t\t\t\t\t\t\t\ttiddlerInfoArray.forEach(function(tiddlerInfo) {\n\t\t\t\t\t\t\t\t\t\t\t\t$tw.preloadTiddlers.push(tiddlerInfo.fields);\n\t\t\t\t\t\t\t\t\t\t\t\tbagMap[tiddlerInfo.fields.title] = bagName;\n\t\t\t\t\t\t\t\t\t\t\t\tetagMap[tiddlerInfo.fields.title] = tiddlerInfo.etag;\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tcallback(null);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t},callback);\n\t\t\t\t}\n\t\t\t},\n\t\t\t// Get the skinny recipe tiddlers\n\t\t\tgetSkinnyRecipeTiddlers: {\n\t\t\t\tprogressContribution: 5,\n\t\t\t\thandler: function(startProgress,lengthProgress,callback) {\n\t\t\t\t\ttiddlersToReload = [];\n\t\t\t\t\t$xememex.server.jsonRequest({\n\t\t\t\t\t\turl: \"recipes/\" + fullyEncodeURIComponent(recipeName) + \"/tiddlers.json\",\n\t\t\t\t\t\tprogress: function(lengthComputable,loaded,total) {\n\t\t\t\t\t\t\tsetProgressIndicator(startProgress,lengthProgress,lengthComputable,loaded,total);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcallback: function(err,data) {\n\t\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Process each incoming tiddler to see if it is newer than any existing one\n\t\t\t\t\t\t\tfor(var t=0; t<data.length; t++) {\n\t\t\t\t\t\t\t\tvar tiddlerDetails = data[t],\n\t\t\t\t\t\t\t\t\tetag = etagMap[tiddlerDetails.title];\n\t\t\t\t\t\t\t\tif(!etag || etag !== tiddlerDetails.etag) {\n\t\t\t\t\t\t\t\t\ttiddlersToReload.push(tiddlerDetails.title);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcallback(null);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\t// Reload any necessary tiddlers\n\t\t\treloadNewTiddlers: {\n\t\t\t\tprogressContribution: 2,\n\t\t\t\thandler: function(startProgress,lengthProgress,callback) {\n\t\t\t\t\tasync.eachOfSeries(tiddlersToReload,function(title,index,callback) {\n\t\t\t\t\t\t$xememex.server.jsonRequest({\n\t\t\t\t\t\t\turl: \"recipes/\" + fullyEncodeURIComponent(recipeName) + \"/tiddlers/\" + fullyEncodeURIComponent(title),\n\t\t\t\t\t\t\tprogress: function(lengthComputable,loaded,total) {\n\t\t\t\t\t\t\t\tsetProgressIndicator(startProgress + (lengthProgress / tiddlersToReload.length) * index,lengthProgress / tiddlersToReload.length,lengthComputable,loaded,total);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcallback: function(err,tiddlerInfo) {\n\t\t\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$tw.preloadTiddlers.push(tiddlerInfo.fields);\n\t\t\t\t\t\t\t\tetagMap[title] = tiddlerInfo.etag;\n\t\t\t\t\t\t\t\tbagMap[title] = tiddlerInfo.bag;\n\t\t\t\t\t\t\t\tcallback(null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t},callback);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Work out which tasks we need to run\n\tvar tasks = [];\n\tif($xememex.config[\"load-cached-bags\"]) {\n\t\ttasks.push(taskFunctions.getRecipeDetails);\n\t\ttasks.push(taskFunctions.getCachedBags);\n\t}\n\ttasks.push(taskFunctions.getSkinnyRecipeTiddlers);\n\ttasks.push(taskFunctions.reloadNewTiddlers);\n\t// Work out the progress contribution\n\tvar totalProgressContribution = 0;\n\ttasks.forEach(function(task) {\n\t\ttotalProgressContribution += task.progressContribution;\n\t});\n\t// Execute them\n\tvar currentProgressMark = 0;\n\tasync.eachOfSeries(tasks,\n\t\tfunction(task,index,callback) {\n\t\t\t// Give each task its proportion of the total progress time\n\t\t\tvar startProgressChunk = (currentProgressMark / totalProgressContribution) * 100,\n\t\t\t\tlengthProgressChunk = (task.progressContribution / totalProgressContribution) * 100;\n\t\t\ttask.handler(startProgressChunk,lengthProgressChunk,function(err) {\n\t\t\t\tcurrentProgressMark += task.progressContribution;\n\t\t\t\tcallback(err);\n\t\t\t});\n\t\t},\n\t\tfunction(err) {\n\t\t// Raise any errors\n\t\tif(err) {\n\t\t\treturn handleError(err);\t\t\t\n\t\t}\n\t\t// Save the bag/etag data and boot TiddlyWiki\n\t\t$tw.preloadTiddlers.push({title: MAP_BAG_TITLE, type: \"application/json\", text: JSON.stringify(bagMap)});\n\t\t$tw.preloadTiddlers.push({title: MAP_ETAG_TITLE, type: \"application/json\", text: JSON.stringify(etagMap)});\n\t\tbootTiddlyWiki();\n\t});\n}\n\nfunction setProgressIndicator(startChunk,lengthChunk,lengthComputable,loaded,total) {\n\tvar p;\n\tif(lengthComputable) {\n\t\tp = startChunk + lengthChunk * (loaded / total);\n\t} else {\n\t\tp = startChunk;\n\t}\n\t$xememex.pill.setProgress(p); // Progress 0-100\n}\n\nfunction bootTiddlyWiki() {\n\t$xememex.pill.hideDropdown();\n\t$tw.boot.boot();\t\n}\n\nfunction handleError(err) {\n\tvar msg;\n\tif(err === 401) {\n\t\tmsg = \"Access Denied\";\n\t} else {\n\t\tmsg = err.toString();\n\t}\n\talert(msg);\n}\n\n/*\nGet an object mapping tiddler titles to the DOM node containing the tiddler\n*/\nfunction getTiddlerStoreMap() {\n\tvar map = Object.create(null);\n\tvar e = document.getElementById(\"storeArea\").firstElementChild;\n\twhile(e) {\n\t\tmap[e.getAttribute(\"title\") || \"\"] = e;\n\t\te = e.nextElementSibling;\n\t}\n\treturn map;\n}\n\n/*\nGet the text of a tiddler identified by its DIV\n*/\nfunction getTiddlerText(e) {\n\tif(e) {\n\t\treturn e.firstElementChild.textContent;\t\t\n\t} else {\n\t\treturn undefined;\n\t}\n}\n\n/*\nWe also encode single quote because it is not URL safe for API Gateway (see http://stackoverflow.com/questions/18251399/why-doesnt-encodeuricomponent-encode-single-quotes-apostrophes)\n*/\nfunction fullyEncodeURIComponent(str) {\n\treturn encodeURIComponent(str).replace(/'/g,\"%27\");\n}\n\n})();\n","type":"application/javascript","module-type":"library"},"$:/plugins/federatial/xememex/readme":{"title":"$:/plugins/federatial/xememex/readme","text":"This plugin contains Xememex client utilities for TiddlyWiki.\n"},"$:/plugins/federatial/xememex/readonly":{"title":"$:/plugins/federatial/xememex/readonly","tags":"[[$:/tags/Stylesheet]]","text":"\\define button-selector(title)\nbutton.$title$, .tc-drop-down button.$title$, div.$title$\n\\end\n\n\\define hide-edit-controls()\n<$reveal state=\"$:/status/IsReadOnly\" type=\"match\" text=\"yes\" default=\"yes\">\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fclone>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fdelete>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fedit>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fnew-here>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fnew-journal-here>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fimport>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fmanager>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fnew-image>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fnew-journal>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fnew-tiddler>> `{\n\tdisplay: none;\n}`\n</$reveal>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n<<hide-edit-controls>>\n"},"$:/plugins/federatial/xememex/startup.js":{"title":"$:/plugins/federatial/xememex/startup.js","text":"/*\\\ntitle: $:/plugins/federatial/xememex/startup.js\ntype: application/javascript\nmodule-type: startup\n\nSetup Xememex components\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"xememex-startup\";\nexports.platforms = [\"browser\"];\nexports.before = [\"startup\"];\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar STATE_USERNAME_TITLE = \"$:/state/xememex/username\", // Blank if not logged in\n\tSTATE_EMAIL_TITLE = \"$:/state/xememex/email\",\n\tSTATE_GROUPS_TITLE = \"$:/state/xememex/groups\",\n\tSTATE_STATUS_TITLE = \"$:/state/xememex/status\"; // Status: WAITING, LOGGEDIN, LOGGEDOUT\n\nexports.startup = function() {\n\t// Check dependencies\n\tif(!window.$xememex) {\n\t\tconsole.log(\"Xememex is disabled because xememex.js is missing\");\n\t\treturn;\t\t\n\t}\n\tif(!window.AWSCognito) {\n\t\tconsole.log(\"Xememex is disabled because AWSCognito is missing\");\n\t\treturn;\n\t}\n\t// Initialise state tiddlers\n\t$tw.wiki.addTiddler({title: STATE_STATUS_TITLE, text: \"WAITING\"});\n\t$tw.wiki.addTiddler({title: STATE_USERNAME_TITLE, text: \"\"});\n\t// Listen for login/logout events\n\t$xememex.server.addEventListener(\"login-status-change\",function(user) {\n\t\tupdateUserStatus(user);\n\t});\n\t// Initialise user status tiddlers\n\tupdateUserStatus($xememex.server.user);\n};\n\nfunction updateUserStatus(user) {\n\tif(user) {\n\t\t$tw.wiki.addTiddler({title: STATE_STATUS_TITLE, text: \"LOGGEDIN\"});\n\t\t$tw.wiki.addTiddler({title: STATE_USERNAME_TITLE, text: user.name});\n\t\t$tw.wiki.addTiddler({title: STATE_EMAIL_TITLE, text: user.email});\n\t\t$tw.wiki.addTiddler({title: STATE_GROUPS_TITLE, text: user.groups.map(function(t){return \"* \" + t;}).join(\"\\n\"), list: user.groups});\n\t} else {\n\t\t$tw.wiki.addTiddler({title: STATE_STATUS_TITLE, text: \"LOGGEDOUT\"});\n\t\t$tw.wiki.addTiddler({title: STATE_USERNAME_TITLE, text: \"\"});\n\t\t$tw.wiki.addTiddler({title: STATE_EMAIL_TITLE, text: \"\"});\n\t\t$tw.wiki.addTiddler({title: STATE_GROUPS_TITLE, list: []});\n\t}\n}\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/plugins/federatial/xememex/status-button":{"title":"$:/plugins/federatial/xememex/status-button","tags":"$:/tags/TopRightBar","list-before":"$:/core/ui/TopBar/menu","text":"<span class=\"tc-popup-keep\">\n<$reveal state=\"$:/status/IsLoggedIn\" type=\"nomatch\" text=\"yes\">\n<$button message=\"tm-login\" tooltip=\"Login to Xememex\" class=\"tc-btn-invisible tc-status-button tc-status-button-logged-out\" selectedClass=\"tc-selected\">\n{{$:/plugins/federatial/xememex/icon}} Log in\n</$button>\n</$reveal>\n<$reveal state=\"$:/status/IsLoggedIn\" type=\"match\" text=\"yes\">\n<$button popup=<<qualify \"$:/state/popup/xememex-status-button\">> tooltip=\"Xememex login status\" class=\"tc-btn-invisible tc-status-button tc-status-button-logged-in\" selectedClass=\"tc-selected\">\n{{$:/plugins/federatial/xememex/icon}} Logged in as ''{{$:/status/UserName}}''\n</$button>\n</$reveal>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/xememex-status-button\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<p>\nLogged in as {{$:/status/UserName}} ({{$:/state/xememex/email}})\n<$list filter=\"[list[$:/state/xememex/groups!!list]sort[]]\">\n//<$text text=<<currentTiddler>>/>//\n</$list>\n</p>\n<$button message=\"tm-logout\" tag=\"a\">Logout</$button> <$button message=\"tm-server-refresh\" tag=\"a\">Fetch updates from server</$button>\n</div>\n</$reveal>"},"$:/plugins/federatial/xememex/styles":{"title":"$:/plugins/federatial/xememex/styles","tags":"[[$:/tags/Stylesheet]]","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/*\n** Background\n*/\n\nhtml body.tc-body {\n\tdisabled-background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='49' viewBox='0 0 28 49'%3E%3Cg fill-rule='evenodd'%3E%3Cg fill-opacity='0.82' fill-rule='nonzero'%3E%3Cpath d='M13.99 9.25l13 7.5v15l-13 7.5L1 31.75v-15l12.99-7.5zM3 17.9v12.7l10.99 6.34 11-6.35V17.9l-11-6.34L3 17.9zM0 15l12.98-7.5V0h-2v6.35L0 12.69v2.3zm0 18.5L12.98 41v8h-2v-6.85L0 35.81v-2.3zM15 0v7.5L27.99 15H28v-2.31h-.01L17 6.35V0h-2zm0 49v-8l12.99-7.5H28v2.31h-.01L17 42.15V49h-2z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\");\n}\n\n/*\n** Hide irrelevant toolbar buttons\n*/\n\nbutton.tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fencryption, div.tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fencryption {\n\tdisplay: none;\t\n}\n\n\n/*\n** Login status button\n*/\n\nbutton.tc-btn-invisible.tc-status-button {\n\tcolor: white;\n\tborder-radius:4px;\n\tpadding: 3px 5px;\n\tfont-size: 0.85em;\n}\n\nbutton.tc-btn-invisible.tc-status-button svg {\n\tfill: white;\n}\n\nbutton.tc-btn-invisible.tc-status-button:hover {\n\tcolor: white;\n\tfill: white;\n}\n\nbutton.tc-btn-invisible.tc-status-button.tc-status-button-logged-in {\n\tbackground: green;\n}\n\nbutton.tc-btn-invisible.tc-status-button.tc-status-button-logged-out {\n\tbackground: blue;\t\n}\n\nbutton.tc-btn-invisible.tc-status-button.tc-status-button-logged-in:hover,\nbutton.tc-btn-invisible.tc-status-button.tc-status-button-logged-out:hover {\n\tbackground: black;\n}\n\nbutton.tc-btn-invisible.tc-status-button.tc-status-button-logged-in:hover svg,\nbutton.tc-btn-invisible.tc-status-button.tc-status-button-logged-out:hover svg {\n\tcolor: white;\n\tfill: white;\n}\n\n/*\n** Syncer stus\n*/\n\n.tc-syncer-status {\n}\n\n.tc-syncer-status-queued-out {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n    line-height: 0;\n}\n\n.tc-syncer-status-in-progress {\n\tposition: fixed;\n\ttext-align: center;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n    line-height: 0;\n}\n\n.tc-syncer-status-queued-in {\n\tposition: fixed;\n\ttext-align: right;\n\ttop: 0;\n\tright: 0;\n    line-height: 0;\n}\n\n.tc-syncer-status-item {\n\tdisplay: inline-block;\n\tmargin: 1px;\n\twidth: 3px;\n\theight: 3px;\n}\n\n.tc-syncer-status-queued-out .tc-syncer-status-item {\n\tbackground: red;\n}\n\n.tc-syncer-status-in-progress .tc-syncer-status-item {\n\tbackground: blue;\n}\n\n.tc-syncer-status-queued-in .tc-syncer-status-item {\n\tbackground: green;\n}\n\n"},"$:/plugins/federatial/xememex/syncadaptor.js":{"title":"$:/plugins/federatial/xememex/syncadaptor.js","text":"/*\\\ntitle: $:/plugins/federatial/xememex/syncadaptor.js\ntype: application/javascript\nmodule-type: syncadaptor\n\nA sync adaptor module for synchronising with Xememex servers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CONFIG_HOST_TIDDLER = \"$:/config/tiddlyweb/host\",\n\tCONFIG_SYNC_DISABLE_LOAD_FROM_SERVER = \"$:/config/SyncDisableLoadFromServer\",\n\tDEFAULT_HOST_TIDDLER = \"$protocol$//$host$/\",\n\tLOGIN_MODAL_TITLE = \"$:/plugins/federatial/xememex/login-modal\";\n\nfunction XememexAdaptor(options) {\n\tthis.wiki = options.wiki;\n\tthis.logger = new $tw.utils.Logger(\"XememexAdaptor\");\n\tthis.recipe = $tw.wiki.getTiddlerText(\"$:/plugins/federatial/xememex/config/recipe\");\n\tthis.isReadOnly = true;\n\tif($xememex && $xememex.server) {\n\t\t$xememex.server.addEventListener(\"login-status-change\",function(user) {\n\t\t\tif($tw.syncer) {\n\t\t\t\t$tw.syncer.getStatus();\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n}\n\nXememexAdaptor.prototype.name = \"xememex\";\n\nXememexAdaptor.prototype.setLoggerSaveBuffer = function(loggerForSaving) {\n\tthis.logger.setSaveBuffer(loggerForSaving);\n};\n\nXememexAdaptor.prototype.isReady = function() {\n\treturn true;\n};\n\nXememexAdaptor.prototype.getTiddlerInfo = function(tiddlerOrTitle) {\n\tvar title = tiddlerOrTitle;\n\tif(title instanceof $tw.Tiddler) {\n\t\ttitle = tiddlerOrTitle.fields.title;\n\t}\n\tvar etag = this.wiki.extractTiddlerDataItem(\"$:/state/federatial/xememex/tiddlers/etag\",title),\n\t\tbag = this.wiki.extractTiddlerDataItem(\"$:/state/federatial/xememex/tiddlers/bag\",title);\n\tif(etag && bag) {\n\t\treturn {\n\t\t\ttitle: title,\n\t\t\tetag: etag,\n\t\t\tbag: bag\n\t\t};\n\t} else {\n\t\treturn undefined;\n\t}\n};\n\nXememexAdaptor.prototype.getTiddlerRevision = function(title) {\n\treturn this.wiki.extractTiddlerDataItem(\"$:/state/federatial/xememex/tiddlers/etag\",title);\n};\n\nXememexAdaptor.prototype.setTiddlerInfo = function(title,etag,bag) {\n\tthis.wiki.setText(\"$:/state/federatial/xememex/tiddlers/etag\",null,title,etag,{suppressTimestamp: true});\n\tthis.wiki.setText(\"$:/state/federatial/xememex/tiddlers/bag\",null,title,bag,{suppressTimestamp: true});\n};\n\nXememexAdaptor.prototype.removeTiddlerInfo = function(title) {\n\tthis.wiki.setText(\"$:/state/federatial/xememex/tiddlers/etag\",null,title,undefined,{suppressTimestamp: true});\n\tthis.wiki.setText(\"$:/state/federatial/xememex/tiddlers/bag\",null,title,undefined,{suppressTimestamp: true});\n};\n\n/*\nGet the current status of the TiddlyWeb connection\nReturns err,isLoggedIn,username,isReadOnly via callback\n*/\nXememexAdaptor.prototype.getStatus = function(callback) {\n\tvar self = this;\n\tif(!$xememex || !$xememex.server) {\n\t\treturn callback(null,false,null,true);\n\t}\n\t$xememex.server.getSession(function(err,user) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t$xememex.server.jsonRequest({\n\t\t\turl: \"recipes/\" + fullyEncodeURIComponent(self.recipe),\n\t\t\tcallback: function(err,recipeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(null,false,null,true);\n\t\t\t\t}\n\t\t\t\tif(user) {\n\t\t\t\t\t$xememex.pill.hideDropdown();\n\t\t\t\t}\n\t\t\t\tself.isReadOnly = !recipeInfo[\"topmost-user-writable-bag\"];\n\t\t\t\tself.shouldRefreshFromServer = !!recipeInfo[\"refresh-from-server\"];\n\t\t\t\tcallback(null,!!user,user && user.name,self.isReadOnly);\n\t\t\t}\n\t\t});\n\t});\n};\n\n/*\nAttempt to login and invoke the callback(err)\n*/\nXememexAdaptor.prototype.login = function(username,password,callback) {\n\tvar self = this;\n\t$xememex.server.login(username,password,null,null,function(err) {\n\t\tif(err) {\n\t\t\tself.logger.log(\"login error: \" + err);\n\t\t\tif(err.code) {\n\t\t\t\tswitch(err.code) {\n\t\t\t\t\tcase \"UserNotFoundException\":\n\t\t\t\t\t\terr = \"Username `\" + username + \"` not found. Please check that you have typed your username correctly\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"NotAuthorizedException\":\n\t\t\t\t\t\terr = \"User `\" + username + \"` is not authorised. Please check that you have typed your password correctly\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\terr = \"<pre><code>\" + err + \"</code></pre>\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tself.logger.alert(err);\n\t\t}\n\t\tcallback(err);\n\t});\n};\n\n/*\nDisplay our custom login prompt\n*/\nXememexAdaptor.prototype.displayLoginPrompt = function() {\n\t$xememex.pill.hideProgress();\n\t$xememex.pill.showLogin();\n\t$xememex.pill.showDropdown();\n};\n\n/*\nHandle forgotten password link\n*/\nXememexAdaptor.prototype.forgotPassword = function() {\n\t$xememex.server.forgotPassword(data.email,function(err,result) {\n\t\tif(err) {\n\t\t\tself.logger.log(\"Error handling forgotten password\",err);\n\t\t\tvar msg = err;\n\t\t\tswitch(err.code) {\n\t\t\t\tcase \"UserNotFoundException\":\n\t\t\t\t\tmsg  = \"Email address not found\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn alert(msg);\n\t\t}\n\t\tif(result) {\n\t\t\talert(\"Please check your email for your new temporary password\");\n\t\t}\n\t});\n};\n\n/*\n*/\nXememexAdaptor.prototype.logout = function(callback) {\n\t$xememex.server.logout();\n};\n\n/*\nGet metadata for any new tiddlers from the server\n*/\nXememexAdaptor.prototype.getUpdatedTiddlers = function(syncer,callback) {\n\tvar self = this;\n\tif(!$xememex || !$xememex.server) {\n\t\treturn callback(null,null);\n\t}\n\tif($tw.wiki.getTiddlerText(CONFIG_SYNC_DISABLE_LOAD_FROM_SERVER) === \"yes\") {\n\t\treturn callback(null,null);\n\t}\n\tif(!self.shouldRefreshFromServer) {\n\t\treturn callback(null,null);\n\t}\n\t$xememex.server.jsonRequest({\n\t\turl: \"recipes/\" + fullyEncodeURIComponent(this.recipe) + \"/tiddlers.json\",\n\t\tcallback: function(err,data) {\n\t\t\tif(err) {\n\t\t\t\tif(err.toString() === \"Error: Not logged in\") {\n\t\t\t\t\treturn callback(null,null);\n\t\t\t\t}\n\t\t\t\tself.logger.log(\"Error retrieving skinny tiddler: \" + err);\n\t\t\t\treturn callback(null,null);\n\t\t\t}\n\t\t\t// Prepare results\n\t\t\tvar result = {\n\t\t\t\tmodifications: [],\n\t\t\t\tdeletions: []\n\t\t\t};\n\t\t\t// Process each incoming tiddler to see if it is newer than any existing one, keeping track of which tiddlers are found\n\t\t\tvar currentTitles = syncer.getSyncedTiddlers();\n\t\t\tfor(var t=0; t<data.length; t++) {\n\t\t\t\tvar tiddlerDetails = data[t],\n\t\t\t\t\tpos = currentTitles.indexOf(tiddlerDetails.title);\n\t\t\t\tif(pos != -1) {\n\t\t\t\t\tcurrentTitles.splice(pos,1);\n\t\t\t\t}\n\t\t\t\tvar tiddlerInfo = syncer.tiddlerInfo[tiddlerDetails.title];\n\t\t\t\tif(!tiddlerInfo || tiddlerDetails.etag !== tiddlerInfo.revision) {\n\t\t\t\t\tresult.modifications.push(tiddlerDetails.title);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Delete any tiddlers we've got that were not listed in the incoming\n\t\t\t$tw.utils.each(currentTitles,function(title) {\n\t\t\t\tresult.deletions.push(title);\n\t\t\t});\n\t\t\tcallback(null,result);\n\t\t}\n\t});\n};\n\n/*\nSave a tiddler and invoke the callback with (err,adaptorInfo,revision)\n*/\nXememexAdaptor.prototype.saveTiddler = function(tiddler,callback) {\n\tif(this.isReadOnly) {\n\t\treturn callback(null,{bag: \"default\"},\"\");\n\t}\n\tvar self = this,\n\t\ttitle = tiddler.fields.title;\n\tif(!$xememex || !$xememex.server) {\n\t\treturn callback(\"Not logged in\",null);\n\t}\n\t$xememex.server.jsonRequest({\n\t\ttype: \"PUT\",\n\t\turl: \"recipes/\" + fullyEncodeURIComponent(this.recipe) + \"/tiddlers/\" + fullyEncodeURIComponent(title),\n\t\theaders: {\n\t\t\t\"Content-type\": \"application/json\"\n\t\t},\n\t\tdata: JSON.stringify(tiddler.getFieldStrings(),null,$tw.config.preferences.jsonSpaces),\n\t\tcallback: function(err,data) {\n\t\t\tconsole.log(\"Back from saveTiddler\",err,data);\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tif(data && data.errorMessage) {\n\t\t\t\treturn callback(data.errorMessage)\n\t\t\t}\n\t\t\tself.setTiddlerInfo(title,data.etag,data.bag);\n\t\t\tcallback(err,{bag: data.bag},data.etag);\n\t\t}\n\t});\n};\n\n/*\nLoad a tiddler and invoke the callback with (err,tiddlerFields)\n\nIf the tiddler is not found, err and tiddlerFields are both null\n*/\nXememexAdaptor.prototype.loadTiddler = function(title,callback) {\n\tvar self = this;\n\tif(!$xememex || !$xememex.server) {\n\t\treturn callback(\"Not logged in\",null);\n\t}\n\t$xememex.server.jsonRequest({\n\t\turl: \"recipes/\" + fullyEncodeURIComponent(this.recipe) + \"/tiddlers/\" + fullyEncodeURIComponent(title),\n\t\tcallback: function(err,data) {\n\t\t\tconsole.log(\"Back from loadTiddler\",err,data);\n\t\t\tif(!err) {\n\t\t\t\tself.setTiddlerInfo(title,data.etag,data.bag);\n\t\t\t\treturn callback(null,data.fields);\n\t\t\t} else if(err === 404) {\n\t\t\t\treturn callback(null,null);\n\t\t\t} else {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nLoad one or more tiddlers and invoke the callback with (err,tiddlerFieldsArray)\n*/\nXememexAdaptor.prototype.batchLoadTiddlers = function(titles,callback) {\n\tvar self = this,\n\t\tpayload = titles.map(function(title) {\n\t\t\treturn {\n\t\t\t\ttype: \"GET\",\n\t\t\t\ttitle: title\n\t\t\t};\n\t\t});\n\tif(!$xememex || !$xememex.server) {\n\t\treturn callback(\"Not logged in\",null);\n\t}\n\t$xememex.server.jsonRequest({\n\t\ttype: \"POST\",\n\t\turl: \"recipes/\" + fullyEncodeURIComponent(this.recipe) + \"/batch\",\n\t\theaders: {\n\t\t\t\"Content-type\": \"application/json\"\n\t\t},\n\t\tdata: JSON.stringify(payload,null,$tw.config.preferences.jsonSpaces),\n\t\tcallback: function(err,data) {\n\t\t\tconsole.log(\"Back from batchLoadTiddlers\",err,data);\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar tiddlers = [];\n\t\t\tdata.forEach(function(tiddlerInfo) {\n\t\t\t\ttiddlers.push(tiddlerInfo.fields);\n\t\t\t\tself.setTiddlerInfo(tiddlerInfo.fields.title,tiddlerInfo.etag,tiddlerInfo.bag);\t\t\t\t\n\t\t\t});\n\t\t\tcallback(err,tiddlers);\n\t\t}\n\t});\n};\n\n/*\nDelete a tiddler and invoke the callback with (err)\noptions include:\ntiddlerInfo: the syncer's tiddlerInfo for this tiddler\n*/\nXememexAdaptor.prototype.deleteTiddler = function(title,callback,options) {\n\tif(this.isReadOnly) {\n\t\treturn callback(null);\n\t}\n\tvar self = this,\n\t\ttiddlerInfo = this.getTiddlerInfo(title),\n\t\tbagName = tiddlerInfo && tiddlerInfo.bag;\n\tif(!$xememex || !$xememex.server) {\n\t\treturn callback(\"Not logged in\",null);\n\t}\n\tif(bagName) {\n\t\t$xememex.server.request({\n\t\t\ttype: \"DELETE\",\n\t\t\turl: \"recipes/\" + fullyEncodeURIComponent(self.recipe) + \"/tiddlers/\" + fullyEncodeURIComponent(title),\n\t\t\theaders: {\n\t\t\t\t\"Content-type\": \"application/json\"\n\t\t\t},\n\t\t\tcallback: function(err,data,httpRequest) {\n\t\t\t\tconsole.log(\"Back from deleteTiddler\",err,data,httpRequest.response);\n\t\t\t\tif(data && data.errorMessage) {\n\t\t\t\t\treturn callback(data.errorMessage)\n\t\t\t\t} else if(err === 400 && httpRequest.response === \"ERROR_TIDDLER_IS_NOT_IN_TOP_BAG_IN_RECIPE\") {\n\t\t\t\t\tself.logger.alert(\"'<$text text=\\\"\\\"\\\"\" + title + \"\\\"\\\"\\\"/>' cannot be deleted because it is not from the topmost bag of the recipe '\" + self.recipe + \"'\");\n\t\t\t\t\t$tw.syncer.enqueueLoadTiddler(title);\n\t\t\t\t\tvar story = new $tw.Story();\n\t\t\t\t\tstory.navigateTiddler(title);\n\t\t\t\t\treturn callback(null);\n\t\t\t\t} else if(err) {\n\t\t\t\t\tcallback(err,data);\n\t\t\t\t} else {\n\t\t\t\t\tself.removeTiddlerInfo(title);\n\t\t\t\t\tcallback(err,data);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t});\t\t\n\t} else {\n\t\t// If we don't have a record of the tiddler then it was never synced to the server so we don't need to delete it\n\t\t$tw.utils.nextTick(function() {\n\t\t\tcallback(null);\n\t\t});\n\t}\n};\n\n/*\nWe also encode single quote because it is not URL safe for API Gateway (see http://stackoverflow.com/questions/18251399/why-doesnt-encodeuricomponent-encode-single-quotes-apostrophes)\n*/\nfunction fullyEncodeURIComponent(str) {\n\treturn encodeURIComponent(str).replace(/'/g,\"%27\");\n}\n\nif($tw.browser) {\n\texports.adaptorClass = XememexAdaptor;\n}\n\n})();\n","type":"application/javascript","module-type":"syncadaptor"},"$:/core/modules/startup/task-daemon.js":{"title":"$:/core/modules/startup/task-daemon.js","text":"/*\\\ntitle: $:/core/modules/startup/task-daemon.js\ntype: application/javascript\nmodule-type: startup\n\nTask daemon for on-render widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"task-daemon\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\t\t\nexports.startup = function() {\n\t$tw.taskDaemon = new TaskDaemon();\n};\n\nfunction TaskDaemon() {\n\tthis.lastInvocationTime = {}; // Hashmap by task name of dates\n}\n\n/*\nOptions include:\n\nwidget: reference to the widget triggering the task\nname: name for this task\nactions: actions comprising the task\nminimumInterval: minimum interval between invocations in milliseconds\n*/\nTaskDaemon.prototype.invoke = function(options) {\n\tvar now = new Date();\n\tif(options.name) {\n\t\tif(options.minimumInterval && this.lastInvocationTime[options.name]) {\n\t\t\tif((now - this.lastInvocationTime[options.name]) < options.minimumInterval) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.lastInvocationTime[options.name] = now;\n\t}\nconsole.log(\"Invoking actions\",options.actions)\n\toptions.widget.invokeActionString(options.actions,options.widget,{});\n}\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/plugins/federatial/xememex/save/offline":{"title":"$:/plugins/federatial/xememex/save/offline","text":"\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/]] -[prefix[$:/status/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[prefix[$:/plugins/federatial/xememex]] -[[$:/isEncrypted]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"},"$:/plugins/federatial/xememex/save/all-prefix":{"title":"$:/plugins/federatial/xememex/save/all-prefix","text":"\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/plugins/federatial/xememex/templates/tiddlywiki5.html-prefix}}\n"},"$:/plugins/federatial/xememex/save/all-suffix":{"title":"$:/plugins/federatial/xememex/save/all-suffix","text":"\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/plugins/federatial/xememex/templates/tiddlywiki5.html-suffix}}\n"},"$:/plugins/federatial/xememex/save/empty-prefix":{"title":"$:/plugins/federatial/xememex/save/empty-prefix","text":"\\define saveTiddlerFilter()\n[[$:/core]] [[$:/isEncrypted]] [[$:/themes/tiddlywiki/snowwhite]] [[$:/themes/tiddlywiki/vanilla]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/plugins/federatial/xememex/templates/tiddlywiki5.html-prefix}}\n"},"$:/plugins/federatial/xememex/save/empty-suffix":{"title":"$:/plugins/federatial/xememex/save/empty-suffix","text":"\\define saveTiddlerFilter()\n[[$:/core]] [[$:/isEncrypted]] [[$:/themes/tiddlywiki/snowwhite]] [[$:/themes/tiddlywiki/vanilla]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/plugins/federatial/xememex/templates/tiddlywiki5.html-suffix}}\n"},"$:/plugins/federatial/xememex/templates/tiddlywiki5.html-prefix":{"title":"$:/plugins/federatial/xememex/templates/tiddlywiki5.html-prefix","text":"<$set name=\"saveTiddlerAndShadowsFilter\" filter=\"[subfilter<saveTiddlerFilter>] [subfilter<saveTiddlerFilter>plugintiddlers[]]\">\n`<!doctype html>\n`{{$:/core/templates/MOTW.html}}`<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n`{{{ [<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"`{{$:/core/copyright.txt}}`\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>`{{$:/core/wiki/title}}`</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/core/wiki/rawmarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}`\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}`\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n`{{$:/boot/boot.css||$:/core/templates/css-tiddler}}`\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n`{{$:/core/templates/static.area}}`\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n<div id=\"storeArea\" style=\"display:none;\">\n`\n"},"$:/plugins/federatial/xememex/templates/tiddlywiki5.html-suffix":{"title":"$:/plugins/federatial/xememex/templates/tiddlywiki5.html-suffix","text":"\\define tiddlers()\n<$list filter=<<saveTiddlerFilter>> template=\"$:/core/templates/html-div-tiddler\"/>\n\\end\n<$set name=\"saveTiddlerAndShadowsFilter\" filter=\"[subfilter<saveTiddlerFilter>] [subfilter<saveTiddlerFilter>plugintiddlers[]]\">\n<<tiddlers>>\n`</div>\n<!--~~ Library modules ~~-->\n<div id=\"libraryModules\" style=\"display:none;\">\n`{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/javascript-tiddler}}}`\n</div>\n<!--~~ Boot kernel prologue ~~-->\n<div id=\"bootKernelPrefix\" style=\"display:none;\">\n`{{ $:/boot/bootprefix.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Boot kernel ~~-->\n<div id=\"bootKernel\" style=\"display:none;\">\n`{{ $:/boot/boot.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Raw markup for the bottom of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}`\n</body>\n</html>`\n"},"$:/plugins/federatial/xememex/upgrader.js":{"title":"$:/plugins/federatial/xememex/upgrader.js","text":"/*\\\ntitle: $:/plugins/federatial/xememex/upgrader.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that suppresses Xememex-specific system tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DONT_IMPORT_PREFIX_LIST = [\"$:/plugins/federatial/xememex\"];\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tfor(var t=0; t<DONT_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\tvar prefix = DONT_IMPORT_PREFIX_LIST[t];\n\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\tmessages[title] = \"Xememex system tiddler blocked\";\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n","type":"application/javascript","module-type":"upgrader"}}}
```
<script>

window.$tw = window.$tw || {};

$tw.boot = $tw.boot || {};

$tw.preloadTiddlers = $tw.preloadTiddlers || [];

$tw.boot.suppressBoot = true;

window.$xememex = {
	config: {
		"require-login": false,
		"load-cached-bags": false,
		"pill-button": false,
		"pill-dropdown": "modal",
		"show-cancel": true
	}
}

</script>
<script src="../~lib/xememex.js" onerror="console.log('Cannot load xememex.js');$tw.boot.suppressBoot = false;"></script>
<script>
```
{{$:/plugins/federatial/xememex/raw-markup-boot.js}}
```
</script>
```
{"tiddlers":{"$:/core/ui/ViewTemplate/classic":{"title":"$:/core/ui/ViewTemplate/classic","tags":"$:/tags/ViewTemplate $:/tags/EditTemplate","type":"text/vnd.tiddlywiki","text":"\n\n"},"$:/core/modules/widgets/classictransclude.js":{"title":"$:/core/modules/widgets/classictransclude.js","text":"/*\\\ntitle: $:/core/modules/widgets/classictransclude.js\ntype: application/javascript\nmodule-type: widget\n\nTransclude widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\nvar sliceSeparator = \"::\";\nvar sectionSeparator = \"##\";\n\nfunction getsectionname(title) {\n\tif(!title)\n\t\treturn \"\";\n\tvar pos = title.indexOf(sectionSeparator);\n\tif(pos != -1) {\n\t\treturn title.substr(pos + sectionSeparator.length);\n\t}\n\treturn \"\";\n}\nfunction getslicename(title) { \n\tif(!title)\n\t\treturn \"\";\n\tvar pos = title.indexOf(sliceSeparator);\n\tif(pos != -1) {\n\t\treturn title.substr(pos + sliceSeparator.length);\n\t}\n\treturn \"\";\n};\nfunction gettiddlername(title) {\n\tif(!title)\n\t\treturn \"\";\n\tvar pos = title.indexOf(sectionSeparator);\n\n\tif(pos != -1) {\n\t\treturn title.substr(0,pos);\n\t}\n\tpos = title.indexOf(sliceSeparator);\n\tif(pos != -1) {\n\t\treturn title.substr(0,pos);\n\t}\n\treturn title;\n}\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TranscludeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTranscludeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTranscludeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTranscludeWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.rawTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.transcludeTitle = gettiddlername(this.rawTitle);\n\tthis.section = getsectionname(this.rawTitle);\n\tthis.slice = getslicename(this.rawTitle);\n\t// Check for recursion\n\tvar recursionMarker = this.makeRecursionMarker();\n\tif(this.parentWidget && this.parentWidget.hasVariable(\"transclusion\",recursionMarker)) {\n\t\tthis.makeChildWidgets([{type: \"text\", text: $tw.language.getString(\"Error/RecursiveTransclusion\")}]);\n\t\treturn;\n\t}\n\t// Check for correct type\n\tvar existingTiddler = this.wiki.getTiddler(this.transcludeTitle);\n\t// Check if we're dealing with a classic tiddler\n\tif(existingTiddler && existingTiddler.hasField(\"type\") && existingTiddler.fields.type !== \"text/x-tiddlywiki\") {\n\t\tthis.makeChildWidgets([{type: \"text\", text: \"Tiddler not of type 'text/x-tiddlywiki'\"}]);\n\t\treturn;\n\t}\n\tif(existingTiddler && !existingTiddler.hasField(\"type\")) {\n\t\tthis.makeChildWidgets([{type: \"text\", text: \"Tiddler not of type 'text/x-tiddlywiki'\"}]);\n\t\treturn;\n\t}\t\t\n\t// Set context variables for recursion detection\n\tthis.setVariable(\"transclusion\",recursionMarker);\n\t// Parse \n\tvar text = this.wiki.getTiddlerText(this.transcludeTitle);\n\tif (!!this.section||!!this.slice) {\n\t\ttext =this.refineTiddlerText(text, this.section, this.slice);\n\t}\n\n\tthis.options  ={};\n\tthis.options.parseAsInline = false;\n\tvar parser = this.wiki.parseText(\"text/x-tiddlywiki\",text,{});\n\tvar\tparseTreeNodes = parser ? parser.tree : this.parseTreeNode.children;\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n/*\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\n*/\nTranscludeWidget.prototype.makeRecursionMarker = function() {\n\tvar output = [];\n\toutput.push(\"{\");\n\toutput.push(this.getVariable(\"currentTiddler\",{defaultValue: \"\"}));\n\toutput.push(\"|\");\n\toutput.push(this.transcludeTitle || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeField || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeIndex || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.section || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.slice || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\nTranscludeWidget.prototype.slicesRE = /(?:^([\\'\\/]{0,2})~?([\\.\\w]+)\\:\\1[\\t\\x20]*([^\\n]*)[\\t\\x20]*$)|(?:^\\|([\\'\\/]{0,2})~?([\\.\\w]+)\\:?\\4\\|[\\t\\x20]*([^\\|\\n]*)[\\t\\x20]*\\|$)/gm;\n\nTranscludeWidget.prototype.calcAllSlices = function(text)\n{\n\tvar slices = {};\n\tthis.slicesRE.lastIndex = 0;\n\tvar m = this.slicesRE.exec(text);\n\twhile(m) {\n\t\tif(m[2])\n\t\t\tslices[m[2]] = m[3];\n\t\telse\n\t\t\tslices[m[5]] = m[6];\n\t\tm = this.slicesRE.exec(text);\n\t}\n\treturn slices;\n};\n\n// Returns the slice of text of the given name\nTranscludeWidget.prototype.getTextSlice = function(text,sliceName)\n{\n\treturn (this.calcAllSlices(text))[sliceName];\n};\n\nTranscludeWidget.prototype.refineTiddlerText = function(text,section,slice)\n{\n\tvar textsection = null;\n\tif (slice) {\n\t\tvar textslice = this.getTextSlice(text,slice);\n\t\tif(textslice)\n\t\t\treturn textslice;\n\t}\n\tif(!section)\n\t\treturn text;\n\tvar re = new RegExp(\"(^!{1,6}[ \\t]*\" + $tw.utils.escapeRegExp(section) + \"[ \\t]*\\n)\",\"mg\");\n\tre.lastIndex = 0;\n\tvar match = re.exec(text);\n\tif(match) {\n\t\tvar t = text.substr(match.index+match[1].length);\n\t\tvar re2 = /^!/mg;\n\t\tre2.lastIndex = 0;\n\t\tmatch = re2.exec(t); //# search for the next heading\n\t\tif(match)\n\t\t\tt = t.substr(0,match.index-1);//# don't include final \\n\n\t\treturn t;\n\t}\n\treturn \"\";\n}\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler ||changedTiddlers[this.transcludeTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.classictransclude = TranscludeWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/macros/tiddlywiki/entry.js":{"title":"$:/macros/tiddlywiki/entry.js","text":"/*\\\ntitle: $:/macros/tiddlywiki/entry.js\ntype: application/javascript\nmodule-type: macro\n\\*/\n(function(){\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n/*\nInformation about this macro\nreturns value of key in a data json tiddler\nnote that macros are not connected with the refresh mechanism -use with caution.\n*/\nexports.name = \"entryof\";\n\nexports.params = [\n\t{ name: \"key\" }, { name: \"map\" }\n];\n/*\nRun the macro\n*/\nexports.run = function(key,map) {\n\ttry {\n\t\treturn  JSON.parse(map)[key];\n\t} catch(e) {\n\t\treturn \"\";\n\t}\n}\n})();\n","type":"application/javascript","module-type":"macro"},"$:/plugins/tiddlywiki/tw2parser/image-css":{"title":"$:/plugins/tiddlywiki/tw2parser/image-css","tags":"$:/tags/Stylesheet","type":"text/plain","text":".classic-image-left{\n     float: left;\n}\n\n.classic-image-right{\n     float: right;\n}\n"},"$:/plugins/tiddlywiki/tw2parser/macrodefs":{"title":"$:/plugins/tiddlywiki/tw2parser/macrodefs","text":"\\define tiddler(tiddler)\n<$classictransclude tiddler = \"$tiddler$\"/>\n\\end\n\n\\define slider(chkUniqueCookieName tiddler label tooltip)\n<span title=$tooltip$><$button popup=\"$chkUniqueCookieName$\" class=\"tc-btn-invisible tc-slider\">$label$</$button>\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=\"$chkUniqueCookieName$\" animate=\"yes\">\n<$classictransclude tiddler = \"$tiddler$\"/>\n</$reveal></span>\n\\end\n\n\\define __system_tabinstance(state, currentTab, prompts, labels)\n\t\t<span title=<<entryof \"$currentTab$\" \"\"\"$prompts$\"\"\">> ><$button set=<<qualify \"$state$\">> setTo=\"$currentTab$\" selectedClass=\"tc-tab-selected\">\n\t\t<<entryof \"$currentTab$\" \"\"\"$labels$\"\"\" >>\n\t\t</$button></span>\n\\end\n\n\\define __system_tabs(tabsList,prompts,labels,state:\"$:/state/tab\")\n<div class=\"tc-tab-buttons\">\n\t<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\t\t<$macrocall $name=\"__system_tabinstance\" state=\"$state$\" prompts=\"\"\"$prompts$\"\"\" labels=\"\"\"$labels$\"\"\" currentTab=<<currentTab>>/>\n\t</$list>\n</div>\n<div class=\"tc-tab-divider\"/>\n<div class=\"tc-tab-content\">\n\t<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\t\t<$reveal type=\"match\" state=<<qualify \"$state$\">> text=<<currentTab>> default=\"$default$\">\n\t\t\t<$classictransclude tiddler=<<currentTab>> />\n\t\t</$reveal>\n\t</$list>\n</div>\n\\end\n"},"$:/macros/classic/macroadapter.js":{"title":"$:/macros/classic/macroadapter.js","text":"/*\\\ntitle: $:/macros/classic/macroadapter.js\ntype: application/javascript\nmodule-type: module\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n/*\nInformation about this module:\nrename macros and\nre-jig macro params from tw2 to tw5 style\nnew macros created as a result of adapting tw2 should be \nprepended \"__system\" to distinguish them from the actual used name\n*/\nvar sliceSeparator = \"::\";\nvar sectionSeparator = \"##\";\n\nfunction getsectionname(title) {\n\tif(!title)\n\t\treturn \"\";\n\tvar pos = title.indexOf(sectionSeparator);\n\tif(pos != -1) {\n\t\treturn title.substr(pos + sectionSeparator.length);\n\t}\n\treturn \"\";\n}\nfunction getslicename(title) { \n\tif(!title)\n\t\treturn \"\";\n\tvar pos = title.indexOf(sliceSeparator);\n\tif(pos != -1) {\n\t\treturn title.substr(pos + sliceSeparator.length);\n\t}\n\treturn \"\";\n};\nfunction gettiddlername(title) {\n\tif(!title)\n\t\treturn \"\";\n\tvar pos = title.indexOf(sectionSeparator);\n\n\tif(pos != -1) {\n\t\treturn title.substr(0,pos);\n\t}\n\tpos = title.indexOf(sliceSeparator);\n\tif(pos != -1) {\n\t\treturn title.substr(0,pos);\n\t}\n\treturn title;\n}\n\nvar parserparams = function(paramString) {\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn params;\n}\nvar tabshandler = function(paramstring) {\n\tvar params = parserparams(paramstring);\n\tvar cookie = params[0].value;\n\tvar numTabs = (params.length-1)/3;\n\tvar t;\n\tvar tabslist = \"\";\n\tvar labelarray = {};\n    var promptarray = {};\n\tfor(t=0; t<numTabs; t++) {\n\t\tvar contentName = params[t*3+3].value;\n\t\ttabslist = tabslist+\" \" + contentName;\n\t\tlabelarray[contentName] = params[t*3+1].value;\n\t\tpromptarray[contentName] = params[t*3+2].value;\n\t} \n\t//Create a list of names (tiddlers, tiddler/sections, tiddler/slices), and create maps from name -> label and name -> prompt\n\t//Use json to implement maps \n\treturn '\"\"\"'+tabslist +'\"\"\" \"\"\"'+JSON.stringify(promptarray)+'\"\"\" \"\"\"'+JSON.stringify(labelarray)+'\"\"\" \"\"\"'+cookie+'\"\"\"';\n};\nvar namedapter = {tabs:'__system_tabs'};\nvar paramadapter = {\n\ttabs: tabshandler\n}\nexports.name = 'macroadapter';\nexports.namedapter = namedapter;\nexports.paramadapter = paramadapter;\n})();\n","type":"application/javascript","module-type":"module"},"$:/plugins/tiddlywiki/tw2parser/readme":{"title":"$:/plugins/tiddlywiki/tw2parser/readme","text":"This experimental plugin provides support for parsing and rendering tiddlers written in TiddlyWiki Classic format (`text/x-tiddlywiki`).\n\n[[Source code|https://github.com/TiddlyWiki/TiddlyWiki5/blob/master/plugins/tiddlywiki/tw2parser]]\n"},"$:/plugins/tiddlywiki/tw2parser/wikitextparser.js":{"title":"$:/plugins/tiddlywiki/tw2parser/wikitextparser.js","text":"/*\\\ntitle: $:/plugins/tiddlywiki/tw2parser/wikitextparser.js\ntype: application/javascript\nmodule-type: parser\n\nParses a block of tiddlywiki-format wiki text into a parse tree object. This is a transliterated version of the old TiddlyWiki code. The plan is to replace it with a new, mostly backwards compatible parser built in PEGJS.\n\nA wikitext parse tree is an array of objects with a `type` field that can be `text`,`macro` or the name of an HTML element.\n\nText nodes are represented as `{type: \"text\", value: \"A string of text\"}`.\n\nMacro nodes look like this:\n`\n{type: \"macro\", name: \"view\", params: {\n\tone: {type: \"eval\", value: \"2+2\"},\n\ttwo: {type: \"string\", value: \"twenty two\"}\n}}\n`\nHTML nodes look like this:\n`\n{type: \"div\", attributes: {\n\tsrc: \"one\"\n\tstyles: {\n\t\t\"background-color\": \"#fff\",\n\t\t\"color\": \"#000\"\n\t}\n}}\n`\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a new instance of the wiki text parser with the specified options. The\noptions are a hashmap of mandatory members as follows:\n\n\twiki: The wiki object to use to parse any cascaded content (eg transclusion)\n\nPlanned:\n\n\tenableRules: An array of names of wiki text rules to enable. If not specified, all rules are available\n\textraRules: An array of additional rule handlers to add\n\tenableMacros: An array of names of macros to enable. If not specified, all macros are available\n\textraMacros: An array of additional macro handlers to add\n*/\n\nvar WikiTextParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\tthis.autoLinkWikiWords = true;\n\tthis.installRules();\n\ttext = text || \"no text\";\n\tthis.source = text;\n\tthis.nextMatch = 0;\n\tthis.children = [];\n\tthis.tree =[];\n\tthis.output = null;\n\tthis.subWikify(this.children);\n\t// prepend tw2 macros locally to the content\n\tvar parser = this.wiki.parseTiddler(\"$:/plugins/tiddlywiki/tw2parser/macrodefs\",{parseAsInline:false});\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tchildren:this.children\n\t}];\n\t// clone the output of parser \n\tvar root = JSON.parse(JSON.stringify(parser.tree));\n\t// macros are defined in a linear tree; walk down the tree and append the source's parsed content \n\tvar baseroot = root;\n\twhile(root[0] && root[0].children && root[0].children.length !== 0 ){ \n\t\troot = root[0].children;\n\t}\n\troot[0].children[0] = this.tree[0];\n\tthis.tree = baseroot;\n};\n\n\nWikiTextParser.prototype.installRules = function() {\n\tvar rules = require(\"./wikitextrules.js\").rules,\n\t\tpattern = [];\n\tfor(var n=0; n<rules.length; n++) {\n\t\tpattern.push(\"(\" + rules[n].match + \")\");\n\t}\n\tthis.rules = rules;\n\tthis.rulesRegExp = new RegExp(pattern.join(\"|\"),\"mg\");\n};\n\n\nWikiTextParser.prototype.outputText = function(place,startPos,endPos) {\n\tif(startPos < endPos) {\n\t\tplace.push({type: \"text\",text:this.source.substring(startPos,endPos)});\n\t}\n};\n\nWikiTextParser.prototype.subWikify = function(output,terminator) {\n\t// Handle the terminated and unterminated cases separately, this speeds up wikifikation by about 30%\n\tif(terminator)\n\t\tthis.subWikifyTerm(output,new RegExp(\"(\" + terminator + \")\",\"mg\"));\n\telse\n\t\tthis.subWikifyUnterm(output);\n};\n\nWikiTextParser.prototype.subWikifyUnterm = function(output) {\n\t// subWikify can be indirectly recursive, so we need to save the old output pointer\n\tvar oldOutput = this.output;\n\tthis.output = output;\n\t// Get the first match\n\tthis.rulesRegExp.lastIndex = this.nextMatch;\n\tvar ruleMatch = this.rulesRegExp.exec(this.source);\n\twhile(ruleMatch) {\n\t\t// Output any text before the match\n\t\tif(ruleMatch.index > this.nextMatch)\n\t\t\tthis.outputText(this.output,this.nextMatch,ruleMatch.index);\n\t\t// Set the match parameters for the handler\n\t\tthis.matchStart = ruleMatch.index;\n\t\tthis.matchLength = ruleMatch[0].length;\n\t\tthis.matchText = ruleMatch[0];\n\t\tthis.nextMatch = this.rulesRegExp.lastIndex;\n\t\t// Figure out which rule matched and call its handler\n\t\tvar t;\n\t\tfor(t=1; t<ruleMatch.length; t++) {\n\t\t\tif(ruleMatch[t]) {\n\t\t\t\tthis.rules[t-1].handler(this);\n\t\t\t\tthis.rulesRegExp.lastIndex = this.nextMatch;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t// Get the next match\n\t\truleMatch = this.rulesRegExp.exec(this.source);\n\t}\n\t// Output any text after the last match\n\tif(this.nextMatch < this.source.length) {\n\t\tthis.outputText(this.output,this.nextMatch,this.source.length);\n\t\tthis.nextMatch = this.source.length;\n\t}\n\t// Restore the output pointer\n\tthis.output = oldOutput;\n};\n\nWikiTextParser.prototype.subWikifyTerm = function(output,terminatorRegExp) {\n\t// subWikify can be indirectly recursive, so we need to save the old output pointer\n\tvar oldOutput = this.output;\n\tthis.output = output;\n\t// Get the first matches for the rule and terminator RegExps\n\tterminatorRegExp.lastIndex = this.nextMatch;\n\tvar terminatorMatch = terminatorRegExp.exec(this.source);\n\tthis.rulesRegExp.lastIndex = this.nextMatch;\n\tvar ruleMatch = this.rulesRegExp.exec(terminatorMatch ? this.source.substr(0,terminatorMatch.index) : this.source);\n\twhile(terminatorMatch || ruleMatch) {\n\t\t// Check for a terminator match before the next rule match\n\t\tif(terminatorMatch && (!ruleMatch || terminatorMatch.index <= ruleMatch.index)) {\n\t\t\t// Output any text before the match\n\t\t\tif(terminatorMatch.index > this.nextMatch)\n\t\t\t\tthis.outputText(this.output,this.nextMatch,terminatorMatch.index);\n\t\t\t// Set the match parameters\n\t\t\tthis.matchText = terminatorMatch[1];\n\t\t\tthis.matchLength = terminatorMatch[1].length;\n\t\t\tthis.matchStart = terminatorMatch.index;\n\t\t\tthis.nextMatch = this.matchStart + this.matchLength;\n\t\t\t// Restore the output pointer\n\t\t\tthis.output = oldOutput;\n\t\t\treturn;\n\t\t}\n\t\t// It must be a rule match; output any text before the match\n\t\tif(ruleMatch.index > this.nextMatch)\n\t\t\tthis.outputText(this.output,this.nextMatch,ruleMatch.index);\n\t\t// Set the match parameters\n\t\tthis.matchStart = ruleMatch.index;\n\t\tthis.matchLength = ruleMatch[0].length;\n\t\tthis.matchText = ruleMatch[0];\n\t\tthis.nextMatch = this.rulesRegExp.lastIndex;\n\t\t// Figure out which rule matched and call its handler\n\t\tvar t;\n\t\tfor(t=1; t<ruleMatch.length; t++) {\n\t\t\tif(ruleMatch[t]) {\n\t\t\t\tthis.rules[t-1].handler(this);\n\t\t\t\tthis.rulesRegExp.lastIndex = this.nextMatch;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t// Get the next match\n\t\tterminatorRegExp.lastIndex = this.nextMatch;\n\t\tterminatorMatch = terminatorRegExp.exec(this.source);\n\t\truleMatch = this.rulesRegExp.exec(terminatorMatch ? this.source.substr(0,terminatorMatch.index) : this.source);\n\t}\n\t// Output any text after the last match\n\tif(this.nextMatch < this.source.length) {\n\t\tthis.outputText(this.output,this.nextMatch,this.source.length);\n\t\tthis.nextMatch = this.source.length;\n\t}\n\t// Restore the output pointer\n\tthis.output = oldOutput;\n};\n\nexports[\"text/x-tiddlywiki\"] = WikiTextParser;\n\n})();\n","type":"application/javascript","module-type":"parser"},"$:/plugins/tiddlywiki/tw2parser/wikitextrules.js":{"title":"$:/plugins/tiddlywiki/tw2parser/wikitextrules.js","text":"/*\\\ntitle: $:/plugins/tiddlywiki/tw2parser/wikitextrules.js\ntype: application/javascript\nmodule-type: module\n\nRule modules for the wikitext parser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\nvar macroadapter = require(\"$:/macros/classic/macroadapter.js\");\nvar textPrimitives = {\n\tupperLetter: \"[A-Z\\u00c0-\\u00de\\u0150\\u0170]\",\n\tlowerLetter: \"[a-z0-9_\\\\-\\u00df-\\u00ff\\u0151\\u0171]\",\n\tanyLetter:   \"[A-Za-z0-9_\\\\-\\u00c0-\\u00de\\u00df-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tanyLetterStrict: \"[A-Za-z0-9\\u00c0-\\u00de\\u00df-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tsliceSeparator: \"::\",\n\tsectionSeparator: \"##\",\n\turlPattern: \"(?:file|http|https|mailto|ftp|irc|news|data):[^\\\\s'\\\"]+(?:/|\\\\b)\",\n\tunWikiLink: \"~\",\n\tbrackettedLink: \"\\\\[\\\\[([^\\\\]]+)\\\\]\\\\]\",\n\ttitledBrackettedLink: \"\\\\[\\\\[([^\\\\[\\\\]\\\\|]+)\\\\|([^\\\\[\\\\]\\\\|]+)\\\\]\\\\]\"\n};\n\ntextPrimitives.wikiLink = \"(?:(?:\" + textPrimitives.upperLetter + \"+\" +\n\t\t\t\t\t\t\ttextPrimitives.lowerLetter + \"+\" +\n\t\t\t\t\t\t\ttextPrimitives.upperLetter +\n\t\t\t\t\t\t\ttextPrimitives.anyLetter + \"*)|(?:\" +\n\t\t\t\t\t\t\ttextPrimitives.upperLetter + \"{2,}\" +\n\t\t\t\t\t\t\ttextPrimitives.lowerLetter + \"+))\";\n\ntextPrimitives.cssLookahead = \"(?:(\" + textPrimitives.anyLetter +\n\t\"+)\\\\(([^\\\\)\\\\|\\\\n]+)(?:\\\\):))|(?:(\" + textPrimitives.anyLetter + \"+):([^;\\\\|\\\\n]+);)\";\n\ntextPrimitives.cssLookaheadRegExp = new RegExp(textPrimitives.cssLookahead,\"mg\");\n\ntextPrimitives.tiddlerForcedLinkRegExp = new RegExp(\"(?:\" + textPrimitives.titledBrackettedLink + \")|(?:\" +\n\ttextPrimitives.brackettedLink + \")|(?:\" +\n\ttextPrimitives.urlPattern + \")\",\"mg\");\n\ntextPrimitives.tiddlerAnyLinkRegExp = new RegExp(\"(\"+ textPrimitives.wikiLink + \")|(?:\" +\n\ttextPrimitives.titledBrackettedLink + \")|(?:\" +\n\ttextPrimitives.brackettedLink + \")|(?:\" +\n\ttextPrimitives.urlPattern + \")\",\"mg\");\n\n// Helper to add an attribute to an HTML node\nvar setAttr = function(node,attr,value) {\n\tif(!node.attributes) {\n\t\tnode.attributes = {};\n\t}\n\tnode.attributes[attr] ={type: \"string\", value:value} ;\n};\n\nvar inlineCssHelper = function(w) {\n\tvar styles = [];\n\ttextPrimitives.cssLookaheadRegExp.lastIndex = w.nextMatch;\n\tvar lookaheadMatch = textPrimitives.cssLookaheadRegExp.exec(w.source);\n\twhile(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {\n\t\tvar s,v;\n\t\tif(lookaheadMatch[1]) {\n\t\t\ts = lookaheadMatch[1];\n\t\t\tv = lookaheadMatch[2];\n\t\t} else {\n\t\t\ts = lookaheadMatch[3];\n\t\t\tv = lookaheadMatch[4];\n\t\t}\n\t\tif(s==\"bgcolor\")\n\t\t\ts = \"backgroundColor\";\n\t\tif(s==\"float\")\n\t\t\ts = \"cssFloat\";\n\t\tstyles.push({style: s, value: v});\n\t\tw.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n\t\ttextPrimitives.cssLookaheadRegExp.lastIndex = w.nextMatch;\n\t\tlookaheadMatch = textPrimitives.cssLookaheadRegExp.exec(w.source);\n\t}\n\treturn styles;\n};\n\nvar applyCssHelper = function(e,styles) {\n\n\tif(styles.length > 0) {\n\n\t\tfor(var t=0; t< styles.length; t++) {\n\t\t\t$tw.utils.addStyleToParseTreeNode(e,$tw.utils.roundTripPropertyName(styles[t].style),styles[t].value);\n\t\t}\n\t}\n\t\n};\n\nvar enclosedTextHelper = function(w) {\n\tthis.lookaheadRegExp.lastIndex = w.matchStart;\n\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\tvar text = lookaheadMatch[1];\n\t\tw.output.push({type:\"element\",tag:this.element,\n\t\t\tchildren:[{type: \"text\",text: lookaheadMatch[1]}]});\n\t\tw.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n\t}\n};\n\nvar insertMacroCall = function(w,output,macroName,paramString) {\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\toutput.push({\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params,\n\t\tisBlock: false\n\t});\n}\n\n\nvar isLinkExternal = function(to) {\n\tvar externalRegExp = /(?:file|http|https|mailto|ftp|irc|news|obsidian|data|skype):[^\\s'\"]+(?:\\/|\\b)/i;\n\treturn externalRegExp.test(to);\n};\nvar rules = [\n{\n\tname: \"table\",\n\tmatch: \"^\\\\|(?:[^\\\\n]*)\\\\|(?:[fhck]?)$\",\n\tlookaheadRegExp: /^\\|([^\\n]*)\\|([fhck]?)$/mg,\n\trowTermRegExp: /(\\|(?:[fhck]?)$\\n?)/mg,\n\tcellRegExp: /(?:\\|([^\\n\\|]*)\\|)|(\\|[fhck]?$\\n?)/mg,\n\tcellTermRegExp: /((?:\\x20*)\\|)/mg,\n\trowTypes: {\"c\":\"caption\", \"h\":\"thead\", \"\":\"tbody\", \"f\":\"tfoot\"},\n\thandler: function(w)\n\t{\n\t\tvar table = {type:\"element\",tag:\"table\",attributes: {\"class\": {type: \"string\", value:\"table\"}},\n\t\t\t\t\tchildren: []};\n\t\t\n\t\tw.output.push(table);\n\t\tvar prevColumns = [];\n\t\tvar currRowType = null;\n\t\tvar rowContainer;\n\t\tvar rowCount = 0;\n\t\tw.nextMatch = w.matchStart;\n\t\tthis.lookaheadRegExp.lastIndex = w.nextMatch;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\twhile(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {\n\t\t\tvar nextRowType = lookaheadMatch[2];\n\t\t\tif(nextRowType == \"k\") {\n\t\t\t\ttable.attributes[\"class\"] = lookaheadMatch[1];\n\t\t\t\tw.nextMatch += lookaheadMatch[0].length+1;\n\t\t\t} else {\n\t\t\t\tif(nextRowType != currRowType) {\n\t\t\t\t\trowContainer = {type:\"element\",tag:this.rowTypes[nextRowType],children: []};\n\t\t\t\t\ttable.children.push(rowContainer);\n\t\t\t\t\tcurrRowType = nextRowType;\n\t\t\t\t}\n\t\t\t\tif(currRowType == \"c\") {\n\t\t\t\t\t// Caption\n\t\t\t\t\tw.nextMatch++;\n\t\t\t\t\t// Move the caption to the first row if it isn't already\n\t\t\t\t\tif(table.children.length !== 1) {\n\t\t\t\t\t\ttable.children.pop(); // Take rowContainer out of the children array\n\t\t\t\t\t\ttable.children.splice(0,0,rowContainer); // Insert it at the bottom\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\trowContainer.attributes={};\n\t\t\t\t\trowContainer.attributes.align = rowCount === 0 ? \"top\" : \"bottom\";\n\t\t\t\t\tw.subWikifyTerm(rowContainer.children,this.rowTermRegExp);\n\t\t\t\t} else {\n\t\t\t\t\tvar theRow = {type:\"element\",tag:\"tr\",\n\t\t\t\t\t\tattributes: {\"class\": {type: \"string\", value:rowCount%2 ? \"oddRow\" : \"evenRow\"}},\n\t\t\t\t\t\tchildren: []};\n\t\t\t\t\t\n\t\t\t\t\trowContainer.children.push(theRow);\n\t\t\t\t\tthis.rowHandler(w,theRow.children,prevColumns);\n\t\t\t\t\trowCount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.lookaheadRegExp.lastIndex = w.nextMatch;\n\t\t\tlookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\t}\n\t},\n\trowHandler: function(w,e,prevColumns)\n\t{\n\t\tvar col = 0;\n\t\tvar colSpanCount = 1;\n\t\tvar prevCell = null;\n\t\tthis.cellRegExp.lastIndex = w.nextMatch;\n\t\tvar cellMatch = this.cellRegExp.exec(w.source);\n\t\twhile(cellMatch && cellMatch.index == w.nextMatch) {\n\t\t\tif(cellMatch[1] == \"~\") {\n\t\t\t\t// Rowspan\n\t\t\t\tvar last = prevColumns[col];\n\t\t\tif(last) {\n\t\t\t\tlast.rowSpanCount++;\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"rowspan\",last.rowSpanCount);\n\t\t\t\tvar vAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,\"valign\",\"center\");\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"valign\",vAlign);\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\tw.nextMatch = this.cellRegExp.lastIndex-1;\n\t\t\t} else if(cellMatch[1] == \">\") {\n\t\t\t\t// Colspan\n\t\t\t\tcolSpanCount++;\n\t\t\t\tw.nextMatch = this.cellRegExp.lastIndex-1;\n\t\t\t} else if(cellMatch[2]) {\n\t\t\t\t// End of row\n\t\t\t\tif(prevCell && colSpanCount > 1) {\n\t\t\t\t\tprevCell.attributes.colspan = colSpanCount;\n\t\t\t\t}\n\t\t\t\tw.nextMatch = this.cellRegExp.lastIndex;\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t// Cell\n\t\t\t\tw.nextMatch++;\n\t\t\t\tvar styles = inlineCssHelper(w);\n\t\t\t\tvar spaceLeft = false;\n\t\t\t\tvar chr = w.source.substr(w.nextMatch,1);\n\t\t\t\twhile(chr == \" \") {\n\t\t\t\t\tspaceLeft = true;\n\t\t\t\t\tw.nextMatch++;\n\t\t\t\t\tchr = w.source.substr(w.nextMatch,1);\n\t\t\t\t}\n\t\t\t\tvar cell;\n\t\t\t\tif(chr == \"!\") {\n\t\t\t\t\tcell = {type:\"element\",tag:\"th\",children: []};\n\t\t\t\t\te.push(cell);\n\t\t\t\t\tw.nextMatch++;\n\t\t\t\t} else {\n\t\t\t\t\tcell = {type:\"element\",tag:\"td\",children: []};\n\t\t\t\t\te.push(cell);\n\t\t\t\t}\n\t\t\t\tprevCell = cell;\n\t\t\t\tprevColumns[col] = {rowSpanCount:1,element:cell};\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t\tapplyCssHelper(cell,styles);\n\t\t\t\tw.subWikifyTerm(cell.children,this.cellTermRegExp);\n\t\t\t\tif(!cell.attributes) cell.attributes ={};\n\t\t\t\tif(w.matchText.substr(w.matchText.length-2,1) == \" \") // spaceRight\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",spaceLeft ? \"center\" : \"left\");\n\t\t\t\telse if(spaceLeft)\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",\"right\");\n\t\t\t\tw.nextMatch--;\n\t\t\t}\n\t\t\tcol++;\n\t\t\tthis.cellRegExp.lastIndex = w.nextMatch;\n\t\t\tcellMatch = this.cellRegExp.exec(w.source);\n\t\t}\n\t}\n},\n\n{\n\tname: \"heading\",\n\tmatch: \"^!{1,6}\",\n\ttermRegExp: /(\\n)/mg,\n\thandler: function(w)\n\t{\n\t\tvar e = {type:\"element\",tag:\"h\" + w.matchLength,children: []};\n\t\tw.output.push(e);\n\t\tw.subWikifyTerm(e.children,this.termRegExp);\n\t}\n},\n\n{\n\tname: \"list\",\n\tmatch: \"^(?:[\\\\*#;:]+)\",\n\tlookaheadRegExp: /^(?:(?:(\\*)|(#)|(;)|(:))+)/mg,\n\ttermRegExp: /(\\n)/mg,\n\thandler: function(w)\n\t{\n\t\tvar stack = [w.output];\n\t\tvar currLevel = 0, currType = null;\n\t\tvar listLevel, listType, itemType, baseType;\n\t\tw.nextMatch = w.matchStart;\n\t\tthis.lookaheadRegExp.lastIndex = w.nextMatch;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\twhile(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {\n\t\t\tif(lookaheadMatch[1]) {\n\t\t\t\tlistType = \"ul\";\n\t\t\t\titemType = \"li\";\n\t\t\t} else if(lookaheadMatch[2]) {\n\t\t\t\tlistType = \"ol\";\n\t\t\t\titemType = \"li\";\n\t\t\t} else if(lookaheadMatch[3]) {\n\t\t\t\tlistType = \"dl\";\n\t\t\t\titemType = \"dt\";\n\t\t\t} else if(lookaheadMatch[4]) {\n\t\t\t\tlistType = \"dl\";\n\t\t\t\titemType = \"dd\";\n\t\t\t}\n\t\t\tif(!baseType)\n\t\t\t\tbaseType = listType;\n\t\t\tlistLevel = lookaheadMatch[0].length;\n\t\t\tw.nextMatch += lookaheadMatch[0].length;\n\t\t\tvar t,e;\n\t\t\tif(listLevel > currLevel) {\n\t\t\t\tfor(t=currLevel; t<listLevel; t++) {\n\t\t\t\t\tvar target = stack[stack.length-1];\n\t\t\t\t\tif(currLevel !== 0 && target.children) {\n\t\t\t\t\t\ttarget = target.children[target.children.length-1];\n\t\t\t\t\t}\n\t\t\t\t\te = {type:\"element\",tag:listType,children: []};\n\t\t\t\t\ttarget.push(e);\n\t\t\t\t\tstack.push(e.children);\n\t\t\t\t}\n\t\t\t} else if(listType!=baseType && listLevel==1) {\n\t\t\t\tw.nextMatch -= lookaheadMatch[0].length;\n\t\t\t\treturn;\n\t\t\t} else if(listLevel < currLevel) {\n\t\t\t\tfor(t=currLevel; t>listLevel; t--)\n\t\t\t\t\tstack.pop();\n\t\t\t} else if(listLevel == currLevel && listType != currType) {\n\t\t\t\tstack.pop();\n\t\t\t\te = {type:\"element\",tag:listType,children: []};\n\t\t\t\tstack[stack.length-1].push(e);\n\t\t\t\tstack.push(e.children);\n\t\t\t}\n\t\t\tcurrLevel = listLevel;\n\t\t\tcurrType = listType;\n\t\t\te = {type:\"element\",tag:itemType,children: []};\n\t\t\tstack[stack.length-1].push(e);\n\t\t\tw.subWikifyTerm(e.children,this.termRegExp);\n\t\t\tthis.lookaheadRegExp.lastIndex = w.nextMatch;\n\t\t\tlookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\t}\n\t}\n},\n\n{\n\tname: \"quoteByBlock\",\n\tmatch: \"^<<<\\\\n\",\n\ttermRegExp: /(^<<<(\\n|$))/mg,\n\telement: \"blockquote\",\n\thandler:  function(w) {\n\t\tvar e = {type:\"element\",tag:this.element,children: []};\n\t\tw.output.push(e);\n\t\tw.subWikifyTerm(e.children,this.termRegExp);\n\t}\n},\n\n{\n\tname: \"quoteByLine\",\n\tmatch: \"^>+\",\n\tlookaheadRegExp: /^>+/mg,\n\ttermRegExp: /(\\n)/mg,\n\telement: \"blockquote\",\n\thandler: function(w)\n\t{\n\t\tvar stack = [];\n\t\tvar currLevel = 0;\n\t\tvar newLevel = w.matchLength;\n\t\tvar t,matched,e;\n\t\tdo {\n\t\t\tif(newLevel > currLevel) {\n\t\t\t\tfor(t=currLevel; t<newLevel; t++) {\n\t\t\t\t\tvar f = stack[stack.length-1];\n\t\t\t\t\te = {type:\"element\",tag:this.element,children: []};\n\t\t\t\t\tstack.push(e);\n\t\t\t\t\tif(t ===0){\n\t\t\t\t\t\tw.output.push(e);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tf.children.push(e);\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if(newLevel < currLevel) {\n\t\t\t\tfor(t=currLevel; t>newLevel; t--)\n\t\t\t\t\tstack.pop();\n\t\t\t}\n\t\t\tcurrLevel = newLevel;\n\t\t\tw.subWikifyTerm(stack[stack.length-1].children,this.termRegExp);\n\t\t\tstack[stack.length-1].children.push({type:\"element\",tag:\"br\"});\n\t\t\t//e.push({type:\"element\",tag:\"br\"});\n\n\t\t\tthis.lookaheadRegExp.lastIndex = w.nextMatch;\n\t\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\t\tmatched = lookaheadMatch && lookaheadMatch.index == w.nextMatch;\n\t\t\tif(matched) {\n\t\t\t\tnewLevel = lookaheadMatch[0].length;\n\t\t\t\tw.nextMatch += lookaheadMatch[0].length;\n\t\t\t}\n\t\t} while(matched);\n\t}\n},\n\n{\n\tname: \"rule\",\n\tmatch: \"^----+$\\\\n?|<hr ?/?>\\\\n?\",\n\thandler: function(w)\n\t{\n\t\tw.output.push({type:\"element\",tag:\"hr\"});\n\t}\n},\n\n{\n\tname: \"monospacedByLine\",\n\tmatch: \"^(?:/\\\\*\\\\{\\\\{\\\\{\\\\*/|\\\\{\\\\{\\\\{|//\\\\{\\\\{\\\\{|<!--\\\\{\\\\{\\\\{-->)\\\\n\",\n\telement: \"pre\",\n\thandler: function(w)\n\t{\n\t\tswitch(w.matchText) {\n\t\tcase \"/*{{{*/\\n\": // CSS\n\t\t\tthis.lookaheadRegExp = /\\/\\*\\{\\{\\{\\*\\/\\n*((?:^[^\\n]*\\n)+?)(\\n*^\\f*\\/\\*\\}\\}\\}\\*\\/$\\n?)/mg;\n\t\t\tbreak;\n\t\tcase \"{{{\\n\": // monospaced block\n\t\t\tthis.lookaheadRegExp = /^\\{\\{\\{\\n((?:^[^\\n]*\\n)+?)(^\\f*\\}\\}\\}$\\n?)/mg;\n\t\t\tbreak;\n\t\tcase \"//{{{\\n\": // plugin\n\t\t\tthis.lookaheadRegExp = /^\\/\\/\\{\\{\\{\\n\\n*((?:^[^\\n]*\\n)+?)(\\n*^\\f*\\/\\/\\}\\}\\}$\\n?)/mg;\n\t\t\tbreak;\n\t\tcase \"<!--{{{-->\\n\": //template\n\t\t\tthis.lookaheadRegExp = /<!--\\{\\{\\{-->\\n*((?:^[^\\n]*\\n)+?)(\\n*^\\f*<!--\\}\\}\\}-->$\\n?)/mg;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tenclosedTextHelper.call(this,w);\n\t}\n},\n\n{\n\tname: \"typedBlock\",\n\t\tmatch: \"^\\\\$\\\\$\\\\$(?:[^ >\\\\r\\\\n]*)\\\\r?\\\\n\",\n\tlookaheadRegExp: /^\\$\\$\\$([^ >\\r\\n]*)\\n((?:^[^\\n]*\\r?\\n)+?)(^\\f*\\$\\$\\$\\r?\\n?)/mg,\n\t//match: \"^\\\\$\\\\$\\\\$(?:[^ >\\\\r\\\\n]*)(?: *> *([^ \\\\r\\\\n]+))?\\\\r?\\\\n\",\n\t//lookaheadRegExp: /^\\$\\$\\$([^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))\\n((?:^[^\\n]*\\n)+?)(^\\f*\\$\\$\\$$\\n?)/mg,\n\thandler: function(w)\n\t{\n\t\tthis.lookaheadRegExp.lastIndex = w.matchStart;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\t\t// The wikitext parsing infrastructure is horribly unre-entrant\n\t\t\tvar parseType = lookaheadMatch[1],\n\t\t\t\trenderType ,//= this.match[2],\n\t\t\t\ttext = lookaheadMatch[2],\n\t\t\t\toldOutput = w.output,\n\t\t\t\toldSource = w.source,\n\t\t\t\toldNextMatch = w.nextMatch,\n\t\t\t\toldChildren = w.children;\n\t\t\t// Parse the block according to the specified type\n\t\t\tvar parser = $tw.wiki.parseText(parseType,text.toString(),{defaultType: \"text/plain\"});\n\n\t\t\tw.output = oldOutput;\n\t\t\tw.source = oldSource;\n\t\t\tw.nextMatch = oldNextMatch;\n\t\t\tw.children = oldChildren;\n\t\t\tfor(var i=0; i<parser.tree.length; i++) {\n\t\t\t\tw.output.push(parser.tree[i]);\n\t\t\t}\n\t\t\tw.nextMatch = this.lookaheadRegExp.lastIndex;\n\t\t}\n\t}\n},\n\n{\n\tname: \"wikifyComment\",\n\tmatch: \"^(?:/\\\\*\\\\*\\\\*|<!---)\\\\n\",\n\thandler: function(w)\n\t{\n\t\tvar termRegExp = (w.matchText == \"/***\\n\") ? (/(^\\*\\*\\*\\/\\n)/mg) : (/(^--->\\n)/mg);\n\t\tw.subWikifyTerm(w.output,termRegExp);\n\t}\n},\n\n{\n\tname: \"macro\",\n\tmatch: \"<<\",\n\tlookaheadRegExp: /<<(?:([!@£\\$%\\^\\&\\*\\(\\)`\\~'\"\\|\\\\\\/;\\:\\.\\,\\+\\=\\-\\_\\{\\}])|([^>\\s]+))(?:\\s*)((?:[^>]|(?:>(?!>)))*)>>/mg,\n\thandler: function(w)\n\t{\n\t\tthis.lookaheadRegExp.lastIndex = w.matchStart;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source),\n\t\t\tname;\n\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\t\tname = lookaheadMatch[1] || lookaheadMatch[2];\n\t\t\tvar params = lookaheadMatch[3], nameold =name;\n\t\t\tif(name) {\n\t\t\t\tif(!!macroadapter.paramadapter[name]) {\n\t\t\t\t\tparams=macroadapter.paramadapter[name](params);\n\t\t\t\t\t//alert(\"going out as \"+params);\n\t\t\t\t}\n\t\t\t\tif(!!macroadapter.namedapter[name]) {\n\t\t\t\t\tname=macroadapter.namedapter[name];\n\t\t\t\t}\n\t\t\t\tw.nextMatch = this.lookaheadRegExp.lastIndex;\n\t\t\t\tinsertMacroCall(w,w.output,name,params);\n\t\t\t}\n\t\t}\n\t}\n},\n\n\n{\n\tname: \"prettyLink\",\n\tmatch: \"\\\\[\\\\[\",\n\tlookaheadRegExp: /\\[\\[(.*?)(?:\\|(~)?(.*?))?\\]\\]/mg,\n\thandler: function(w)\n\t{\n\t\tthis.lookaheadRegExp.lastIndex = w.matchStart;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\t\tvar text = lookaheadMatch[1],\n\t\t\t\tlink = text;\n\t\t\tif(lookaheadMatch[3]) {\n\t\t\t\t// Pretty bracketted link\n\t\t\t\tlink = lookaheadMatch[3];\n\t\t\t}\n\tif(isLinkExternal(link)) {\n\t\tw.output.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: link},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t});\n\t} else {\n\t\tw.output.push({\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: link}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t});\n\t}\n\n\t\t\tw.nextMatch = this.lookaheadRegExp.lastIndex;\n\t\t}\n\t}\n},\n{\n\tname: \"wikiLink\",\n\tmatch: textPrimitives.unWikiLink+\"?\"+textPrimitives.wikiLink,\n\thandler: function(w)\n\t{\n\t\tif(w.matchText.substr(0,1) == textPrimitives.unWikiLink) {\n\t\t\tw.outputText(w.output,w.matchStart+1,w.nextMatch);\n\t\t\treturn;\n\t\t}\n\t\tif(w.matchStart > 0) {\n\t\t\tvar preRegExp = new RegExp(textPrimitives.anyLetterStrict,\"mg\");\n\t\t\tpreRegExp.lastIndex = w.matchStart-1;\n\t\t\tvar preMatch = preRegExp.exec(w.source);\n\t\t\tif(preMatch.index == w.matchStart-1) {\n\t\t\t\tw.outputText(w.output,w.matchStart,w.nextMatch);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif(w.autoLinkWikiWords) {\n\t\t\tw.output.push({\n\t\t\t\ttype: \"link\",\n\t\t\t\tattributes: {\n\t\t\t\t\tto: {type: \"string\", value: w.matchText}\n\t\t\t\t},\n\t\t\t\tchildren: [{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: w.source.substring(w.matchStart,w.nextMatch)\n\t\t\t\t}]\n\t\t\t});\n\t\t} else {\t\n\t\t\tw.outputText(w.output,w.matchStart,w.nextMatch);\n\t\t}\n\t}\n},\n\n{\n\tname: \"urlLink\",\n\tmatch: textPrimitives.urlPattern,\n\thandler: function(w)\n\t{\n\t\t\tw.output.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: w.matchText},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: w.source.substring(w.matchStart,w.nextMatch)\n\t\t\t}]\n\t\t});\n\n\t}\n},\n\n{\n\tname: \"image\",\n\tmatch: \"\\\\[[<>]?[Ii][Mm][Gg]\\\\[\",\n\t// [<] sequence below is to avoid lessThan-questionMark sequence so TiddlyWikis can be included in PHP files\n\tlookaheadRegExp: /\\[([<]?)(>?)[Ii][Mm][Gg]\\[(?:([^\\|\\]]+)\\|)?([^\\[\\]\\|]+)\\](?:\\[([^\\]]*)\\])?\\]/mg,\n\thandler: function(w)\n\t{\n\t\tvar node = {\n\t\t\ttype: \"image\",\n\t\t\tattributes: {}\n\t\t};\n\t\tthis.lookaheadRegExp.lastIndex = w.matchStart;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source),\n\t\t\timageParams = {},\n\t\t\tlinkParams = {};\n\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\t\tif(lookaheadMatch[1]) {\n\t\t\t\tnode.attributes.class = {type: \"string\", value: \"classic-image-left\"};\n\t\t\t} else if(lookaheadMatch[2]) {\n\t\t\t\tnode.attributes.class  = {type: \"string\", value: \"classic-image-right\"};\n\t\t\t}\n\t\t\tif(lookaheadMatch[3]) {\n\t\t\t\tnode.attributes.tooltip = {type: \"string\", value: lookaheadMatch[3]};\n\t\t\t}\n\t\t\tnode.attributes.source = {type: \"string\", value: lookaheadMatch[4]};\n\t\t\tif(lookaheadMatch[5]) {\n\t\t\t\tif(isLinkExternal(lookaheadMatch[5])) {\n\t\t\t\t\tw.output.push({\n\t\t\t\t\t\ttype: \"element\",\n\t\t\t\t\t\ttag: \"a\",\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\thref: {type: \"string\", value:lookaheadMatch[5]},\n\t\t\t\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\t\t\t\ttarget: {type: \"string\", value: \"_blank\"}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchildren: [node]\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tw.output.push({\n\t\t\t\t\t\ttype: \"link\",\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tto: {type: \"string\", value: lookaheadMatch[5]}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchildren: [node]\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tw.output.push(node);\n\t\t\t}\n\t\t\tw.nextMatch = this.lookaheadRegExp.lastIndex;\n\t\t}\n\t}\n},\n\n{\n\tname: \"html\",\n\tmatch: \"<[Hh][Tt][Mm][Ll]>\",\n\tlookaheadRegExp: /<[Hh][Tt][Mm][Ll]>((?:.|\\n)*?)<\\/[Hh][Tt][Mm][Ll]>/mg,\n\thandler: function(w)\n\t{\n\t\tthis.lookaheadRegExp.lastIndex = w.matchStart;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\t\tw.output.push({\ttype:\"raw\", html:lookaheadMatch[1]});\n\t\t\tw.nextMatch = this.lookaheadRegExp.lastIndex;\n\t\t}\n\t}\n},\n\n{\n\tname: \"commentByBlock\",\n\tmatch: \"/%\",\n\tlookaheadRegExp: /\\/%((?:.|\\n)*?)%\\//mg,\n\thandler: function(w)\n\t{\n\t\tthis.lookaheadRegExp.lastIndex = w.matchStart;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n\t\t\tw.nextMatch = this.lookaheadRegExp.lastIndex;\n\t}\n},\n\n{\n\tname: \"characterFormat\",\n\tmatch: \"''|//|__|\\\\^\\\\^|~~|--(?!\\\\s|$)|\\\\{\\\\{\\\\{|`\",\n\thandler: function(w)\n\t{\n\t\tvar e,lookaheadRegExp,lookaheadMatch;\n\t\tswitch(w.matchText) {\n\t\tcase \"''\":\n\t\t\te = {type:\"element\",tag:\"strong\",children: []};\n\t\t\tw.output.push(e);\n\t\t\tw.subWikifyTerm(e.children,/('')/mg);\n\t\t\tbreak;\n\t\tcase \"//\":\n\t\t\te = {type:\"element\",tag:\"em\",children: []};\n\t\t\tw.output.push(e);\n\t\t\tw.subWikifyTerm(e.children,/(\\/\\/)/mg);\n\t\t\tbreak;\n\t\tcase \"__\":\n\t\t\te = {type:\"element\",tag:\"u\",children: []};\n\t\t\tw.output.push(e);\n\t\t\tw.subWikifyTerm(e.children,/(__)/mg);\n\t\t\tbreak;\n\t\tcase \"^^\":\n\t\t\te = {type:\"element\",tag:\"sup\",children: []};\n\t\t\tw.output.push(e);\n\t\t\tw.subWikifyTerm(e.children,/(\\^\\^)/mg);\n\t\t\tbreak;\n\t\tcase \"~~\":\n\t\t\te = {type:\"element\",tag:\"sub\",children: []};\n\t\t\tw.output.push(e);\n\t\t\tw.subWikifyTerm(e.children,/(~~)/mg);\n\t\t\tbreak;\n\t\tcase \"--\":\n\t\t\te = {type:\"element\",tag:\"strike\",children: []};\n\t\t\tw.output.push(e);\n\t\t\tw.subWikifyTerm(e.children,/(--)/mg);\n\t\t\tbreak;\n\t\tcase \"`\":\n\t\t\tlookaheadRegExp = /`((?:.|\\n)*?)`/mg;\n\t\t\tlookaheadRegExp.lastIndex = w.matchStart;\n\t\t\tlookaheadMatch = lookaheadRegExp.exec(w.source);\n\t\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\t\t\tw.output.push({type:\"element\",tag:\"code\",\n\t\t\t\t\tchildren:[{type: \"text\",text: lookaheadMatch[1]}]});\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"{{{\":\n\t\t\tlookaheadRegExp = /\\{\\{\\{((?:.|\\n)*?)\\}\\}\\}/mg;\n\t\t\tlookaheadRegExp.lastIndex = w.matchStart;\n\t\t\tlookaheadMatch = lookaheadRegExp.exec(w.source);\n\t\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\t\t\tw.output.push({type:\"element\",tag:\"code\",\n\t\t\t\t\tchildren:[{type: \"text\",text: lookaheadMatch[1]}]});\n\t\t\t\tw.nextMatch = lookaheadRegExp.lastIndex;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n},\n\n{\n\tname: \"customFormat\",\n\tmatch: \"@@|\\\\{\\\\{\",\n\thandler: function(w)\n\t{\n\t\tswitch(w.matchText) {\n\t\tcase \"@@\":\n\t\t\tvar e = {type:\"element\",tag:\"span\",children: []};\n\t\t\tw.output.push(e);\n\t\t\tvar styles = inlineCssHelper(w);\n\t\t\tif(styles.length === 0)\n\t\t\t\tsetAttr(e,\"class\",\"marked\");\n\t\t\telse\n\t\t\t\tapplyCssHelper(e,styles);\n\t\t\tw.subWikifyTerm(e.children,/(@@)/mg);\n\t\t\tbreak;\n\t\tcase \"{{\":\n\t\t\tvar lookaheadRegExp = /\\{\\{[\\s]*([\\-\\w]+[\\-\\s\\w]*)[\\s]*\\{(\\n?)/mg;\n\t\t\tlookaheadRegExp.lastIndex = w.matchStart;\n\t\t\tvar lookaheadMatch = lookaheadRegExp.exec(w.source);\n\t\t\tif(lookaheadMatch) {\n\t\t\t\tw.nextMatch = lookaheadRegExp.lastIndex;\n\t\t\t\te = {type:\"element\",tag:lookaheadMatch[2] == \"\\n\" ? \"div\" : \"span\",\n\t\t\t\t\tattributes: {\"class\": {type: \"string\", value:lookaheadMatch[1]}},children: []};\n\t\t\t\tw.output.push(e);\n\t\t\t\tw.subWikifyTerm(e.children,/(\\}\\}\\})/mg);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n},\n\n{\n\tname: \"mdash\",\n\tmatch: \"--\",\n\thandler: function(w)\n\t{\n\t\tw.output.push({type: \"entity\", entity: \"&mdash;\"});\n\t}\n},\n\n{\n\tname: \"lineBreak\",\n\tmatch: \"\\\\n|<br ?/?>\",\n\thandler: function(w)\n\t{\n\t\tw.output.push({type:\"element\",tag:\"br\"});\n\t}\n},\n\n{\n\tname: \"rawText\",\n\tmatch: \"\\\"{3}|<nowiki>\",\n\tlookaheadRegExp: /(?:\\\"{3}|<nowiki>)((?:.|\\n)*?)(?:\\\"{3}|<\\/nowiki>)/mg,\n\thandler: function(w)\n\t{\n\t\tthis.lookaheadRegExp.lastIndex = w.matchStart;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\t\tw.output.push({type: \"text\",text: lookaheadMatch[1]\n\t\t\t});\n\t\t\tw.nextMatch = this.lookaheadRegExp.lastIndex;\n\t\t}\n\t}\n},\n\n{\n\tname: \"htmlEntitiesEncoding\",\n\tmatch: \"&#?[a-zA-Z0-9]{2,8};\",\n\thandler: function(w)\n\t{\n\t\tw.output.push({type: \"entity\", entity: w.matchText});\n\t}\n}\n\n];\n\nexports.rules = rules;\n\n})();\n","type":"application/javascript","module-type":"module"}}}
no

{
    "tiddlers": {
        "$:/info/browser": {
            "title": "$:/info/browser",
            "text": "no"
        },
        "$:/info/node": {
            "title": "$:/info/node",
            "text": "yes"
        },
        "$:/info/startup-timestamp": {
            "title": "$:/info/startup-timestamp",
            "text": "20241031093721852"
        }
    }
}
{"tiddlers":{"$:/themes/tiddlywiki/snowwhite/base":{"title":"$:/themes/tiddlywiki/snowwhite/base","tags":"[[$:/tags/Stylesheet]]","text":"\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n.tc-sidebar-header {\n\ttext-shadow: 0 1px 0 <<colour sidebar-foreground-shadow>>;\n}\n\n.tc-tiddler-info {\n\t<<box-shadow \"inset 1px 2px 3px rgba(0,0,0,0.1)\">>\n}\n\n@media screen {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow \"1px 1px 5px rgba(0, 0, 0, 0.3)\">>\n\t}\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow none>>\n\t}\n}\n\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\n\t<<transition \"fill 150ms ease-in-out\">>\n}\n\n.tc-tiddler-controls button.tc-selected,\n.tc-page-controls button.tc-selected {\n\t<<filter \"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\">>\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame select.tc-edit-texteditor {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-edit-tags {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\n\t<<box-shadow \"none\">>\n\tborder: none;\n\toutline: none;\n}\n\ntextarea.tc-edit-texteditor {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\ncanvas.tc-edit-bitmapeditor  {\n\t<<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-drop-down {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-block-dropdown {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-modal {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n}\n\n.tc-modal-footer {\n\tborder-radius: 0 0 6px 6px;\n\t<<box-shadow \"inset 0 1px 0 #fff\">>;\n}\n\n\n.tc-alert {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.6)\">>\n}\n\n.tc-notification {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\n}\n\n.tc-sidebar-lists .tc-tab-set .tc-tab-divider {\n\tborder-top: none;\n\theight: 1px;\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%\">>\n}\n\n.tc-message-box img {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n\n.tc-plugin-info {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n"}}}
{"tiddlers":{"$:/themes/tiddlywiki/vanilla/themetweaks":{"title":"$:/themes/tiddlywiki/vanilla/themetweaks","tags":"$:/tags/ControlPanel/Appearance","caption":"{{$:/language/ThemeTweaks/ThemeTweaks}}","text":"\\define lingo-base() $:/language/ThemeTweaks/\n\n\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n\\define backgroundimage-dropdown()\n<div class=\"tc-drop-down-wrapper\">\n<$set name=\"state\" value=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">>>\n<$button popup=<<state>> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<state>> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\" class=\"tc-popup-keep\">\n<div class=\"tc-drop-down\" style=\"text-align:center;\">\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"\n\t$value=<<imageTitle>>\n/>\n\n<$action-deletetiddler $tiddler=<<state>>/>\n\n\"\"\"/>\n</div>\n</$reveal>\n</$set>\n</div>\n\\end\n\n\\define backgroundimageattachment-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\" default=\"scroll\">\n<option value=\"scroll\"><<lingo Settings/BackgroundImageAttachment/Scroll>></option>\n<option value=\"fixed\"><<lingo Settings/BackgroundImageAttachment/Fixed>></option>\n</$select>\n\\end\n\n\\define backgroundimagesize-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\" default=\"scroll\">\n<option value=\"auto\"><<lingo Settings/BackgroundImageSize/Auto>></option>\n<option value=\"cover\"><<lingo Settings/BackgroundImageSize/Cover>></option>\n<option value=\"contain\"><<lingo Settings/BackgroundImageSize/Contain>></option>\n</$select>\n\\end\n\n<<lingo ThemeTweaks/Hint>>\n\n! <<lingo Options>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><<lingo Options/SidebarLayout>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><option value=\"fixed-fluid\"><<lingo Options/SidebarLayout/Fixed-Fluid>></option><option value=\"fluid-fixed\"><<lingo Options/SidebarLayout/Fluid-Fixed>></option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><<lingo Options/StickyTitles>></$link><br>//<<lingo Options/StickyTitles/Hint>>// |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><option value=\"no\">{{$:/language/No}}</option><option value=\"yes\">{{$:/language/Yes}}</option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><<lingo Options/CodeWrapping>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><option value=\"pre\">{{$:/language/No}}</option><option value=\"pre-wrap\">{{$:/language/Yes}}</option></$select> |\n\n! <<lingo Settings>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"><<lingo Settings/FontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\"><<lingo Settings/CodeFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\"><<lingo Settings/EditorFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"><<lingo Settings/BackgroundImage>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" default=\"\" tag=\"input\"/> |<<backgroundimage-dropdown>> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\"><<lingo Settings/BackgroundImageAttachment>></$link> |<<backgroundimageattachment-dropdown>> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\"><<lingo Settings/BackgroundImageSize>></$link> |<<backgroundimagesize-dropdown>> | |\n\n! <<lingo Metrics>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\"><<lingo Metrics/FontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\"><<lingo Metrics/LineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\"><<lingo Metrics/BodyFontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\"><<lingo Metrics/BodyLineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\"><<lingo Metrics/StoryLeft>></$link><br>//<<lingo Metrics/StoryLeft/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\"><<lingo Metrics/StoryTop>></$link><br>//<<lingo Metrics/StoryTop/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\"><<lingo Metrics/StoryRight>></$link><br>//<<lingo Metrics/StoryRight/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\"><<lingo Metrics/StoryWidth>></$link><br>//<<lingo Metrics/StoryWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"><<lingo Metrics/TiddlerWidth>></$link><br>//<<lingo Metrics/TiddlerWidth/Hint>>//<br> |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\"><<lingo Metrics/SidebarBreakpoint>></$link><br>//<<lingo Metrics/SidebarBreakpoint/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\"><<lingo Metrics/SidebarWidth>></$link><br>//<<lingo Metrics/SidebarWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\" default=\"\" tag=\"input\"/> |\n"},"$:/themes/tiddlywiki/vanilla/base":{"title":"$:/themes/tiddlywiki/vanilla/base","tags":"[[$:/tags/Stylesheet]]","list-before":"","code-body":"yes","text":"\\define custom-background-datauri()\n<$set name=\"background\" value={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}>\n<$list filter=\"[<background>is[image]]\">\n`background: url(`\n<$list filter=\"[<background>!has[_canonical_uri]]\">\n`\"`<$macrocall $name=\"datauri\" title={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}/>`\"`\n</$list>\n<$list filter=\"[<background>has[_canonical_uri]]\">\n`\"`<$view tiddler={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}} field=\"_canonical_uri\"/>`\"`\n</$list>\n`) center center;`\n`background-attachment: `{{$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment}}`;\n-webkit-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-moz-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-o-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\nbackground-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;`\n</$list>\n</$set>\n\\end\n\n\\define sidebarbreakpoint()\n<$text text={{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}/>\n\\end\n\n\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\n\\end\n\n\\define if-fluid-fixed(text,hiddenSidebarText)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" type=\"match\" text=\"fluid-fixed\">\n$text$\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">\n$hiddenSidebarText$\n</$reveal>\n</$reveal>\n\\end\n\n\\define if-editor-height-fixed(then,else)\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n$then$\n</$reveal>\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n$else$\n</$reveal>\n\\end\n\n\\define set-type-selector-min-width()\n<$set name=\"typeLength\" value={{{ [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]get[name]length[]maxall[]] }}}>\n\n\t.tc-type-selector-dropdown-wrapper {\n\t\tmin-width: calc(<<typeLength>>ch + 4em);\n\t}\n\n\t.tc-type-selector-dropdown-wrapper input.tc-edit-typeeditor {\n\t\tmin-width: <<typeLength>>ch;\n\t}\n\n</$set>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/*\n** Start with the normalize CSS reset, and then belay some of its effects\n*/\n\n{{$:/themes/tiddlywiki/vanilla/reset}}\n\ninput[type=\"search\"] {\n\toutline-offset: initial;\n}\n\nbutton:focus-visible, input:focus-visible, textarea:focus-visible, select:focus-visible {\n\toutline: 2px solid <<colour primary>>;\n\toutline-offset: -2px;\n\tborder-radius: 0.25em;\n}\n\nbutton:-moz-focusring, input:-moz-focusring, textarea:-moz-focusring, select:-moz-focusring {\n\toutline: 2px solid <<colour primary>>;\n\toutline-offset: -2px;\n\tborder-radius: 0.25em;\n}\n\n/*\n** Button default styles. Makes them look consistent for all browsers\n*/\nhtml button {\n\tline-height: 1.2;\n\tcolor: <<colour button-foreground>>;\n\tfill: <<colour button-foreground>>;\n\tbackground: <<colour button-background>>;\n\tborder-color: <<colour button-border>>;\n}\n\nbutton:disabled svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml, body {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\n\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour page-background>>;\n}\n\nbody.tc-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\n\tword-wrap: break-word;\n\t<<custom-background-datauri>>\n\tcolor: <<colour foreground>>;\n\tbackground-color: <<colour page-background>>;\n\tfill: <<colour foreground>>;\n}\n\n<<if-background-attachment \"\"\"\n\nbody.tc-body {\n\tbackground-color: transparent;\n}\n\n\"\"\">>\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n\tfont-size: 2em;\n}\n\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: normal;\n}\n\npre {\n\tdisplay: block;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\tword-break: normal;\n\tword-wrap: break-word;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tbackground-color: <<colour pre-background>>;\n\tborder: 1px solid <<colour pre-border>>;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\ncode {\n\tcolor: <<colour code-foreground>>;\n\tbackground-color: <<colour code-background>>;\n\tborder: 1px solid <<colour code-border>>;\n\twhite-space: pre-wrap;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\nblockquote {\n\tborder-left: 5px solid <<colour blockquote-bar>>;\n\tmargin-left: 25px;\n\tpadding-left: 10px;\n\tquotes: \"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";\n}\n\nblockquote > div {\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\nblockquote.tc-big-quote {\n\tfont-family: Georgia, serif;\n\tposition: relative;\n\tbackground: <<colour pre-background>>;\n\tborder-left: none;\n\tmargin-left: 50px;\n\tmargin-right: 50px;\n\tpadding: 10px;\n\tborder-radius: 8px;\n}\n\nblockquote.tc-big-quote cite:before {\n\tcontent: \"\\2014 \\2009\";\n}\n\nblockquote.tc-big-quote:before {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: open-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n\tleft: -50px;\n\ttop: 42px;\n}\n\nblockquote.tc-big-quote:after {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: close-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n\tright: -80px;\n\tbottom: -20px;\n}\n\ndl dt {\n\tfont-weight: bold;\n\tmargin-top: 6px;\n}\n\ntextarea,\ninput[type=text],\ninput[type=search],\ninput[type=number],\ninput[type=password],\ninput[type=email],\ninput[type=tel],\ninput[type=url],\ninput[type=\"\"],\ninput:not([type]) {\n\tcolor: <<colour foreground>>;\n\tbackground: <<colour background>>;\n}\n\ninput[type=\"checkbox\"] {\n\tvertical-align: middle;\n}\n\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-results-button,\ninput[type=\"search\"]::-webkit-search-results-decoration {\n\t-webkit-appearance:none;\n}\n\n.tc-muted {\n\tcolor: <<colour muted-foreground>>;\n}\n\nsvg.tc-image-button {\n\tpadding: 0px 1px 1px 0px;\n}\n\n.tc-icon-wrapper > svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\nkbd {\n\tdisplay: inline-block;\n\tpadding: 3px 5px;\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tcolor: <<colour foreground>>;\n\tvertical-align: middle;\n\tbackground-color: <<colour background>>;\n\tborder: solid 1px <<colour muted-foreground>>;\n\tborder-bottom-color: <<colour muted-foreground>>;\n\tborder-radius: 3px;\n\tbox-shadow: inset 0 -1px 0 <<colour muted-foreground>>;\n}\n\n::selection {\n\tbackground-color: Highlight;\n\tcolor: HighlightText;\n\tbackground-color: <<colour selection-background>>;\n\tcolor: <<colour selection-foreground>>;\n}\n\n.tc-inline-style {\n\tbackground: <<colour highlight-background>>;\n\tcolor: <<colour highlight-foreground>>;\n}\n\n/* Markdown uses mark element to highlight */\n\nmark {\n\tbackground: <<colour highlight-background>>;\n\tcolor: <<colour highlight-foreground>>;\n}\n\nform.tc-form-inline {\n\tdisplay: inline;\n}\n\n/*\nMarkdown likes putting code elements inside pre elements\n*/\npre > code {\n\tdisplay: block;\n\tpadding: 0.5em;\n\tborder: none;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tbackground-color: inherit;\n\tcolor: inherit;\n\toverflow-x: auto;\n}\n\n/*\nTable defaults\n*/\n\ntable {\n\tborder: 1px solid <<colour table-border>>;\n\twidth: auto;\n\tmax-width: 100%;\n\tcaption-side: bottom;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\t/* next 2 elements needed, since normalize 8.0.1 */\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n}\n\ntable th, table td {\n\tpadding: 0 7px 0 7px;\n\tborder-top: 1px solid <<colour table-border>>;\n\tborder-left: 1px solid <<colour table-border>>;\n}\n\ntable thead tr td, table th {\n\tbackground-color: <<colour table-header-background>>;\n\tfont-weight: bold;\n}\n\ntable tfoot tr td {\n\tbackground-color: <<colour table-footer-background>>;\n}\n\n/*\nTable utility classes\n*/\n\n/* Remove borders from table as used in eg: GettingStarted*/\n.tc-table-no-border,\n.tc-table-no-border th,\n.tc-table-no-border td {\n\tborder: initial;\n}\n\n/* First column in table width will fit to text.*/\n/* This rule makes most sense with tc-first-link-nowrap*/\n.tc-first-col-min-width td:nth-child(1) {\n\twidth: 1%;\n}\n\n/*\n** Utility classes work well with tables but also for other containers\n*/\n\n/* First link A element will not wrap */\n.tc-first-link-nowrap:first-of-type a {\n\twhite-space: nowrap;\n}\n\n/* Move the table to the center of the container */\n.tc-center {\n\tmargin-left: auto;\n\tmargin-right: auto;\n}\n\n.tc-max-width {\n\twidth: 100%;\n}\n\n.tc-max-width-80 {\n\tmax-width: 80%;\n}\n\n/* Allow input and textarea to look like the ControlPanel inputs */\n.tc-edit-max-width input,\n.tc-edit-max-width textarea {\n\twidth: 100%;\n\tpadding: 3px;\n}\n\n/*\nCSV parser plugin\n*/\n\n.tc-csv-table {\n\twhite-space: nowrap;\n}\n\n.tc-csv-table th,\n.tc-csv-table td {\n\twhite-space: pre-line;\n}\n\n/*\nTiddler frame in story river\n*/\n\n.tc-tiddler-frame img,\n.tc-tiddler-frame svg,\n.tc-tiddler-frame canvas,\n.tc-tiddler-frame embed,\n.tc-tiddler-frame iframe {\n\tmax-width: 100%;\n}\n\n.tc-tiddler-body > embed,\n.tc-tiddler-body > iframe {\n\twidth: 100%;\n\theight: 600px;\n}\n\n:root {\n\tcolor-scheme: {{{ [{$:/palette}get[color-scheme]] ~light }}};\n}\n\n/*\n** Links\n*/\n\nbutton.tc-tiddlylink,\na.tc-tiddlylink {\n\ttext-decoration: none;\n\tfont-weight: 500;\n\tcolor: <<colour tiddler-link-foreground>>;\n\t-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */\n\t-webkit-touch-callout: none; /* Prevents long presses from bringing up a link preview */\n}\n\n.tc-sidebar-lists a.tc-tiddlylink {\n\tcolor: <<colour sidebar-tiddler-link-foreground>>;\n}\n\n.tc-sidebar-lists a.tc-tiddlylink:hover {\n\tcolor: <<colour sidebar-tiddler-link-foreground-hover>>;\n}\n\nbutton.tc-tiddlylink:hover,\na.tc-tiddlylink:hover {\n\ttext-decoration: underline;\n}\n\na.tc-tiddlylink-resolves {\n}\n\na.tc-tiddlylink-shadow {\n\tfont-weight: bold;\n}\n\na.tc-tiddlylink-shadow.tc-tiddlylink-resolves {\n\tfont-weight: normal;\n}\n\na.tc-tiddlylink-missing {\n\tfont-style: italic;\n}\n\na.tc-tiddlylink-external {\n\ttext-decoration: underline;\n\tcolor: <<colour external-link-foreground>>;\n\tbackground-color: <<colour external-link-background>>;\n}\n\na.tc-tiddlylink-external:visited {\n\tcolor: <<colour external-link-foreground-visited>>;\n\tbackground-color: <<colour external-link-background-visited>>;\n}\n\na.tc-tiddlylink-external:hover {\n\tcolor: <<colour external-link-foreground-hover>>;\n\tbackground-color: <<colour external-link-background-hover>>;\n}\n\n.tc-drop-down a.tc-tiddlylink:hover {\n\tcolor: <<colour tiddler-link-background>>;\n}\n\n/*\n** Drag and drop styles\n*/\n\n.tc-tiddler-dragger {\n\tposition: relative;\n\tz-index: -10000;\n}\n\n.tc-tiddler-dragger-inner {\n\tposition: absolute;\n\ttop: -1000px;\n\tleft: -1000px;\n\tdisplay: inline-block;\n\tpadding: 8px 20px;\n\tfont-size: 16.9px;\n\tfont-weight: bold;\n\tline-height: 20px;\n\tcolor: <<colour dragger-foreground>>;\n\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 1);\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour dragger-background>>;\n\tborder-radius: 20px;\n}\n\n.tc-tiddler-dragger-cover {\n\tposition: absolute;\n\tbackground-color: <<colour page-background>>;\n}\n\n.tc-page-container > .tc-dropzone {\n\tmin-height: 100vh;\n}\n\n.tc-dropzone {\n\tposition: relative;\n}\n\n.tc-dropzone.tc-dragover:before {\n\tz-index: 10000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour dropzone-background>>;\n\ttext-align: center;\n\tcontent: \"<<lingo DropMessage>>\";\n}\n\n.tc-droppable > .tc-droppable-placeholder {\n\tdisplay: none;\n}\n\n.tc-droppable.tc-dragover > .tc-droppable-placeholder {\n\tdisplay: block;\n\tborder: 2px dashed <<colour dropzone-background>>;\n}\n\n.tc-draggable {\n\tcursor: move;\n}\n\n.tc-sidebar-tab-open .tc-droppable-placeholder, .tc-tagged-draggable-list .tc-droppable-placeholder,\n.tc-links-draggable-list .tc-droppable-placeholder {\n\tline-height: 2em;\n\theight: 2em;\n}\n\n.tc-sidebar-tab-open-item {\n\tposition: relative;\n}\n\n.tc-sidebar-tab-open .tc-btn-invisible.tc-btn-mini svg {\n\tfont-size: 0.7em;\n\tfill: <<colour muted-foreground>>;\n}\n\n/*\n** Plugin reload warning\n*/\n\n.tc-plugin-reload-warning {\n\tz-index: 1000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour alert-background>>;\n\ttext-align: center;\n}\n\n/*\n** Buttons\n*/\n\nbutton svg, button img, label svg, label img {\n\tvertical-align: middle;\n}\n\n.tc-btn-invisible {\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\tcursor: pointer;\n\tcolor: <<colour foreground>>;\n\tfill: <<colour foreground>>;\n}\n\nbutton:disabled.tc-btn-invisible  {\n\tcursor: default;\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-btn-boxed {\n\tfont-size: 0.6em;\n\tpadding: 0.2em;\n\tmargin: 1px;\n\tbackground: none;\n\tborder: 1px solid <<colour tiddler-controls-foreground>>;\n\tborder-radius: 0.25em;\n}\n\nhtml body.tc-body .tc-btn-boxed svg {\n\tfont-size: 1.6666em;\n}\n\n.tc-btn-boxed:hover {\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n}\n\nhtml body.tc-body .tc-btn-boxed:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded {\n\tfont-size: 0.5em;\n\tline-height: 2;\n\tpadding: 0em 0.3em 0.2em 0.4em;\n\tmargin: 1px;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n\tborder-radius: 2em;\n}\n\nhtml body.tc-body .tc-btn-rounded svg {\n\tfont-size: 1.6666em;\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded:hover {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tcolor: <<colour muted-foreground>>;\n}\n\nhtml body.tc-body .tc-btn-rounded:hover svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-icon svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n\n.tc-btn-text {\n\tmargin-left: 7px;\n}\n\n/* used for documentation \"fake\" buttons */\n.tc-btn-standard {\n\tline-height: 1.8;\n\tcolor: #667;\n\tbackground-color: #e0e0e0;\n\tborder: 1px solid #888;\n\tpadding: 2px 1px 2px 1px;\n\tmargin: 1px 4px 1px 4px;\n}\n\n.tc-btn-big-green {\n\tdisplay: inline-block;\n\tpadding: 8px;\n\tmargin: 4px 8px 4px 8px;\n\tbackground: <<colour download-background>>;\n\tcolor: <<colour download-foreground>>;\n\tfill: <<colour download-foreground>>;\n\tborder: none;\n\tborder-radius: 2px;\n\tfont-size: 1.2em;\n\tline-height: 1.4em;\n\ttext-decoration: none;\n}\n\n.tc-btn-big-green svg,\n.tc-btn-big-green img {\n\theight: 2em;\n\twidth: 2em;\n\tvertical-align: middle;\n\tfill: <<colour download-foreground>>;\n}\n\n.tc-primary-btn {\n\tbackground: <<colour primary>>;\n}\n\n.tc-sidebar-lists input {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-sidebar-lists button {\n\tcolor: <<colour sidebar-button-foreground>>;\n\tfill: <<colour sidebar-button-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini {\n\tcolor: <<colour sidebar-muted-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini:hover {\n\tcolor: <<colour sidebar-muted-foreground-hover>>;\n}\n\n.tc-sidebar-lists button small {\n\tcolor: <<colour foreground>>;\n}\n\nbutton svg.tc-image-button, button .tc-image-button img {\n\theight: 1em;\n\twidth: 1em;\n}\n\n.tc-unfold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 100%;\n\twidth: calc(100% + 2px);\n\tmargin-left: -43px;\n\ttext-align: center;\n\tborder-top: 2px solid <<colour tiddler-info-background>>;\n\tmargin-top: 4px;\n}\n\n.tc-unfold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n\tborder-top: 2px solid <<colour tiddler-info-border>>;\n}\n\n.tc-unfold-banner svg, .tc-fold-banner svg {\n\theight: 0.75em;\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-unfold-banner:hover svg, .tc-fold-banner:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n.tc-fold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 23px;\n\ttext-align: center;\n\tmargin-left: -35px;\n\ttop: 6px;\n\tbottom: 6px;\n}\n\n.tc-fold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-unfold-banner {\n\t\tposition: static;\n\t\twidth: calc(100% + 59px);\n\t}\n\n\t.tc-fold-banner {\n\t\twidth: 16px;\n\t\tmargin-left: -16px;\n\t\tfont-size: 0.75em;\n\t}\n\n}\n\n/*\n** Tags and missing tiddlers\n*/\n\n.tc-tag-list-item {\n\tposition: relative;\n\tdisplay: inline-block;\n}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-tags-wrapper .tc-tag-list-item {\n\tmargin-right: 7px;\n}\n\n.tc-missing-tiddler-label {\n\tfont-style: italic;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tfont-size: 11.844px;\n\tline-height: 14px;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n}\n\n.tc-block-tags-dropdown > .tc-btn-invisible:hover {\n\tbackground-color: <<colour primary>>;\n}\n\nbutton.tc-tag-label, span.tc-tag-label {\n\tdisplay: inline-block;\n\tpadding: 0.16em 0.7em;\n\tfont-size: 0.9em;\n\tfont-weight: normal;\n\tline-height: 1.2em;\n\tcolor: <<colour tag-foreground>>;\n\twhite-space: break-spaces;\n\tvertical-align: baseline;\n\tbackground-color: <<colour tag-background>>;\n\tborder-radius: 1em;\n}\n\n.tc-sidebar-scrollable .tc-tag-label {\n\ttext-shadow: none;\n}\n\n.tc-untagged-separator {\n\tborder: 0;\n\theight: 1px;\n\tbackground: <<colour tab-divider>>;\n}\n\nbutton.tc-untagged-label {\n\tbackground-color: <<colour untagged-background>>;\n}\n\n.tc-tag-label svg, .tc-tag-label img {\n\theight: 1em;\n\twidth: 1em;\n\tmargin-right: 3px;\n\tmargin-bottom: 1px;\n\tvertical-align: bottom;\n}\n\n.tc-edit-tags button.tc-remove-tag-button svg {\n\tfont-size: 0.7em;\n\tvertical-align: middle;\n}\n\n.tc-tag-manager-table .tc-tag-label {\n}\n\n.tc-tag-manager-tag {\n\twidth: 100%;\n}\n\nbutton.tc-btn-invisible.tc-remove-tag-button {\n\toutline: none;\n}\n\n.tc-tag-button-selected,\n.tc-list-item-selected a.tc-tiddlylink, a.tc-list-item-selected {\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour tiddler-background>>;\n}\n\n/*\n** Page layout\n*/\n\n.tc-topbar {\n\tposition: fixed;\n\tz-index: 1200;\n}\n\n.tc-topbar-left {\n\tleft: 29px;\n\ttop: 5px;\n}\n\n.tc-topbar-right {\n\ttop: 5px;\n\tright: 29px;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-topbar-right {\n\t\tright: 10px;\n\t}\n\n}\n\n.tc-topbar button {\n\tpadding: 8px;\n}\n\n.tc-topbar svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-topbar button:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-show-sidebar-btn svg.tc-image-chevron-left, .tc-hide-sidebar-btn svg.tc-image-chevron-right {\n\t\ttransform: rotate(-90deg);\n\t}\n\n}\n\n.tc-sidebar-header {\n\tcolor: <<colour sidebar-foreground>>;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\n\tfont-weight: normal;\n}\n\n.tc-sidebar-header .tc-sidebar-lists p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-sidebar-header .tc-missing-tiddler-label {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-advanced-search input {\n\twidth: 60%;\n}\n\n.tc-search a svg {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tvertical-align: middle;\n}\n\n.tc-page-controls {\n\tmargin-top: 14px;\n\tmargin-bottom: 14px;\n\tfont-size: 1.5em;\n}\n\n.tc-page-controls .tc-drop-down {\n\tfont-size: 1rem;\n}\n\n.tc-page-controls button {\n\tmargin-right: 0.5em;\n}\n\n.tc-page-controls a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-page-controls img {\n\twidth: 1em;\n}\n\n.tc-page-controls svg {\n\tfill: <<colour sidebar-controls-foreground>>;\n}\n\n.tc-page-controls button:hover svg, .tc-page-controls a:hover svg {\n\tfill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n.tc-sidebar-lists .tc-menu-list-item {\n\twhite-space: nowrap;\n}\n\n.tc-menu-list-count {\n\tfont-weight: bold;\n}\n\n.tc-menu-list-subitem {\n\tpadding-left: 7px;\n}\n\n.tc-story-river {\n\tposition: relative;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-sidebar-header {\n\t\tpadding: 14px;\n\t\tmin-height: 32px;\n\t\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\ttransition:  min-height {{$:/config/AnimationDuration}}ms ease-in-out, padding-top {{$:/config/AnimationDuration}}ms ease-in-out, padding-bottom {{$:/config/AnimationDuration}}ms ease-in-out;\n\t}\n\n\t<<if-no-sidebar \"\"\"\n\n\t\t.tc-sidebar-header {\n\t\t\tmin-height: 0;\n\t\t\tpadding-top: 0;\n\t\t\tpadding-bottom: 0;\n\t\t}\n\n\t\"\"\">>\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-message-box {\n\t\tmargin: 21px -21px 21px -21px;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tposition: fixed;\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t\tbottom: 0;\n\t\tright: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tmargin: 0 0 0 -42px;\n\t\tpadding: 71px 0 28px 42px;\n\t}\n\n\thtml[dir=\"rtl\"] .tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tright: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};\n\t\tpadding: 42px 42px 42px 42px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-story-river {\n\t\twidth: calc(100% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}});\n\t}\n\n\">>\n\n\t.tc-story-river.tc-static-story-river {\n\t\tmargin-right: 0;\n\t\tpadding-right: 42px;\n\t}\n\n}\n\n@media print {\n\n\tbody.tc-body {\n\t\tbackground-color: transparent;\n\t}\n\n\t.tc-sidebar-header, .tc-topbar {\n\t\tdisplay: none;\n\t}\n\n\t.tc-story-river {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\t.tc-story-river .tc-tiddler-frame {\n\t\tmargin: 0;\n\t\tborder: none;\n\t\tpadding: 0;\n\t}\n}\n\n/*\n** Tiddler styles\n*/\n\n.tc-tiddler-frame {\n\tposition: relative;\n\tmargin-bottom: 28px;\n\tbackground-color: <<colour tiddler-background>>;\n\tborder: 1px solid <<colour tiddler-border>>;\n}\n\n{{$:/themes/tiddlywiki/vanilla/sticky}}\n\n.tc-tiddler-info {\n\toverflow: hidden;\n\tpadding: 14px 42px 14px 42px;\n\tbackground-color: <<colour tiddler-info-background>>;\n\tborder-top: 1px solid <<colour tiddler-info-border>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-border>>;\n}\n\n.tc-tiddler-info p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour tiddler-info-tab-background>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-tab-background>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-tiddler-info {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\n}\n\n.tc-view-field-table {\n\twidth: 100%;\n}\n\n.tc-view-field-name {\n\twidth: 1%; /* Makes this column be as narrow as possible */\n\twhite-space: nowrap;\n\tvertical-align: top;\n\ttext-align: right;\n\tfont-style: italic;\n\tfont-weight: normal;\n}\n\n.tc-view-field-value {\n\tword-break: break-all;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t\tmargin-bottom: .5em;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\t.tc-tiddler-frame {\n\t\tpadding: 28px 42px 42px 42px;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\n\t\tborder-radius: 2px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\">>\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -42px 0 -42px;\n\t}\n}\n\n.tc-site-title,\n.tc-titlebar {\n\tfont-weight: normal;\n\tfont-size: 2.35em;\n\tline-height: 1.35em;\n\tcolor: <<colour tiddler-title-foreground>>;\n\tmargin: 0;\n}\n\n.tc-site-title {\n\tcolor: <<colour site-title-foreground>>;\n}\n\n.tc-tiddler-title-icon {\n\tvertical-align: middle;\n\tmargin-right: .1em;\n}\n\n.tc-tiddler-title-icon svg {\n\twidth: 0.9em;\n\theight: 0.9em;\n}\n\n.tc-system-title-prefix {\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-tiddler-lazy-loading {\n\theight: 4px;\n\twidth: 100%;\n\tbackground: no-repeat linear-gradient(<<colour background>> 0 0),no-repeat linear-gradient(<<colour background>> 0 0),<<colour primary>>;\n\tbackground-size: 60% 100%;\n\tanimation: animation-loading-progress 3s infinite;\n}\n\n@keyframes animation-loading-progress {\n\t0%   {background-position:-150% 0,-150% 0}\n\t66%  {background-position: 250% 0,-150% 0}\n\t100% {background-position: 250% 0, 250% 0}\n}\n\n.tc-titlebar h2 {\n\tfont-size: 1em;\n\tdisplay: inline;\n}\n\n.tc-titlebar img {\n\theight: 1em;\n}\n\n.tc-subtitle {\n\tfont-size: 0.9em;\n\tcolor: <<colour tiddler-subtitle-foreground>>;\n\tfont-weight: normal;\n}\n\n.tc-subtitle .tc-tiddlylink {\n\tmargin-right: .3em;\n}\n\n.tc-tiddler-missing .tc-title {\n\tfont-style: italic;\n\tfont-weight: normal;\n}\n\n.tc-tiddler-frame .tc-tiddler-controls {\n\tfloat: right;\n\tpadding: 3px; /* make space for outline */\n}\n\n.tc-tiddler-controls .tc-drop-down {\n\tfont-size: 0.6em;\n}\n\n.tc-tiddler-controls .tc-drop-down .tc-drop-down {\n\tfont-size: 1em;\n}\n\n.tc-tiddler-controls > span > button,\n.tc-tiddler-controls > span > span > button,\n.tc-tiddler-controls > span > span > span > button {\n\tvertical-align: baseline;\n\tmargin-left:5px;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img,\n.tc-search button svg, .tc-search a svg {\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\n\theight: 0.75em;\n}\n\n.tc-search button svg, .tc-search a svg {\n\theight: 1.2em;\n\twidth: 1.2em;\n\tmargin: 0 0.25em;\n}\n\n.tc-tiddler-controls button.tc-selected svg,\n.tc-page-controls button.tc-selected svg  {\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n}\n\n.tc-tiddler-controls button.tc-btn-invisible:hover svg,\n.tc-search button:hover svg, .tc-search a:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n@media print {\n\t.tc-tiddler-controls {\n\t\tdisplay: none;\n\t}\n}\n\n.tc-tiddler-help { /* Help prompts within tiddler template */\n\tcolor: <<colour muted-foreground>>;\n\tmargin-top: 14px;\n}\n\n.tc-tiddler-help a.tc-tiddlylink {\n\tcolor: <<colour very-muted-foreground>>;\n}\n\n.tc-tiddler-frame .tc-edit-texteditor {\n\twidth: 100%;\n\tmargin: 4px 0 4px 0;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor,\n.tc-tiddler-frame iframe.tc-edit-texteditor,\n.tc-tiddler-frame select.tc-edit-texteditor {\n\tpadding: 3px 3px 3px 3px;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tline-height: 1.3em;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor,\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\t-webkit-appearance: none;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame select.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-editor-background>>;\n}\n\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-background>>;\n}\n\n.tc-tiddler-frame .tc-edit-fields input.tc-edit-fieldeditor,\n.tc-tiddler-frame .tc-edit-fields select.tc-edit-fieldeditor,\n.tc-tiddler-frame .tc-edit-fields textarea.tc-edit-fieldeditor {\n\tmargin: 0;\n\tpadding: 2px 3px;\n}\n\n.tc-tiddler-frame .tc-binary-warning {\n\twidth: 100%;\n\theight: 5em;\n\ttext-align: center;\n\tpadding: 3em 3em 6em 3em;\n\tbackground: <<colour alert-background>>;\n\tborder: 1px solid <<colour alert-border>>;\n}\n\ncanvas.tc-edit-bitmapeditor  {\n\tborder: 6px solid <<colour tiddler-editor-border-image>>;\n\tcursor: crosshair;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tmargin-top: 6px;\n\tmargin-bottom: 6px;\n}\n\n.tc-edit-bitmapeditor-width {\n\tdisplay: block;\n}\n\n.tc-edit-bitmapeditor-height {\n\tdisplay: block;\n}\n\n.tc-single-tiddler-window .tc-tiddler-body,\n.tc-tiddler-frame .tc-tiddler-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};\n}\n\n.tc-titlebar, .tc-tiddler-edit-title {\n\toverflow: hidden; /* https://github.com/TiddlyWiki/TiddlyWiki5/issues/282 */\n}\n\n/*\n* Tiddler in a new window.\n* Also see: .tc-single-tiddler-window .tc-tiddler-body, above\n*/\n\nhtml body.tc-body.tc-single-tiddler-window {\n\tmargin: 1em;\n\tbackground: <<colour tiddler-background>>;\n}\n\n.tc-single-tiddler-window img,\n.tc-single-tiddler-window svg,\n.tc-single-tiddler-window canvas,\n.tc-single-tiddler-window embed,\n.tc-single-tiddler-window iframe {\n\tmax-width: 100%;\n}\n\n/*\n** Editor\n*/\n\n.tc-editor-toolbar {\n\tmargin-top: 8px;\n}\n\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview .tc-editor-toolbar,\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview-hidden .tc-editor-toolbar {\n\tgrid-area: toolbar;\n}\n\n.tc-editor-toolbar button {\n\tvertical-align: middle;\n\tbackground-color: <<colour tiddler-controls-foreground>>;\n\tcolor: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n\tborder-radius: 4px;\n\tpadding: 3px;\n\tmargin: 2px 0 2px 4px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-adjunct {\n\tmargin-left: 1px;\n\twidth: 1em;\n\tborder-radius: 8px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-start-group {\n\tmargin-left: 11px;\n}\n\n.tc-editor-toolbar button.tc-selected {\n\tbackground-color: <<colour primary>>;\n}\n\n.tc-editor-toolbar button svg {\n\twidth: 1.6em;\n\theight: 1.2em;\n}\n\n.tc-editor-toolbar .tc-drop-down button.tc-btn-mini {\n\tpadding: 2px 4px;\n}\n\n.tc-editor-toolbar button:hover {\n\tbackground-color: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour background>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more {\n\twhite-space: normal;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more button {\n\tdisplay: inline-block;\n\tpadding: 3px;\n\twidth: auto;\n}\n\n.tc-editor-toolbar .tc-search-results {\n\tpadding: 0;\n}\n\n.tc-editor-toolbar button.tc-editortoolbar-stamp-button + .tc-popup .tc-drop-down > p {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.tc-editor-toolbar button.tc-editortoolbar-stamp-button + .tc-popup .tc-drop-down a.tc-tiddlylink {\n\tfont-weight: normal;\n}\n\n/*\n** Adjustments for fluid-fixed mode\n*/\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n<<if-fluid-fixed text:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 0;\n\t\tposition: relative;\n\t\twidth: auto;\n\t\tleft: 0;\n\t\tmargin-left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\tmargin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\tbody.tc-body .tc-page-container.tc-page-view-zoomin .tc-tiddler-frame {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 42px);\n\t}\n\n\"\"\" hiddenSidebarText:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 3em;\n\t\tmargin-right: 0;\n\t}\n\n\tbody.tc-body .tc-page-container.tc-page-view-zoomin .tc-tiddler-frame {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 84px);\n\t}\n\n\"\"\">>\n\n}\n\n/*\n** Toolbar buttons\n*/\n\n.tc-page-controls svg.tc-image-new-button {\n\tfill: <<colour toolbar-new-button>>;\n}\n\n.tc-page-controls svg.tc-image-options-button {\n\tfill: <<colour toolbar-options-button>>;\n}\n\n.tc-page-controls svg.tc-image-save-button {\n\tfill: <<colour toolbar-save-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-info-button {\n\tfill: <<colour toolbar-info-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-edit-button {\n\tfill: <<colour toolbar-edit-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-close-button {\n\tfill: <<colour toolbar-close-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-delete-button {\n\tfill: <<colour toolbar-delete-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-cancel-button {\n\tfill: <<colour toolbar-cancel-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-done-button {\n\tfill: <<colour toolbar-done-button>>;\n}\n\n.tc-page-controls svg.tc-image-layout-button {\n\tfill: <<colour toolbar-options-button>>;\n}\n\n/*\n** Tiddler edit mode\n*/\n\n.tc-tiddler-edit-frame em.tc-edit {\n\tcolor: <<colour muted-foreground>>;\n\tfont-style: normal;\n}\n\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-type-selector .tc-edit-typeeditor {\n\twidth: auto;\n}\n\n.tc-type-selector-dropdown-wrapper {\n\tdisplay: inline-block;\n}\n\n<<set-type-selector-min-width>>\n\n.tc-edit-tags {\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tpadding: 4px 8px 4px 8px;\n}\n\n.tc-edit-add-tag {\n\tdisplay: inline-block;\n}\n\n.tc-edit-add-tag .tc-add-tag-name input {\n\twidth: 50%;\n}\n\n.tc-edit-add-tag .tc-keyboard {\n\tdisplay:inline;\n}\n\n.tc-edit-tags .tc-tag-label {\n\tdisplay: inline-block;\n}\n\n.tc-edit-tags-list {\n\tmargin: 14px 0 14px 0;\n}\n\n.tc-remove-tag-button {\n\tpadding-left: 4px;\n}\n\n.tc-tiddler-editor {\n\tdisplay: grid;\n}\n\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview {\n\tgrid-template-areas:\n\t\t\"toolbar toolbar\"\n\t\t\"editor preview\";\n\tgrid-template-columns: repeat(2, minmax(0px, 1fr));\n\tgrid-template-rows: auto 1fr;\n}\n\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview-hidden {\n\tgrid-template-areas:\n\t\t\"toolbar\"\n\t\t\"editor\";\n\tgrid-template-columns: 1fr;\n\tgrid-template-rows: auto 1fr;\n}\n\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview .tc-tiddler-preview-preview {\n\tgrid-area: preview;\n\toverflow-wrap: anywhere;\n\tword-break: normal;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tmargin: 4px 0 3px 3px;\n\tpadding: 3px 3px 3px 3px;\n}\n\n<<if-editor-height-fixed then:\"\"\"\n\n.tc-tiddler-preview-preview {\n\toverflow-y: scroll;\n\theight: {{$:/config/TextEditor/EditorHeight/Height}};\n}\n\n\"\"\">>\n\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview .tc-edit-texteditor,\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview-hidden .tc-edit-texteditor {\n\tgrid-area: editor;\n}\n\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview canvas.tc-edit-bitmapeditor,\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview-hidden canvas.tc-edit-bitmapeditor {\n\tgrid-area: editor;\n\tmax-width: 100%;\n}\n\n.tc-edit-fields {\n\twidth: 100%;\n}\n\n.tc-edit-fields.tc-edit-fields-small {\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n}\n\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\n\tborder: none;\n\tpadding: 4px;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\n\tbackground-color: <<colour tiddler-editor-fields-odd>>;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\n\tbackground-color: <<colour tiddler-editor-fields-even>>;\n}\n\n.tc-edit-field-name {\n\ttext-align: right;\n}\n\n.tc-edit-field-value input {\n\twidth: 100%;\n}\n\n.tc-edit-field-remove {\n}\n\n.tc-edit-field-remove svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n\tvertical-align: middle;\n}\n\n.tc-edit-field-add-name-wrapper input.tc-edit-texteditor {\n\twidth: auto;\n}\n\n.tc-edit-field-add-name-wrapper {\n\tdisplay: inline-block;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-edit-field-add-value {\n\t\twidth: 35%;\n\t}\n\n}\n\n.tc-edit-field-add-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n\n/*\n** Tiddler editor dropzone\n*/\n\n.tc-dropzone-editor {\n\tposition:relative;\n}\n\n.tc-dropzone-editor.tc-dragover .tc-editor-toolbar::after{\n\tz-index: 10000;\n\ttop:0;\n\tleft:0;\n\tright:0;\n\theight: 100%;\n\tbackground: <<colour dropzone-background>>;\n\tcontent: \"<<lingo DropMessage>>\";\n\tpointer-events: none;\n\tposition: absolute;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground-color: <<color background>>;\n\tborder: 4px dashed <<color modal-border>>;\n\tfont-weight: bold;\n\tfont-size: 150%;\n\topacity: 0.8;\n\tcolor: <<color foreground>>;\n}\n\n.tc-editor-importpopup {\n\twidth: 100%;\n\theight: 100%;\n}\n\n.tc-editor-import {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%);\n\tbackground: <<color pre-background>>;\n\tbox-shadow: 2px 2px 10px <<colour foreground>>;\n\tpadding: 10px;\n\twidth: 96%;\n\tborder: 1px solid <<color tiddler-controls-foreground>>;\n\ttext-align:center;\n}\n\n.tc-editor-import img {\n\tmax-height: 500px;\n}\n\n/*\n** Storyview Classes\n*/\n\n.tc-viewswitcher .tc-image-button {\n\tmargin-right: .3em;\n}\n\n.tc-page-container.tc-page-view-zoomin .tc-tiddler-frame {\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-page-container.tc-page-view-zoomin .tc-tiddler-frame {\n\t\twidth: calc(100% - 84px);\n\t}\n\n}\n\n/*\n** Dropdowns\n*/\n\n.tc-btn-dropdown {\n\ttext-align: left;\n}\n\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down-wrapper {\n\tposition: relative;\n}\n\n.tc-drop-down {\n\tmin-width: 380px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\ttext-shadow: none;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-drop-down {\n\tmargin-left: 14px;\n}\n\n.tc-drop-down button svg, .tc-drop-down a svg  {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down button:disabled svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down button.tc-btn-invisible:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-drop-down .tc-drop-down-info {\n\tpadding-left: 14px;\n}\n\n.tc-drop-down p {\n\tpadding: 0 14px 0 14px;\n}\n\n.tc-drop-down svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-drop-down img {\n\twidth: 1em;\n}\n\n.tc-drop-down a, .tc-drop-down button {\n\tdisplay: block;\n\tpadding: 0 14px 0 14px;\n\twidth: 100%;\n\ttext-align: left;\n\tcolor: <<colour foreground>>;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-tab-set .tc-tab-buttons button {\n\tdisplay: inline-block;\n\twidth: auto;\n\tmargin-bottom: 0px;\n\tborder-bottom-left-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-drop-down .tc-prompt {\n\tpadding: 0 14px;\n}\n\n.tc-drop-down .tc-chooser {\n\tborder: none;\n}\n\n.tc-drop-down .tc-chooser .tc-swatches-horiz {\n\tfont-size: 0.4em;\n\tpadding-left: 1.2em;\n}\n\n.tc-drop-down .tc-file-input-wrapper {\n\twidth: 100%;\n}\n\n.tc-drop-down .tc-file-input-wrapper button {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-tab-buttons button {\n\tbackground-color: <<colour dropdown-tab-background>>;\n}\n\n.tc-drop-down .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour dropdown-tab-background-selected>>;\n\tborder-bottom: 1px solid <<colour dropdown-tab-background-selected>>;\n}\n\n.tc-drop-down-bullet {\n\tdisplay: inline-block;\n\twidth: 0.5em;\n}\n\n.tc-drop-down .tc-tab-contents a {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-block-dropdown-wrapper {\n\tposition: relative;\n}\n\n.tc-block-dropdown {\n\tposition: absolute;\n\tmin-width: 220px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\tz-index: 1000;\n\ttext-shadow: none;\n}\n\n.tc-block-dropdown.tc-search-drop-down {\n\tmargin-left: -12px;\n}\n\n.tc-block-dropdown a {\n\tdisplay: block;\n\tpadding: 4px 14px 4px 14px;\n}\n\n.tc-block-dropdown.tc-search-drop-down a {\n\tdisplay: block;\n\tpadding: 0px 10px 0px 10px;\n}\n\n.tc-drop-down .tc-dropdown-item-plain,\n.tc-block-dropdown .tc-dropdown-item-plain {\n\tpadding: 4px 14px 4px 7px;\n}\n\n.tc-drop-down .tc-dropdown-item,\n.tc-block-dropdown .tc-dropdown-item {\n\tpadding: 4px 14px 4px 7px;\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-block-dropdown a.tc-tiddlylink:hover {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-search-results {\n\tpadding: 0 7px 0 7px;\n}\n\n.tc-image-chooser, .tc-colour-chooser {\n\twhite-space: normal;\n}\n\n.tc-image-chooser a,\n.tc-colour-chooser a {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\ttext-align: center;\n\tposition: relative;\n}\n\n.tc-image-chooser a {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 2px;\n\tmargin: 2px;\n\twidth: 4em;\n\theight: 4em;\n}\n\n.tc-colour-chooser a {\n\tpadding: 3px;\n\twidth: 2em;\n\theight: 2em;\n\tvertical-align: middle;\n}\n\n.tc-image-chooser a:hover,\n.tc-colour-chooser a:hover {\n\tbackground: <<colour primary>>;\n\tpadding: 0px;\n\tborder: 3px solid <<colour primary>>;\n}\n\n.tc-image-chooser a svg,\n.tc-image-chooser a img {\n\tdisplay: inline-block;\n\twidth: auto;\n\theight: auto;\n\tmax-width: 3.5em;\n\tmax-height: 3.5em;\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tmargin: auto;\n}\n\n/* Make search dropdown visible on small screens. issue #7003 */\n@media (max-width: <<sidebarbreakpoint>>) {\n\n\t.tc-sidebar-search .tc-block-dropdown-wrapper {\n\t\tposition: initial;\n\t}\n\n}\n\n/*\n** Modals\n*/\n\n.tc-modal-wrapper {\n\tposition: fixed;\n\toverflow: auto;\n\toverflow-y: scroll;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 900;\n}\n\n.tc-modal-backdrop {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 1000;\n\tbackground-color: <<colour modal-backdrop>>;\n}\n\n.tc-modal {\n\tz-index: 1100;\n\tbackground-color: <<colour modal-background>>;\n\tborder: 1px solid <<colour modal-border>>;\n}\n\n@media (max-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 1em;\n\t\tleft: 1em;\n\t\tright: 1em;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n@media (min-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 2em;\n\t\tleft: 25%;\n\t\twidth: 50%;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n.tc-modal-header {\n\tpadding: 9px 15px;\n\tborder-bottom: 1px solid <<colour modal-header-border>>;\n}\n\n.tc-modal-header h3 {\n\tmargin: 0;\n\tline-height: 30px;\n}\n\n.tc-modal-header img, .tc-modal-header svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-modal-body {\n\tpadding: 15px;\n}\n\n.tc-modal-footer {\n\tpadding: 14px 15px 15px;\n\tmargin-bottom: 0;\n\ttext-align: right;\n\tbackground-color: <<colour modal-footer-background>>;\n\tborder-top: 1px solid <<colour modal-footer-border>>;\n}\n\n.tc-modal-prevent-scroll {\n\toverflow: hidden;\n}\n\n/*\n** Centered modals\n*/\n.tc-modal-centered .tc-modal {\n\twidth: auto;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%) !important;\n}\n\n/*\n** Notifications\n*/\n\n.tc-notification {\n\tposition: fixed;\n\ttop: 14px;\n\tright: 42px;\n\tz-index: 1300;\n\tmax-width: 280px;\n\tpadding: 0 14px 0 14px;\n\tbackground-color: <<colour notification-background>>;\n\tborder: 1px solid <<colour notification-border>>;\n}\n\n/*\n** Tabs\n*/\n\n.tc-tab-set.tc-vertical {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tab-buttons {\n\tfont-size: 0.85em;\n\tpadding-top: 1em;\n\tmargin-bottom: -2px;\n}\n\n.tc-tab-buttons.tc-vertical  {\n\tz-index: 100;\n\tdisplay: block;\n\tpadding-top: 14px;\n\tvertical-align: top;\n\ttext-align: right;\n\tmargin-bottom: inherit;\n\tmargin-right: -1px;\n\tmax-width: 33%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n}\n\n.tc-tab-buttons button.tc-tab-selected {\n\tcolor: <<colour tab-foreground-selected>>;\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-left: 1px solid <<colour tab-border-selected>>;\n\tborder-top: 1px solid <<colour tab-border-selected>>;\n\tborder-right: 1px solid <<colour tab-border-selected>>;\n}\n\n.tc-tab-buttons button {\n\tcolor: <<colour tab-foreground>>;\n\tpadding: 3px 5px 3px 5px;\n\tmargin-right: 0.3em;\n\tfont-weight: normal;\n\tborder: none;\n\tbackground: inherit;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-right: 1px solid <<colour tab-border>>;\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n\tborder-bottom-left-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin-top: 3px;\n\tmargin-right: 0;\n\ttext-align: right;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tborder-right: none;\n\tborder-top-left-radius: 2px;\n\tborder-bottom-left-radius: 2px;\n\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button.tc-tab-selected {\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-right: 1px solid <<colour tab-background-selected>>;\n}\n\n.tc-tab-divider {\n\tborder-top: 1px solid <<colour tab-divider>>;\n}\n\n.tc-tab-divider.tc-vertical  {\n\tdisplay: none;\n}\n\n.tc-tab-content {\n\tmargin-top: 14px;\n}\n\n.tc-tab-content.tc-vertical  {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-top: 0;\n\tpadding-left: 14px;\n\tborder-left: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 70%;\n\tflex: 1 0 70%;\n\toverflow: auto;\n}\n\n.tc-sidebar-lists .tc-tab-buttons {\n\tmargin-bottom: -1px;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tcolor: <<colour sidebar-tab-foreground-selected>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border-selected>>;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tcolor: <<colour sidebar-tab-foreground>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border>>;\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\tborder-top: 1px solid <<colour sidebar-tab-divider>>;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\tdisplay: block;\n\twidth: 100%;\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tborder-top: none;\n\tborder-left: none;\n\tborder-bottom: none;\n\tborder-right: 1px solid #ccc;\n\tmargin-bottom: inherit;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tborder: none;\n}\n\n/*\n** Manager\n*/\n\n.tc-manager-wrapper {\n\n}\n\n.tc-manager-controls {\n\n}\n\n.tc-manager-control {\n\tmargin: 0.5em 0;\n}\n\n.tc-manager-control select {\n\tmax-width: 100%;\n}\n\n.tc-manager-list {\n\twidth: 100%;\n\tborder-top: 1px solid <<colour muted-foreground>>;\n\tborder-left: 1px solid <<colour muted-foreground>>;\n\tborder-right: 1px solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item {\n\n}\n\n.tc-manager-list-item-heading {\n\tdisplay: block;\n\twidth: 100%;\n\ttext-align: left;\n\tborder-bottom: 1px solid <<colour muted-foreground>>;\n\tpadding: 3px;\n}\n\n.tc-manager-list-item-heading-selected {\n\tfont-weight: bold;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n\tbackground-color: <<colour foreground>>;\n}\n\n.tc-manager-list-item-heading:hover {\n\tbackground: <<colour primary>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-manager-list-item-content {\n\tdisplay: flex;\n}\n\n.tc-manager-list-item-content-sidebar {\n\tflex: 1 0;\n\tbackground: <<colour tiddler-editor-background>>;\n\tborder-right: 0.5em solid <<colour muted-foreground>>;\n\tborder-bottom: 0.5em solid <<colour muted-foreground>>;\n\twhite-space: nowrap;\n}\n\n.tc-manager-list-item-content-item-heading {\n\tdisplay: block;\n\twidth: 100%;\n\ttext-align: left;\n\tbackground: <<colour muted-foreground>>;\n\ttext-transform: uppercase;\n\tfont-size: 0.6em;\n\tfont-weight: bold;\n\tpadding: 0.5em 0 0.5em 0;\n}\n\n.tc-manager-list-item-content-item-body {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-manager-list-item-content-item-body > pre {\n\tmargin: 0.5em 0 0.5em 0;\n\tborder: none;\n\tbackground: inherit;\n}\n\n.tc-manager-list-item-content-tiddler {\n\tflex: 3 1;\n\tborder-left: 0.5em solid <<colour muted-foreground>>;\n\tborder-right: 0.5em solid <<colour muted-foreground>>;\n\tborder-bottom: 0.5em solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item-content-item-body > table {\n\tborder: none;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.tc-manager-list-item-content-item-body > table td {\n\tborder: none;\n}\n\n.tc-manager-icon-editor > button {\n\twidth: 100%;\n}\n\n.tc-manager-icon-editor > button > svg,\n.tc-manager-icon-editor > button > button {\n\twidth: 100%;\n\theight: auto;\n}\n\n/*\n** Import table\n*/\n\n.tc-import-table {\n\twidth: 100%;\n}\n\n.tc-import-table svg.tc-image-edit-button {\n\tmax-width: unset;\n}\n\n.tc-import-table th:first-of-type {\n\twidth: 10%;\n}\n\n.tc-import-table th:last-of-type {\n\twidth: 30%;\n}\n\n.tc-import-table .tc-row-disabled {\n\tbackground: <<colour very-muted-foreground>>10;\n\topacity: 0.8;\n}\n\n.tc-import-table .tc-row-warning {\n\tbackground: <<colour diff-delete-background>>50;\n}\n\n/*\n** Alerts\n*/\n\n.tc-alerts {\n\tposition: fixed;\n\ttop: 28px;\n\tleft: 0;\n\tright: 0;\n\tmax-width: 50%;\n\tz-index: 20000;\n}\n\n.tc-alert {\n\tposition: relative;\n\tmargin: 14px;\n\tpadding: 7px;\n\tborder: 1px solid <<colour alert-border>>;\n\tbackground-color: <<colour alert-background>>;\n}\n\n.tc-alert-toolbar {\n\tposition: absolute;\n\ttop: 7px;\n\tright: 7px;\n\tline-height: 0;\n}\n\n.tc-alert-toolbar svg {\n\tfill: <<colour alert-muted-foreground>>;\n}\n\n.tc-alert-subtitle {\n\tcolor: <<colour alert-muted-foreground>>;\n\tfont-weight: bold;\n\tfont-size: 0.8em;\n\tmargin-bottom: 0.5em;\n}\n\n.tc-alert-body > p {\n\tmargin: 0;\n}\n\n.tc-alert-highlight {\n\tcolor: <<colour alert-highlight>>;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-static-alert {\n\t\tposition: relative;\n\t}\n\n\t.tc-static-alert-inner {\n\t\tposition: absolute;\n\t\tz-index: 100;\n\t}\n\n}\n\n.tc-static-alert-inner {\n\tpadding: 0 2px 2px 42px;\n\tcolor: <<colour static-alert-foreground>>;\n}\n\n/*\n** Floating drafts list\n*/\n\n.tc-drafts-list {\n\tz-index: 2000;\n\tposition: fixed;\n\tfont-size: 0.8em;\n\tleft: 0;\n\tbottom: 0;\n}\n\n.tc-drafts-list a {\n\tmargin: 0 0.5em;\n\tpadding: 4px 4px;\n\tborder-top-left-radius: 4px;\n\tborder-top-right-radius: 4px;\n\tborder: 1px solid <<colour background>>;\n\tborder-bottom: none;\n\tbackground: <<colour dirty-indicator>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a:hover {\n\ttext-decoration: none;\n\tbackground: <<colour foreground>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a svg {\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: text-bottom;\n}\n\n/*\n** Control panel\n*/\n\n.tc-control-panel td {\n\tpadding: 4px;\n}\n\n.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {\n\twidth: 100%;\n}\n\n.tc-control-panel-setting {\n\tborder-top: 1px solid <<colour blockquote-bar>>;\n}\n\n.tc-plugin-info {\n\tdisplay: flex;\n\ttext-shadow: none;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tfill: <<colour muted-foreground>>;\n\tbackground-color: <<colour background>>;\n\tmargin: 0.5em 0 0.5em 0;\n\tpadding: 4px;\n\talign-items: center;\n}\n\n.tc-sidebar-lists a.tc-tiddlylink.tc-plugin-info {\n\tcolor: <<colour tiddler-link-foreground>>;\n}\n\n\n.tc-plugin-info-sub-plugins .tc-plugin-info {\n\tmargin: 0.5em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugin-indicator {\n\tmargin: -16px 1em 0 2em;\n}\n\n.tc-plugin-info-sub-plugin-indicator button {\n\tcolor: <<colour background>>;\n\tbackground: <<colour foreground>>;\n\tborder-radius: 8px;\n\tpadding: 2px 7px;\n\tfont-size: 0.75em;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info-dropdown {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-plugin-info-disabled {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n\tbackground: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n}\n\n.tc-plugin-info-disabled:hover {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n\tbackground: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n}\n\na.tc-tiddlylink.tc-plugin-info:hover {\n\ttext-decoration: none;\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour foreground>>;\n}\n\na.tc-tiddlylink.tc-plugin-info:hover > .tc-plugin-info-chunk > svg {\n\tfill: <<colour background>>;\n}\n\na.tc-tiddlylink.tc-plugin-info:hover > .tc-plugin-info-chunk .tc-plugin-info-stability {\n\tborder: 1px solid <<colour background>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-plugin-info-chunk {\n\tmargin: 2px;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n\theight: 2em;\n\twidth: 2em;\n\tdisplay: grid;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description {\n\tflex-grow: 1;\n}\n\n.tc-plugin-info-chunk .tc-plugin-info-stability {\n\tmargin-right: 4px;\n\tpadding: 1px 3px;\n\tfont-size: 0.8em;\n\tborder-radius: 4px;\n\tfont-weight: bold;\n}\n\n.tc-plugin-info-chunk .tc-plugin-info-stability-stable {\n\tborder: 1px solid <<colour stability-stable>>;\n\tcolor: <<colour stability-stable>>;\n}\n\n.tc-plugin-info-chunk .tc-plugin-info-stability-experimental {\n\tborder: 1px solid <<colour stability-experimental>>;\n\tcolor: <<colour stability-experimental>>;\n}\n\n.tc-plugin-info-chunk .tc-plugin-info-stability-deprecated {\n\tborder: 1px solid <<colour stability-deprecated>>;\n\tcolor: <<colour stability-deprecated>>;\n}\n\n.tc-plugin-info-chunk .tc-plugin-info-stability-legacy {\n\tborder: 1px solid <<colour stability-legacy>>;\n\tcolor: <<colour stability-legacy>>;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-buttons {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\ttext-align: right;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h1 {\n\tfont-size: 1em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h2 {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description div {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle img, .tc-plugin-info-chunk.tc-plugin-info-toggle svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon img, .tc-plugin-info-chunk.tc-plugin-info-icon svg {\n\tmax-width: 2em;\n\tmax-height: 2em;\n\tmargin: auto;\n}\n\n.tc-plugin-info-dropdown {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tmargin-top: -8px;\n}\n\n.tc-plugin-info-dropdown-message {\n\tbackground: <<colour message-background>>;\n\tpadding: 0.5em 1em 0.5em 1em;\n\tfont-weight: bold;\n\tfont-size: 0.8em;\n}\n\n.tc-plugin-info-dropdown-body {\n\tpadding: 1em 1em 0 1em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugins {\n\tpadding: 0.5em;\n\tmargin: 0 1em 1em 1em;\n\tbackground: <<colour notification-background>>;\n}\n\n.tc-install-plugin {\n\tfont-weight: bold;\n\tbackground: green;\n\tcolor: white;\n\tfill: white;\n\tborder-radius: 4px;\n\tpadding: 3px;\n}\n\n.tc-install-plugin.tc-reinstall-downgrade {\n\tbackground: red;\n}\n\n.tc-install-plugin.tc-reinstall {\n\tbackground: blue;\n}\n\n.tc-install-plugin.tc-reinstall-upgrade {\n\tbackground: orange;\n}\n\n.tc-check-list {\n\tline-height: 2em;\n}\n\n.tc-check-list .tc-image-button {\n\theight: 1.5em;\n}\n\n/*\n** Message boxes\n*/\n\n.tc-message-box {\n\tborder: 1px solid <<colour message-border>>;\n\tbackground: <<colour message-background>>;\n\tpadding: 0px 21px 0px 21px;\n\tfont-size: 12px;\n\tline-height: 18px;\n\tcolor: <<colour message-foreground>>;\n}\n\n.tc-message-box svg {\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: text-bottom;\n}\n\n/*\n** Pictures\n*/\n\n.tc-bordered-image {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 5px;\n\tmargin: 5px;\n}\n\n/*\n** Floats\n*/\n\n.tc-float-right {\n\tfloat: right;\n}\n\n/* Float tc-clearfix. Needs to be used by elements that allow float:right in their content.\n** So the floating element does not overflow\n*/\n\n.tc-clearfix:after {\n\tcontent: \"\";\n\tclear: both;\n\tdisplay: table;\n}\n\n/* Fix overflow toc, manager and testcase output */\n.tc-tiddler-body .tc-tabbed-table-of-contents, .tc-manager-list-item-content, .tc-test-case-output {\n\toverflow-x: auto;\n}\n\n/* A wrapper to fix table overflow */\n\n.tc-table-wrapper {\n\toverflow-x: auto;\n}\n\n/*\n** Chooser\n*/\n\n.tc-chooser {\n\tborder-right: 1px solid <<colour table-header-background>>;\n\tborder-left: 1px solid <<colour table-header-background>>;\n}\n\n\n.tc-chooser-item {\n\tborder-bottom: 1px solid <<colour table-header-background>>;\n\tborder-top: 1px solid <<colour table-header-background>>;\n\tpadding: 2px 4px 2px 14px;\n}\n\n.tc-drop-down .tc-chooser-item {\n\tpadding: 2px;\n}\n\n.tc-chosen,\n.tc-chooser-item:hover {\n\tbackground-color: <<colour table-header-background>>;\n\tborder-color: <<colour table-footer-background>>;\n}\n\n.tc-chosen .tc-tiddlylink {\n\tcursor:default;\n}\n\n.tc-chooser-item .tc-tiddlylink {\n\tdisplay: block;\n\ttext-decoration: none;\n\tbackground-color: transparent;\n}\n\n.tc-chooser-item:hover .tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-chosen .tc-tiddlylink,\n.tc-drop-down .tc-chooser-item .tc-tiddlylink:hover {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-chosen > .tc-tiddlylink:before {\n\tmargin-left: -10px;\n\tposition: relative;\n\tcontent: \"» \";\n}\n\n.tc-chooser-item svg,\n.tc-chooser-item img{\n\tmax-width: 1em;\n\tmax-height: 1em;\n\tvertical-align: middle;\n}\n\n.tc-language-chooser .tc-image-button img {\n\tmax-width: 2em;\n\tmax-height: 1em;\n\twidth: auto;\n\theight: auto;\n\tvertical-align: -0.15em;\n}\n\n/*\n** Palette swatches\n*/\n\n.tc-swatches-horiz {\n}\n\n.tc-swatches-horiz .tc-swatch {\n\tdisplay: inline-block;\n}\n\n.tc-swatch {\n\twidth: 2em;\n\theight: 2em;\n\tmargin: 0.4em;\n\tborder: 1px solid #888;\n}\n\ninput.tc-palette-manager-colour-input {\n\twidth: 100%;\n\tpadding: 0;\n}\n\n/*\n** Table of contents\n*/\n\n.tc-sidebar-lists .tc-table-of-contents {\n\twhite-space: nowrap;\n}\n\n.tc-table-of-contents button,\n.tc-table-of-contents .toc-item-muted {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents svg {\n\twidth: 0.7em;\n\theight: 0.7em;\n\tvertical-align: middle;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents ol {\n\tlist-style-type: none;\n\tpadding-left: 0;\n}\n\n.tc-table-of-contents ol ol {\n\tpadding-left: 1em;\n}\n\n.tc-table-of-contents li {\n\tfont-size: 1.0em;\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\n\tline-height: 1.4;\n}\n\n.tc-table-of-contents li li a {\n\tfont-weight: normal;\n}\n\n.tc-table-of-contents li li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\n\tline-height: 1.5;\n}\n\n.tc-table-of-contents li li li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\n}\n\n.tc-tabbed-table-of-contents {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents {\n\tz-index: 100;\n\tdisplay: inline-block;\n\tpadding-left: 1em;\n\tmax-width: 50%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n\tbackground: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tdisplay: block;\n\tpadding: 0.12em 1em 0.12em 0.25em;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {\n\tborder-top: 1px solid <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-background>>;\n\tborder-bottom: 1px solid <<colour tab-background>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {\n\ttext-decoration: none;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour background>>;\n\tmargin-right: -1px;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {\n\ttext-decoration: none;\n}\n\n.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-left: 1.5em;\n\tpadding-right: 1.5em;\n\tborder: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 50%;\n\tflex: 1 0 50%;\n}\n\n/*\n** Dirty indicator\n*/\n\nhtml body svg.tc-image-save-button-dynamic .tc-image-save-button-dynamic-clean {\n\tvisibility: visible;\n}\n\nhtml body svg.tc-image-save-button-dynamic .tc-image-save-button-dynamic-dirty {\n\tvisibility: hidden;\n}\n\nhtml body.tc-dirty svg.tc-image-save-button-dynamic .tc-image-save-button-dynamic-clean {\n\tvisibility: hidden;\n}\n\nhtml body.tc-dirty svg.tc-image-save-button-dynamic .tc-image-save-button-dynamic-dirty {\n\tvisibility: visible;\n}\n\nhtml body.tc-dirty span.tc-dirty-indicator, html body.tc-dirty span.tc-dirty-indicator svg {\n\tfill: <<colour dirty-indicator>>;\n\tcolor: <<colour dirty-indicator>>;\n}\n\n/*\n** File inputs\n*/\n\n.tc-file-input-wrapper {\n\tposition: relative;\n\toverflow: hidden;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-file-input-wrapper input[type=file] {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tfont-size: 999px;\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tfilter: alpha(opacity=0);\n\topacity: 0;\n\toutline: none;\n\tbackground: white;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n::-webkit-file-upload-button {\n\tcursor:pointer;\n}\n\n/*\n** Thumbnail macros\n*/\n\n.tc-thumbnail-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin: 6px;\n\tvertical-align: top;\n}\n\n.tc-thumbnail-right-wrapper {\n\tfloat:right;\n\tmargin: 0.5em 0 0.5em 0.5em;\n}\n\n.tc-thumbnail-image {\n\ttext-align: center;\n\toverflow: hidden;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-image svg,\n.tc-thumbnail-image img {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n\tmin-width: 100%;\n\tmin-height: 100%;\n\tmax-width: 100%;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image img {\n\tfilter: alpha(opacity=0.8);\n\topacity: 0.8;\n}\n\n.tc-thumbnail-background {\n\tposition: absolute;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-icon svg,\n.tc-thumbnail-icon img {\n\twidth: 3em;\n\theight: 3em;\n\t<<filter \"drop-shadow(2px 2px 4px rgba(0,0,0,0.3))\">>\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon img {\n\tfill: #fff;\n\t<<filter \"drop-shadow(3px 3px 4px rgba(0,0,0,0.6))\">>\n}\n\n.tc-thumbnail-icon {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: -webkit-flex;\n\t-webkit-align-items: center;\n\t-webkit-justify-content: center;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.tc-thumbnail-caption {\n\tposition: absolute;\n\tbackground-color: #777;\n\tcolor: #fff;\n\ttext-align: center;\n\tbottom: 0;\n\twidth: 100%;\n\tfilter: alpha(opacity=0.9);\n\topacity: 0.9;\n\tline-height: 1.4;\n\tborder-bottom-left-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-caption {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n}\n\n/*\n** Diffs\n*/\n\n.tc-diff-equal {\n\tbackground-color: <<colour diff-equal-background>>;\n\tcolor: <<colour diff-equal-foreground>>;\n}\n\n.tc-diff-insert {\n\tbackground-color: <<colour diff-insert-background>>;\n\tcolor: <<colour diff-insert-foreground>>;\n}\n\n.tc-diff-delete {\n\tbackground-color: <<colour diff-delete-background>>;\n\tcolor: <<colour diff-delete-foreground>>;\n}\n\n.tc-diff-invisible {\n\tbackground-color: <<colour diff-invisible-background>>;\n\tcolor: <<colour diff-invisible-foreground>>;\n}\n\n.tc-diff-tiddlers th {\n\ttext-align: right;\n\tbackground: <<colour background>>;\n\tfont-weight: normal;\n\tfont-style: italic;\n}\n\n.tc-diff-tiddlers pre {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: none;\n\tbackground: none;\n}\n\n/*\n** Errors\n*/\n\n.tc-error {\n\tbackground: #f00;\n\tcolor: #fff;\n}\n\n/*\n** Tree macro\n*/\n\n.tc-tree div {\n\tpadding-left: 14px;\n}\n\n.tc-tree ol {\n\tlist-style-type: none;\n\tpadding-left: 0;\n\tmargin-top: 0;\n}\n\n.tc-tree ol ol {\n\tpadding-left: 1em;\n}\n\n.tc-tree button {\n\tcolor: #acacac;\n}\n\n.tc-tree svg {\n\tfill: #acacac;\n}\n\n.tc-tree span svg {\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: baseline;\n}\n\n.tc-tree li span {\n\tcolor: lightgray;\n}\n\nselect {\n\tcolor: <<colour select-tag-foreground>>;\n\tbackground: <<colour select-tag-background>>;\n}\n\n/*\n** Translink macro\n*/\n\n.tc-translink {\n\tbackground-color: <<colour pre-background>>;\n\tborder: 1px solid <<colour pre-border>>;\n\tpadding: 0 3px;\n\tborder-radius: 3px;\n}\n\ndiv.tc-translink > div {\n\tmargin: 1em;\n}\n\ndiv.tc-translink > div > a:first-child > h1 {\n\tfont-size: 1.2em;\n\tfont-weight: bold;\n}\n\nspan.tc-translink > a:first-child {\n\tfont-weight: bold;\n}\n\n/*\n** Classes for displaying globals\n*/\n\n.tc-global-tiddler-body {\n\tpadding: 0.25em;\n\tborder: 1px solid <<colour foreground>>;\n\tbackground-color: <<colour muted-foreground>>;\n\tborder-radius: 3px;\n}\n\n.tc-global-tiddler-body-heading {\n\tmargin: 0 0 0.25em 0;\n\tfont-weight: normal;\n}\n\n.tc-global-tiddler-body-type {\n\tmargin: 0 0 0.25em 0;\n\tborder-bottom: 1px solid <<colour foreground>>;\n}\n\n.tc-global-tiddler-body-details {\n\tbackground-color: <<colour background>>;\n}\n\n.tc-global-tiddler-body pre {\n\tmargin: 0;\n\tborder: 1px solid <<colour foreground>>;\n}\n\n/*\n** Utility classes for SVG icons\n*/\n\n.tc-fill-background {\n\tfill: <<colour background>>;\n}\n\n.tc-network-activity-background {\n\tfill: <<colour network-activity-foreground>>;\n}\n\n/*\n** Test Cases\n*/\n\n.tc-test-case-wrapper {\n\tborder: 1px solid <<colour foreground>>;\n\tbackground-color: <<colour muted-foreground>>;\n\tborder-radius: 6px;\n}\n\n.tc-test-case-wrapper {\n\tbackground-color: <<colour testcase-accent-level-1>>;\n}\n\n.tc-test-case-wrapper .tc-test-case-wrapper {\n\tbackground-color: <<colour testcase-accent-level-2>>;\n}\n\n.tc-test-case-wrapper .tc-test-case-wrapper .tc-test-case-wrapper {\n\tbackground-color: <<colour testcase-accent-level-3>>;\n}\n\n.tc-test-case-header {\n\tfont-weight: normal;\n\tmargin: 0.5em 0;\n\tpadding: 0 0.5em;\n}\n\n.tc-test-case-divider {\n\tx-background-color: <<colour muted-foreground>>;\n}\n\n.tc-test-case-result-icon {\n\tfill: #fff;\n\tpadding: 0.25em;\n\tdisplay: inline-block;\n\tline-height: 0;\n\tborder-radius: 1em;\n\tvertical-align: text-bottom;\n\tmargin-right: 0.25em;\n}\n\n.tc-test-case-result-icon-pass {\n\tbackground-color: green;\n}\n\n.tc-test-case-result-icon-fail {\n\tbackground-color: red;\n}\n\n.tc-test-case-result-icon svg {\n\twidth: 0.5em;\n\theight: 0.5em;\n}\n\n.tc-test-case-header > h2 {\n\tbackground: <<colour background>>;\n\tborder-radius: 4px;\n\tpadding: 0.25em;\n}\n\n.tc-test-case-header > h2,\n.tc-test-case-source > pre {\n\tmargin: 0;\n}\n\n.tc-test-case-header > h2 a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-test-case-toolbar {\n\tfloat: right;\n}\n\n.tc-test-case-toolbar svg {\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-test-case-toolbar .tc-drop-down {\n\tfont-size: 0.8em;\n}\n\n.tc-test-case-result-fail {\n\tborder: 1px solid <<colour foreground>>;\n\tbackground-color: <<colour background>>;\n\tborder-radius: 4px;\n\tmargin: 0 0.5em;\n\tpadding: 0;\n}\n\n.tc-test-case-result-fail-header {\n\tbackground: <<colour diff-delete-background>>;\n\tcolor: <<colour diff-delete-foreground>>;\n\tborder-top-left-radius: 4px;\n\tborder-top-right-radius: 4px;\n\tpadding: 4px;\n}\n\n.tc-test-case-result-fail-body {\n\tpadding: 4px;\n}\n\n.tc-test-case-source > pre {\n\theight: 100%;\n}\n\n.tc-test-case-narrative {\n\tpadding: 0.5em;\n}\n\n.tc-test-case-panes {\n\tdisplay: flex;\n\talign-items: stretch;\n\tflex-wrap: wrap;\n\tpadding: 0.5em;\n\tborder-bottom-left-radius: 6px;\n\tborder-bottom-right-radius: 6px;\n}\n\n.tc-test-case-source {\n\tflex: 1 0 49%;\n\tmin-width: 250px;\n}\n\n.tc-test-case-source .tc-tab-content {\n\tbackground: inherit;\n\tmargin: 0;\n}\n\n.tc-test-case-source .tc-tab-content .tc-field-table {\n\tbackground: <<colour background>>;\n}\n\n.tc-test-case-source .tc-field-table {\n\twidth: 100%;\n}\n\n.tc-test-case-source table.tc-field-table {\n\tmargin: 0;\n}\n\n.tc-test-case-source .tc-tiddler-frame .tc-edit-texteditor {\n\tmargin: 0;\n}\n\n.tc-test-case-divider {\n\tflex: 0 0 1.5%;\n}\n\n.tc-test-case-source .tc-tab-buttons {\n\tpadding-top: 0;\n}\n\n.tc-test-case-footer-toolbar {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n}\n\n.tc-test-case-output {\n\tbox-shadow: inset 2px 2px 10px 0px <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tborder-radius: 4px;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tflex: 1 0 49%;\n\tmin-width: 250px;\n\tpadding: 0.25em 1em;\n}\n\n/*\n** Flexbox utility classes\n*/\n\n.tc-flex {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-flex-column {\n\tflex-direction: column;\n}\n\n.tc-flex-row {\n\tflex-direction: row;\n}\n\n.tc-flex-grow-1 {\n\tflex-grow: 1;\n}\n\n.tc-flex-grow-2 {\n\tflex-grow: 2;\n}\n\n/*\n** Other utility classes\n*/\n\n/* Horizontal gaps */\n\n.tc-tiny-gap {\n\tmargin-left: .25em;\n\tmargin-right: .25em;\n}\n\n.tc-tiny-gap-left {\n\tmargin-left: .25em;\n}\n\n.tc-tiny-gap-right {\n\tmargin-right: .25em;\n}\n\n.tc-small-gap {\n\tmargin-left: .5em;\n\tmargin-right: .5em;\n}\n\n.tc-small-gap-left {\n\tmargin-left: .5em;\n}\n\n.tc-small-gap-right {\n\tmargin-right: .5em;\n}\n\n.tc-big-gap {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-big-gap-left {\n\tmargin-left: 1em;\n}\n\n.tc-big-gap-right {\n\tmargin-right: 1em;\n}\n\n.tc-word-break {\n\tword-break: break-all;\n}\n\n/* Vertical gaps */\n\n.tc-tiny-v-gap-bottom {\n\tmargin-bottom: 3px;\n}\n\n"},"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize":{"title":"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize","text":"15px"},"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight":{"title":"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight","text":"22px"},"$:/themes/tiddlywiki/vanilla/metrics/fontsize":{"title":"$:/themes/tiddlywiki/vanilla/metrics/fontsize","text":"14px"},"$:/themes/tiddlywiki/vanilla/metrics/lineheight":{"title":"$:/themes/tiddlywiki/vanilla/metrics/lineheight","text":"20px"},"$:/themes/tiddlywiki/vanilla/metrics/storyleft":{"title":"$:/themes/tiddlywiki/vanilla/metrics/storyleft","text":"0px"},"$:/themes/tiddlywiki/vanilla/metrics/storytop":{"title":"$:/themes/tiddlywiki/vanilla/metrics/storytop","text":"0px"},"$:/themes/tiddlywiki/vanilla/metrics/storyright":{"title":"$:/themes/tiddlywiki/vanilla/metrics/storyright","text":"770px"},"$:/themes/tiddlywiki/vanilla/metrics/storywidth":{"title":"$:/themes/tiddlywiki/vanilla/metrics/storywidth","text":"770px"},"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth":{"title":"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth","text":"686px"},"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint":{"title":"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint","text":"960px"},"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth":{"title":"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth","text":"350px"},"$:/themes/tiddlywiki/vanilla/options/stickytitles":{"title":"$:/themes/tiddlywiki/vanilla/options/stickytitles","text":"no"},"$:/themes/tiddlywiki/vanilla/options/sidebarlayout":{"title":"$:/themes/tiddlywiki/vanilla/options/sidebarlayout","text":"fixed-fluid"},"$:/themes/tiddlywiki/vanilla/options/codewrapping":{"title":"$:/themes/tiddlywiki/vanilla/options/codewrapping","text":"pre-wrap"},"$:/themes/tiddlywiki/vanilla/reset":{"title":"$:/themes/tiddlywiki/vanilla/reset","type":"text/css","text":"/*! modern-normalize v2.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n/*\nDocument\n========\n*/\n\n/**\nUse a better box model (opinionated).\n*/\n\n*,\n::before,\n::after {\n\tbox-sizing: border-box;\n}\n\nhtml {\n\t/* Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) */\n\tfont-family:\n\t\tsystem-ui,\n\t\t'Segoe UI',\n\t\tRoboto,\n\t\tHelvetica,\n\t\tArial,\n\t\tsans-serif,\n\t\t'Apple Color Emoji',\n\t\t'Segoe UI Emoji';\n\tline-height: 1.15; /* 1. Correct the line height in all browsers. */\n\t-webkit-text-size-adjust: 100%; /* 2. Prevent adjustments of font size after orientation changes in iOS. */\n\t-moz-tab-size: 4; /* 3. Use a more readable tab size (opinionated). */\n\ttab-size: 4; /* 3 */\n}\n\n/*\nSections\n========\n*/\n\nbody {\n\tmargin: 0; /* Remove the margin in all browsers. */\n}\n\n/*\nGrouping content\n================\n*/\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\nhr {\n\theight: 0; /* 1 */\n\tcolor: inherit; /* 2 */\n}\n\n/*\nText-level semantics\n====================\n*/\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr[title] {\n\ttext-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n\tfont-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n\tfont-family:\n\t\tui-monospace,\n\t\tSFMono-Regular,\n\t\tConsolas,\n\t\t'Liberation Mono',\n\t\tMenlo,\n\t\tmonospace; /* 1 */\n\tfont-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n\tfont-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n\tfont-size: 75%;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsub {\n\tbottom: -0.25em;\n}\n\nsup {\n\ttop: -0.5em;\n}\n\n/*\nTabular data\n============\n*/\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\ntable {\n\ttext-indent: 0; /* 1 */\n\tborder-color: inherit; /* 2 */\n}\n\n/*\nForms\n=====\n*/\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n\tfont-family: inherit; /* 1 */\n\tfont-size: 100%; /* 1 */\n\tline-height: 1.15; /* 1 */\n\tmargin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n\ttext-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n\t-webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n::-moz-focus-inner {\n\tborder-style: none;\n\tpadding: 0;\n}\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n:-moz-focusring {\n\toutline: 1px dotted ButtonText;\n}\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n:-moz-ui-invalid {\n\tbox-shadow: none;\n}\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\nlegend {\n\tpadding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n\tvertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n\theight: auto;\n}\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n\t-webkit-appearance: textfield; /* 1 */\n\toutline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n::-webkit-file-upload-button {\n\t-webkit-appearance: button; /* 1 */\n\tfont: inherit; /* 2 */\n}\n\n/*\nInteractive\n===========\n*/\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n\tdisplay: list-item;\n}\n"},"$:/themes/tiddlywiki/vanilla/settings/fontfamily":{"title":"$:/themes/tiddlywiki/vanilla/settings/fontfamily","text":"-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Noto Sans\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\""},"$:/themes/tiddlywiki/vanilla/settings/codefontfamily":{"title":"$:/themes/tiddlywiki/vanilla/settings/codefontfamily","text":"ui-monospace, \"SFMono-Regular\", \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace"},"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment":{"title":"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment","text":"fixed"},"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize":{"title":"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize","text":"auto"},"$:/themes/tiddlywiki/vanilla/sticky":{"title":"$:/themes/tiddlywiki/vanilla/sticky","code-body":"yes","text":"<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\" type=\"match\" text=\"yes\">\n``\n.tc-tiddler-title {\n\tposition: -webkit-sticky;\n\tposition: -moz-sticky;\n\tposition: -o-sticky;\n\tposition: -ms-sticky;\n\tposition: sticky;\n\ttop: 0px;\n\tbackground: ``<<colour tiddler-background>>``;\n\tz-index: 500;\n}\n\n``\n<$list filter=\"[range[100]]\">\n`.tc-story-river .tc-tiddler-frame:nth-child(100n+`<$text text=<<currentTiddler>>/>`) {\nz-index: `<$text text={{{ [[200]subtract<currentTiddler>] }}}/>`;\n}\n`\n</$list>\n</$reveal>\n"}}}